Changeset 5185 for LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Timestamp:
- Sep 11, 2024, 4:27:07 PM (16 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Files:
-
- 2 moved
-
dynetat0_loc.f90 (moved) (moved from LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynetat0_loc.F90) (2 diffs)
-
leapfrog_loc.f90 (moved) (moved from LMDZ6/branches/Amaury_dev/libf/dyn3dmem/leapfrog_loc.F90) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynetat0_loc.f90
r5184 r5185 1 SUBROUTINE dynetat0_loc(fichnom, vcov,ucov,teta,q,masse,ps,phis,time)2 3 !-------------------------------------------------------------------------------4 ! Authors: P. Le Van , L.Fairhead5 !-------------------------------------------------------------------------------6 ! Purpose: Initial state reading.7 !-------------------------------------------------------------------------------1 SUBROUTINE dynetat0_loc(fichnom, vcov, ucov, teta, q, masse, ps, phis, time) 2 3 !------------------------------------------------------------------------------- 4 ! Authors: P. Le Van , L.Fairhead 5 !------------------------------------------------------------------------------- 6 ! Purpose: Initial state reading. 7 !------------------------------------------------------------------------------- 8 8 USE parallel_lmdz 9 USE lmdz_infotrac, ONLY: nqtot, tracers, niso, iqIsoPha, iH2O, isoName9 USE lmdz_infotrac, ONLY: nqtot, tracers, niso, iqIsoPha, iH2O, isoName 10 10 USE lmdz_strings, ONLY: maxlen, msg, strStack, real2str, int2str, strIdx 11 USE netcdf, ONLY: nf90_open,nf90_nowrite, nf90_inquire_dimension, nf90_inq_varid, &12 nf90_close, nf90_get_var, nf90_inquire_variable,nf90_noerr11 USE netcdf, ONLY: nf90_open, nf90_nowrite, nf90_inquire_dimension, nf90_inq_varid, & 12 nf90_close, nf90_get_var, nf90_inquire_variable, nf90_noerr 13 13 USE lmdz_readTracFiles, ONLY: new2oldH2O, newHNO3, oldHNO3, getKey 14 14 USE control_mod, ONLY: planet_type 15 15 USE lmdz_assert_eq, ONLY: assert_eq 16 USE comvert_mod, ONLY: pa, preff16 USE comvert_mod, ONLY: pa, preff 17 17 USE comconst_mod, ONLY: cpp, daysec, dtvr, g, im, jm, kappa, lllm, omeg, rad 18 18 USE logic_mod, ONLY: fxyhypb, ysinus 19 19 USE serre_mod, ONLY: clon, clat, grossismx, grossismy 20 20 USE temps_mod, ONLY: annee_ref, day_ini, day_ref, itau_dyn, start_time 21 USE ener_mod, ONLY: etot0, ptot0,ztot0,stot0,ang022 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA 21 USE ener_mod, ONLY: etot0, ptot0, ztot0, stot0, ang0 22 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA, CPPKEY_REPROBUS 23 23 USE lmdz_description, ONLY: descript 24 24 USE lmdz_iniprint, ONLY: lunout, prt_level 25 25 USE lmdz_comgeom 26 26 27 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm27 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 28 28 USE lmdz_paramet 29 29 IMPLICIT NONE 30 30 31 31 32 !===============================================================================33 ! Arguments:34 CHARACTER(LEN =*), INTENT(IN) :: fichnom !--- FILE NAME35 REAL, INTENT(OUT) :: vcov(ijb_v:ije_v,llm) !--- V COVARIANT WIND36 REAL, INTENT(OUT) :: ucov(ijb_u:ije_u,llm) !--- U COVARIANT WIND37 REAL, INTENT(OUT) :: teta(ijb_u:ije_u,llm) !--- POTENTIAL TEMP.38 REAL, INTENT(OUT) :: q(ijb_u:ije_u,llm,nqtot)!--- TRACERS39 REAL, INTENT(OUT) :: masse(ijb_u:ije_u, llm) !--- MASS PER CELL40 REAL, INTENT(OUT) :: ps(ijb_u:ije_u) !--- GROUND PRESSURE41 REAL, INTENT(OUT) :: phis(ijb_u:ije_u) !--- GEOPOTENTIAL42 !===============================================================================43 ! Local variables:44 CHARACTER(LEN =maxlen) :: mesg, var, modname, oldVar45 INTEGER, PARAMETER :: length =10032 !=============================================================================== 33 ! Arguments: 34 CHARACTER(LEN = *), INTENT(IN) :: fichnom !--- FILE NAME 35 REAL, INTENT(OUT) :: vcov(ijb_v:ije_v, llm) !--- V COVARIANT WIND 36 REAL, INTENT(OUT) :: ucov(ijb_u:ije_u, llm) !--- U COVARIANT WIND 37 REAL, INTENT(OUT) :: teta(ijb_u:ije_u, llm) !--- POTENTIAL TEMP. 38 REAL, INTENT(OUT) :: q(ijb_u:ije_u, llm, nqtot)!--- TRACERS 39 REAL, INTENT(OUT) :: masse(ijb_u:ije_u, llm) !--- MASS PER CELL 40 REAL, INTENT(OUT) :: ps(ijb_u:ije_u) !--- GROUND PRESSURE 41 REAL, INTENT(OUT) :: phis(ijb_u:ije_u) !--- GEOPOTENTIAL 42 !=============================================================================== 43 ! Local variables: 44 CHARACTER(LEN = maxlen) :: mesg, var, modname, oldVar 45 INTEGER, PARAMETER :: length = 100 46 46 INTEGER :: iq, fID, vID, idecal, ierr, iqParent, iName, iZone, iPhase, ix 47 REAL :: time,tab_cntrl(length) !--- RUN PARAMS TABLE48 REAL :: tnat, alpha_ideal49 REAL, ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:),ps_glo(:)50 REAL, ALLOCATABLE :: ucov_glo(:,:), q_glo(:,:), phis_glo(:)51 REAL, ALLOCATABLE :: teta_glo(:,:)47 REAL :: time, tab_cntrl(length) !--- RUN PARAMS TABLE 48 REAL :: tnat, alpha_ideal 49 REAL, ALLOCATABLE :: vcov_glo(:, :), masse_glo(:, :), ps_glo(:) 50 REAL, ALLOCATABLE :: ucov_glo(:, :), q_glo(:, :), phis_glo(:) 51 REAL, ALLOCATABLE :: teta_glo(:, :) 52 52 LOGICAL :: lSkip, ll 53 LOGICAL, PARAMETER :: tnat1=.TRUE.54 !-------------------------------------------------------------------------------55 modname ="dynetat0_loc"56 57 !--- Initial state file opening58 var =fichnom59 CALL err(nf90_open(var, nf90_nowrite,fID),"open",var)60 CALL get_var1("controle", tab_cntrl)61 62 !!! AS: idecal is a hack to be able to read planeto starts...63 !!! .... while keeping everything OK for LMDZ EARTH53 LOGICAL, PARAMETER :: tnat1 = .TRUE. 54 !------------------------------------------------------------------------------- 55 modname = "dynetat0_loc" 56 57 !--- Initial state file opening 58 var = fichnom 59 CALL err(nf90_open(var, nf90_nowrite, fID), "open", var) 60 CALL get_var1("controle", tab_cntrl) 61 62 !!! AS: idecal is a hack to be able to read planeto starts... 63 !!! .... while keeping everything OK for LMDZ EARTH 64 64 IF(planet_type=="generic") THEN 65 65 CALL msg('NOTE NOTE NOTE : Planeto-like start files', modname) 66 66 idecal = 4 67 annee_ref = 200067 annee_ref = 2000 68 68 ELSE 69 69 CALL msg('NOTE NOTE NOTE : Earth-like start files', modname) 70 70 idecal = 5 71 annee_ref = tab_cntrl(5)71 annee_ref = tab_cntrl(5) 72 72 END IF 73 im = tab_cntrl(1)74 jm = tab_cntrl(2)75 lllm = tab_cntrl(3)76 day_ref = tab_cntrl(4)77 rad = tab_cntrl(idecal+1)78 omeg = tab_cntrl(idecal+2)79 g = tab_cntrl(idecal+3)80 cpp = tab_cntrl(idecal+4)81 kappa = tab_cntrl(idecal+5)82 daysec = tab_cntrl(idecal+6)83 dtvr = tab_cntrl(idecal+7)84 etot0 = tab_cntrl(idecal+8)85 ptot0 = tab_cntrl(idecal+9)86 ztot0 = tab_cntrl(idecal+10)87 stot0 = tab_cntrl(idecal+11)88 ang0 = tab_cntrl(idecal+12)89 pa = tab_cntrl(idecal+13)90 preff = tab_cntrl(idecal+14)91 92 clon = tab_cntrl(idecal+15)93 clat = tab_cntrl(idecal+16)94 grossismx = tab_cntrl(idecal+17)95 grossismy = tab_cntrl(idecal+18)96 97 IF ( tab_cntrl(idecal+19)==1.) THEN98 fxyhypb = .TRUE.99 ! dzoomx = tab_cntrl(25)100 ! dzoomy = tab_cntrl(26)101 ! taux = tab_cntrl(28)102 ! tauy = tab_cntrl(29)73 im = tab_cntrl(1) 74 jm = tab_cntrl(2) 75 lllm = tab_cntrl(3) 76 day_ref = tab_cntrl(4) 77 rad = tab_cntrl(idecal + 1) 78 omeg = tab_cntrl(idecal + 2) 79 g = tab_cntrl(idecal + 3) 80 cpp = tab_cntrl(idecal + 4) 81 kappa = tab_cntrl(idecal + 5) 82 daysec = tab_cntrl(idecal + 6) 83 dtvr = tab_cntrl(idecal + 7) 84 etot0 = tab_cntrl(idecal + 8) 85 ptot0 = tab_cntrl(idecal + 9) 86 ztot0 = tab_cntrl(idecal + 10) 87 stot0 = tab_cntrl(idecal + 11) 88 ang0 = tab_cntrl(idecal + 12) 89 pa = tab_cntrl(idecal + 13) 90 preff = tab_cntrl(idecal + 14) 91 92 clon = tab_cntrl(idecal + 15) 93 clat = tab_cntrl(idecal + 16) 94 grossismx = tab_cntrl(idecal + 17) 95 grossismy = tab_cntrl(idecal + 18) 96 97 IF (tab_cntrl(idecal + 19)==1.) THEN 98 fxyhypb = .TRUE. 99 ! dzoomx = tab_cntrl(25) 100 ! dzoomy = tab_cntrl(26) 101 ! taux = tab_cntrl(28) 102 ! tauy = tab_cntrl(29) 103 103 ELSE 104 104 fxyhypb = .FALSE. 105 ysinus = tab_cntrl(idecal+22)==1.105 ysinus = tab_cntrl(idecal + 22)==1. 106 106 END IF 107 107 108 day_ini = tab_cntrl(30)109 itau_dyn = tab_cntrl(31)108 day_ini = tab_cntrl(30) 109 itau_dyn = tab_cntrl(31) 110 110 start_time = tab_cntrl(32) 111 111 112 !-------------------------------------------------------------------------------113 CALL msg('rad, omeg, g, cpp, kappa = ' //TRIM(strStack(real2str([rad,omeg,g,cpp,kappa]))), modname)114 CALL check_dim(im, iim,'im','im')115 CALL check_dim(jm, jjm,'jm','jm')116 CALL check_dim(lllm, llm,'lm','lllm')117 CALL get_var1("rlonu", rlonu)118 CALL get_var1("rlatu", rlatu)119 CALL get_var1("rlonv", rlonv)120 CALL get_var1("rlatv", rlatv)121 CALL get_var1("cu" ,cu)122 CALL get_var1("cv" ,cv)123 CALL get_var1("aire", aire)124 125 var ="temps"126 IF(nf90_inq_varid(fID, var,vID)/=nf90_noerr) THEN112 !------------------------------------------------------------------------------- 113 CALL msg('rad, omeg, g, cpp, kappa = ' // TRIM(strStack(real2str([rad, omeg, g, cpp, kappa]))), modname) 114 CALL check_dim(im, iim, 'im', 'im') 115 CALL check_dim(jm, jjm, 'jm', 'jm') 116 CALL check_dim(lllm, llm, 'lm', 'lllm') 117 CALL get_var1("rlonu", rlonu) 118 CALL get_var1("rlatu", rlatu) 119 CALL get_var1("rlonv", rlonv) 120 CALL get_var1("rlatv", rlatv) 121 CALL get_var1("cu", cu) 122 CALL get_var1("cv", cv) 123 CALL get_var1("aire", aire) 124 125 var = "temps" 126 IF(nf90_inq_varid(fID, var, vID)/=nf90_noerr) THEN 127 127 CALL msg('missing field <temps> ; trying with <Time>', modname) 128 var ="Time"129 CALL err(nf90_inq_varid(fID, var,vID),"inq",var)128 var = "Time" 129 CALL err(nf90_inq_varid(fID, var, vID), "inq", var) 130 130 END IF 131 CALL err(nf90_get_var(fID, vID,time),"get",var)131 CALL err(nf90_get_var(fID, vID, time), "get", var) 132 132 133 133 ALLOCATE(phis_glo(ip1jmp1)) 134 CALL get_var1("phisinit", phis_glo)135 phis (ijb_u:ije_u) =phis_glo(ijb_u:ije_u); DEALLOCATE(phis_glo)136 137 ALLOCATE(ucov_glo(ip1jmp1, llm))138 CALL get_var2("ucov", ucov_glo)139 ucov (ijb_u:ije_u, :)=ucov_glo(ijb_u:ije_u,:); DEALLOCATE(ucov_glo)140 141 ALLOCATE(vcov_glo(ip1jm, llm))142 CALL get_var2("vcov", vcov_glo)143 vcov (ijb_v:ije_v, :)=vcov_glo(ijb_v:ije_v,:); DEALLOCATE(vcov_glo)144 145 ALLOCATE(teta_glo(ip1jmp1, llm))146 CALL get_var2("teta", teta_glo)147 teta (ijb_u:ije_u, :)=teta_glo(ijb_u:ije_u,:); DEALLOCATE(teta_glo)148 149 ALLOCATE(masse_glo(ip1jmp1, llm))150 CALL get_var2("masse", masse_glo)151 masse(ijb_u:ije_u, :)=masse_glo(ijb_u:ije_u,:); DEALLOCATE(masse_glo)152 134 CALL get_var1("phisinit", phis_glo) 135 phis (ijb_u:ije_u) = phis_glo(ijb_u:ije_u); DEALLOCATE(phis_glo) 136 137 ALLOCATE(ucov_glo(ip1jmp1, llm)) 138 CALL get_var2("ucov", ucov_glo) 139 ucov (ijb_u:ije_u, :) = ucov_glo(ijb_u:ije_u, :); DEALLOCATE(ucov_glo) 140 141 ALLOCATE(vcov_glo(ip1jm, llm)) 142 CALL get_var2("vcov", vcov_glo) 143 vcov (ijb_v:ije_v, :) = vcov_glo(ijb_v:ije_v, :); DEALLOCATE(vcov_glo) 144 145 ALLOCATE(teta_glo(ip1jmp1, llm)) 146 CALL get_var2("teta", teta_glo) 147 teta (ijb_u:ije_u, :) = teta_glo(ijb_u:ije_u, :); DEALLOCATE(teta_glo) 148 149 ALLOCATE(masse_glo(ip1jmp1, llm)) 150 CALL get_var2("masse", masse_glo) 151 masse(ijb_u:ije_u, :) = masse_glo(ijb_u:ije_u, :); DEALLOCATE(masse_glo) 152 153 153 ALLOCATE(ps_glo(ip1jmp1)) 154 CALL get_var1("ps", ps_glo)155 ps (ijb_u:ije_u) =ps_glo(ijb_u:ije_u); DEALLOCATE(ps_glo)156 157 !--- Tracers158 ALLOCATE(q_glo(ip1jmp1, llm))154 CALL get_var1("ps", ps_glo) 155 ps (ijb_u:ije_u) = ps_glo(ijb_u:ije_u); DEALLOCATE(ps_glo) 156 157 !--- Tracers 158 ALLOCATE(q_glo(ip1jmp1, llm)) 159 159 ll = .FALSE. 160 #ifdef REPROBUS 161 ll = nf90_inq_varid(fID, 'HNO3tot', vID) /= nf90_noerr !--- DETECT OLD REPRO start.nc FILE162 #endif 163 DO iq =1,nqtot160 IF (CPPKEY_REPROBUS) THEN 161 ll = nf90_inq_varid(fID, 'HNO3tot', vID) /= nf90_noerr !--- DETECT OLD REPRO start.nc FILE 162 END IF 163 DO iq = 1, nqtot 164 164 var = tracers(iq)%name 165 165 oldVar = new2oldH2O(var) 166 166 lSkip = ll .AND. var == 'HNO3' !--- FORCE "HNO3_g" READING FOR "HNO3" 167 #ifdef REPROBUS 168 ix = strIdx(newHNO3, var); IF(ix /= 0) oldVar = oldHNO3(ix) !--- REPROBUS HNO3 exceptions169 #endif 167 IF (CPPKEY_REPROBUS) THEN 168 ix = strIdx(newHNO3, var); IF(ix /= 0) oldVar = oldHNO3(ix) !--- REPROBUS HNO3 exceptions 169 END IF 170 170 IF (CPPKEY_INCA) THEN 171 171 IF(var == 'O3') oldVar = 'OX' !--- DEAL WITH INCA OZONE EXCEPTION … … 173 173 !-------------------------------------------------------------------------------------------------------------------------- 174 174 IF(nf90_inq_varid(fID, var, vID) == nf90_noerr .AND. .NOT.lSkip) THEN !=== REGULAR CASE: AVAILABLE VARIABLE 175 CALL get_var2(var, q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:)176 !--------------------------------------------------------------------------------------------------------------------------175 CALL get_var2(var, q_glo); q(ijb_u:ije_u, :, iq) = q_glo(ijb_u:ije_u, :) 176 !-------------------------------------------------------------------------------------------------------------------------- 177 177 ELSE IF(nf90_inq_varid(fID, oldVar, vID) == nf90_noerr) THEN !=== TRY WITH ALTERNATE NAME 178 CALL msg('Tracer <' //TRIM(var)//'> is missing => initialized to <'//TRIM(oldVar)//'>', modname)179 CALL get_var2(oldVar, q_glo); q(ijb_u:ije_u, :,iq)=q_glo(ijb_u:ije_u,:)180 !--------------------------------------------------------------------------------------------------------------------------178 CALL msg('Tracer <' // TRIM(var) // '> is missing => initialized to <' // TRIM(oldVar) // '>', modname) 179 CALL get_var2(oldVar, q_glo); q(ijb_u:ije_u, :, iq) = q_glo(ijb_u:ije_u, :) 180 !-------------------------------------------------------------------------------------------------------------------------- 181 181 ELSE IF(tracers(iq)%iso_iGroup == iH2O .AND. niso > 0) THEN !=== WATER ISOTOPES 182 iName = tracers(iq)%iso_iName183 iPhase = tracers(iq)%iso_iPhase182 iName = tracers(iq)%iso_iName 183 iPhase = tracers(iq)%iso_iPhase 184 184 iqParent = tracers(iq)%iqParent 185 185 IF(tracers(iq)%iso_iZone == 0) THEN 186 IF (tnat1) THEN187 tnat=1.0188 alpha_ideal=1.0189 WRITE(*,*) 'attention dans dynetat0: les alpha_ideal sont a 1'190 else186 IF (tnat1) THEN 187 tnat = 1.0 188 alpha_ideal = 1.0 189 WRITE(*, *) 'attention dans dynetat0: les alpha_ideal sont a 1' 190 else 191 191 IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) & 192 CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)193 endif194 CALL msg('Tracer <'//TRIM(var)//'> is missing => initialized with a simplified Rayleigh distillation law.', modname)195 q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)196 ! Camille 9 mars 2023: point de vigilence: initialisation incohérente197 ! avec celle de xt_ancien dans la physiq.192 CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1) 193 endif 194 CALL msg('Tracer <' // TRIM(var) // '> is missing => initialized with a simplified Rayleigh distillation law.', modname) 195 q(ijb_u:ije_u, :, iq) = q(ijb_u:ije_u, :, iqParent) * tnat * (q(ijb_u:ije_u, :, iqParent) / 30.e-3)**(alpha_ideal - 1.) 196 ! Camille 9 mars 2023: point de vigilence: initialisation incohérente 197 ! avec celle de xt_ancien dans la physiq. 198 198 ELSE 199 CALL msg('Tracer <'//TRIM(var)//'> is missing => initialized to its parent isotope concentration.', modname)200 ! Camille 9 mars 2023: attention!! seuls les tags qui correspondent à201 ! izone=izone_init (définie dans isotrac_mod) sont initialisés comme202 ! les parents. Sinon, c'est nul.203 ! j'ai fait ça en attendant, mais il faudrait initialiser proprement en204 ! remplacant 1 par izone_init dans la ligne qui suit.205 IF(tracers(iq)%iso_iZone == 1) THEN206 q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))207 ELSE208 q(ijb_u:ije_u,:,iq) =0.209 ENDIF199 CALL msg('Tracer <' // TRIM(var) // '> is missing => initialized to its parent isotope concentration.', modname) 200 ! Camille 9 mars 2023: attention!! seuls les tags qui correspondent à 201 ! izone=izone_init (définie dans isotrac_mod) sont initialisés comme 202 ! les parents. Sinon, c'est nul. 203 ! j'ai fait ça en attendant, mais il faudrait initialiser proprement en 204 ! remplacant 1 par izone_init dans la ligne qui suit. 205 IF(tracers(iq)%iso_iZone == 1) THEN 206 q(ijb_u:ije_u, :, iq) = q(ijb_u:ije_u, :, iqIsoPha(iName, iPhase)) 207 ELSE 208 q(ijb_u:ije_u, :, iq) = 0. 209 ENDIF 210 210 END IF 211 !--------------------------------------------------------------------------------------------------------------------------211 !-------------------------------------------------------------------------------------------------------------------------- 212 212 ELSE !=== MISSING: SET TO 0 213 CALL msg('Tracer <' //TRIM(var)//'> is missing => initialized to zero', modname)214 q(ijb_u:ije_u, :,iq)=0.215 !--------------------------------------------------------------------------------------------------------------------------213 CALL msg('Tracer <' // TRIM(var) // '> is missing => initialized to zero', modname) 214 q(ijb_u:ije_u, :, iq) = 0. 215 !-------------------------------------------------------------------------------------------------------------------------- 216 216 END IF 217 217 END DO 218 218 DEALLOCATE(q_glo) 219 CALL err(nf90_close(fID),"close",fichnom) 220 day_ini=day_ini+INT(time) 221 time=time-INT(time) 222 223 224 CONTAINS 225 226 227 SUBROUTINE check_dim(n1,n2,str1,str2) 228 INTEGER, INTENT(IN) :: n1, n2 229 CHARACTER(LEN=*), INTENT(IN) :: str1, str2 230 CHARACTER(LEN=maxlen) :: s1, s2 231 IF(n1/=n2) CALL abort_gcm(TRIM(modname), 'value of "'//TRIM(str1)//'" = '//TRIM(int2str(n1))// & 232 ' read in starting file differs from gcm value of "'//TRIM(str2)//'" = '//TRIM(int2str(n2)), 1) 233 END SUBROUTINE check_dim 234 235 236 SUBROUTINE get_var1(var,v) 237 CHARACTER(LEN=*), INTENT(IN) :: var 238 REAL, INTENT(OUT) :: v(:) 239 REAL, ALLOCATABLE :: w2(:,:), w3(:,:,:) 240 INTEGER :: nn(3), dids(3), k, nd, ntot 241 242 CALL err(nf90_inq_varid(fID,var,vID),"inq",var) 243 ierr=nf90_inquire_variable(fID,vID,ndims=nd) 244 IF(nd==1) THEN 245 CALL err(nf90_get_var(fID,vID,v),"get",var); RETURN 246 END IF 247 ierr=nf90_inquire_variable(fID,vID,dimids=dids) 248 DO k=1,nd; ierr=nf90_inquire_dimension(fID,dids(k),len=nn(k)); END DO 249 ntot=PRODUCT(nn(1:nd)) 250 SELECT CASE(nd) 251 CASE(2); ALLOCATE(w2(nn(1),nn(2))) 252 CALL err(nf90_get_var(fID,vID,w2),"get",var) 253 v=RESHAPE(w2,[ntot]); DEALLOCATE(w2) 254 CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3))) 255 CALL err(nf90_get_var(fID,vID,w3),"get",var) 256 v=RESHAPE(w3,[ntot]); DEALLOCATE(w3) 257 END SELECT 258 END SUBROUTINE get_var1 259 260 SUBROUTINE get_var2(var,v) 261 CHARACTER(LEN=*), INTENT(IN) :: var 262 REAL, INTENT(OUT) :: v(:,:) 263 REAL, ALLOCATABLE :: w4(:,:,:,:), w3(:,:,:) 264 INTEGER :: nn(4), dids(4), k, nd 265 266 267 CALL err(nf90_inq_varid(fID,var,vID),"inq",var) 268 ierr=nf90_inquire_variable(fID,vID,ndims=nd) 269 270 IF(nd==1) THEN 271 CALL err(nf90_get_var(fID,vID,v),"get",var); RETURN 272 END IF 273 ierr=nf90_inquire_variable(fID,vID,dimids=dids) 274 275 DO k=1,nd; ierr=nf90_inquire_dimension(fID,dids(k),len=nn(k)); END DO 276 277 SELECT CASE(nd) 278 CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3))) 279 CALL err(nf90_get_var(fID,vID,w3),"get",var) 280 v=RESHAPE(w3,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w3) 281 CASE(4); ALLOCATE(w4(nn(1),nn(2),nn(3),nn(4))) 282 CALL err(nf90_get_var(fID,vID,w4),"get",var) 283 v=RESHAPE(w4,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w4) 284 END SELECT 285 END SUBROUTINE get_var2 286 287 288 SUBROUTINE err(ierr,typ,nam) 289 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 290 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 291 CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD/FILE NAME 292 IF(ierr==nf90_noerr) RETURN 293 SELECT CASE(typ) 294 CASE('inq'); mesg="Field <"//TRIM(nam)//"> is missing" 295 CASE('get'); mesg="Reading failed for <"//TRIM(nam)//">" 296 CASE('open'); mesg="File opening failed for <"//TRIM(nam)//">" 297 CASE('close'); mesg="File closing failed for <"//TRIM(nam)//">" 298 END SELECT 299 CALL ABORT_gcm(TRIM(modname),TRIM(mesg),ierr) 300 END SUBROUTINE err 219 CALL err(nf90_close(fID), "close", fichnom) 220 day_ini = day_ini + INT(time) 221 time = time - INT(time) 222 223 224 CONTAINS 225 226 227 SUBROUTINE check_dim(n1, n2, str1, str2) 228 INTEGER, INTENT(IN) :: n1, n2 229 CHARACTER(LEN = *), INTENT(IN) :: str1, str2 230 CHARACTER(LEN = maxlen) :: s1, s2 231 IF(n1/=n2) CALL abort_gcm(TRIM(modname), 'value of "' // TRIM(str1) // '" = ' // TRIM(int2str(n1)) // & 232 ' read in starting file differs from gcm value of "' // TRIM(str2) // '" = ' // TRIM(int2str(n2)), 1) 233 END SUBROUTINE check_dim 234 235 236 SUBROUTINE get_var1(var, v) 237 CHARACTER(LEN = *), INTENT(IN) :: var 238 REAL, INTENT(OUT) :: v(:) 239 REAL, ALLOCATABLE :: w2(:, :), w3(:, :, :) 240 INTEGER :: nn(3), dids(3), k, nd, ntot 241 242 CALL err(nf90_inq_varid(fID, var, vID), "inq", var) 243 ierr = nf90_inquire_variable(fID, vID, ndims = nd) 244 IF(nd==1) THEN 245 CALL err(nf90_get_var(fID, vID, v), "get", var); RETURN 246 END IF 247 ierr = nf90_inquire_variable(fID, vID, dimids = dids) 248 DO k = 1, nd; ierr = nf90_inquire_dimension(fID, dids(k), len = nn(k)); 249 END DO 250 ntot = PRODUCT(nn(1:nd)) 251 SELECT CASE(nd) 252 CASE(2); ALLOCATE(w2(nn(1), nn(2))) 253 CALL err(nf90_get_var(fID, vID, w2), "get", var) 254 v = RESHAPE(w2, [ntot]); DEALLOCATE(w2) 255 CASE(3); ALLOCATE(w3(nn(1), nn(2), nn(3))) 256 CALL err(nf90_get_var(fID, vID, w3), "get", var) 257 v = RESHAPE(w3, [ntot]); DEALLOCATE(w3) 258 END SELECT 259 END SUBROUTINE get_var1 260 261 SUBROUTINE get_var2(var, v) 262 CHARACTER(LEN = *), INTENT(IN) :: var 263 REAL, INTENT(OUT) :: v(:, :) 264 REAL, ALLOCATABLE :: w4(:, :, :, :), w3(:, :, :) 265 INTEGER :: nn(4), dids(4), k, nd 266 267 CALL err(nf90_inq_varid(fID, var, vID), "inq", var) 268 ierr = nf90_inquire_variable(fID, vID, ndims = nd) 269 270 IF(nd==1) THEN 271 CALL err(nf90_get_var(fID, vID, v), "get", var); RETURN 272 END IF 273 ierr = nf90_inquire_variable(fID, vID, dimids = dids) 274 275 DO k = 1, nd; ierr = nf90_inquire_dimension(fID, dids(k), len = nn(k)); 276 END DO 277 278 SELECT CASE(nd) 279 CASE(3); ALLOCATE(w3(nn(1), nn(2), nn(3))) 280 CALL err(nf90_get_var(fID, vID, w3), "get", var) 281 v = RESHAPE(w3, [nn(1) * nn(2), nn(3)]); DEALLOCATE(w3) 282 CASE(4); ALLOCATE(w4(nn(1), nn(2), nn(3), nn(4))) 283 CALL err(nf90_get_var(fID, vID, w4), "get", var) 284 v = RESHAPE(w4, [nn(1) * nn(2), nn(3)]); DEALLOCATE(w4) 285 END SELECT 286 END SUBROUTINE get_var2 287 288 289 SUBROUTINE err(ierr, typ, nam) 290 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 291 CHARACTER(LEN = *), INTENT(IN) :: typ !--- TYPE OF OPERATION 292 CHARACTER(LEN = *), INTENT(IN) :: nam !--- FIELD/FILE NAME 293 IF(ierr==nf90_noerr) RETURN 294 SELECT CASE(typ) 295 CASE('inq'); mesg = "Field <" // TRIM(nam) // "> is missing" 296 CASE('get'); mesg = "Reading failed for <" // TRIM(nam) // ">" 297 CASE('open'); mesg = "File opening failed for <" // TRIM(nam) // ">" 298 CASE('close'); mesg = "File closing failed for <" // TRIM(nam) // ">" 299 END SELECT 300 CALL ABORT_gcm(TRIM(modname), TRIM(mesg), ierr) 301 END SUBROUTINE err 301 302 302 303 END SUBROUTINE dynetat0_loc -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/leapfrog_loc.f90
r5184 r5185 39 39 xios_set_current_context, & 40 40 using_xios 41 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO 41 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO, CPPKEY_REPROBUS 42 42 USE lmdz_description, ONLY: descript 43 43 USE lmdz_iniprint, ONLY: lunout, prt_level … … 81 81 ! Declarations: 82 82 ! ------------- 83 84 85 86 83 87 84 REAL, INTENT(IN) :: time_0 ! not used … … 319 316 320 317 IF (ok_guide) THEN 321 CALL guide_main(itau, ucov,vcov,teta,q,masse,ps)322 !$OMP BARRIER318 CALL guide_main(itau, ucov, vcov, teta, q, masse, ps) 319 !$OMP BARRIER 323 320 ENDIF 324 321 … … 796 793 !c$OMP END PARALLEL 797 794 798 799 800 795 IF(apphys) THEN 801 796 … … 952 947 endif 953 948 954 IF (ANY(type_trac == ['inca', 'inco'])) THEN 955 CALL finalize_inca 956 ! switching back to LMDZDYN context 957 !$OMP MASTER 958 IF (ok_dyn_xios) THEN 959 CALL xios_set_current_context(dyn3d_ctx_handle) 960 ENDIF 961 !$OMP END MASTER 949 IF (ANY(type_trac == ['inca', 'inco'])) THEN 950 CALL finalize_inca 951 ! switching back to LMDZDYN context 952 !$OMP MASTER 953 IF (ok_dyn_xios) THEN 954 CALL xios_set_current_context(dyn3d_ctx_handle) 962 955 ENDIF 963 #ifdef REPROBUS 964 IF (type_trac == 'repr') CALL finalize_reprobus 965 #endif 956 !$OMP END MASTER 957 ENDIF 958 IF (CPPKEY_REPROBUS) THEN 959 IF (type_trac == 'repr') CALL finalize_reprobus 960 END IF 966 961 967 962 !$OMP MASTER … … 1005 1000 !$OMP END MASTER 1006 1001 1007 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1008 CALL finalize_inca 1009 ! switching back to LMDZDYN context 1010 !$OMP MASTER 1011 IF (ok_dyn_xios) THEN 1012 CALL xios_set_current_context(dyn3d_ctx_handle) 1013 ENDIF 1014 !$OMP END MASTER 1002 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1003 CALL finalize_inca 1004 ! switching back to LMDZDYN context 1005 !$OMP MASTER 1006 IF (ok_dyn_xios) THEN 1007 CALL xios_set_current_context(dyn3d_ctx_handle) 1015 1008 ENDIF 1016 #ifdef REPROBUS 1017 IF (type_trac == 'repr') CALL finalize_reprobus 1018 #endif 1009 !$OMP END MASTER 1010 ENDIF 1011 IF (CPPKEY_REPROBUS) THEN 1012 IF (type_trac == 'repr') CALL finalize_reprobus 1013 END IF 1019 1014 1020 1015 !$OMP MASTER … … 1044 1039 !$OMP BARRIER 1045 1040 1046 IF (ok_dynzon) THEN1047 1048 CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, &1049 ps, masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)1050 1051 ENDIF !ok_dynzon1052 1053 IF (ok_dyn_ave) THEN1054 CALL writedynav_loc(itau,vcov, &1055 ucov,teta,pk,phi,q,masse,ps,phis)1056 ENDIF1041 IF (ok_dynzon) THEN 1042 1043 CALL bilan_dyn_loc(2, dtvr * iperiod, dtvr * day_step * periodav, & 1044 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q) 1045 1046 ENDIF !ok_dynzon 1047 1048 IF (ok_dyn_ave) THEN 1049 CALL writedynav_loc(itau, vcov, & 1050 ucov, teta, pk, phi, q, masse, ps, phis) 1051 ENDIF 1057 1052 1058 1053 ENDIF … … 1073 1068 !$OMP BARRIER 1074 1069 1075 IF (ok_dyn_ins) THEN1076 CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, &1077 masse,ps,phis)1078 endif1070 IF (ok_dyn_ins) THEN 1071 CALL writehist_loc(itau, vcov, ucov, teta, pk, phi, q, & 1072 masse, ps, phis) 1073 endif 1079 1074 1080 1075 IF (ok_dyn_xios) THEN … … 1167 1162 !$OMP END MASTER 1168 1163 1169 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1170 CALL finalize_inca 1171 ! switching back to LMDZDYN context 1172 !$OMP MASTER 1173 IF (ok_dyn_xios) THEN 1174 CALL xios_set_current_context(dyn3d_ctx_handle) 1175 ENDIF 1176 !$OMP END MASTER 1164 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1165 CALL finalize_inca 1166 ! switching back to LMDZDYN context 1167 !$OMP MASTER 1168 IF (ok_dyn_xios) THEN 1169 CALL xios_set_current_context(dyn3d_ctx_handle) 1177 1170 ENDIF 1178 #ifdef REPROBUS 1179 IF (type_trac == 'repr') CALL finalize_reprobus 1180 #endif 1171 !$OMP END MASTER 1172 ENDIF 1173 IF (CPPKEY_REPROBUS) THEN 1174 IF (type_trac == 'repr') CALL finalize_reprobus 1175 END IF 1181 1176 1182 1177 !$OMP MASTER … … 1200 1195 ENDIF 1201 1196 1202 ! Ehouarn: re-compute geopotential for outputs 1203 !$OMP BARRIER 1204 !$OMP MASTER 1205 CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi) 1206 !$OMP END MASTER 1207 !$OMP BARRIER 1208 1209 IF (ok_dynzon) THEN 1210 CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, & 1211 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q) 1212 ENDIF 1213 1214 IF (ok_dyn_ave) THEN 1215 CALL writedynav_loc(itau,vcov, & 1216 ucov,teta,pk,phi,q,masse,ps,phis) 1217 ENDIF 1218 1219 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) 1220 1221 IF(MOD(itau, iecri)==0) THEN 1222 1197 ! Ehouarn: re-compute geopotential for outputs 1223 1198 !$OMP BARRIER 1224 1199 !$OMP MASTER … … 1227 1202 !$OMP BARRIER 1228 1203 1229 1230 IF (ok_dyn_ins) THEN 1231 CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, & 1232 masse,ps,phis) 1233 endif ! of if (ok_dyn_ins) 1204 IF (ok_dynzon) THEN 1205 CALL bilan_dyn_loc(2, dtvr * iperiod, dtvr * day_step * periodav, & 1206 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q) 1207 ENDIF 1208 1209 IF (ok_dyn_ave) THEN 1210 CALL writedynav_loc(itau, vcov, & 1211 ucov, teta, pk, phi, q, masse, ps, phis) 1212 ENDIF 1213 1214 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) 1215 1216 IF(MOD(itau, iecri)==0) THEN 1217 1218 !$OMP BARRIER 1219 !$OMP MASTER 1220 CALL geopot_loc(ip1jmp1, teta, pk, pks, phis, phi) 1221 !$OMP END MASTER 1222 !$OMP BARRIER 1223 1224 IF (ok_dyn_ins) THEN 1225 CALL writehist_loc(itau, vcov, ucov, teta, pk, phi, q, & 1226 masse, ps, phis) 1227 endif ! of if (ok_dyn_ins) 1234 1228 1235 1229 IF (ok_dyn_xios) THEN … … 1269 1263 !$OMP END MASTER 1270 1264 1271 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1272 CALL finalize_inca 1273 ! switching back to LMDZDYN context 1274 !$OMP MASTER 1275 IF (ok_dyn_xios) THEN 1276 CALL xios_set_current_context(dyn3d_ctx_handle) 1277 ENDIF 1278 !$OMP END MASTER 1265 IF (ANY(type_trac == ['inca', 'inco'])) THEN 1266 CALL finalize_inca 1267 ! switching back to LMDZDYN context 1268 !$OMP MASTER 1269 IF (ok_dyn_xios) THEN 1270 CALL xios_set_current_context(dyn3d_ctx_handle) 1279 1271 ENDIF 1280 #ifdef REPROBUS 1281 IF (type_trac == 'repr') CALL finalize_reprobus 1282 #endif 1272 !$OMP END MASTER 1273 ENDIF 1274 IF (CPPKEY_REPROBUS) THEN 1275 IF (type_trac == 'repr') CALL finalize_reprobus 1276 END IF 1283 1277 1284 1278 !$OMP MASTER
Note: See TracChangeset
for help on using the changeset viewer.
