Changeset 2299
- Timestamp:
- Jun 15, 2015, 8:48:31 PM (9 years ago)
- Location:
- LMDZ5/trunk/libf
- Files:
-
- 1 added
- 5 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dyn3d/dynetat0.f90
r2298 r2299 109 109 CALL get_var2("cv" ,cv) 110 110 CALL get_var2("aire" ,aire) 111 CALL get_var2("phisinit",phis)112 111 var="temps" 113 112 IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN … … 117 116 END IF 118 117 CALL err(NF90_GET_VAR(fID,vID,time),"get",var) 118 CALL get_var2("phisinit",phis) 119 119 CALL get_var3("ucov",ucov) 120 120 CALL get_var3("vcov",vcov) … … 126 126 DO iq=1,nqtot 127 127 var=tname(iq) 128 IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN 129 WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing" 130 WRITE(lunout,*)" It is hence initialized to zero" 131 q(:,:,:,iq)=0. 132 ELSE 133 CALL err(NF90_GET_VAR(fID,vID,q(:,:,:,iq)),"get",var) 128 IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN 129 CALL err(NF90_GET_VAR(fID,vID,q(:,:,:,iq)),"get",var); CYCLE 130 END IF 131 WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing" 132 WRITE(lunout,*)" It is hence initialized to zero" 133 q(:,:,:,iq)=0. 134 !--- CRisi: for isotops, theoretical initialization using very simplified 135 ! Rayleigh distillation las. 136 IF(ok_isotopes.AND.iso_num(iq)>0) THEN 137 IF(zone_num(iq)==0) q(:,:,:,iq)=q(:,:,:,iqpere(iq))*tnat(iso_num(iq)) & 138 & *(q(:,:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1) 139 IF(zone_num(iq)==1) q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq),phase_num(iq))) 134 140 END IF 135 141 END DO … … 158 164 SUBROUTINE get_var1(var,v) 159 165 CHARACTER(LEN=*), INTENT(IN) :: var 160 #ifdef NC_DOUBLE161 DOUBLE PRECISION, INTENT(OUT) :: v(:)162 #else163 166 REAL, INTENT(OUT) :: v(:) 164 #endif165 167 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 166 168 CALL err(NF90_GET_VAR(fID,vID,v),"get",var) … … 170 172 SUBROUTINE get_var2(var,v) 171 173 CHARACTER(LEN=*), INTENT(IN) :: var 172 #ifdef NC_DOUBLE173 DOUBLE PRECISION, INTENT(OUT) :: v(:,:)174 #else175 174 REAL, INTENT(OUT) :: v(:,:) 176 #endif177 175 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 178 176 CALL err(NF90_GET_VAR(fID,vID,v),"get",var) … … 182 180 SUBROUTINE get_var3(var,v) 183 181 CHARACTER(LEN=*), INTENT(IN) :: var 184 #ifdef NC_DOUBLE185 DOUBLE PRECISION, INTENT(OUT) :: v(:,:,:)186 #else187 182 REAL, INTENT(OUT) :: v(:,:,:) 188 #endif189 183 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 190 184 CALL err(NF90_GET_VAR(fID,vID,v),"get",var) -
LMDZ5/trunk/libf/dyn3d/dynredem.F90
r2293 r2299 8 8 #endif 9 9 USE infotrac 10 USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_REDEF, NF90_INQ_VARID, & 11 NF90_CLOBBER, NF90_CLOSE, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_ATT, & 12 NF90_UNLIMITED, NF90_GLOBAL, NF90_FLOAT, NF90_DOUBLE 13 USE netcdf95, ONLY: NF95_PUT_VAR 10 USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL, & 11 NF90_CLOSE, NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER 12 USE dynredem_mod, ONLY: cre_var, put_var1, put_var2, err, modname, fil 14 13 IMPLICIT NONE 15 14 include "dimensions.h" … … 21 20 include "ener.h" 22 21 include "logic.h" 23 include "netcdf.inc"24 22 include "description.h" 25 23 include "serre.h" … … 35 33 INTEGER, PARAMETER :: length=100 36 34 REAL :: tab_cntrl(length) !--- RUN PARAMETERS TABLE 37 CHARACTER(LEN=20) :: modname38 35 ! For NetCDF: 39 36 CHARACTER(LEN=30) :: unites … … 42 39 INTEGER :: sID, sigID, nID, vID, timID 43 40 INTEGER :: yyears0, jjour0, mmois0 44 REAL :: zan0, zjulian, hours45 !=============================================================================== 46 modname='dynredem0' 41 REAL :: zan0, zjulian, hours 42 !=============================================================================== 43 modname='dynredem0'; fil=fichnom 47 44 #ifdef CPP_IOIPSL 48 45 CALL ymds2ju(annee_ref, 1, iday_end, 0.0, zjulian) … … 102 99 ! start_time: start_time of simulation (not necessarily 0.) 103 100 tab_cntrl(32) = start_time 104 !.........................................................105 101 106 102 !--- File creation … … 121 117 122 118 !--- Define and save invariant fields 123 CALL put_var1( "controle","Parametres de controle" ,[indexID],tab_cntrl)124 CALL put_var1( "rlonu" ,"Longitudes des points U",[rlonuID],rlonu)125 CALL put_var1( "rlatu" ,"Latitudes des points U" ,[rlatuID],rlatu)126 CALL put_var1( "rlonv" ,"Longitudes des points V",[rlonvID],rlonv)127 CALL put_var1( "rlatv" ,"Latitudes des points V" ,[rlatvID],rlatv)128 CALL put_var1( "nivsigs" ,"Numero naturel des couches s" ,[sID] ,nivsigs)129 CALL put_var1( "nivsig" ,"Numero naturel des couches sigma",[sigID],nivsig)130 CALL put_var1( "ap" ,"Coefficient A pour hybride" ,[sigID],ap)131 CALL put_var1( "bp" ,"Coefficient B pour hybride" ,[sigID],bp)132 CALL put_var1( "presnivs","" ,[sID] ,presnivs)119 CALL put_var1(nid,"controle","Parametres de controle" ,[indexID],tab_cntrl) 120 CALL put_var1(nid,"rlonu" ,"Longitudes des points U",[rlonuID],rlonu) 121 CALL put_var1(nid,"rlatu" ,"Latitudes des points U" ,[rlatuID],rlatu) 122 CALL put_var1(nid,"rlonv" ,"Longitudes des points V",[rlonvID],rlonv) 123 CALL put_var1(nid,"rlatv" ,"Latitudes des points V" ,[rlatvID],rlatv) 124 CALL put_var1(nid,"nivsigs" ,"Numero naturel des couches s" ,[sID] ,nivsigs) 125 CALL put_var1(nid,"nivsig" ,"Numero naturel des couches sigma",[sigID],nivsig) 126 CALL put_var1(nid,"ap" ,"Coefficient A pour hybride" ,[sigID],ap) 127 CALL put_var1(nid,"bp" ,"Coefficient B pour hybride" ,[sigID],bp) 128 CALL put_var1(nid,"presnivs","" ,[sID] ,presnivs) 133 129 ! covariant <-> contravariant <-> natural conversion coefficients 134 CALL put_var2( "cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu)135 CALL put_var2( "cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv)136 CALL put_var2( "aire","Aires de chaque maille" ,[rlonvID,rlatuID],aire)137 CALL put_var2( "phisinit","Geopotentiel au sol" ,[rlonvID,rlatuID],phis)130 CALL put_var2(nid,"cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu) 131 CALL put_var2(nid,"cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv) 132 CALL put_var2(nid,"aire","Aires de chaque maille" ,[rlonvID,rlatuID],aire) 133 CALL put_var2(nid,"phisinit","Geopotentiel au sol" ,[rlonvID,rlatuID],phis) 138 134 139 135 !--- Define fields saved later 140 136 WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')"),& 141 137 yyears0,mmois0,jjour0 142 CALL put_var0("temps","Temps de simulation",[timID],unites)143 CALL put_var0("ucov" ,"Vitesse U" ,[rlonuID,rlatuID,sID,timID])144 CALL put_var0("vcov" ,"Vitesse V" ,[rlonvID,rlatvID,sID,timID])145 CALL put_var0("teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])138 CALL cre_var(nid,"temps","Temps de simulation",[timID],unites) 139 CALL cre_var(nid,"ucov" ,"Vitesse U" ,[rlonuID,rlatuID,sID,timID]) 140 CALL cre_var(nid,"vcov" ,"Vitesse V" ,[rlonvID,rlatvID,sID,timID]) 141 CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID]) 146 142 DO iq=1,nqtot 147 CALL put_var0(tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])143 CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID]) 148 144 END DO 149 CALL put_var0("masse","Masse d air" ,[rlonvID,rlatuID,sID,timID]) 150 CALL put_var0("ps" ,"Pression au sol",[rlonvID,rlatuID ,timID]) 151 CALL err(NF90_ENDDEF(nid)) 145 CALL cre_var(nid,"masse","Masse d air" ,[rlonvID,rlatuID,sID,timID]) 146 CALL cre_var(nid,"ps" ,"Pression au sol",[rlonvID,rlatuID ,timID]) 152 147 CALL err(NF90_CLOSE (nid)) 153 148 … … 155 150 WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa 156 151 157 158 CONTAINS159 160 161 SUBROUTINE put_var0(var,title,did,units)162 CHARACTER(LEN=*), INTENT(IN) :: var, title163 INTEGER, INTENT(IN) :: did(:)164 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units165 #ifdef NC_DOUBLE166 CALL err(NF90_DEF_VAR(nid,var,NF90_DOUBLE,did,vID),var)167 #else168 CALL err(NF90_DEF_VAR(nid,var,NF90_FLOAT,did,vID),var)169 #endif170 IF(title/="") CALL err(NF90_PUT_ATT(nid,vID,"title",title),var)171 IF(PRESENT(units)) CALL err(NF90_PUT_ATT(nid,vID,"units",units),var)172 END SUBROUTINE put_var0173 174 175 SUBROUTINE put_var1(var,title,did,v,units)176 CHARACTER(LEN=*), INTENT(IN) :: var, title177 INTEGER, INTENT(IN) :: did(1)178 #ifdef NC_DOUBLE179 DOUBLE PRECISION, INTENT(IN) :: v(:)180 #else181 REAL, INTENT(IN) :: v(:)182 #endif183 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units184 #ifdef NC_DOUBLE185 CALL err(NF90_DEF_VAR(nid,var,NF90_DOUBLE,did,vID),var)186 #else187 CALL err(NF90_DEF_VAR(nid,var,NF90_FLOAT,did,vID),var)188 #endif189 IF(title/="") CALL err(NF90_PUT_ATT(nid,vID,"title",title),var)190 IF(PRESENT(units)) CALL err(NF90_PUT_ATT(nid,vID,"units",units),var)191 CALL err(NF90_ENDDEF(nid))192 CALL NF95_PUT_VAR(nid,vID,v)193 CALL err(NF90_REDEF(nid))194 END SUBROUTINE put_var1195 196 197 SUBROUTINE put_var2(var,title,did,v,units)198 CHARACTER(LEN=*), INTENT(IN) :: var, title199 INTEGER, INTENT(IN) :: did(2)200 #ifdef NC_DOUBLE201 DOUBLE PRECISION, INTENT(IN) :: v(:,:)202 #else203 REAL, INTENT(IN) :: v(:,:)204 #endif205 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units206 #ifdef NC_DOUBLE207 CALL err(NF90_DEF_VAR(nid,var,NF90_DOUBLE,did,vID),var)208 #else209 CALL err(NF90_DEF_VAR(nid,var,NF90_FLOAT,did,vID),var)210 #endif211 IF(title/="") CALL err(NF90_PUT_ATT(nid,vID,"title",title),var)212 IF(PRESENT(units)) CALL err(NF90_PUT_ATT(nid,vID,"units",units),var)213 CALL err(NF90_ENDDEF(nid))214 CALL NF95_PUT_VAR(nid,vID,v)215 CALL err(NF90_REDEF(nid))216 217 END SUBROUTINE put_var2218 219 220 SUBROUTINE err(ierr,var)221 USE netcdf, ONLY: NF90_STRERROR, NF90_NOERR222 IMPLICIT NONE223 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE224 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: var !--- VARIABLE NAME225 CHARACTER(LEN=256) :: file, msg226 IF(ierr==NF90_NoERR) RETURN227 msg='Error in "'//TRIM(modname)//'" for file "'//TRIM(fichnom)//'"'228 IF(PRESENT(var)) msg=TRIM(msg)//'" and variable "'//TRIM(var)//'"'229 WRITE(lunout,*)TRIM(msg)//': '//NF90_STRERROR(ierr)230 231 END SUBROUTINE err232 233 152 END SUBROUTINE dynredem0 234 153 ! … … 245 164 USE infotrac 246 165 USE control_mod 247 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_ INQ_VARID, NF90_NoErr,&248 NF90_CLOSE, NF90_WRITE, NF90_ GET_VAR249 USE netcdf95, ONLY: NF95_PUT_VAR250 USE assert_eq_m, ONLY: assert_eq166 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID, & 167 NF90_CLOSE, NF90_WRITE, NF90_PUT_VAR, NF90_NoErr 168 USE dynredem_mod, ONLY: dynredem_write_u, dynredem_write_v, dynredem_read_u, & 169 err, modname, fil, msg 251 170 IMPLICIT NONE 252 #include "dimensions.h"253 #include "paramet.h"254 #include "description.h"255 #include "comvert.h"256 #include "comgeom.h"257 #include "temps.h"258 #include "iniprint.h"171 include "dimensions.h" 172 include "paramet.h" 173 include "description.h" 174 include "comvert.h" 175 include "comgeom.h" 176 include "temps.h" 177 include "iniprint.h" 259 178 !=============================================================================== 260 179 ! Arguments: 261 CHARACTER(LEN=*), INTENT(IN) :: fichnom !-- FILE NAME262 REAL, INTENT(IN) :: time !-- TIME263 REAL, INTENT(IN) :: vcov(iip1,jjm, llm) !-- V COVARIANT WIND264 REAL, INTENT(IN) :: ucov(iip1,jjp1,llm) !-- U COVARIANT WIND265 REAL, INTENT(IN) :: teta(iip1,jjp1,llm) !-- POTENTIAL TEMPERATURE266 REAL, INTENT(IN ) :: q(iip1,jjp1,llm,nqtot) !-- TRACERS267 REAL, INTENT(IN) :: masse(iip1,jjp1,llm) !-- MASS PER CELL268 REAL, INTENT(IN) :: ps(iip1,jjp1) !-- GROUND PRESSURE180 CHARACTER(LEN=*), INTENT(IN) :: fichnom !-- FILE NAME 181 REAL, INTENT(IN) :: time !-- TIME 182 REAL, INTENT(IN) :: vcov(iip1,jjm, llm) !-- V COVARIANT WIND 183 REAL, INTENT(IN) :: ucov(iip1,jjp1,llm) !-- U COVARIANT WIND 184 REAL, INTENT(IN) :: teta(iip1,jjp1,llm) !-- POTENTIAL TEMPERATURE 185 REAL, INTENT(INOUT) :: q(iip1,jjp1,llm,nqtot) !-- TRACERS 186 REAL, INTENT(IN) :: masse(iip1,jjp1,llm) !-- MASS PER CELL 187 REAL, INTENT(IN) :: ps(iip1,jjp1) !-- GROUND PRESSURE 269 188 !=============================================================================== 270 189 ! Local variables: 271 INTEGER :: l, iq, nid, vID, nid_trac, vID_trac190 INTEGER :: l, iq, nid, vID, ierr, nid_trac, vID_trac 272 191 INTEGER, SAVE :: nb=0 273 192 INTEGER, PARAMETER :: length=100 274 #ifdef NC_DOUBLE275 DOUBLE PRECISION :: trac_tmp(ip1jmp1,llm)276 #else277 REAL :: trac_tmp(ip1jmp1,llm)278 #endif279 193 REAL :: tab_cntrl(length) ! tableau des parametres du run 280 CHARACTER(LEN=256) :: modname, var, fil281 LOGICAL :: exist_file282 !=============================================================================== 283 modname='dynredem1' 284 fil=fichnom194 CHARACTER(LEN=256) :: var, dum 195 LOGICAL :: lread_inca 196 !=============================================================================== 197 198 modname='dynredem1'; fil=fichnom 285 199 CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil) 286 200 287 201 !--- Write/extend time coordinate 288 202 nb = nb + 1 289 CALL sav_var1("temps",[time],nb) 203 var="temps" 204 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 205 CALL err(NF90_PUT_VAR(nid,vID,[time]),"put",var) 290 206 WRITE(lunout,*)TRIM(modname)//": Saving for ", nb, time 291 207 292 208 !--- Rewrite control table (itaufin undefined in dynredem0) 293 209 var="controle" 294 CALL get_var1(var,tab_cntrl); tab_cntrl(31)=DBLE(itau_dyn + itaufin)295 210 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 296 CALL NF95_PUT_VAR(nid,vID,tab_cntrl) 211 CALL err(NF90_GET_VAR(nid,vID,tab_cntrl),"get",var) 212 tab_cntrl(31)=DBLE(itau_dyn + itaufin) 213 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 214 CALL err(NF90_PUT_VAR(nid,vID,tab_cntrl),"put",var) 297 215 298 216 !--- Save fields 299 CALL sav_var3("ucov",ucov)300 CALL sav_var3("vcov",vcov)301 CALL sav_var3("teta",teta)302 CALL sav_var3("masse",masse)303 CALL sav_var2("ps" ,ps)217 CALL dynredem_write_u(nid,"ucov" ,ucov ,llm) 218 CALL dynredem_write_v(nid,"vcov" ,vcov ,llm) 219 CALL dynredem_write_u(nid,"teta" ,teta ,llm) 220 CALL dynredem_write_u(nid,"masse",masse,llm) 221 CALL dynredem_write_u(nid,"ps" ,ps ,1) 304 222 305 223 !--- Tracers in file "start_trac.nc" (added by Anne) 306 IF (type_trac == 'inca') THEN 307 fil="start_trac.nc"; INQUIRE(FILE=fil,EXIST=exist_file) 308 IF(.NOT.exist_file) CALL war(-1,"open",fil) 309 END IF 310 DO iq=1,nqtot; var=tname(iq) 311 312 !--- Usual case 313 IF(type_trac/='inca') THEN 314 CALL sav_var3(var,q(:,:,:,iq)); CYCLE 224 lread_inca=.FALSE.; fil="start_trac.nc" 225 IF(type_trac=='inca') INQUIRE(FILE=fil,EXIST=lread_inca) 226 IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open") 227 228 !--- Save tracers 229 DO iq=1,nqtot; var=tname(iq); ierr=-1 230 IF(lread_inca) THEN !--- Possibly read from "start_trac.nc" 231 fil="start_trac.nc" 232 ierr=NF90_INQ_VARID(nid_trac,var,vID_trac) 233 dum='inq'; IF(ierr==NF90_NoErr) dum='fnd' 234 WRITE(lunout,*)msg(dum,var) 235 236 237 IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,:,iq),llm) 315 238 END IF 316 317 !--- Special case for INCA tracer read from "start_trac.nc" 318 IF(NF90_INQ_VARID(nid_trac,var,vID_trac)/=NF90_NoErr) THEN 319 CALL war(-1,"inq",var,fil) 320 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var,fil) 321 CALL NF95_PUT_VAR(nid,vID,q(:,:,:,iq)) 322 ELSE 323 WRITE(lunout,*)TRIM(modname)//": <"//TRIM(var)//"> found in "//fil 324 CALL err(NF90_GET_VAR(nid_trac,vID_trac,trac_tmp),"get",var,fil) 325 END IF 326 CALL sav_var3(var,RESHAPE(trac_tmp,SHAPE=[iip1,jjp1,llm])) 239 fil=fichnom 240 CALL dynredem_write_u(nid,var,q(:,:,:,iq),llm) 327 241 END DO 328 CALL err(NF90_CLOSE(nid),"close",fichnom) 329 330 331 CONTAINS 332 333 334 SUBROUTINE get_var1(var,v) 335 CHARACTER(LEN=*), INTENT(IN) :: var 336 REAL, INTENT(OUT) :: v(:) 337 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 338 CALL err(NF90_GET_VAR(nid,vID,v),"get",var) 339 END SUBROUTINE get_var1 340 341 342 SUBROUTINE sav_var1(var,v,start) 343 CHARACTER(LEN=*), INTENT(IN) :: var 344 #ifdef NC_DOUBLE 345 DOUBLE PRECISION, INTENT(IN) :: v(:) 346 #else 347 REAL, INTENT(IN) :: v(:) 348 #endif 349 INTEGER, OPTIONAL, INTENT(IN) :: start 350 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 351 IF(PRESENT(start)) THEN 352 CALL NF95_PUT_VAR(nid,vID,v,start=[start]) 353 ELSE 354 CALL NF95_PUT_VAR(nid,vID,v) 355 END IF 356 END SUBROUTINE sav_var1 357 358 359 SUBROUTINE sav_var2(var,v) 360 CHARACTER(LEN=*), INTENT(IN) :: var 361 #ifdef NC_DOUBLE 362 DOUBLE PRECISION, INTENT(IN) :: v(:,:) 363 #else 364 REAL, INTENT(IN) :: v(:,:) 365 #endif 366 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 367 CALL NF95_PUT_VAR(nid,vID,v) 368 END SUBROUTINE sav_var2 369 370 371 SUBROUTINE sav_var3(var,v) 372 CHARACTER(LEN=*), INTENT(IN) :: var 373 #ifdef NC_DOUBLE 374 DOUBLE PRECISION, INTENT(IN) :: v(:,:,:) 375 #else 376 REAL, INTENT(IN) :: v(:,:,:) 377 #endif 378 379 print*,'var='//TRIM(var) 380 print*,SHAPE(v) 381 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 382 CALL NF95_PUT_VAR(nid,vID,v) 383 END SUBROUTINE sav_var3 384 385 386 FUNCTION msg(typ,nam,fil) 387 IMPLICIT NONE 388 CHARACTER(LEN=256) :: msg !--- STANDARDIZED MESSAGE 389 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 390 CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD NAME 391 CHARACTER(LEN=*), INTENT(IN) :: fil !--- FILE NAME 392 SELECT CASE(typ) 393 CASE('inq'); msg="Missing field <"//TRIM(nam)//">" 394 CASE('get'); msg="Reading failed for <"//TRIM(nam)//">" 395 CASE('open'); msg="Opening failed for <"//TRIM(nam)//">" 396 CASE('close'); msg="Closing failed for <"//TRIM(nam)//">" 397 END SELECT 398 msg=TRIM(modname)//": "//TRIM(msg) 399 IF(typ=="inq".AND.fil/="") msg=TRIM(msg)//" in file <"//TRIM(fil)//">" 400 401 END FUNCTION msg 402 403 404 SUBROUTINE err(ierr,typ,nam,fil) 405 IMPLICIT NONE 406 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 407 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 408 CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD NAME 409 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fil !--- FILE NAME 410 CHARACTER(LEN=256) :: file 411 IF(ierr==NF90_NoERR) RETURN 412 file=""; IF(PRESENT(fil)) file=fil 413 CALL ABORT_gcm(modname,msg(typ,nam,file),ierr) 414 END SUBROUTINE err 415 416 417 SUBROUTINE war(ierr,typ,nam,fil) 418 IMPLICIT NONE 419 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 420 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 421 CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD NAME 422 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fil !--- FILE NAME 423 CHARACTER(LEN=256) :: file 424 IF(ierr==NF90_NoERR) RETURN 425 file=""; IF(PRESENT(fil)) file=fil 426 WRITE(lunout,*)msg(typ,nam,file) 427 END SUBROUTINE war 428 242 CALL err(NF90_CLOSE(nid),"close") 243 fil="start_trac.nc" 244 IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close") 429 245 430 246 END SUBROUTINE dynredem1 -
LMDZ5/trunk/libf/dyn3d/etat0dyn_netcdf.F90
r2293 r2299 12 12 ! routine (to be called after restget): 13 13 ! CALL startget_dyn3d(varname, lon_in, lat_in, pls, workvar,& 14 ! champ, val_exp, lon_in2, lat_in2, ibar)14 ! champ, lon_in2, lat_in2, ibar) 15 15 ! 16 16 ! * Variables should have the following names in the NetCDF files: … … 87 87 USE infotrac 88 88 USE filtreg_mod 89 !#endif90 89 IMPLICIT NONE 91 90 !------------------------------------------------------------------------------- … … 120 119 !******************************************************************************* 121 120 CALL infotrac_init 122 ALLOCATE(q3d(iip1,jjp1,llm,nqtot))123 121 CALL inifilr() 124 122 … … 154 152 ! Update uvent, vvent, t3d and tpot 155 153 !******************************************************************************* 156 uvent(:,:,:) = 0.0 ; t3d (:,:,:) = 0.0 157 vvent(:,:,:) = 0.0 ; tpot(:,:,:) = 0.0 158 CALL startget_dyn3d('u' ,rlonu,rlatu,pls,y ,uvent,0.0,rlonv,rlatv,ib) 159 CALL startget_dyn3d('v' ,rlonv,rlatv,pls(:,:jjm,:),y(:,:jjm,:),vvent,0.0, & 154 uvent(:,:,:) = 0.0 ; vvent(:,:,:) = 0.0 ; t3d (:,:,:) = 0.0 155 CALL startget_dyn3d('u' ,rlonu,rlatu,pls,y ,uvent,rlonv,rlatv,ib) 156 CALL startget_dyn3d('v' ,rlonv,rlatv,pls(:,:jjm,:),y(:,:jjm,:),vvent, & 160 157 & rlonu,rlatu(:jjm),ib) 161 CALL startget_dyn3d('t' ,rlonv,rlatu,pls,y ,t3d , 0.0,rlonu,rlatv,ib)162 tpot =t3d163 CALL startget_dyn3d('tpot',rlonv,rlatu,pls,pk,tpot, 0.0,rlonu,rlatv,ib)158 CALL startget_dyn3d('t' ,rlonv,rlatu,pls,y ,t3d ,rlonu,rlatv,ib) 159 tpot(:,:,:)=t3d(:,:,:) 160 CALL startget_dyn3d('tpot',rlonv,rlatu,pls,pk,tpot,rlonu,rlatv,ib) 164 161 165 162 WRITE(lunout,*) 'T3D min,max:',MINVAL(t3d(:,:,:)),MAXVAL(t3d(:,:,:)) … … 174 171 ! WRITE(lunout,*) 'QSAT :',qsat(10,20,:) 175 172 qd (:,:,:) = 0.0 176 CALL startget_dyn3d('q',rlonv,rlatu,pls,qsat,qd,0.0,rlonu,rlatv,ib) 177 q3d(:,:,:,:) = 0.0 ; q3d(:,:,:,1) = qd(:,:,:) 178 173 CALL startget_dyn3d('q',rlonv,rlatu,pls,qsat,qd,rlonu,rlatv,ib) 174 ALLOCATE(q3d(iip1,jjp1,llm,nqtot)); q3d(:,:,:,:)=0.0 ; q3d(:,:,:,1)=qd(:,:,:) 179 175 CALL flinclo(fid_dyn) 180 176 181 177 #ifdef CPP_PHYS 178 #ifdef CPP_EARTH 182 179 ! Parameterization of ozone chemistry: 183 180 !******************************************************************************* … … 190 187 q3d(:,:,:,i)=q3d(:,:,:,i)*48./ 29. !--- Mole->mass fraction 191 188 END IF 189 192 190 #endif 191 #endif 192 q3d(iip1,:,:,:)=q3d(1,:,:,:) 193 193 194 194 ! Intermediate computation … … 204 204 masse(:,jjp1,l)=xps 205 205 END DO 206 q3d(iip1,:,:,:)=q3d(1,:,:,:)207 206 208 207 ! Writing … … 234 233 235 234 !#endif 236 ! #endif of #ifdef CPP_EARTH235 ! of ifdef CPP_EARTH 237 236 238 237 END SUBROUTINE etat0dyn_netcdf … … 244 243 !------------------------------------------------------------------------------- 245 244 ! 246 SUBROUTINE startget_dyn3d(var, 247 champ, val_exp, lon_in2, lat_in2, ibar)245 SUBROUTINE startget_dyn3d(var, lon_in, lat_in, pls, workvar,& 246 champ, lon_in2, lat_in2, ibar) 248 247 !------------------------------------------------------------------------------- 249 248 IMPLICIT NONE … … 253 252 !------------------------------------------------------------------------------- 254 253 ! Note: An input auxilliary field "workvar" has to be specified in two cases: 255 ! * for "q": 256 ! * for "t opot": the Exner function.254 ! * for "q": the saturated humidity. 255 ! * for "tpot": the Exner function. 257 256 !=============================================================================== 258 257 ! Arguments: … … 263 262 REAL, INTENT(IN) :: workvar(:, :, :) ! dim (iml, jml, lml) 264 263 REAL, INTENT(INOUT) :: champ (:, :, :) ! dim (iml, jml, lml) 265 REAL, INTENT(IN) :: val_exp266 264 REAL, INTENT(IN) :: lon_in2(:) ! dim (iml) 267 265 REAL, INTENT(IN) :: lat_in2(:) ! dim (jml2) … … 274 272 REAL :: xppn, xpps 275 273 !------------------------------------------------------------------------------- 276 IF(MINVAL(champ)==MAXVAL(champ).AND.MINVAL(champ)==val_exp) THEN 277 iml = assert_eq([SIZE(lon_in),SIZE(pls,1),SIZE(workvar,1),SIZE(champ,1), & 278 & SIZE(lon_in2)],TRIM(modname)//" iml") 279 jml = assert_eq( SIZE(lat_in),SIZE(pls,2),SIZE(workvar,2),SIZE(champ,2), & 280 & TRIM(modname)//" jml") 281 lml = assert_eq( SIZE(pls,3),SIZE(workvar,3),SIZE(champ,3), & 282 & TRIM(modname)//" lml") 283 jml2 = SIZE(lat_in2) 284 285 !--- CHECK IF THE FIELD IS KNOWN 286 SELECT CASE(var) 287 CASE('u'); vname='U' 288 CASE('v'); vname='V' 289 CASE('t'); vname='TEMP' 290 CASE('q'); vname='R'; msg='humidity as the saturated humidity' 291 CASE('tpot'); vname='TEMP'; msg='potential temperature as the Exner function' 292 CASE DEFAULT; msg='No rule to extract variable '//TRIM(var) 293 CALL abort_gcm(modname,TRIM(msg)//' from any data set',1) 294 END SELECT 295 296 !--- CHECK IF SOMETHING IS MISSING 297 IF((var=='tpot'.OR.var=='q').AND.MINVAL(workvar)==MAXVAL(workvar)) THEN 298 msg='Could not compute '//TRIM(msg)//' is missing or constant.' 299 CALL abort_gcm(modname,TRIM(msg),1) 300 END IF 301 302 !--- INTERPOLATE 3D FIELD IF NEEDED 303 IF(var/='tpot') CALL start_inter_3d(TRIM(vname),lon_in,lat_in,lon_in2, & 304 lat_in2,pls,champ,ibar) 305 306 !--- COMPUTE THE REQUIRED FILED 307 SELECT CASE(var) 308 CASE('u'); DO il=1,lml; champ(:,:,il)=champ(:,:,il)*cu(:,1:jml); END DO 309 champ(iml,:,:)=champ(1,:,:) !--- Eastward wind 310 311 CASE('v'); DO il=1,lml; champ(:,:,il)=champ(:,:,il)*cv(:,1:jml); END DO 312 champ(iml,:,:)=champ(1,:,:) !--- Northward wind 313 314 CASE('tpot','q') 315 IF(var=='tpot') THEN; champ=champ*cpp/workvar !--- Temperature 316 ELSE; champ=champ*.01*workvar !--- Relat. humidity 317 WHERE(champ<0.) champ=1.0E-10 318 END IF 319 DO il=1,lml 320 xppn = SUM(aire(:,1 )*champ(:,1 ,il))/apoln 321 xpps = SUM(aire(:,jml)*champ(:,jml,il))/apols 322 champ(:,1 ,il) = xppn 323 champ(:,jml,il) = xpps 324 END DO 325 END SELECT 274 iml=assert_eq([SIZE(lon_in),SIZE(pls,1),SIZE(workvar,1),SIZE(champ,1), & 275 & SIZE(lon_in2)], TRIM(modname)//" iml") 276 jml=assert_eq( SIZE(lat_in),SIZE(pls,2),SIZE(workvar,2),SIZE(champ,2), & 277 & TRIM(modname)//" jml") 278 lml=assert_eq( SIZE(pls,3),SIZE(workvar,3),SIZE(champ,3), & 279 & TRIM(modname)//" lml") 280 jml2=SIZE(lat_in2) 281 282 !--- CHECK IF THE FIELD IS KNOWN 283 SELECT CASE(var) 284 CASE('u'); vname='U' 285 CASE('v'); vname='V' 286 CASE('t'); vname='TEMP' 287 CASE('q'); vname='R'; msg='humidity as the saturated humidity' 288 CASE('tpot'); msg='potential temperature as the Exner function' 289 CASE DEFAULT; msg='No rule to extract variable '//TRIM(var) 290 CALL abort_gcm(modname,TRIM(msg)//' from any data set',1) 291 END SELECT 292 293 !--- CHECK IF SOMETHING IS MISSING 294 IF((var=='tpot'.OR.var=='q').AND.MINVAL(workvar)==MAXVAL(workvar)) THEN 295 msg='Could not compute '//TRIM(msg)//' is missing or constant.' 296 CALL abort_gcm(modname,TRIM(msg),1) 326 297 END IF 298 299 !--- INTERPOLATE 3D FIELD IF NEEDED 300 IF(var/='tpot') CALL start_inter_3d(TRIM(vname),lon_in,lat_in,lon_in2, & 301 lat_in2,pls,champ,ibar) 302 303 !--- COMPUTE THE REQUIRED FILED 304 SELECT CASE(var) 305 CASE('u'); DO il=1,lml; champ(:,:,il)=champ(:,:,il)*cu(:,1:jml); END DO 306 champ(iml,:,:)=champ(1,:,:) !--- Eastward wind 307 308 CASE('v'); DO il=1,lml; champ(:,:,il)=champ(:,:,il)*cv(:,1:jml); END DO 309 champ(iml,:,:)=champ(1,:,:) !--- Northward wind 310 311 CASE('tpot','q') 312 IF(var=='tpot') THEN; champ=champ*cpp/workvar !--- Potential temperature 313 ELSE; champ=champ*.01*workvar !--- Relative humidity 314 WHERE(champ<0.) champ=1.0E-10 315 END IF 316 DO il=1,lml 317 xppn = SUM(aire(:,1 )*champ(:,1 ,il))/apoln 318 xpps = SUM(aire(:,jml)*champ(:,jml,il))/apols 319 champ(:,1 ,il) = xppn 320 champ(:,jml,il) = xpps 321 END DO 322 END SELECT 327 323 328 324 END SUBROUTINE startget_dyn3d … … 768 764 769 765 !#endif 770 ! of #ifdef CPP_EARTH766 ! of ifdef CPP_EARTH 771 767 772 768 END MODULE etat0dyn -
LMDZ5/trunk/libf/dyn3dmem/dynetat0_loc.f90
r2298 r2299 1 SUBROUTINE dynetat0_loc(fichnom,vcov,ucov,teta,q,masse,ps,phis,time) 1 2 ! 2 ! $Id$ 3 !------------------------------------------------------------------------------- 4 ! Authors: P. Le Van , L.Fairhead 5 !------------------------------------------------------------------------------- 6 ! Purpose: Initial state reading. 7 !------------------------------------------------------------------------------- 8 USE parallel_lmdz 9 USE infotrac 10 USE netcdf, ONLY: NF90_OPEN, NF90_INQUIRE_DIMENSION, NF90_INQ_VARID, & 11 NF90_NOWRITE, NF90_CLOSE, NF90_INQUIRE_VARIABLE, NF90_GET_VAR, NF90_NoErr 12 USE control_mod, ONLY: planet_type 13 USE assert_eq_m, ONLY: assert_eq 14 IMPLICIT NONE 15 include "dimensions.h" 16 include "paramet.h" 17 include "temps.h" 18 include "comconst.h" 19 include "comvert.h" 20 include "comgeom.h" 21 include "ener.h" 22 include "description.h" 23 include "serre.h" 24 include "logic.h" 25 include "iniprint.h" 26 !=============================================================================== 27 ! Arguments: 28 CHARACTER(LEN=*), INTENT(IN) :: fichnom !--- FILE NAME 29 REAL, INTENT(OUT) :: vcov(ijb_v:ije_v,llm) !--- V COVARIANT WIND 30 REAL, INTENT(OUT) :: ucov(ijb_u:ije_u,llm) !--- U COVARIANT WIND 31 REAL, INTENT(OUT) :: teta(ijb_u:ije_u,llm) !--- POTENTIAL TEMP. 32 REAL, INTENT(OUT) :: q(ijb_u:ije_u,llm,nqtot)!--- TRACERS 33 REAL, INTENT(OUT) :: masse(ijb_u:ije_u,llm) !--- MASS PER CELL 34 REAL, INTENT(OUT) :: ps(ijb_u:ije_u) !--- GROUND PRESSURE 35 REAL, INTENT(OUT) :: phis(ijb_u:ije_u) !--- GEOPOTENTIAL 36 !=============================================================================== 37 ! Local variables: 38 CHARACTER(LEN=256) :: msg, var, modname 39 INTEGER, PARAMETER :: length=100 40 INTEGER :: iq, fID, vID, idecal, ierr 41 REAL :: time, tab_cntrl(length) !--- RUN PARAMS TABLE 42 REAL, ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:), ps_glo(:) 43 REAL, ALLOCATABLE :: ucov_glo(:,:), q_glo(:,:), phis_glo(:) 44 REAL, ALLOCATABLE :: teta_glo(:,:) 45 !------------------------------------------------------------------------------- 46 modname="dynetat0_loc" 47 48 !--- Initial state file opening 49 var=fichnom 50 CALL err(NF90_OPEN(var,NF90_NOWRITE,fID),"open",var) 51 CALL get_var1("controle",tab_cntrl) 52 53 !!! AS: idecal is a hack to be able to read planeto starts... 54 !!! .... while keeping everything OK for LMDZ EARTH 55 IF(planet_type=="generic") THEN 56 WRITE(lunout,*)'NOTE NOTE NOTE : Planeto-like start files' 57 idecal = 4 58 annee_ref = 2000 59 ELSE 60 WRITE(lunout,*)'NOTE NOTE NOTE : Earth-like start files' 61 idecal = 5 62 annee_ref = tab_cntrl(5) 63 END IF 64 im = tab_cntrl(1) 65 jm = tab_cntrl(2) 66 lllm = tab_cntrl(3) 67 day_ref = tab_cntrl(4) 68 rad = tab_cntrl(idecal+1) 69 omeg = tab_cntrl(idecal+2) 70 g = tab_cntrl(idecal+3) 71 cpp = tab_cntrl(idecal+4) 72 kappa = tab_cntrl(idecal+5) 73 daysec = tab_cntrl(idecal+6) 74 dtvr = tab_cntrl(idecal+7) 75 etot0 = tab_cntrl(idecal+8) 76 ptot0 = tab_cntrl(idecal+9) 77 ztot0 = tab_cntrl(idecal+10) 78 stot0 = tab_cntrl(idecal+11) 79 ang0 = tab_cntrl(idecal+12) 80 pa = tab_cntrl(idecal+13) 81 preff = tab_cntrl(idecal+14) 3 82 ! 4 SUBROUTINE dynetat0_loc(fichnom,vcov,ucov, 5 . teta,q,masse,ps,phis,time) 6 USE infotrac 7 use control_mod, only : planet_type 8 USE parallel_lmdz 9 IMPLICIT NONE 10 11 c======================================================================= 12 c 13 c Auteur: P. Le Van / L.Fairhead 14 c ------- 15 c 16 c objet: 17 c ------ 18 c 19 c Lecture de l'etat initial 20 c 21 c======================================================================= 22 c----------------------------------------------------------------------- 23 c Declarations: 24 c ------------- 25 26 #include "dimensions.h" 27 #include "paramet.h" 28 #include "temps.h" 29 #include "comconst.h" 30 #include "comvert.h" 31 #include "comgeom.h" 32 #include "ener.h" 33 #include "netcdf.inc" 34 #include "description.h" 35 #include "serre.h" 36 #include "logic.h" 37 #include "iniprint.h" 38 39 c Arguments: 40 c ---------- 41 42 CHARACTER*(*) fichnom 43 REAL vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm) 44 REAL teta(ijb_u:ije_u,llm) 45 REAL q(ijb_u:ije_u,llm,nqtot),masse(ijb_u:ije_u,llm) 46 REAL ps(ijb_u:ije_u),phis(ijb_u:ije_u) 47 48 REAL time 49 50 c Variables 51 c 52 INTEGER length,iq 53 PARAMETER (length = 100) 54 REAL tab_cntrl(length) ! tableau des parametres du run 55 INTEGER ierr, nid, nvarid 56 REAL,ALLOCATABLE :: vcov_glo(:,:),ucov_glo(:,:),teta_glo(:,:) 57 REAL,ALLOCATABLE :: q_glo(:,:),masse_glo(:,:),ps_glo(:) 58 REAL,ALLOCATABLE :: phis_glo(:) 59 60 INTEGER idecal 61 62 c----------------------------------------------------------------------- 63 c Ouverture NetCDF du fichier etat initial 64 65 ierr = NF_OPEN (fichnom, NF_NOWRITE,nid) 66 IF (ierr.NE.NF_NOERR) THEN 67 write(lunout,*) 68 & 'dynetat0_loc: Pb d''ouverture du fichier start.nc' 69 write(lunout,*)' ierr = ', ierr 70 CALL ABORT_GCM("DYNETAT0", "", 1) 71 ENDIF 72 73 c 74 ierr = NF_INQ_VARID (nid, "controle", nvarid) 75 IF (ierr .NE. NF_NOERR) THEN 76 write(lunout,*)"dynetat0_loc: Le champ <controle> est absent" 77 CALL abort_gcm("dynetat0", "", 1) 78 ENDIF 79 #ifdef NC_DOUBLE 80 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, tab_cntrl) 81 #else 82 ierr = NF_GET_VAR_REAL(nid, nvarid, tab_cntrl) 83 #endif 84 IF (ierr .NE. NF_NOERR) THEN 85 write(lunout,*)"dynetat0_loc: Lecture echoue pour <controle>" 86 CALL abort_gcm("dynetat0", "", 1) 87 ENDIF 88 89 !!! AS: idecal is a hack to be able to read planeto starts... 90 !!! .... while keeping everything OK for LMDZ EARTH 91 if (planet_type.eq."generic") then 92 print*,'NOTE NOTE NOTE : Planeto-like start files' 93 idecal = 4 94 annee_ref = 2000 95 else 96 print*,'NOTE NOTE NOTE : Earth-like start files' 97 idecal = 5 98 annee_ref = tab_cntrl(5) 99 endif 100 101 102 im = tab_cntrl(1) 103 jm = tab_cntrl(2) 104 lllm = tab_cntrl(3) 105 day_ref = tab_cntrl(4) 106 rad = tab_cntrl(idecal+1) 107 omeg = tab_cntrl(idecal+2) 108 g = tab_cntrl(idecal+3) 109 cpp = tab_cntrl(idecal+4) 110 kappa = tab_cntrl(idecal+5) 111 daysec = tab_cntrl(idecal+6) 112 dtvr = tab_cntrl(idecal+7) 113 etot0 = tab_cntrl(idecal+8) 114 ptot0 = tab_cntrl(idecal+9) 115 ztot0 = tab_cntrl(idecal+10) 116 stot0 = tab_cntrl(idecal+11) 117 ang0 = tab_cntrl(idecal+12) 118 pa = tab_cntrl(idecal+13) 119 preff = tab_cntrl(idecal+14) 120 c 121 clon = tab_cntrl(idecal+15) 122 clat = tab_cntrl(idecal+16) 123 grossismx = tab_cntrl(idecal+17) 124 grossismy = tab_cntrl(idecal+18) 125 c 126 IF ( tab_cntrl(idecal+19).EQ.1. ) THEN 127 fxyhypb = . TRUE . 128 c dzoomx = tab_cntrl(25) 129 c dzoomy = tab_cntrl(26) 130 c taux = tab_cntrl(28) 131 c tauy = tab_cntrl(29) 132 ELSE 133 fxyhypb = . FALSE . 134 ysinus = . FALSE . 135 IF( tab_cntrl(idecal+22).EQ.1. ) ysinus = . TRUE. 136 ENDIF 137 138 day_ini = tab_cntrl(30) 139 itau_dyn = tab_cntrl(31) 140 c ................................................................. 141 c 142 c 143 write(lunout,*)'dynetat0_loc: rad,omeg,g,cpp,kappa', 144 & rad,omeg,g,cpp,kappa 145 146 IF( im.ne.iim ) THEN 147 PRINT 1,im,iim 148 STOP 149 ELSE IF( jm.ne.jjm ) THEN 150 PRINT 2,jm,jjm 151 STOP 152 ELSE IF( lllm.ne.llm ) THEN 153 PRINT 3,lllm,llm 154 STOP 155 ENDIF 156 157 ierr = NF_INQ_VARID (nid, "rlonu", nvarid) 158 IF (ierr .NE. NF_NOERR) THEN 159 write(lunout,*)"dynetat0_loc: Le champ <rlonu> est absent" 160 CALL abort_gcm("dynetat0", "", 1) 161 ENDIF 162 #ifdef NC_DOUBLE 163 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, rlonu) 164 #else 165 ierr = NF_GET_VAR_REAL(nid, nvarid, rlonu) 166 #endif 167 IF (ierr .NE. NF_NOERR) THEN 168 write(lunout,*)"dynetat0_loc: Lecture echouee pour <rlonu>" 169 CALL abort_gcm("dynetat0", "", 1) 170 ENDIF 171 172 ierr = NF_INQ_VARID (nid, "rlatu", nvarid) 173 IF (ierr .NE. NF_NOERR) THEN 174 write(lunout,*)"dynetat0_loc: Le champ <rlatu> est absent" 175 CALL abort_gcm("dynetat0", "", 1) 176 ENDIF 177 #ifdef NC_DOUBLE 178 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, rlatu) 179 #else 180 ierr = NF_GET_VAR_REAL(nid, nvarid, rlatu) 181 #endif 182 IF (ierr .NE. NF_NOERR) THEN 183 write(lunout,*)"dynetat0_loc: Lecture echouee pour <rlatu>" 184 CALL abort_gcm("dynetat0", "", 1) 185 ENDIF 186 187 ierr = NF_INQ_VARID (nid, "rlonv", nvarid) 188 IF (ierr .NE. NF_NOERR) THEN 189 write(lunout,*)"dynetat0_loc: Le champ <rlonv> est absent" 190 CALL abort_gcm("dynetat0", "", 1) 191 ENDIF 192 #ifdef NC_DOUBLE 193 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, rlonv) 194 #else 195 ierr = NF_GET_VAR_REAL(nid, nvarid, rlonv) 196 #endif 197 IF (ierr .NE. NF_NOERR) THEN 198 write(lunout,*)"dynetat0_loc: Lecture echouee pour <rlonv>" 199 CALL abort_gcm("dynetat0", "", 1) 200 ENDIF 201 202 ierr = NF_INQ_VARID (nid, "rlatv", nvarid) 203 IF (ierr .NE. NF_NOERR) THEN 204 write(lunout,*)"dynetat0_loc: Le champ <rlatv> est absent" 205 CALL abort_gcm("dynetat0", "", 1) 206 ENDIF 207 #ifdef NC_DOUBLE 208 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, rlatv) 209 #else 210 ierr = NF_GET_VAR_REAL(nid, nvarid, rlatv) 211 #endif 212 IF (ierr .NE. NF_NOERR) THEN 213 write(lunout,*)"dynetat0_loc: Lecture echouee pour rlatv" 214 CALL abort_gcm("dynetat0", "", 1) 215 ENDIF 216 217 ierr = NF_INQ_VARID (nid, "cu", nvarid) 218 IF (ierr .NE. NF_NOERR) THEN 219 write(lunout,*)"dynetat0_loc: Le champ <cu> est absent" 220 CALL abort_gcm("dynetat0", "", 1) 221 ENDIF 222 #ifdef NC_DOUBLE 223 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, cu) 224 #else 225 ierr = NF_GET_VAR_REAL(nid, nvarid, cu) 226 #endif 227 IF (ierr .NE. NF_NOERR) THEN 228 write(lunout,*)"dynetat0_loc: Lecture echouee pour <cu>" 229 CALL abort_gcm("dynetat0", "", 1) 230 ENDIF 231 232 ierr = NF_INQ_VARID (nid, "cv", nvarid) 233 IF (ierr .NE. NF_NOERR) THEN 234 write(lunout,*)"dynetat0_loc: Le champ <cv> est absent" 235 CALL abort_gcm("dynetat0", "", 1) 236 ENDIF 237 #ifdef NC_DOUBLE 238 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, cv) 239 #else 240 ierr = NF_GET_VAR_REAL(nid, nvarid, cv) 241 #endif 242 IF (ierr .NE. NF_NOERR) THEN 243 write(lunout,*)"dynetat0_loc: Lecture echouee pour <cv>" 244 CALL abort_gcm("dynetat0", "", 1) 245 ENDIF 246 247 ierr = NF_INQ_VARID (nid, "aire", nvarid) 248 IF (ierr .NE. NF_NOERR) THEN 249 write(lunout,*)"dynetat0_loc: Le champ <aire> est absent" 250 CALL abort_gcm("dynetat0", "", 1) 251 ENDIF 252 #ifdef NC_DOUBLE 253 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, aire) 254 #else 255 ierr = NF_GET_VAR_REAL(nid, nvarid, aire) 256 #endif 257 IF (ierr .NE. NF_NOERR) THEN 258 write(lunout,*)"dynetat0_loc: Lecture echouee pour <aire>" 259 CALL abort_gcm("dynetat0", "", 1) 260 ENDIF 261 262 ALLOCATE(phis_glo(ip1jmp1)) 263 264 ierr = NF_INQ_VARID (nid, "phisinit", nvarid) 265 IF (ierr .NE. NF_NOERR) THEN 266 write(lunout,*)"dynetat0_loc: Le champ <phisinit> est absent" 267 CALL abort_gcm("dynetat0", "", 1) 268 ENDIF 269 #ifdef NC_DOUBLE 270 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, phis_glo) 271 #else 272 ierr = NF_GET_VAR_REAL(nid, nvarid, phis_glo) 273 #endif 274 IF (ierr .NE. NF_NOERR) THEN 275 write(lunout,*)"dynetat0_loc: Lecture echouee pour <phisinit>" 276 CALL abort_gcm("dynetat0", "", 1) 277 ENDIF 278 phis(ijb_u:ije_u)=phis_glo(ijb_u:ije_u) 279 DEALLOCATE(phis_glo) 280 281 ierr = NF_INQ_VARID (nid, "temps", nvarid) 282 IF (ierr .NE. NF_NOERR) THEN 283 write(lunout,*)"dynetat0: Le champ <temps> est absent" 284 write(lunout,*)"dynetat0: J essaie <Time>" 285 ierr = NF_INQ_VARID (nid, "Time", nvarid) 286 IF (ierr .NE. NF_NOERR) THEN 287 write(lunout,*)"dynetat0: Le champ <Time> est absent" 288 CALL abort_gcm("dynetat0", "", 1) 289 ENDIF 290 ENDIF 291 #ifdef NC_DOUBLE 292 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, time) 293 #else 294 ierr = NF_GET_VAR_REAL(nid, nvarid, time) 295 #endif 296 IF (ierr .NE. NF_NOERR) THEN 297 write(lunout,*)"dynetat0_loc: Lecture echouee <temps>" 298 CALL abort_gcm("dynetat0", "", 1) 299 ENDIF 300 301 ierr = NF_INQ_VARID (nid, "ucov", nvarid) 302 IF (ierr .NE. NF_NOERR) THEN 303 write(lunout,*)"dynetat0_loc: Le champ <ucov> est absent" 304 CALL abort_gcm("dynetat0", "", 1) 305 ENDIF 306 307 ALLOCATE(ucov_glo(ip1jmp1,llm)) 308 309 #ifdef NC_DOUBLE 310 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, ucov_glo) 311 #else 312 ierr = NF_GET_VAR_REAL(nid, nvarid, ucov_glo) 313 #endif 314 IF (ierr .NE. NF_NOERR) THEN 315 write(lunout,*)"dynetat0_loc: Lecture echouee pour <ucov>" 316 CALL abort_gcm("dynetat0", "", 1) 317 ENDIF 318 319 ucov(ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:) 320 DEALLOCATE(ucov_glo) 321 ALLOCATE(vcov_glo(ip1jm,llm)) 322 323 ierr = NF_INQ_VARID (nid, "vcov", nvarid) 324 IF (ierr .NE. NF_NOERR) THEN 325 write(lunout,*)"dynetat0_loc: Le champ <vcov> est absent" 326 CALL abort_gcm("dynetat0", "", 1) 327 ENDIF 328 #ifdef NC_DOUBLE 329 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, vcov_glo) 330 #else 331 ierr = NF_GET_VAR_REAL(nid, nvarid, vcov_glo) 332 #endif 333 IF (ierr .NE. NF_NOERR) THEN 334 write(lunout,*)"dynetat0_loc: Lecture echouee pour <vcov>" 335 CALL abort_gcm("dynetat0", "", 1) 336 ENDIF 337 vcov(ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:) 338 DEALLOCATE(vcov_glo) 339 ALLOCATE(teta_glo(ip1jmp1,llm)) 340 341 ierr = NF_INQ_VARID (nid, "teta", nvarid) 342 IF (ierr .NE. NF_NOERR) THEN 343 write(lunout,*)"dynetat0_loc: Le champ <teta> est absent" 344 CALL abort_gcm("dynetat0", "", 1) 345 ENDIF 346 #ifdef NC_DOUBLE 347 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, teta_glo) 348 #else 349 ierr = NF_GET_VAR_REAL(nid, nvarid, teta_glo) 350 #endif 351 IF (ierr .NE. NF_NOERR) THEN 352 write(lunout,*)"dynetat0_loc: Lecture echouee pour <teta>" 353 CALL abort_gcm("dynetat0", "", 1) 354 ENDIF 355 356 teta(ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:) 357 DEALLOCATE(teta_glo) 358 ALLOCATE(q_glo(ip1jmp1,llm)) 359 360 361 DO iq=1,nqtot 362 ierr = NF_INQ_VARID (nid, tname(iq), nvarid) 363 IF (ierr .NE. NF_NOERR) THEN 364 write(lunout,*)"dynetat0_loc: Le traceur <" & 365 & //trim(tname(iq))//"> est absent" 366 write(lunout,*)"Il est donc initialise a zero" 367 q(:,:,iq)=0. 368 369 ! CRisi: pour les isotopes, on peut faire init théorique 370 ! distill de Rayleigh très simplifiée 371 if (ok_isotopes) then 372 if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.0)) then 373 q(:,:,iq)=q(:,:,iqpere(iq)) & 374 & *tnat(iso_num(iq)) & 375 & *(q(:,:,iqpere(iq))/30.e-3) & 376 & **(alpha_ideal(iso_num(iq))-1) 377 endif 378 if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.1)) then 379 q(:,:,iq)=q(:,:,iqiso(iso_indnum(iq),phase_num(iq))) 380 endif 381 endif !if (ok_isotopes) then 382 383 ELSE 384 #ifdef NC_DOUBLE 385 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, q_glo) 386 #else 387 ierr = NF_GET_VAR_REAL(nid, nvarid, q_glo) 388 #endif 389 IF (ierr .NE. NF_NOERR) THEN 390 write(lunout,*) 391 & "dynetat0_loc: Lecture echouee pour "//tname(iq) 392 CALL abort_gcm("dynetat0", "", 1) 393 ENDIF 394 q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:) 395 396 ENDIF 397 ENDDO !DO iq=1,nqtot 398 399 if (ok_iso_verif) then 400 call check_isotopes(q,ijb_u,ije_u,'dynetat0_loc') 401 endif !if (ok_iso_verif) then 402 403 DEALLOCATE(q_glo) 404 ALLOCATE(masse_glo(ip1jmp1,llm)) 405 406 ierr = NF_INQ_VARID (nid, "masse", nvarid) 407 IF (ierr .NE. NF_NOERR) THEN 408 write(lunout,*)"dynetat0_loc: Le champ <masse> est absent" 409 CALL abort_gcm("dynetat0", "", 1) 410 ENDIF 411 #ifdef NC_DOUBLE 412 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, masse_glo) 413 #else 414 ierr = NF_GET_VAR_REAL(nid, nvarid, masse_glo) 415 #endif 416 IF (ierr .NE. NF_NOERR) THEN 417 write(lunout,*)"dynetat0_loc: Lecture echouee pour <masse>" 418 CALL abort_gcm("dynetat0", "", 1) 419 ENDIF 420 masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:) 421 DEALLOCATE(masse_glo) 422 ALLOCATE(ps_glo(ip1jmp1)) 423 424 ierr = NF_INQ_VARID (nid, "ps", nvarid) 425 IF (ierr .NE. NF_NOERR) THEN 426 write(lunout,*)"dynetat0_loc: Le champ <ps> est absent" 427 CALL abort_gcm("dynetat0", "", 1) 428 ENDIF 429 #ifdef NC_DOUBLE 430 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, ps_glo) 431 #else 432 ierr = NF_GET_VAR_REAL(nid, nvarid, ps_glo) 433 #endif 434 IF (ierr .NE. NF_NOERR) THEN 435 write(lunout,*)"dynetat0_loc: Lecture echouee pour <ps>" 436 CALL abort_gcm("dynetat0", "", 1) 437 ENDIF 438 439 ps(ijb_u:ije_u)=ps_glo(ijb_u:ije_u) 440 DEALLOCATE(ps_glo) 441 442 ierr = NF_CLOSE(nid) 443 444 day_ini=day_ini+INT(time) 445 time=time-INT(time) 446 447 1 FORMAT(//10x,'la valeur de im =',i4,2x,'lue sur le fichier de dem 448 *arrage est differente de la valeur parametree iim =',i4//) 449 2 FORMAT(//10x,'la valeur de jm =',i4,2x,'lue sur le fichier de dem 450 *arrage est differente de la valeur parametree jjm =',i4//) 451 3 FORMAT(//10x,'la valeur de lmax =',i4,2x,'lue sur le fichier dema 452 *rrage est differente de la valeur parametree llm =',i4//) 453 4 FORMAT(//10x,'la valeur de dtrv =',i4,2x,'lue sur le fichier dema 454 *rrage est differente de la valeur dtinteg =',i4//) 455 456 RETURN 457 END 83 clon = tab_cntrl(idecal+15) 84 clat = tab_cntrl(idecal+16) 85 grossismx = tab_cntrl(idecal+17) 86 grossismy = tab_cntrl(idecal+18) 87 ! 88 IF ( tab_cntrl(idecal+19)==1. ) THEN 89 fxyhypb = .TRUE. 90 ! dzoomx = tab_cntrl(25) 91 ! dzoomy = tab_cntrl(26) 92 ! taux = tab_cntrl(28) 93 ! tauy = tab_cntrl(29) 94 ELSE 95 fxyhypb = .FALSE. 96 ysinus = tab_cntrl(idecal+22)==1. 97 END IF 98 99 day_ini = tab_cntrl(30) 100 itau_dyn = tab_cntrl(31) 101 ! start_time = tab_cntrl(32) ???? 102 103 !------------------------------------------------------------------------------- 104 WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa 105 CALL check_dim(im,iim,'im','im') 106 CALL check_dim(jm,jjm,'jm','jm') 107 CALL check_dim(lllm,llm,'lm','lllm') 108 CALL get_var1("rlonu",rlonu) 109 CALL get_var1("rlatu",rlatu) 110 CALL get_var1("rlonv",rlonv) 111 CALL get_var1("rlatv",rlatv) 112 CALL get_var1("cu" ,cu) 113 CALL get_var1("cv" ,cv) 114 CALL get_var1("aire",aire) 115 116 var="temps" 117 IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN 118 WRITE(lunout,*)TRIM(modname)//": missing field <temps>" 119 WRITE(lunout,*)TRIM(modname)//": trying with <Time>"; var="Time" 120 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 121 END IF 122 CALL err(NF90_GET_VAR(fID,vID,time),"get",var) 123 124 ALLOCATE(phis_glo(ip1jmp1)) 125 CALL get_var1("phisinit",phis_glo) 126 phis (ijb_u:ije_u) =phis_glo(ijb_u:ije_u); DEALLOCATE(phis_glo) 127 128 ALLOCATE(ucov_glo(ip1jmp1,llm)) 129 CALL get_var2("ucov",ucov_glo) 130 ucov (ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:); DEALLOCATE(ucov_glo) 131 132 ALLOCATE(vcov_glo(ip1jm,llm)) 133 CALL get_var2("vcov",vcov_glo) 134 vcov (ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:); DEALLOCATE(vcov_glo) 135 136 ALLOCATE(teta_glo(ip1jmp1,llm)) 137 CALL get_var2("teta",teta_glo) 138 teta (ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:); DEALLOCATE(teta_glo) 139 140 ALLOCATE(masse_glo(ip1jmp1,llm)) 141 CALL get_var2("masse",masse_glo) 142 masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:); DEALLOCATE(masse_glo) 143 144 ALLOCATE(ps_glo(ip1jmp1)) 145 CALL get_var1("ps",ps_glo) 146 ps (ijb_u:ije_u) = ps_glo(ijb_u:ije_u); DEALLOCATE(ps_glo) 147 148 !--- Tracers 149 ALLOCATE(q_glo(ip1jmp1,llm)) 150 DO iq=1,nqtot 151 var=tname(iq) 152 IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN 153 CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE 154 END IF 155 WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing" 156 WRITE(lunout,*)" It is hence initialized to zero" 157 q(ijb_u:ije_u,:,iq)=0. 158 !--- CRisi: for isotops, theoretical initialization using very simplified 159 ! Rayleigh distillation las. 160 IF(ok_isotopes.AND.iso_num(iq)>0) THEN 161 IF(zone_num(iq)==0) q(:,:,iq)=q(:,:,iqpere(iq))*tnat(iso_num(iq)) & 162 & *(q(:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1) 163 IF(zone_num(iq)==1) q(:,:,iq)=q(:,:,iqiso(iso_indnum(iq),phase_num(iq))) 164 END IF 165 END DO 166 DEALLOCATE(q_glo) 167 CALL err(NF90_CLOSE(fID),"close",fichnom) 168 day_ini=day_ini+INT(time) 169 time=time-INT(time) 170 171 172 CONTAINS 173 174 175 SUBROUTINE check_dim(n1,n2,str1,str2) 176 INTEGER, INTENT(IN) :: n1, n2 177 CHARACTER(LEN=*), INTENT(IN) :: str1, str2 178 CHARACTER(LEN=256) :: s1, s2 179 IF(n1/=n2) THEN 180 s1='value of '//TRIM(str1)//' =' 181 s2=' read in starting file differs from parametrized '//TRIM(str2)//' =' 182 WRITE(msg,'(10x,a,i4,2x,a,i4)'),s1,n1,s2,n2 183 CALL ABORT_gcm(TRIM(modname),TRIM(msg),1) 184 END IF 185 END SUBROUTINE check_dim 186 187 188 SUBROUTINE get_var1(var,v) 189 CHARACTER(LEN=*), INTENT(IN) :: var 190 REAL, INTENT(OUT) :: v(:) 191 REAL, ALLOCATABLE :: w2(:,:), w3(:,:,:) 192 INTEGER :: nn(3), dids(3), k, nd, ntot 193 194 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 195 ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd) 196 IF(nd==1) THEN 197 CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN 198 END IF 199 ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids) 200 DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO 201 ntot=PRODUCT(nn(1:nd)) 202 SELECT CASE(nd) 203 CASE(2); ALLOCATE(w2(nn(1),nn(2))) 204 CALL err(NF90_GET_VAR(fID,vID,w2),"get",var) 205 v=RESHAPE(w2,[ntot]); DEALLOCATE(w2) 206 CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3))) 207 CALL err(NF90_GET_VAR(fID,vID,w3),"get",var) 208 v=RESHAPE(w3,[ntot]); DEALLOCATE(w3) 209 END SELECT 210 END SUBROUTINE get_var1 211 212 213 SUBROUTINE get_var2(var,v) 214 CHARACTER(LEN=*), INTENT(IN) :: var 215 REAL, INTENT(OUT) :: v(:,:) 216 REAL, ALLOCATABLE :: w4(:,:,:,:) 217 INTEGER :: nn(4), dids(4), k, nd 218 CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var) 219 ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids,ndims=nd) 220 DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO 221 ALLOCATE(w4(nn(1),nn(2),nn(3),nn(4))) 222 CALL err(NF90_GET_VAR(fID,vID,w4),"get",var) 223 v=RESHAPE(w4,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w4) 224 END SUBROUTINE get_var2 225 226 227 SUBROUTINE err(ierr,typ,nam) 228 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 229 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 230 CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD/FILE NAME 231 IF(ierr==NF90_NoERR) RETURN 232 SELECT CASE(typ) 233 CASE('inq'); msg="Field <"//TRIM(nam)//"> is missing" 234 CASE('get'); msg="Reading failed for <"//TRIM(nam)//">" 235 CASE('open'); msg="File opening failed for <"//TRIM(nam)//">" 236 CASE('close'); msg="File closing failed for <"//TRIM(nam)//">" 237 END SELECT 238 CALL ABORT_gcm(TRIM(modname),TRIM(msg),ierr) 239 END SUBROUTINE err 240 241 END SUBROUTINE dynetat0_loc -
LMDZ5/trunk/libf/dyn3dmem/dynredem_loc.F90
r2298 r2299 1 ! 2 ! $Id$3 ! 4 c 5 SUBROUTINE dynredem0_loc(fichnom,iday_end,phis) 1 SUBROUTINE dynredem0_loc(fichnom,iday_end,phis) 2 ! 3 !------------------------------------------------------------------------------- 4 ! Write the NetCDF restart file (initialization). 5 !------------------------------------------------------------------------------- 6 6 #ifdef CPP_IOIPSL 7 7 USE IOIPSL 8 8 #endif 9 USE parallel_lmdz 10 USE mod_hallo 11 USE infotrac 12 IMPLICIT NONE 13 c======================================================================= 14 c Ecriture du fichier de redemarrage sous format NetCDF (initialisation) 15 c======================================================================= 16 c Declarations: 17 c ------------- 18 #include "dimensions.h" 19 #include "paramet.h" 20 #include "comconst.h" 21 #include "comvert.h" 22 #include "comgeom.h" 23 #include "temps.h" 24 #include "ener.h" 25 #include "logic.h" 26 #include "netcdf.inc" 27 #include "description.h" 28 #include "serre.h" 29 #include "iniprint.h" 30 31 c Arguments: 32 c ---------- 33 INTEGER iday_end 34 REAL phis(ijb_u:ije_u) 35 CHARACTER*(*) fichnom 36 37 c Local: 38 c ------ 39 INTEGER iq,l 40 INTEGER length 41 PARAMETER (length = 100) 42 REAL tab_cntrl(length) ! tableau des parametres du run 43 INTEGER ierr 44 character*20 modname 45 character*80 abort_message 46 47 c Variables locales pour NetCDF: 48 c 49 INTEGER dims2(2), dims3(3), dims4(4) 50 INTEGER idim_index 51 INTEGER idim_rlonu, idim_rlonv, idim_rlatu, idim_rlatv 52 INTEGER idim_s, idim_sig 53 INTEGER idim_tim 54 INTEGER nid,nvarid 55 56 REAL zan0,zjulian,hours 57 INTEGER yyears0,jjour0, mmois0 58 character*30 unites 59 REAL :: phis_glo(ip1jmp1) 60 61 CALL Gather_field_u(phis,phis_glo,1) 62 63 64 c----------------------------------------------------------------------- 65 if (mpi_rank==0) then 66 67 modname='dynredem0_loc' 9 USE parallel_lmdz 10 USE mod_hallo 11 USE infotrac 12 USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL, & 13 NF90_CLOSE, NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER 14 USE dynredem_mod, ONLY: cre_var, put_var, err, modname, fil 15 IMPLICIT NONE 16 include "dimensions.h" 17 include "paramet.h" 18 include "comconst.h" 19 include "comvert.h" 20 include "comgeom.h" 21 include "temps.h" 22 include "ener.h" 23 include "logic.h" 24 include "description.h" 25 include "serre.h" 26 include "iniprint.h" 27 !=============================================================================== 28 ! Arguments: 29 CHARACTER(LEN=*), INTENT(IN) :: fichnom !--- FILE NAME 30 INTEGER, INTENT(IN) :: iday_end !--- 31 REAL, INTENT(IN) :: phis(ijb_u:ije_u)!--- GROUND GEOPOTENTIAL 32 !=============================================================================== 33 ! Local variables: 34 INTEGER :: iq, l 35 INTEGER, PARAMETER :: length=100 36 REAL :: tab_cntrl(length) !--- RUN PARAMETERS TABLE 37 REAL :: phis_glo(ip1jmp1) 38 ! For NetCDF: 39 CHARACTER(LEN=30) :: unites 40 INTEGER :: indexID 41 INTEGER :: rlonuID, rlonvID, rlatuID, rlatvID 42 INTEGER :: sID, sigID, nID, vID, timID 43 INTEGER :: yyears0, jjour0, mmois0 44 REAL :: zan0, zjulian, hours 45 !=============================================================================== 46 modname='dynredem0'; fil=fichnom 47 CALL Gather_field_u(phis,phis_glo,1) 48 IF(mpi_rank/=0) RETURN 68 49 69 50 #ifdef CPP_IOIPSL 70 callymds2ju(annee_ref, 1, iday_end, 0.0, zjulian)71 callju2ymds(zjulian, yyears0, mmois0, jjour0, hours)51 CALL ymds2ju(annee_ref, 1, iday_end, 0.0, zjulian) 52 CALL ju2ymds(zjulian, yyears0, mmois0, jjour0, hours) 72 53 #else 73 54 ! set yyears0, mmois0, jjour0 to 0,1,1 (hours is not used) 74 yyears0=0 75 mmois0=1 76 jjour0=1 77 #endif 78 79 DO l=1,length 80 tab_cntrl(l) = 0. 81 ENDDO 82 tab_cntrl(1) = REAL(iim) 83 tab_cntrl(2) = REAL(jjm) 84 tab_cntrl(3) = REAL(llm) 85 tab_cntrl(4) = REAL(day_ref) 86 tab_cntrl(5) = REAL(annee_ref) 87 tab_cntrl(6) = rad 88 tab_cntrl(7) = omeg 89 tab_cntrl(8) = g 90 tab_cntrl(9) = cpp 91 tab_cntrl(10) = kappa 92 tab_cntrl(11) = daysec 93 tab_cntrl(12) = dtvr 94 tab_cntrl(13) = etot0 95 tab_cntrl(14) = ptot0 96 tab_cntrl(15) = ztot0 97 tab_cntrl(16) = stot0 98 tab_cntrl(17) = ang0 99 tab_cntrl(18) = pa 100 tab_cntrl(19) = preff 101 c 102 c ..... parametres pour le zoom ...... 103 104 tab_cntrl(20) = clon 105 tab_cntrl(21) = clat 106 tab_cntrl(22) = grossismx 107 tab_cntrl(23) = grossismy 108 c 109 IF ( fxyhypb ) THEN 110 tab_cntrl(24) = 1. 111 tab_cntrl(25) = dzoomx 112 tab_cntrl(26) = dzoomy 113 tab_cntrl(27) = 0. 114 tab_cntrl(28) = taux 115 tab_cntrl(29) = tauy 116 ELSE 117 tab_cntrl(24) = 0. 118 tab_cntrl(25) = dzoomx 119 tab_cntrl(26) = dzoomy 120 tab_cntrl(27) = 0. 121 tab_cntrl(28) = 0. 122 tab_cntrl(29) = 0. 123 IF( ysinus ) tab_cntrl(27) = 1. 124 ENDIF 125 126 tab_cntrl(30) = REAL(iday_end) 127 tab_cntrl(31) = REAL(itau_dyn + itaufin) 128 c start_time: start_time of simulation (not necessarily 0.) 129 tab_cntrl(32) = start_time 130 c 131 c ......................................................... 132 c 133 c Creation du fichier: 134 c 135 ierr = NF_CREATE(fichnom, NF_CLOBBER, nid) 136 IF (ierr.NE.NF_NOERR) THEN 137 write(lunout,*)"dynredem0: Pb d ouverture du fichier " 138 & //trim(fichnom) 139 write(lunout,*)' ierr = ', ierr 140 CALL ABORT_GCM("DYNREDEM0", "", 1) 141 ENDIF 142 c 143 c Preciser quelques attributs globaux: 144 c 145 ierr = NF_PUT_ATT_TEXT (nid, NF_GLOBAL, "title", 27, 146 . "Fichier demmarage dynamique") 147 c 148 c Definir les dimensions du fichiers: 149 c 150 ierr = NF_DEF_DIM (nid, "index", length, idim_index) 151 ierr = NF_DEF_DIM (nid, "rlonu", iip1, idim_rlonu) 152 ierr = NF_DEF_DIM (nid, "rlatu", jjp1, idim_rlatu) 153 ierr = NF_DEF_DIM (nid, "rlonv", iip1, idim_rlonv) 154 ierr = NF_DEF_DIM (nid, "rlatv", jjm, idim_rlatv) 155 ierr = NF_DEF_DIM (nid, "sigs", llm, idim_s) 156 ierr = NF_DEF_DIM (nid, "sig", llmp1, idim_sig) 157 ierr = NF_DEF_DIM (nid, "temps", NF_UNLIMITED, idim_tim) 158 c 159 ierr = NF_ENDDEF(nid) ! sortir du mode de definition 160 c 161 c Definir et enregistrer certains champs invariants: 162 c 163 ierr = NF_REDEF (nid) 164 cIM 220306 BEG 165 #ifdef NC_DOUBLE 166 ierr = NF_DEF_VAR (nid,"controle",NF_DOUBLE,1,idim_index,nvarid) 167 #else 168 ierr = NF_DEF_VAR (nid,"controle",NF_FLOAT,1,idim_index,nvarid) 169 #endif 170 cIM 220306 END 171 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 22, 172 . "Parametres de controle") 173 ierr = NF_ENDDEF(nid) 174 #ifdef NC_DOUBLE 175 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl) 176 #else 177 ierr = NF_PUT_VAR_REAL (nid,nvarid,tab_cntrl) 178 #endif 179 c 180 ierr = NF_REDEF (nid) 181 cIM 220306 BEG 182 #ifdef NC_DOUBLE 183 ierr = NF_DEF_VAR (nid,"rlonu",NF_DOUBLE,1,idim_rlonu,nvarid) 184 #else 185 ierr = NF_DEF_VAR (nid,"rlonu",NF_FLOAT,1,idim_rlonu,nvarid) 186 #endif 187 cIM 220306 END 188 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 23, 189 . "Longitudes des points U") 190 ierr = NF_ENDDEF(nid) 191 #ifdef NC_DOUBLE 192 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlonu) 193 #else 194 ierr = NF_PUT_VAR_REAL (nid,nvarid,rlonu) 195 #endif 196 c 197 ierr = NF_REDEF (nid) 198 cIM 220306 BEG 199 #ifdef NC_DOUBLE 200 ierr = NF_DEF_VAR (nid,"rlatu",NF_DOUBLE,1,idim_rlatu,nvarid) 201 #else 202 ierr = NF_DEF_VAR (nid,"rlatu",NF_FLOAT,1,idim_rlatu,nvarid) 203 #endif 204 cIM 220306 END 205 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 22, 206 . "Latitudes des points U") 207 ierr = NF_ENDDEF(nid) 208 #ifdef NC_DOUBLE 209 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlatu) 210 #else 211 ierr = NF_PUT_VAR_REAL (nid,nvarid,rlatu) 212 #endif 213 c 214 ierr = NF_REDEF (nid) 215 cIM 220306 BEG 216 #ifdef NC_DOUBLE 217 ierr = NF_DEF_VAR (nid,"rlonv",NF_DOUBLE,1,idim_rlonv,nvarid) 218 #else 219 ierr = NF_DEF_VAR (nid,"rlonv",NF_FLOAT,1,idim_rlonv,nvarid) 220 #endif 221 cIM 220306 END 222 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 23, 223 . "Longitudes des points V") 224 ierr = NF_ENDDEF(nid) 225 #ifdef NC_DOUBLE 226 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlonv) 227 #else 228 ierr = NF_PUT_VAR_REAL (nid,nvarid,rlonv) 229 #endif 230 c 231 ierr = NF_REDEF (nid) 232 cIM 220306 BEG 233 #ifdef NC_DOUBLE 234 ierr = NF_DEF_VAR (nid,"rlatv",NF_DOUBLE,1,idim_rlatv,nvarid) 235 #else 236 ierr = NF_DEF_VAR (nid,"rlatv",NF_FLOAT,1,idim_rlatv,nvarid) 237 #endif 238 cIM 220306 END 239 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 22, 240 . "Latitudes des points V") 241 ierr = NF_ENDDEF(nid) 242 #ifdef NC_DOUBLE 243 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,rlatv) 244 #else 245 ierr = NF_PUT_VAR_REAL (nid,nvarid,rlatv) 246 #endif 247 c 248 ierr = NF_REDEF (nid) 249 cIM 220306 BEG 250 #ifdef NC_DOUBLE 251 ierr = NF_DEF_VAR (nid,"nivsigs",NF_DOUBLE,1,idim_s,nvarid) 252 #else 253 ierr = NF_DEF_VAR (nid,"nivsigs",NF_FLOAT,1,idim_s,nvarid) 254 #endif 255 cIM 220306 END 256 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 28, 257 . "Numero naturel des couches s") 258 ierr = NF_ENDDEF(nid) 259 #ifdef NC_DOUBLE 260 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,nivsigs) 261 #else 262 ierr = NF_PUT_VAR_REAL (nid,nvarid,nivsigs) 263 #endif 264 c 265 ierr = NF_REDEF (nid) 266 cIM 220306 BEG 267 #ifdef NC_DOUBLE 268 ierr = NF_DEF_VAR (nid,"nivsig",NF_DOUBLE,1,idim_sig,nvarid) 269 #else 270 ierr = NF_DEF_VAR (nid,"nivsig",NF_FLOAT,1,idim_sig,nvarid) 271 #endif 272 cIM 220306 END 273 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 32, 274 . "Numero naturel des couches sigma") 275 ierr = NF_ENDDEF(nid) 276 #ifdef NC_DOUBLE 277 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,nivsig) 278 #else 279 ierr = NF_PUT_VAR_REAL (nid,nvarid,nivsig) 280 #endif 281 c 282 ierr = NF_REDEF (nid) 283 cIM 220306 BEG 284 #ifdef NC_DOUBLE 285 ierr = NF_DEF_VAR (nid,"ap",NF_DOUBLE,1,idim_sig,nvarid) 286 #else 287 ierr = NF_DEF_VAR (nid,"ap",NF_FLOAT,1,idim_sig,nvarid) 288 #endif 289 cIM 220306 END 290 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 26, 291 . "Coefficient A pour hybride") 292 ierr = NF_ENDDEF(nid) 293 #ifdef NC_DOUBLE 294 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,ap) 295 #else 296 ierr = NF_PUT_VAR_REAL (nid,nvarid,ap) 297 #endif 298 c 299 ierr = NF_REDEF (nid) 300 cIM 220306 BEG 301 #ifdef NC_DOUBLE 302 ierr = NF_DEF_VAR (nid,"bp",NF_DOUBLE,1,idim_sig,nvarid) 303 #else 304 ierr = NF_DEF_VAR (nid,"bp",NF_FLOAT,1,idim_sig,nvarid) 305 #endif 306 cIM 220306 END 307 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 26, 308 . "Coefficient B pour hybride") 309 ierr = NF_ENDDEF(nid) 310 #ifdef NC_DOUBLE 311 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,bp) 312 #else 313 ierr = NF_PUT_VAR_REAL (nid,nvarid,bp) 314 #endif 315 c 316 ierr = NF_REDEF (nid) 317 cIM 220306 BEG 318 #ifdef NC_DOUBLE 319 ierr = NF_DEF_VAR (nid,"presnivs",NF_DOUBLE,1,idim_s,nvarid) 320 #else 321 ierr = NF_DEF_VAR (nid,"presnivs",NF_FLOAT,1,idim_s,nvarid) 322 #endif 323 cIM 220306 END 324 ierr = NF_ENDDEF(nid) 325 #ifdef NC_DOUBLE 326 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,presnivs) 327 #else 328 ierr = NF_PUT_VAR_REAL (nid,nvarid,presnivs) 329 #endif 330 c 331 c Coefficients de passage cov. <-> contra. <--> naturel 332 c 333 ierr = NF_REDEF (nid) 334 dims2(1) = idim_rlonu 335 dims2(2) = idim_rlatu 336 cIM 220306 BEG 337 #ifdef NC_DOUBLE 338 ierr = NF_DEF_VAR (nid,"cu",NF_DOUBLE,2,dims2,nvarid) 339 #else 340 ierr = NF_DEF_VAR (nid,"cu",NF_FLOAT,2,dims2,nvarid) 341 #endif 342 cIM 220306 END 343 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 29, 344 . "Coefficient de passage pour U") 345 ierr = NF_ENDDEF(nid) 346 #ifdef NC_DOUBLE 347 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,cu) 348 #else 349 ierr = NF_PUT_VAR_REAL (nid,nvarid,cu) 350 #endif 351 c 352 ierr = NF_REDEF (nid) 353 dims2(1) = idim_rlonv 354 dims2(2) = idim_rlatv 355 cIM 220306 BEG 356 #ifdef NC_DOUBLE 357 ierr = NF_DEF_VAR (nid,"cv",NF_DOUBLE,2,dims2,nvarid) 358 #else 359 ierr = NF_DEF_VAR (nid,"cv",NF_FLOAT,2,dims2,nvarid) 360 #endif 361 cIM 220306 END 362 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 29, 363 . "Coefficient de passage pour V") 364 ierr = NF_ENDDEF(nid) 365 #ifdef NC_DOUBLE 366 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,cv) 367 #else 368 ierr = NF_PUT_VAR_REAL (nid,nvarid,cv) 369 #endif 370 c 371 c Aire de chaque maille: 372 c 373 ierr = NF_REDEF (nid) 374 dims2(1) = idim_rlonv 375 dims2(2) = idim_rlatu 376 cIM 220306 BEG 377 #ifdef NC_DOUBLE 378 ierr = NF_DEF_VAR (nid,"aire",NF_DOUBLE,2,dims2,nvarid) 379 #else 380 ierr = NF_DEF_VAR (nid,"aire",NF_FLOAT,2,dims2,nvarid) 381 #endif 382 cIM 220306 END 383 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 22, 384 . "Aires de chaque maille") 385 ierr = NF_ENDDEF(nid) 386 #ifdef NC_DOUBLE 387 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,aire) 388 #else 389 ierr = NF_PUT_VAR_REAL (nid,nvarid,aire) 390 #endif 391 c 392 c Geopentiel au sol: 393 c 394 ierr = NF_REDEF (nid) 395 dims2(1) = idim_rlonv 396 dims2(2) = idim_rlatu 397 cIM 220306 BEG 398 #ifdef NC_DOUBLE 399 ierr = NF_DEF_VAR (nid,"phisinit",NF_DOUBLE,2,dims2,nvarid) 400 #else 401 ierr = NF_DEF_VAR (nid,"phisinit",NF_FLOAT,2,dims2,nvarid) 402 #endif 403 cIM 220306 END 404 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 19, 405 . "Geopotentiel au sol") 406 ierr = NF_ENDDEF(nid) 407 #ifdef NC_DOUBLE 408 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,phis_glo) 409 #else 410 ierr = NF_PUT_VAR_REAL (nid,nvarid,phis_glo) 411 #endif 412 c 413 c Definir les variables pour pouvoir les enregistrer plus tard: 414 c 415 ierr = NF_REDEF (nid) ! entrer dans le mode de definition 416 c 417 cIM 220306 BEG 418 #ifdef NC_DOUBLE 419 ierr = NF_DEF_VAR (nid,"temps",NF_DOUBLE,1,idim_tim,nvarid) 420 #else 421 ierr = NF_DEF_VAR (nid,"temps",NF_FLOAT,1,idim_tim,nvarid) 422 #endif 423 cIM 220306 END 424 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 19, 425 . "Temps de simulation") 426 write(unites,200)yyears0,mmois0,jjour0 427 200 format('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00') 428 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "units", 30, 429 . unites) 430 431 c 432 dims4(1) = idim_rlonu 433 dims4(2) = idim_rlatu 434 dims4(3) = idim_s 435 dims4(4) = idim_tim 436 cIM 220306 BEG 437 #ifdef NC_DOUBLE 438 ierr = NF_DEF_VAR (nid,"ucov",NF_DOUBLE,4,dims4,nvarid) 439 #else 440 ierr = NF_DEF_VAR (nid,"ucov",NF_FLOAT,4,dims4,nvarid) 441 #endif 442 cIM 220306 END 443 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 9, 444 . "Vitesse U") 445 c 446 dims4(1) = idim_rlonv 447 dims4(2) = idim_rlatv 448 dims4(3) = idim_s 449 dims4(4) = idim_tim 450 cIM 220306 BEG 451 #ifdef NC_DOUBLE 452 ierr = NF_DEF_VAR (nid,"vcov",NF_DOUBLE,4,dims4,nvarid) 453 #else 454 ierr = NF_DEF_VAR (nid,"vcov",NF_FLOAT,4,dims4,nvarid) 455 #endif 456 cIM 220306 END 457 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 9, 458 . "Vitesse V") 459 c 460 dims4(1) = idim_rlonv 461 dims4(2) = idim_rlatu 462 dims4(3) = idim_s 463 dims4(4) = idim_tim 464 cIM 220306 BEG 465 #ifdef NC_DOUBLE 466 ierr = NF_DEF_VAR (nid,"teta",NF_DOUBLE,4,dims4,nvarid) 467 #else 468 ierr = NF_DEF_VAR (nid,"teta",NF_FLOAT,4,dims4,nvarid) 469 #endif 470 cIM 220306 END 471 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 11, 472 . "Temperature") 473 c 474 dims4(1) = idim_rlonv 475 dims4(2) = idim_rlatu 476 dims4(3) = idim_s 477 dims4(4) = idim_tim 478 479 DO iq=1,nqtot 480 cIM 220306 BEG 481 #ifdef NC_DOUBLE 482 ierr = NF_DEF_VAR (nid,tname(iq),NF_DOUBLE,4,dims4,nvarid) 483 #else 484 ierr = NF_DEF_VAR (nid,tname(iq),NF_FLOAT,4,dims4,nvarid) 485 #endif 486 cIM 220306 END 487 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 12,ttext(iq)) 488 ENDDO 489 c 490 dims4(1) = idim_rlonv 491 dims4(2) = idim_rlatu 492 dims4(3) = idim_s 493 dims4(4) = idim_tim 494 cIM 220306 BEG 495 #ifdef NC_DOUBLE 496 ierr = NF_DEF_VAR (nid,"masse",NF_DOUBLE,4,dims4,nvarid) 497 #else 498 ierr = NF_DEF_VAR (nid,"masse",NF_FLOAT,4,dims4,nvarid) 499 #endif 500 cIM 220306 END 501 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 12, 502 . "C est quoi ?") 503 c 504 dims3(1) = idim_rlonv 505 dims3(2) = idim_rlatu 506 dims3(3) = idim_tim 507 cIM 220306 BEG 508 #ifdef NC_DOUBLE 509 ierr = NF_DEF_VAR (nid,"ps",NF_DOUBLE,3,dims3,nvarid) 510 #else 511 ierr = NF_DEF_VAR (nid,"ps",NF_FLOAT,3,dims3,nvarid) 512 #endif 513 cIM 220306 END 514 ierr = NF_PUT_ATT_TEXT (nid, nvarid, "title", 15, 515 . "Pression au sol") 516 c 517 ierr = NF_ENDDEF(nid) ! sortir du mode de definition 518 ierr = NF_CLOSE(nid) ! fermer le fichier 519 520 write(lunout,*)'dynredem_loc: iim,jjm,llm,iday_end', 521 & iim,jjm,llm,iday_end 522 write(lunout,*)'dynredem_loc: rad,omeg,g,cpp,kappa', 523 & rad,omeg,g,cpp,kappa 524 525 endif ! mpi_rank==0 526 RETURN 527 END 528 SUBROUTINE dynredem1_loc(fichnom,time, 529 . vcov,ucov,teta,q,masse,ps) 530 USE parallel_lmdz 531 USE mod_hallo 532 USE infotrac 533 USE control_mod 534 USE dynredem_mod 535 IMPLICIT NONE 536 c================================================================= 537 c Ecriture du fichier de redemarrage sous format NetCDF 538 c================================================================= 539 #include "dimensions.h" 540 #include "paramet.h" 541 #include "description.h" 542 #include "netcdf.inc" 543 #include "comvert.h" 544 #include "comgeom.h" 545 #include "temps.h" 546 #include "iniprint.h" 547 548 INTEGER l 549 REAL vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm) 550 REAL teta(ijb_u:ije_u,llm) 551 REAL ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm) 552 REAL q(ijb_u:ije_u,llm,nqtot) 553 CHARACTER*(*) fichnom 554 555 REAL time 556 INTEGER nid, nvarid, nid_trac, nvarid_trac 557 REAL trac_tmp(ijb_u:ije_u,llm) 558 INTEGER ierr, ierr_file 559 INTEGER iq 560 INTEGER length 561 PARAMETER (length = 100) 562 REAL tab_cntrl(length) ! tableau des parametres du run 563 character*20 modname 564 character*80 abort_message 565 c 566 INTEGER nb 567 SAVE nb 568 DATA nb / 0 / 569 REAL,SAVE,ALLOCATABLE :: ucov_glo(:,:),vcov_glo(:,:),teta_glo(:,:) 570 REAL,SAVE,ALLOCATABLE :: masse_glo(:,:),ps_glo(:),q_glo(:,:) 571 LOGICAL,SAVE :: exist_file 572 INTEGER,SAVE :: ierr_var 573 574 ! call Gather_Field(ucov,ip1jmp1,llm,0) 575 ! call Gather_Field(vcov,ip1jm,llm,0) 576 ! call Gather_Field(teta,ip1jmp1,llm,0) 577 ! call Gather_Field(masse,ip1jmp1,llm,0) 578 ! call Gather_Field(ps,ip1jmp1,1,0) 579 580 ! do iq=1,nqtot 581 ! call Gather_Field(q(1,1,iq),ip1jmp1,llm,0) 582 ! enddo 583 55 yyears0=0 56 mmois0=1 57 jjour0=1 58 #endif 59 60 tab_cntrl(:) = 0. 61 tab_cntrl(1) = REAL(iim) 62 tab_cntrl(2) = REAL(jjm) 63 tab_cntrl(3) = REAL(llm) 64 tab_cntrl(4) = REAL(day_ref) 65 tab_cntrl(5) = REAL(annee_ref) 66 tab_cntrl(6) = rad 67 tab_cntrl(7) = omeg 68 tab_cntrl(8) = g 69 tab_cntrl(9) = cpp 70 tab_cntrl(10) = kappa 71 tab_cntrl(11) = daysec 72 tab_cntrl(12) = dtvr 73 tab_cntrl(13) = etot0 74 tab_cntrl(14) = ptot0 75 tab_cntrl(15) = ztot0 76 tab_cntrl(16) = stot0 77 tab_cntrl(17) = ang0 78 tab_cntrl(18) = pa 79 tab_cntrl(19) = preff 80 81 ! ..... parameters for zoom ...... 82 tab_cntrl(20) = clon 83 tab_cntrl(21) = clat 84 tab_cntrl(22) = grossismx 85 tab_cntrl(23) = grossismy 86 ! 87 IF ( fxyhypb ) THEN 88 tab_cntrl(24) = 1. 89 tab_cntrl(25) = dzoomx 90 tab_cntrl(26) = dzoomy 91 tab_cntrl(27) = 0. 92 tab_cntrl(28) = taux 93 tab_cntrl(29) = tauy 94 ELSE 95 tab_cntrl(24) = 0. 96 tab_cntrl(25) = dzoomx 97 tab_cntrl(26) = dzoomy 98 tab_cntrl(27) = 0. 99 tab_cntrl(28) = 0. 100 tab_cntrl(29) = 0. 101 IF( ysinus ) tab_cntrl(27) = 1. 102 END IF 103 tab_cntrl(30) = REAL(iday_end) 104 tab_cntrl(31) = REAL(itau_dyn + itaufin) 105 ! start_time: start_time of simulation (not necessarily 0.) 106 tab_cntrl(32) = start_time 107 108 !--- File creation 109 CALL err(NF90_CREATE(fichnom,NF90_CLOBBER,nid)) 110 111 !--- Some global attributes 112 CALL err(NF90_PUT_ATT(nid,NF90_GLOBAL,"title","Fichier demarrage dynamique")) 113 114 !--- Dimensions 115 CALL err(NF90_DEF_DIM(nid,"index", length, indexID)) 116 CALL err(NF90_DEF_DIM(nid,"rlonu", iip1, rlonuID)) 117 CALL err(NF90_DEF_DIM(nid,"rlatu", jjp1, rlatuID)) 118 CALL err(NF90_DEF_DIM(nid,"rlonv", iip1, rlonvID)) 119 CALL err(NF90_DEF_DIM(nid,"rlatv", jjm, rlatvID)) 120 CALL err(NF90_DEF_DIM(nid,"sigs", llm, sID)) 121 CALL err(NF90_DEF_DIM(nid,"sig", llmp1, sigID)) 122 CALL err(NF90_DEF_DIM(nid,"temps", NF90_UNLIMITED, timID)) 123 124 !--- Define and save invariant fields 125 CALL put_var(nid,"controle","Parametres de controle" ,[indexID],tab_cntrl) 126 CALL put_var(nid,"rlonu" ,"Longitudes des points U",[rlonuID],rlonu) 127 CALL put_var(nid,"rlatu" ,"Latitudes des points U" ,[rlatuID],rlatu) 128 CALL put_var(nid,"rlonv" ,"Longitudes des points V",[rlonvID],rlonv) 129 CALL put_var(nid,"rlatv" ,"Latitudes des points V" ,[rlatvID],rlatv) 130 CALL put_var(nid,"nivsigs" ,"Numero naturel des couches s" ,[sID] ,nivsigs) 131 CALL put_var(nid,"nivsig" ,"Numero naturel des couches sigma",[sigID],nivsig) 132 CALL put_var(nid,"ap" ,"Coefficient A pour hybride" ,[sigID],ap) 133 CALL put_var(nid,"bp" ,"Coefficient B pour hybride" ,[sigID],bp) 134 CALL put_var(nid,"presnivs","" ,[sID] ,presnivs) 135 ! covariant <-> contravariant <-> natural conversion coefficients 136 CALL put_var(nid,"cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu) 137 CALL put_var(nid,"cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv) 138 CALL put_var(nid,"aire","Aires de chaque maille" ,[rlonvID,rlatuID],aire) 139 CALL put_var(nid,"phisinit","Geopotentiel au sol" ,[rlonvID,rlatuID],phis_glo) 140 141 !--- Define fields saved later 142 WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')"),& 143 yyears0,mmois0,jjour0 144 CALL cre_var(nid,"temps","Temps de simulation",[timID],unites) 145 CALL cre_var(nid,"ucov" ,"Vitesse U" ,[rlonuID,rlatuID,sID,timID]) 146 CALL cre_var(nid,"vcov" ,"Vitesse V" ,[rlonvID,rlatvID,sID,timID]) 147 CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID]) 148 DO iq=1,nqtot 149 CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID]) 150 END DO 151 CALL cre_var(nid,"masse","Masse d air" ,[rlonvID,rlatuID,sID,timID]) 152 CALL cre_var(nid,"ps" ,"Pression au sol",[rlonvID,rlatuID ,timID]) 153 CALL err(NF90_CLOSE (nid)) 154 155 WRITE(lunout,*)TRIM(modname)//': iim,jjm,llm,iday_end',iim,jjm,llm,iday_end 156 WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa 157 158 END SUBROUTINE dynredem0_loc 159 ! 160 !------------------------------------------------------------------------------- 161 162 163 !------------------------------------------------------------------------------- 164 ! 165 SUBROUTINE dynredem1_loc(fichnom,time,vcov,ucov,teta,q,masse,ps) 166 ! 167 !------------------------------------------------------------------------------- 168 ! Purpose: Write the NetCDF restart file (append). 169 !------------------------------------------------------------------------------- 170 USE parallel_lmdz 171 USE mod_hallo 172 USE infotrac 173 USE control_mod 174 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID, & 175 NF90_CLOSE, NF90_WRITE, NF90_PUT_VAR, NF90_NoErr 176 USE dynredem_mod, ONLY: dynredem_write_u, dynredem_write_v, dynredem_read_u, & 177 err, modname, fil, msg 178 IMPLICIT NONE 179 include "dimensions.h" 180 include "paramet.h" 181 include "description.h" 182 include "comvert.h" 183 include "comgeom.h" 184 include "temps.h" 185 include "iniprint.h" 186 !=============================================================================== 187 ! Arguments: 188 CHARACTER(LEN=*), INTENT(IN) :: fichnom !-- FILE NAME 189 REAL, INTENT(IN) :: time !-- TIME 190 REAL, INTENT(IN) :: vcov(ijb_v:ije_v,llm) !-- V COVARIANT WIND 191 REAL, INTENT(IN) :: ucov(ijb_u:ije_u,llm) !-- U COVARIANT WIND 192 REAL, INTENT(IN) :: teta(ijb_u:ije_u,llm) !-- POTENTIAL TEMPERATURE 193 REAL, INTENT(INOUT) :: q(ijb_u:ije_u,llm,nqtot) !-- TRACERS 194 REAL, INTENT(IN) :: masse(ijb_u:ije_u,llm) !-- MASS PER CELL 195 REAL, INTENT(IN) :: ps(ijb_u:ije_u) !-- GROUND PRESSURE 196 !=============================================================================== 197 ! Local variables: 198 INTEGER :: l, iq, nid, vID, ierr, nid_trac, vID_trac 199 INTEGER, SAVE :: nb=0 200 INTEGER, PARAMETER :: length=100 201 REAL :: tab_cntrl(length) ! tableau des parametres du run 202 CHARACTER(LEN=256) :: var, dum 203 LOGICAL :: lread_inca 204 !=============================================================================== 205 206 !$OMP MASTER 207 IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 208 modname='dynredem1_loc'; fil=fichnom 209 fil=fichnom 210 CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil) 211 212 !--- Write/extend time coordinate 213 nb = nb + 1 214 var="temps" 215 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 216 CALL err(NF90_PUT_VAR(nid,vID,[time]),"put",var) 217 WRITE(lunout,*)TRIM(modname)//": Saving for ", nb, time 218 219 !--- Rewrite control table (itaufin undefined in dynredem0) 220 var="controle" 221 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 222 CALL err(NF90_GET_VAR(nid,vID,tab_cntrl),"get",var) 223 tab_cntrl(31)=DBLE(itau_dyn + itaufin) 224 CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var) 225 CALL err(NF90_PUT_VAR(nid,vID,tab_cntrl),"put",var) 226 END IF !++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 227 !$OMP END MASTER 228 229 !--- Save fields 230 CALL dynredem_write_u(nid,"ucov" ,ucov ,llm) 231 CALL dynredem_write_v(nid,"vcov" ,vcov ,llm) 232 CALL dynredem_write_u(nid,"teta" ,teta ,llm) 233 CALL dynredem_write_u(nid,"masse",masse,llm) 234 CALL dynredem_write_u(nid,"ps" ,ps ,1) 235 236 !--- Tracers in file "start_trac.nc" (added by Anne) 237 !$OMP MASTER 238 lread_inca=.FALSE.; fil="start_trac.nc" 239 IF(type_trac=='inca') INQUIRE(FILE=fil,EXIST=lread_inca) 240 IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open") 241 !$OMP END MASTER 242 !$OMP BARRIER 243 244 !--- Save tracers 245 DO iq=1,nqtot; var=tname(iq); ierr=-1 246 IF(lread_inca) THEN !--- Possibly read from "start_trac.nc" 584 247 !$OMP MASTER 585 if (mpi_rank==0) then 586 modname = 'dynredem1_loc' 587 ierr = NF_OPEN(fichnom, NF_WRITE, nid) 588 IF (ierr .NE. NF_NOERR) THEN 589 write(lunout,*)"dynredem1: Pb. d ouverture "//trim(fichnom) 590 CALL abort_gcm("dynredem1", "", 1) 591 ENDIF 592 593 c Ecriture/extension de la coordonnee temps 594 595 nb = nb + 1 596 ierr = NF_INQ_VARID(nid, "temps", nvarid) 597 IF (ierr .NE. NF_NOERR) THEN 598 write(lunout,*) NF_STRERROR(ierr) 599 abort_message='Variable temps n est pas definie' 600 CALL abort_gcm(modname,abort_message,ierr) 601 ENDIF 602 #ifdef NC_DOUBLE 603 ierr = NF_PUT_VAR1_DOUBLE (nid,nvarid,nb,time) 604 #else 605 ierr = NF_PUT_VAR1_REAL (nid,nvarid,nb,time) 606 #endif 607 write(lunout,*) "dynredem1_loc: Enregistrement pour ", nb, time 608 609 c 610 c Re-ecriture du tableau de controle, itaufin n'est plus defini quand 611 c on passe dans dynredem0 612 ierr = NF_INQ_VARID (nid, "controle", nvarid) 613 IF (ierr .NE. NF_NOERR) THEN 614 abort_message="dynredem1: Le champ <controle> est absent" 615 ierr = 1 616 CALL abort_gcm(modname,abort_message,ierr) 617 ENDIF 618 #ifdef NC_DOUBLE 619 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, tab_cntrl) 620 #else 621 ierr = NF_GET_VAR_REAL(nid, nvarid, tab_cntrl) 622 #endif 623 tab_cntrl(31) = REAL(itau_dyn + itaufin) 624 #ifdef NC_DOUBLE 625 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl) 626 #else 627 ierr = NF_PUT_VAR_REAL (nid,nvarid,tab_cntrl) 628 #endif 629 endif 630 !$OMP END MASTER 631 632 ! 633 CALL dynredem_write_u(nid,"ucov",ucov,llm) 634 CALL dynredem_write_v(nid,"vcov",vcov,llm) 635 CALL dynredem_write_u(nid,"teta",teta,llm) 636 CALL dynredem_write_u(nid,"masse",masse,llm) 637 CALL dynredem_write_u(nid,"ps",ps,1) 638 639 IF (type_trac /= 'inca') THEN 640 DO iq=1,nqtot 641 CALL dynredem_write_u(nid,tname(iq),q(:,:,iq),llm) 642 ENDDO 643 ELSE 644 248 fil="start_trac.nc" 249 ierr=NF90_INQ_VARID(nid_trac,var,vID_trac) 250 dum='inq'; IF(ierr==NF90_NoErr) dum='fnd' 251 WRITE(lunout,*)msg(dum,var) 252 !$OMP END MASTER 253 !$OMP BARRIER 254 IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,iq),llm) 255 END IF 256 fil=fichnom 257 CALL dynredem_write_u(nid,var,q(:,:,iq),llm) 258 END DO 259 645 260 !$OMP MASTER 646 INQUIRE(FILE="start_trac.nc", EXIST=exist_file) 647 PRINT *, "EXIST", exist_file 648 !$OMP END MASTER 649 !$OMP BARRIER 650 651 IF (exist_file) THEN 652 !$OMP MASTER 653 ierr_file = NF_OPEN ("start_trac.nc", NF_NOWRITE,nid_trac) 654 IF (ierr_file .NE.NF_NOERR) THEN 655 WRITE(6,*)' Pb d''ouverture du fichier start_trac.nc' 656 WRITE(6,*)' ierr = ', ierr_file 657 ENDIF 658 !$OMP END MASTER 659 660 DO iq=1,nqtot 661 662 !$OMP MASTER 663 ierr_var = NF_INQ_VARID (nid_trac, tname(iq), nvarid_trac) 664 !$OMP END MASTER 665 !$OMP BARRIER 666 IF (ierr == NF_NOERR) THEN 667 CALL dynredem_read_u(nid_trac,tname(iq),q(:,:,iq),llm) 668 ENDIF 669 CALL dynredem_write_u(nid,tname(iq),q(:,:,iq),llm) 670 ENDDO 671 672 ELSE ! pas de fichier start_tract 673 DO iq=1,nqtot 674 CALL dynredem_write_u(nid,tname(iq),q(:,:,iq),llm) 675 ENDDO 676 ENDIF 677 ENDIF 678 679 680 !$OMP MASTER 681 IF (mpi_rank==0) THEN 682 ierr = NF_CLOSE(nid) 683 ENDIF ! mpi_rank==0 684 !$OMP END MASTER 685 686 RETURN 687 END 688 261 IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 262 CALL err(NF90_CLOSE(nid),"close") 263 fil="start_trac.nc" 264 IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close") 265 END IF !++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 266 !$OMP END MASTER 267 268 END SUBROUTINE dynredem1_loc 269 -
LMDZ5/trunk/libf/dyn3dmem/dynredem_mod.F90
r1907 r2299 1 !2 ! $Id$3 !4 1 MODULE dynredem_mod 5 2 6 CONTAINS7 8 SUBROUTINE dynredem_write_u(ncid,id,var,ll)9 3 USE dimensions_mod 10 4 USE parallel_lmdz 11 5 USE mod_hallo 12 IMPLICIT NONE 13 INTEGER :: ncid 14 CHARACTER(LEN=*) :: id 15 REAL :: var(ijb_u:ije_u,ll) 16 REAL,ALLOCATABLE,SAVE :: var_tmp(:,:) 17 REAL,ALLOCATABLE,SAVE :: var_glo(:) 18 INTEGER :: ll 19 INTEGER :: count(4) 20 INTEGER :: start(4) 21 INTEGER :: l 22 INTEGER :: nvarid 23 INTEGER :: ierr 24 INCLUDE 'netcdf.inc' 6 USE netcdf 7 PRIVATE 8 PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err 9 PUBLIC :: cre_var, get_var1, put_var, fil, modname, msg 10 CHARACTER(LEN=256), SAVE :: fil, modname 11 INTEGER, SAVE :: nvarid 12 13 14 CONTAINS 15 16 17 !=============================================================================== 18 ! 19 SUBROUTINE dynredem_write_u(ncid,id,var,ll) 20 ! 21 !=============================================================================== 22 IMPLICIT NONE 23 !=============================================================================== 24 ! Arguments: 25 INTEGER, INTENT(IN) :: ncid 26 CHARACTER(LEN=*), INTENT(IN) :: id 27 REAL, INTENT(IN) :: var(ijb_u:ije_u,ll) 28 INTEGER, INTENT(IN) :: ll 29 !=============================================================================== 30 ! Local variables: 31 REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:) 32 INTEGER :: start(4), count(4), l, ierr 33 !=============================================================================== 34 start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1] 35 36 !$OMP MASTER 37 IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id) 38 !$OMP END MASTER 39 40 !$OMP MASTER 41 ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1)) 42 !$OMP END MASTER 43 !$OMP BARRIER 44 45 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 46 DO l=1,ll; var_tmp(:,l)=var(:,l); END DO 47 DO l=1,ll 48 CALL gather_field_u(var_tmp(:,l),var_glo,1) 49 IF(mpi_rank==0) THEN 50 !$OMP MASTER 51 start(3)=l 52 CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id) 53 !$OMP END MASTER 54 END IF 55 END DO 56 !$OMP BARRIER 57 !$OMP MASTER 58 DEALLOCATE(var_glo,var_tmp) 59 !$OMP END MASTER 60 !$OMP BARRIER 61 62 END SUBROUTINE dynredem_write_u 63 ! 64 !=============================================================================== 65 66 67 !=============================================================================== 68 ! 69 SUBROUTINE dynredem_write_v(ncid,id,var,ll) 70 ! 71 !=============================================================================== 72 IMPLICIT NONE 73 !=============================================================================== 74 ! Arguments: 75 INTEGER, INTENT(IN) :: ncid 76 CHARACTER(LEN=*), INTENT(IN) :: id 77 REAL, INTENT(IN) :: var(ijb_v:ije_v,ll) 78 INTEGER, INTENT(IN) :: ll 79 !=============================================================================== 80 ! Local variables: 81 REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:) 82 INTEGER :: start(4), count(4), l, ierr 83 !=============================================================================== 84 start(:)=[1,1,1,1]; count(:)=[iip1,jjm,1,1] 85 86 !$OMP MASTER 87 IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id) 88 !$OMP END MASTER 89 90 !$OMP MASTER 91 ALLOCATE(var_tmp(ijb_v:ije_v,ll),var_glo(ip1jm)) 92 !$OMP END MASTER 93 !$OMP BARRIER 94 95 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 96 DO l=1,ll; var_tmp(:,l)=var(:,l); END DO 97 DO l=1,ll 98 CALL gather_field_v(var_tmp(:,l),var_glo,1) 99 IF(mpi_rank==0) THEN 100 !$OMP MASTER 101 start(3)=l 102 CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id) 103 !$OMP END MASTER 104 END IF 105 END DO 106 !$OMP BARRIER 107 !$OMP MASTER 108 DEALLOCATE(var_glo,var_tmp) 109 !$OMP END MASTER 110 !$OMP BARRIER 111 112 END SUBROUTINE dynredem_write_v 113 ! 114 !=============================================================================== 115 116 117 !=============================================================================== 118 ! 119 SUBROUTINE dynredem_read_u(ncid,id,var,ll) 120 ! 121 !=============================================================================== 122 IMPLICIT NONE 123 !=============================================================================== 124 ! Arguments: 125 INTEGER, INTENT(IN) :: ncid 126 CHARACTER(LEN=*), INTENT(IN) :: id 127 REAL, INTENT(OUT) :: var(ijb_u:ije_u,ll) 128 INTEGER, INTENT(IN) :: ll 129 !=============================================================================== 130 ! Local variables: 131 REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:) 132 INTEGER :: start(4), count(4), l, ierr 133 !=============================================================================== 134 start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1] 135 136 !$OMP MASTER 137 IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),'inq',id) 138 !$OMP END MASTER 139 140 !$OMP MASTER 141 ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1)) 142 !$OMP END MASTER 143 !$OMP BARRIER 144 145 DO l=1,ll 146 IF(mpi_rank==0) THEN 147 !$OMP MASTER 148 start(3)=l 149 CALL err(NF90_GET_VAR(ncid,nvarid,var_glo,start,count),"get",id) 150 !$OMP END MASTER 151 END IF 152 CALL scatter_field_u(var_glo,var_tmp(:,l),1) 153 END DO 154 155 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 156 DO l=1,ll; var(:,l)=var_tmp(:,l); END DO 25 157 26 count(:)=(/ iip1,jjp1,1,1 /) 27 start(:)=(/ 1,1,1,1 /) 28 29 !$OMP MASTER 30 IF (mpi_rank==0) THEN 31 ierr = NF_INQ_VARID(ncid, id, nvarid) 32 IF (ierr .NE. NF_NOERR) THEN 33 PRINT*, "Variable "//id//" n est pas definie" 34 CALL abort 35 ENDIF 36 ENDIF 37 !$OMP END MASTER 38 39 !$OMP MASTER 40 ALLOCATE(var_tmp(ijb_u:ije_u,ll)) 41 ALLOCATE(var_glo(ip1jmp1)) 42 !$OMP END MASTER 43 !$OMP BARRIER 44 45 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 46 DO l=1,ll 47 var_tmp(:,l)=var(:,l) 48 ENDDO 49 50 DO l=1,ll 51 CALL gather_field_u(var_tmp(:,l),var_glo,1) 52 IF (mpi_rank==0) THEN 53 !$OMP MASTER 54 start(3)=l 158 !$OMP BARRIER 159 !$OMP MASTER 160 DEALLOCATE(var_glo,var_tmp) 161 !$OMP END MASTER 162 !$OMP BARRIER 163 164 END SUBROUTINE dynredem_read_u 165 ! 166 !=============================================================================== 167 168 169 !=============================================================================== 170 ! 171 SUBROUTINE cre_var(ncid,var,title,did,units) 172 ! 173 !=============================================================================== 174 IMPLICIT NONE 175 !=============================================================================== 176 ! Arguments: 177 INTEGER, INTENT(IN) :: ncid 178 CHARACTER(LEN=*), INTENT(IN) :: var, title 179 INTEGER, INTENT(IN) :: did(:) 180 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units 181 !=============================================================================== 55 182 #ifdef NC_DOUBLE 56 ierr = NF_PUT_VARA_DOUBLE (ncid,nvarid,start,count,var_glo)183 CALL err(NF90_DEF_VAR(ncid,var,NF90_DOUBLE,did,nvarid),"inq",var) 57 184 #else 58 ierr = NF_PUT_VARA_REAL (ncid,nvarid,start,count,var_glo)185 CALL err(NF90_DEF_VAR(ncid,var,NF90_FLOAT ,did,nvarid),"inq",var) 59 186 #endif 60 !$OMP END MASTER 61 ENDIF 62 ENDDO 63 64 !$OMP BARRIER 65 !$OMP MASTER 66 DEALLOCATE(var_tmp) 67 DEALLOCATE(var_glo) 68 !$OMP END MASTER 69 !$OMP BARRIER 70 71 END SUBROUTINE dynredem_write_u 72 73 SUBROUTINE dynredem_write_v(ncid,id,var,ll) 74 USE dimensions_mod 75 USE parallel_lmdz 76 USE mod_hallo 77 IMPLICIT NONE 78 INTEGER :: ncid 79 CHARACTER(LEN=*) :: id 80 REAL :: var(ijb_v:ije_v,ll) 81 REAL,ALLOCATABLE,SAVE :: var_tmp(:,:) 82 REAL,ALLOCATABLE,SAVE :: var_glo(:) 83 INTEGER :: ll 84 INTEGER :: count(4) 85 INTEGER :: start(4) 86 INTEGER :: l 87 INTEGER :: nvarid 88 INTEGER :: ierr 89 INCLUDE 'netcdf.inc' 90 91 count(:)=(/ iip1,jjm,1,1 /) 92 start(:)=(/ 1,1,1,1 /) 93 94 !$OMP MASTER 95 IF (mpi_rank==0) THEN 96 ierr = NF_INQ_VARID(ncid, id, nvarid) 97 IF (ierr .NE. NF_NOERR) THEN 98 PRINT*, "Variable "//id//" n est pas definie" 99 CALL abort 100 ENDIF 101 ENDIF 102 !$OMP END MASTER 103 104 !$OMP MASTER 105 ALLOCATE(var_tmp(ijb_v:ije_v,ll)) 106 ALLOCATE(var_glo(ip1jm)) 107 !$OMP END MASTER 108 !$OMP BARRIER 109 110 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 111 DO l=1,ll 112 var_tmp(:,l)=var(:,l) 113 ENDDO 114 115 DO l=1,ll 116 CALL gather_field_v(var_tmp(:,l),var_glo,1) 117 IF (mpi_rank==0) THEN 118 !$OMP MASTER 119 start(3)=l 120 #ifdef NC_DOUBLE 121 ierr = NF_PUT_VARA_DOUBLE (ncid,nvarid,start,count,var_glo) 122 #else 123 ierr = NF_PUT_VARA_REAL (ncid,nvarid,start,count,var_glo) 124 #endif 125 !$OMP END MASTER 126 ENDIF 127 ENDDO 128 129 !$OMP BARRIER 130 !$OMP MASTER 131 DEALLOCATE(var_tmp) 132 DEALLOCATE(var_glo) 133 !$OMP END MASTER 134 !$OMP BARRIER 135 136 END SUBROUTINE dynredem_write_v 137 138 SUBROUTINE dynredem_read_u(ncid,id,var,ll) 139 USE dimensions_mod 140 USE parallel_lmdz 141 USE mod_hallo 142 IMPLICIT NONE 143 INTEGER :: ncid 144 CHARACTER(LEN=*) :: id 145 REAL :: var(ijb_u:ije_u,ll) 146 REAL,ALLOCATABLE,SAVE :: var_tmp(:,:) 147 REAL,ALLOCATABLE,SAVE :: var_glo(:) 148 INTEGER :: ll 149 INTEGER :: count(4) 150 INTEGER :: start(4) 151 INTEGER :: l 152 INTEGER :: nvarid 153 INTEGER :: ierr 154 INCLUDE 'netcdf.inc' 155 156 count(:)=(/ iip1,jjp1,1,1 /) 157 start(:)=(/ 1,1,1,1 /) 158 159 !$OMP MASTER 160 IF (mpi_rank==0) THEN 161 ierr = NF_INQ_VARID(ncid, id, nvarid) 162 IF (ierr .NE. NF_NOERR) THEN 163 PRINT*, "Variable "//id//" n est pas definie" 164 CALL abort 165 ENDIF 166 ENDIF 167 !$OMP END MASTER 168 169 !$OMP MASTER 170 ALLOCATE(var_tmp(ijb_u:ije_u,ll)) 171 ALLOCATE(var_glo(ip1jmp1)) 172 !$OMP END MASTER 173 !$OMP BARRIER 174 175 176 DO l=1,ll 177 IF (mpi_rank==0) THEN 178 !$OMP MASTER 179 start(3)=l 180 #ifdef NC_DOUBLE 181 ierr = NF_GET_VARA_DOUBLE (ncid,nvarid,start,count,var_glo) 182 #else 183 ierr = NF_GET_VARA_REAL (ncid,nvarid,start,count,var_glo) 184 #endif 185 !$OMP END MASTER 186 ENDIF 187 CALL scatter_field_u(var_glo,var_tmp(:,l),1) 188 ENDDO 189 190 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 191 DO l=1,ll 192 var(:,l)=var_tmp(:,l) 193 ENDDO 194 195 !$OMP BARRIER 196 !$OMP MASTER 197 DEALLOCATE(var_tmp) 198 DEALLOCATE(var_glo) 199 !$OMP END MASTER 200 !$OMP BARRIER 201 202 END SUBROUTINE dynredem_read_u 203 187 IF(title/="") CALL err(NF90_PUT_ATT(ncid,nvarid,"title",title),var) 188 IF(PRESENT(units)) CALL err(NF90_PUT_ATT(ncid,nvarid,"units",units),var) 189 190 END SUBROUTINE cre_var 191 ! 192 !=============================================================================== 193 194 195 !=============================================================================== 196 ! 197 SUBROUTINE put_var(ncid,var,title,did,v,units) 198 ! 199 !=============================================================================== 200 IMPLICIT NONE 201 !=============================================================================== 202 ! Arguments: 203 INTEGER, INTENT(IN) :: ncid 204 CHARACTER(LEN=*), INTENT(IN) :: var, title 205 INTEGER, INTENT(IN) :: did(:) 206 REAL, INTENT(IN) :: v(:) 207 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units 208 !=============================================================================== 209 INTEGER :: nd, k, nn(2) 210 IF( PRESENT(units)) CALL cre_var(ncid,var,title,did,units) 211 IF(.NOT.PRESENT(units)) CALL cre_var(ncid,var,title,did) 212 CALL err(NF90_ENDDEF(ncid)) 213 nd=SIZE(did) 214 DO k=1,nd; CALL err(NF90_INQUIRE_DIMENSION(ncid,did(k),len=nn(k))); END DO 215 IF(nd==1) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:1))),var) 216 IF(nd==2) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:2))),var) 217 CALL err(NF90_REDEF(ncid)) 218 END SUBROUTINE put_var 219 ! 220 !=============================================================================== 221 222 223 !=============================================================================== 224 ! 225 FUNCTION msg(typ,nam) 226 ! 227 !=============================================================================== 228 IMPLICIT NONE 229 !=============================================================================== 230 ! Arguments: 231 CHARACTER(LEN=256) :: msg !--- STANDARDIZED MESSAGE 232 CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION 233 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam !--- FIELD NAME 234 !=============================================================================== 235 SELECT CASE(typ) 236 CASE('open'); msg="Opening failed for <"//TRIM(fil)//">" 237 CASE('close'); msg="Closing failed for <"//TRIM(fil)//">" 238 CASE('get'); msg="Reading failed for <"//TRIM(nam)//">" 239 CASE('put'); msg="Writting failed for <"//TRIM(nam)//">" 240 CASE('inq'); msg="Missing field <"//TRIM(nam)//">" 241 CASE('fnd'); msg="Found field <"//TRIM(nam)//">" 242 END SELECT 243 msg=TRIM(msg)//" in file <"//TRIM(fil)//">" 244 245 END FUNCTION msg 246 ! 247 !=============================================================================== 248 249 250 !=============================================================================== 251 ! 252 SUBROUTINE err(ierr,typ,nam) 253 ! 254 !=============================================================================== 255 IMPLICIT NONE 256 !=============================================================================== 257 ! Arguments: 258 INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE 259 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: typ !--- TYPE OF OPERATION 260 CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam !--- FIELD NAME 261 !=============================================================================== 262 IF(ierr==NF90_NoERR) RETURN 263 IF(.NOT.PRESENT(typ)) THEN 264 CALL ABORT_gcm(modname,NF90_STRERROR(ierr),ierr) 265 ELSE 266 CALL ABORT_gcm(modname,msg(typ,nam),ierr) 267 END IF 268 269 END SUBROUTINE err 270 ! 271 !=============================================================================== 272 204 273 END MODULE dynredem_mod 274 205 275 206 276 -
LMDZ5/trunk/libf/dynlonlat_phylonlat/grid_atob_m.f90
r2298 r2299 21 21 !------------------------------------------------------------------------------- 22 22 ! Arguments: 23 REAL, INTENT(IN) :: x_i(:), y_i(:) !- IN X&Y COORD.24 REAL, INTENT(IN) :: x_o(:), y_o(:) !- OUT X&Y COORD.25 DOUBLE PRECISION, INTENT(OUT) :: d_o1(:,:) !- OUT FLD(mo,no)26 REAL, OPTIONAL, INTENT(IN) :: d_i (:,:) !- INP FLD(mi,ni)27 LOGICAL, OPTIONAL, INTENT(IN) :: msk (:,:) !- MASK(mi,ni)28 DOUBLE PRECISION, OPTIONAL, INTENT(OUT) :: d_o2(:,:) !- OUT FOR d_i^223 REAL, INTENT(IN) :: x_i(:), y_i(:) !-- INPUT X&Y COOR. (mi)(ni) 24 REAL, INTENT(IN) :: x_o(:), y_o(:) !-- OUTPUT X&Y COOR. (mi)(ni) 25 REAL, INTENT(OUT) :: d_o1(:,:) !-- OUTPUT FIELD (mo,no) 26 REAL, OPTIONAL, INTENT(IN) :: d_i (:,:) !-- INPUT FIELD (mi,ni) 27 LOGICAL, OPTIONAL, INTENT(IN) :: msk (:,:) !-- MASK (mi,ni) 28 REAL, OPTIONAL, INTENT(OUT) :: d_o2(:,:) !-- OUTPUT FOR d_i^2 (mo,no) 29 29 !------------------------------------------------------------------------------- 30 30 ! Local variables: 31 31 CHARACTER(LEN=256) :: modname="fine2coarse" 32 DOUBLE PRECISION :: inc33 32 INTEGER :: mi, ni, ii, ji, mo, no, io, jo, nr(2), m1, n1, m2, n2, nn 34 33 INTEGER :: num_tot(SIZE(x_o),SIZE(y_o)) … … 36 35 LOGICAL :: mask (SIZE(x_i),SIZE(y_i)), lo 37 36 REAL :: dist (SIZE(x_o),SIZE(y_o)) 38 REAL :: a(SIZE(x_o)), b(SIZE(x_o)), c(SIZE(y_o)), d(SIZE(y_o)) 37 REAL :: a(SIZE(x_o)), b(SIZE(x_o)), c(SIZE(y_o)), d(SIZE(y_o)), inc 39 38 REAL, PARAMETER :: thresh=1.E-5 40 39 !------------------------------------------------------------------------------- … … 56 55 57 56 !--- ACCUMULATE INPUT POINTS ON OUTPUT GRID 58 d_o1(:,:)=0.; num_tot(:,:)=0; inc=1.0 d057 d_o1(:,:)=0.; num_tot(:,:)=0; inc=1.0 59 58 IF(lo) d_o2(:,:)=0. 60 59 DO ji = 1, ni 61 60 DO ii = 1, mi 62 IF(li) inc= DBLE(d_i(ii,ji))61 IF(li) inc=d_i(ii,ji) 63 62 DO jo = 1, no 64 63 IF((y_i(ji)-c(jo)<thresh.OR.y_i(ji)-d(jo)>thresh).AND. & … … 78 77 !--- CHECK INPUT POINTS HAVE BEEN FOUND IN EACH OUTPUT CELL 79 78 found(:,:)=num_tot(:,:)/=0 80 WHERE(found.AND.mask) d_o1(:,:)=d_o1(:,:)/ DBLE(num_tot(:,:))79 WHERE(found.AND.mask) d_o1(:,:)=d_o1(:,:)/REAL(num_tot(:,:)) 81 80 IF(PRESENT(d_o2)) THEN 82 WHERE(found.AND.mask) d_o2(:,:)=d_o2(:,:)/ DBLE(num_tot(:,:))81 WHERE(found.AND.mask) d_o2(:,:)=d_o2(:,:)/REAL(num_tot(:,:)) 83 82 RETURN 84 83 END IF … … 92 91 CALL dist_sphe(x_o(io),y_o(jo),x_i,y_i,dist(:,:)) 93 92 nr=MINLOC(dist(:,:))!; IF(prt_level>=1) PRINT*, "Solution: ", nr 94 inc=1.0; IF(li) inc= DBLE(d_i(nr(1),nr(2)))93 inc=1.0; IF(li) inc=d_i(nr(1),nr(2)) 95 94 IF(mask(nr(1),nr(2))) d_o1(io,jo)=inc 96 95 END DO … … 133 132 REAL, INTENT(OUT) :: sortie(SIZE(x),SIZE(y)) !--- OUTPUT FIELD 134 133 !------------------------------------------------------------------------------- 135 ! Local variable: 136 DOUBLE PRECISION :: out(SIZE(x),SIZE(y)) 137 !------------------------------------------------------------------------------- 138 ! CALL fine2coarse(xdata,ydata,x,y,out,DBLE(entree)) 139 CALL fine2coarse(xdata,ydata,x,y,out,entree) 140 sortie=REAL(out) 134 CALL fine2coarse(xdata,ydata,x,y,sortie,entree) 141 135 142 136 END SUBROUTINE grille_m … … 152 146 ! Author: Z.X. Li (april 1st 1994) 153 147 !------------------------------------------------------------------------------- 154 ! Purpose: From topography field, compute ocean/land mask (land: 1 ; ocean: 0)148 ! Purpose: Remap rugosity length ; constant value (0.001) on oceans. 155 149 ! Naive method (see grille_m) 156 150 !------------------------------------------------------------------------------- … … 164 158 REAL, INTENT(IN) :: mask (SIZE(x),SIZE(y)) !--- MASK 165 159 !------------------------------------------------------------------------------- 166 ! Local variable: 167 DOUBLE PRECISION :: out (SIZE(x),SIZE(y)) 168 !------------------------------------------------------------------------------- 169 CALL fine2coarse(xdata,ydata,x,y,out,LOG(entree)) 160 CALL fine2coarse(xdata,ydata,x,y,sortie,LOG(entree)) 170 161 WHERE(NINT(mask)==1) 171 out(:,:)=EXP(out(:,:))162 sortie(:,:)=EXP(sortie(:,:)) 172 163 ELSE WHERE 173 out(:,:)=0.001164 sortie(:,:)=0.001 174 165 END WHERE 175 sortie=REAL(out)176 166 177 167 END SUBROUTINE rugosite … … 198 188 REAL, INTENT(OUT) :: frac_ice(SIZE(x),SIZE(y)) !--- OUTPUT FIELD 199 189 !------------------------------------------------------------------------------- 200 ! Local variable: 201 DOUBLE PRECISION :: out (SIZE(x),SIZE(y)) 202 !------------------------------------------------------------------------------- 203 CALL fine2coarse(xdata,ydata,x,y,out,msk=NINT(glace01)==1) 204 frac_ice=REAL(out) 190 CALL fine2coarse(xdata,ydata,x,y,frac_ice,msk=NINT(glace01)==1) 205 191 206 192 END SUBROUTINE sea_ice … … 228 214 INTEGER :: k, nn 229 215 INTEGER, PARAMETER:: itmp=360, jtmp=180 230 DOUBLE PRECISION :: out(SIZE(xmod),SIZE(xmod)), amin, amax 231 DOUBLE PRECISION :: cham1tmp(itmp,jtmp), cham2tmp(itmp,jtmp) 232 REAL :: xtmp(itmp), ytmp(jtmp) 216 REAL :: out(SIZE(xmod),SIZE(xmod)), amin, amax 217 REAL :: cham1tmp(itmp,jtmp), cham2tmp(itmp,jtmp), xtmp(itmp), ytmp(jtmp) 233 218 !------------------------------------------------------------------------------- 234 219 … … 245 230 nn=COUNT(cham2tmp<0) 246 231 IF(nn/=0) PRINT*,'Problem for rugsoro ; std**2 < 0. for several points: ',nn 247 WHERE(cham2tmp<0.0) cham2tmp=0.0 d0232 WHERE(cham2tmp<0.0) cham2tmp=0.0 248 233 cham2tmp(:,:)=SQRT(cham2tmp(:,:)) 249 234 amin=MINVAL(cham2tmp); amax=MAXVAL(cham2tmp) … … 251 236 252 237 !--- COMPUTE RUGOSITY AT REQUIRED SCALE 253 WHERE(cham2tmp<0.001 d0) cham2tmp=0.001d0238 WHERE(cham2tmp<0.001) cham2tmp=0.001 254 239 CALL fine2coarse(xtmp,ytmp,xmod,ymod,out,REAL(LOG(cham2tmp))) 255 240 out=EXP(out) 256 241 amin=MINVAL(out); amax=MAXVAL(out) 257 242 PRINT*, 'Ecart-type du modele:', amin, amax 258 out=out/amax*20.0 d0243 out=out/amax*20.0 259 244 amin=MINVAL(out); amax=MAXVAL(out) 260 245 PRINT*, 'Longueur de rugosite du modele:', amin, amax -
LMDZ5/trunk/libf/phylmd/etat0phys_netcdf.F90
r2293 r2299 62 62 REAL, SAVE :: deg2rad 63 63 REAL, SAVE, ALLOCATABLE :: tsol(:) 64 REAL, SAVE, ALLOCATABLE :: rugo(:,:) ! ??? COMPUTED BUT NOT USED ???64 ! REAL, SAVE, ALLOCATABLE :: rugo(:,:) ! ??? COMPUTED BUT NOT USED ??? 65 65 INTEGER, SAVE :: iml_phys, jml_phys, llm_phys, ttm_phys, fid_phys 66 66 REAL, ALLOCATABLE, SAVE :: lon_phys(:,:), lat_phys(:,:), levphys_ini(:) … … 86 86 USE fonte_neige_mod 87 87 USE pbl_surface_mod 88 USE filtreg_mod89 88 USE regr_lat_time_climoz_m, ONLY: regr_lat_time_climoz 90 89 USE indice_sol_mod … … 335 334 !=============================================================================== 336 335 USE conf_dat_m, ONLY: conf_dat2d 337 USE grid_atob_m, ONLY: rugsoro336 ! USE grid_atob_m, ONLY: rugsoro 338 337 USE grid_noro_m, ONLY: grid_noro 339 338 IMPLICIT NONE … … 393 392 394 393 !--- COMPUTE SURFACE ROUGHNESS 395 WRITE(lunout,*) 396 WRITE(lunout,*)'*** Compute surface roughness induced by the orography ***' 397 ALLOCATE(tmp_var(iml-1,jml)) 398 CALL rugsoro(lon_rad, lat_rad, relief_hi, lon_in(1:iml-1), lat_in, tmp_var) 399 ALLOCATE(rugo(iml,jml)); rugo(1:iml-1,:)=tmp_var; rugo(iml,:)=tmp_var(1,:) 400 DEALLOCATE(relief_hi,tmp_var,lon_rad,lat_rad) 394 ! WRITE(lunout,*) 395 ! WRITE(lunout,*)'*** Compute surface roughness induced by the orography ***' 396 ! ALLOCATE(tmp_var(iml-1,jml)) 397 ! CALL rugsoro(lon_rad, lat_rad, relief_hi, lon_in(1:iml-1), lat_in, tmp_var) 398 ! ALLOCATE(rugo(iml,jml)); rugo(1:iml-1,:)=tmp_var; rugo(iml,:)=tmp_var(1,:) 399 ! DEALLOCATE(tmp_var) 400 DEALLOCATE(relief_hi,lon_rad,lat_rad) 401 401 402 402 !--- PUT QUANTITIES TO PHYSICAL GRID -
LMDZ5/trunk/libf/phylmd/phyredem.F90
r2293 r2299 132 132 PRINT*, "Trop de sous-surfaces"; CALL abort_gcm("phyredem", "", 1) 133 133 END IF 134 IF(nsw>99) THEN 135 PRINT*, "Trop de bandes"; CALL abort_gcm("phyredem", "", 1) 136 END IF 134 137 135 138 CALL put_field_srf1("TS","Temperature",ftsol(:,:)) … … 149 152 CALL put_field_srf1("EVAP", "Evaporation", fevap(:,:)) 150 153 151 CALL put_field_srf1("SNOW", "Neige", fevap(:,:))154 CALL put_field_srf1("SNOW", "Neige", snow(:,:)) 152 155 153 156 CALL put_field("RADS", "Rayonnement net a la surface", radsol) … … 302 305 REAL, INTENT(IN) :: field(:,:) 303 306 CHARACTER(LEN=256) :: nm, lm, str 304 DO nsrf = 1, nbsrf307 DO nsrf = 1, SIZE(field,2) 305 308 WRITE(str, '(i2.2)') nsrf 306 309 nm=TRIM(nam)//TRIM(str) … … 318 321 REAL, INTENT(IN) :: field(:,:,:) 319 322 CHARACTER(LEN=256) :: nm, lm, str 320 DO nsrf = 1, nbsrf321 DO isoil=1, nsw323 DO nsrf = 1, SIZE(field,3) 324 DO isoil=1, SIZE(field,2) 322 325 WRITE(str, '(i2.2,"srf",i2.2)')isoil,nsrf 323 326 ! WRITE(lunout,*)"PHYREDEM ",TRIM(nam)//TRIM(str) … … 337 340 REAL, INTENT(IN) :: field(:,:,:) 338 341 CHARACTER(LEN=256) :: nm, lm, str 339 DO nsrf = 1, nbsrf342 DO nsrf = 1, SIZE(field,3) 340 343 WRITE(str, '(i2.2)') nsrf 341 344 nm=TRIM(nam)//TRIM(str)
Note: See TracChangeset
for help on using the changeset viewer.