SURFEX v7.3
General documentation of Surfex
|
00001 ! ################# 00002 MODULE MODD_OCEAN_n 00003 ! ################# 00004 ! 00005 !!**** *MODD_OCEAN_n - declaration of ocean varaiables 00006 !! for 1D oceanic model 00007 !! 00008 !! PURPOSE 00009 !! ------- 00010 ! Declaration of ocean varaiables 00011 ! 00012 !! 00013 !!** IMPLICIT ARGUMENTS 00014 !! ------------------ 00015 !! None 00016 !! 00017 !! REFERENCE 00018 !! --------- 00019 !! 00020 !! AUTHOR 00021 !! ------ 00022 !! C. Lebeaupin *Meteo France* 00023 !! 00024 !! MODIFICATIONS 00025 !! ------------- 00026 !! Original 04/2006 00027 !! Modified 07/2012, P. Le Moigne : CMO1D phasing 00028 ! 00029 !* 0. DECLARATIONS 00030 ! ------------ 00031 ! 00032 ! 00033 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00034 USE PARKIND1 ,ONLY : JPRB 00035 ! 00036 IMPLICIT NONE 00037 ! 00038 TYPE OCEAN_t 00039 ! 00040 ! 00041 ! Switche for interactive coupling with oceanic model 00042 LOGICAL:: LMERCATOR !set to .true. to initialize oceanic var. from Mercator 00043 LOGICAL:: LCURRENT !set to .true. to make initialize ocean state with current 00044 LOGICAL:: LPROGSST !set to .true. to make SST evolve with tendance 00045 INTEGER:: NTIME_COUPLING! coupling time frequency 00046 INTEGER:: NOCTCOUNT !oceanic model counter 00047 ! General surface: 00048 ! 00049 REAL, POINTER, DIMENSION(:,:) :: XSEAT ! oceanic temperature profiles 00050 REAL, POINTER, DIMENSION(:,:) :: XSEAS ! oceanic salinity profiles 00051 REAL, POINTER, DIMENSION(:,:) :: XSEAU ! oceanic zonal current profiles 00052 REAL, POINTER, DIMENSION(:,:) :: XSEAV ! oceanic meridian current profiles 00053 REAL, POINTER, DIMENSION(:,:) :: XSEAE ! oceanic kinetic turbulent energy profiles (^(1/2)) 00054 REAL, POINTER, DIMENSION(:,:) :: XSEABATH !bathymetry indice 00055 !=1 for free sea water 00056 !=0 for sea-bed 00057 REAL, POINTER, DIMENSION(:) :: XSEAHMO! oceanic mixing lengths 00058 ! 00059 REAL, POINTER, DIMENSION(:,:) :: XLE,XLK! oceanic mixing lengths 00060 REAL, POINTER, DIMENSION(:,:) :: XKMEL,XKMELM ! oceanic mixing coefficients 00061 ! 00062 REAL, POINTER, DIMENSION(:) :: XSEATEND! SST tendance 00063 ! 00064 REAL, POINTER, DIMENSION(:,:) :: XDTFSOL ! Temp tendancy due to solar flux 00065 REAL, POINTER, DIMENSION(:) :: XDTFNSOL! -------------------- non solar flux 00066 ! 00067 END TYPE OCEAN_t 00068 ! 00069 TYPE(OCEAN_t), ALLOCATABLE, TARGET, SAVE :: OCEAN_MODEL(:) 00070 ! 00071 LOGICAL, POINTER :: LMERCATOR=>NULL() 00072 !$OMP THREADPRIVATE(LMERCATOR) 00073 LOGICAL, POINTER :: LCURRENT=>NULL() 00074 !$OMP THREADPRIVATE(LCURRENT) 00075 LOGICAL, POINTER :: LPROGSST=>NULL() 00076 !$OMP THREADPRIVATE(LPROGSST) 00077 INTEGER, POINTER :: NTIME_COUPLING=>NULL() 00078 !$OMP THREADPRIVATE(NTIME_COUPLING) 00079 INTEGER, POINTER :: NOCTCOUNT=>NULL() 00080 !$OMP THREADPRIVATE(NOCTCOUNT) 00081 REAL, POINTER, DIMENSION(:,:) :: XSEAT=>NULL() 00082 !$OMP THREADPRIVATE(XSEAT) 00083 REAL, POINTER, DIMENSION(:,:) :: XSEAS=>NULL() 00084 !$OMP THREADPRIVATE(XSEAS) 00085 REAL, POINTER, DIMENSION(:,:) :: XSEAU=>NULL() 00086 !$OMP THREADPRIVATE(XSEAU) 00087 REAL, POINTER, DIMENSION(:,:) :: XSEAV=>NULL() 00088 !$OMP THREADPRIVATE(XSEAV) 00089 REAL, POINTER, DIMENSION(:,:) :: XSEAE=>NULL() 00090 !$OMP THREADPRIVATE(XSEAE) 00091 REAL, POINTER, DIMENSION(:,:) :: XSEABATH=>NULL() 00092 !$OMP THREADPRIVATE(XSEABATH) 00093 REAL, POINTER, DIMENSION(:) :: XSEAHMO=>NULL() 00094 !$OMP THREADPRIVATE(XSEAHMO) 00095 REAL, POINTER, DIMENSION(:,:) :: XLE=>NULL() 00096 !$OMP THREADPRIVATE(XLE) 00097 REAL, POINTER, DIMENSION(:,:) :: XLK=>NULL() 00098 !$OMP THREADPRIVATE(XLK) 00099 REAL, POINTER, DIMENSION(:,:) :: XKMEL=>NULL() 00100 !$OMP THREADPRIVATE(XKMEL) 00101 REAL, POINTER, DIMENSION(:,:) :: XKMELM=>NULL() 00102 !$OMP THREADPRIVATE(XKMELM) 00103 REAL, POINTER, DIMENSION(:) :: XSEATEND=>NULL() 00104 !$OMP THREADPRIVATE(XSEATEND) 00105 REAL, POINTER, DIMENSION(:) :: XDTFNSOL=>NULL() 00106 !$OMP THREADPRIVATE(XDTFNSOL) 00107 REAL, POINTER, DIMENSION(:,:) :: XDTFSOL=>NULL() 00108 !$OMP THREADPRIVATE(XDTFSOL) 00109 00110 CONTAINS 00111 00112 SUBROUTINE OCEAN_GOTO_MODEL(KFROM, KTO, LKFROM) 00113 LOGICAL, INTENT(IN) :: LKFROM 00114 INTEGER, INTENT(IN) :: KFROM, KTO 00115 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00116 ! 00117 ! Save current state for allocated arrays 00118 IF (LKFROM) THEN 00119 OCEAN_MODEL(KFROM)%XSEAT=>XSEAT 00120 OCEAN_MODEL(KFROM)%XSEAS=>XSEAS 00121 OCEAN_MODEL(KFROM)%XSEAU=>XSEAU 00122 OCEAN_MODEL(KFROM)%XSEAV=>XSEAV 00123 OCEAN_MODEL(KFROM)%XSEAE=>XSEAE 00124 OCEAN_MODEL(KFROM)%XSEABATH=>XSEABATH 00125 OCEAN_MODEL(KFROM)%XSEAHMO=>XSEAHMO 00126 OCEAN_MODEL(KFROM)%XLE=>XLE 00127 OCEAN_MODEL(KFROM)%XLK=>XLK 00128 OCEAN_MODEL(KFROM)%XKMEL=>XKMEL 00129 OCEAN_MODEL(KFROM)%XKMELM=>XKMELM 00130 OCEAN_MODEL(KFROM)%XSEATEND=>XSEATEND 00131 OCEAN_MODEL(KFROM)%XDTFNSOL=>XDTFNSOL 00132 OCEAN_MODEL(KFROM)%XDTFSOL=>XDTFSOL 00133 ENDIF 00134 ! 00135 ! Current model is set to model KTO 00136 IF (LHOOK) CALL DR_HOOK('MODD_OCEAN_N:OCEAN_GOTO_MODEL',0,ZHOOK_HANDLE) 00137 LMERCATOR=>OCEAN_MODEL(KTO)%LMERCATOR 00138 LCURRENT=>OCEAN_MODEL(KTO)%LCURRENT 00139 LPROGSST=>OCEAN_MODEL(KTO)%LPROGSST 00140 NTIME_COUPLING=>OCEAN_MODEL(KTO)%NTIME_COUPLING 00141 NOCTCOUNT=>OCEAN_MODEL(KTO)%NOCTCOUNT 00142 XSEAT=>OCEAN_MODEL(KTO)%XSEAT 00143 XSEAS=>OCEAN_MODEL(KTO)%XSEAS 00144 XSEAU=>OCEAN_MODEL(KTO)%XSEAU 00145 XSEAV=>OCEAN_MODEL(KTO)%XSEAV 00146 XSEAE=>OCEAN_MODEL(KTO)%XSEAE 00147 XSEABATH=>OCEAN_MODEL(KTO)%XSEABATH 00148 XSEAHMO=>OCEAN_MODEL(KTO)%XSEAHMO 00149 XLE=>OCEAN_MODEL(KTO)%XLE 00150 XLK=>OCEAN_MODEL(KTO)%XLK 00151 XKMEL=>OCEAN_MODEL(KTO)%XKMEL 00152 XKMELM=>OCEAN_MODEL(KTO)%XKMELM 00153 XSEATEND=>OCEAN_MODEL(KTO)%XSEATEND 00154 XDTFNSOL=>OCEAN_MODEL(KTO)%XDTFNSOL 00155 XDTFSOL=>OCEAN_MODEL(KTO)%XDTFSOL 00156 IF (LHOOK) CALL DR_HOOK('MODD_OCEAN_N:OCEAN_GOTO_MODEL',1,ZHOOK_HANDLE) 00157 00158 END SUBROUTINE OCEAN_GOTO_MODEL 00159 00160 SUBROUTINE OCEAN_ALLOC(KMODEL) 00161 INTEGER, INTENT(IN) :: KMODEL 00162 INTEGER :: J 00163 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00164 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_ALLOC",0,ZHOOK_HANDLE) 00165 ALLOCATE(OCEAN_MODEL(KMODEL)) 00166 DO J=1,KMODEL 00167 NULLIFY(OCEAN_MODEL(J)%XSEAT) 00168 NULLIFY(OCEAN_MODEL(J)%XSEAS) 00169 NULLIFY(OCEAN_MODEL(J)%XSEAU) 00170 NULLIFY(OCEAN_MODEL(J)%XSEAV) 00171 NULLIFY(OCEAN_MODEL(J)%XSEAE) 00172 NULLIFY(OCEAN_MODEL(J)%XSEABATH) 00173 NULLIFY(OCEAN_MODEL(J)%XSEAHMO) 00174 NULLIFY(OCEAN_MODEL(J)%XLE) 00175 NULLIFY(OCEAN_MODEL(J)%XLK) 00176 NULLIFY(OCEAN_MODEL(J)%XKMEL) 00177 NULLIFY(OCEAN_MODEL(J)%XKMELM) 00178 NULLIFY(OCEAN_MODEL(J)%XSEATEND) 00179 NULLIFY(OCEAN_MODEL(J)%XDTFNSOL) 00180 NULLIFY(OCEAN_MODEL(J)%XDTFSOL) 00181 ENDDO 00182 OCEAN_MODEL(:)%LMERCATOR=.FALSE. 00183 OCEAN_MODEL(:)%LCURRENT=.FALSE. 00184 OCEAN_MODEL(:)%LPROGSST=.FALSE. 00185 OCEAN_MODEL(:)%NTIME_COUPLING=0 00186 OCEAN_MODEL(:)%NOCTCOUNT=0 00187 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_ALLOC",1,ZHOOK_HANDLE) 00188 END SUBROUTINE OCEAN_ALLOC 00189 00190 SUBROUTINE OCEAN_DEALLO 00191 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00192 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_DEALLO",0,ZHOOK_HANDLE) 00193 IF (ALLOCATED(OCEAN_MODEL)) DEALLOCATE(OCEAN_MODEL) 00194 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_DEALLO",1,ZHOOK_HANDLE) 00195 END SUBROUTINE OCEAN_DEALLO 00196 00197 END MODULE MODD_OCEAN_n