Changeset 1403
- Timestamp:
- Jul 1, 2010, 11:02:53 AM (14 years ago)
- Location:
- LMDZ4/trunk
- Files:
-
- 8 deleted
- 188 edited
- 17 copied
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk
- Property svn:mergeinfo changed
-
LMDZ4/trunk/arch/arch-PW6_VARGAS.fcm
r1329 r1403 3 3 %AR ar 4 4 %MAKE gmake 5 %FPP_FLAGS -P 6 %FPP_DEF NC_DOUBLE BLAS SGEMV=DGEMV SGEMM=DGEMM 7 %BASE_FFLAGS -qautodbl=dbl4 -qxlf90=autodealloc -q extname=flush5 %FPP_FLAGS -P -I/usr/local/pub/FFTW/3.2/include 6 %FPP_DEF NC_DOUBLE BLAS SGEMV=DGEMV SGEMM=DGEMM FFT_FFTW 7 %BASE_FFLAGS -qautodbl=dbl4 -qxlf90=autodealloc -qmaxmem=-1 -qzerosize 8 8 %PROD_FFLAGS -O5 9 9 %DEV_FFLAGS -O2 -qfullpath -qinitauto=7FBFFFFF -qfloat=nans -qflttrap=overflow:zerodivide:invalid:enable -qsigtrap 10 %DEBUG_FFLAGS -g -qfullpath -qnooptimize -qinitauto=7FBFFFFF -qfloat=nans -qflttrap=overflow:zerodivide:invalid:enable -qsigtrap 10 %DEBUG_FFLAGS -g -qfullpath -qnooptimize -qinitauto=7FBFFFFF -qfloat=nans -qflttrap=overflow:zerodivide:invalid:enable -qsigtrap -qcheck -qextchk 11 11 %MPI_FFLAGS -I/usr/lpp/ppe.poe/include/thread64 12 12 %OMP_FFLAGS -qsmp=omp 13 %BASE_LD -lessl 13 %BASE_LD -lessl -L/usr/local/pub/FFTW/3.2/lib -lfftw3 14 14 %MPI_LD 15 15 %OMP_LD -qsmp=omp -
LMDZ4/trunk/create_make_gcm
r1279 r1403 108 108 echo ' cd $(LIBO) ; $(RANLIB) lib*.a ; cd $(GCM) ;\' 109 109 echo ' cd $(LOCAL_DIR); \' 110 echo ' $(COMPILE90) $(LIBF)/$(DIRMAIN)/$( PROG).F-o $(PROG).o ; \'110 echo ' $(COMPILE90) $(LIBF)/$(DIRMAIN)/$(SOURCE) -o $(PROG).o ; \' 111 111 echo ' $(LINK) $(PROG).o -L$(LIBO) $(L_DYN) $(L_ADJNT) $(L_COSP) $(L_FILTRE) $(L_PHY) $(L_DYN) $(L_BIBIO) $(L_DYN) $(OPLINK) $(OPTION_LINK) -o $(LOCAL_DIR)/$(PROG).e ; $(RM) $(PROG).o ' 112 112 echo -
LMDZ4/trunk/gcm.def
r1279 r1403 1 #2 1 ## $Id$ 3 # 4 ## nombre de pas par jour (multiple de iperiod) 2 ## nombre de pas par jour (multiple de iperiod) ( ici pour dt = 1 min ) 5 3 day_step=480 6 4 ## periode pour le pas Matsuno (en pas) … … 11 9 lstardis=y 12 10 ## nombre d'iterations de l'operateur de dissipation gradiv 13 nitergdiv= 211 nitergdiv=1 14 12 ## nombre d'iterations de l'operateur de dissipation nxgradrot 15 13 nitergrot=2 … … 17 15 niterh=2 18 16 ## temps de dissipation des plus petites long.d ondes pour u,v (gradiv) 19 tetagdiv= 10800.17 tetagdiv=5400. 20 18 ## temps de dissipation des plus petites long.d ondes pour u,v(nxgradrot) 21 tetagrot= 18000.19 tetagrot=5400. 22 20 ## temps de dissipation des plus petites long.d ondes pour h ( divgrad) 23 tetatemp= 18000.21 tetatemp=5400. 24 22 ## coefficient pour gamdissip 25 23 coefdis=0. 26 ## choix du shema d'integration temporelle (Matsuno ou Matsuno-leapfrog)24 ## choix du shema d'integration temporelle (Matsuno:y ou Matsuno-leapfrog:n) 27 25 purmats=n 28 ## physics type (0: none 1: phylmd,... 2: newtonian) 26 ## avec ou sans physique 27 ## 0: pas de physique (e.g. en mode Shallow Water) 28 ## 1: avec physique (e.g. physique phylmd) 29 ## 2: avec rappel newtonien dans la dynamique 29 30 iflag_phys=1 30 ## periode de la physique (en pas) 31 ## avec ou sans fichiers de demarrage (start.nc, startphy.nc) ? 32 ## (sans fichiers de demarrage, initialisation des champs par iniacademic 33 ## dans la dynamique) 34 read_start=y 35 ## periode de la physique (en pas dynamiques, n'a de sens que si iflag_phys=1) 31 36 iphysiq=10 37 ## Avec ou sans strato 38 ok_strato=n 39 # Couche eponge dans les couches de pression plus faible que 100 fois la pression de la derniere couche 40 iflag_top_bound=2 41 # Coefficient pour la couche eponge (valeur derniere couche) 42 tau_top_bound=5.e-5 32 43 ## longitude en degres du centre du zoom 33 44 clon=0. -
LMDZ4/trunk/libf/bibio/initdynav.F
r1279 r1403 2 2 ! $Id$ 3 3 ! 4 subroutine initdynav(infile,day0,anne0,tstep,t_ops,t_wrt 5 . ,fileid) 4 subroutine initdynav(day0,anne0,tstep,t_ops,t_wrt) 6 5 7 6 #ifdef CPP_IOIPSL … … 9 8 #endif 10 9 USE infotrac, ONLY : nqtot, ttext 11 10 use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid, & 11 & dynhistave_file,dynhistvave_file,dynhistuave_file 12 12 implicit none 13 13 … … 30 30 C t_wrt: frequence d'ecriture sur le fichier 31 31 C 32 C Sortie:33 C fileid: ID du fichier netcdf cree34 32 C 35 33 C L. Fairhead, LMD, 03/99 … … 52 50 C Arguments 53 51 C 54 character*(*) infile55 52 integer day0, anne0 56 53 real tstep, t_ops, t_wrt 57 integer fileid58 54 59 55 #ifdef CPP_IOIPSL … … 61 57 C Variables locales 62 58 C 63 integer thoriid, zvertiid64 59 integer tau0 65 60 real zjulian 66 61 integer iq 67 62 real rlong(iip1,jjp1), rlat(iip1,jjp1) 63 integer uhoriid, vhoriid, thoriid, zvertiid 68 64 integer ii,jj 69 65 integer zan, dayref … … 88 84 enddo 89 85 90 call histbeg(infile, iip1, rlong(:,1), jjp1, rlat(1,:), 86 ! Creation de 3 fichiers pour les differentes grilles horizontales 87 ! Restriction de IOIPSL: seulement 2 coordonnees dans le meme fichier 88 ! Grille Scalaire 89 call histbeg(dynhistave_file, iip1, rlong(:,1), jjp1, rlat(1,:), 91 90 . 1, iip1, 1, jjp1, 92 . tau0, zjulian, tstep, thoriid, fileid) 93 91 . tau0, zjulian, tstep, thoriid,histaveid) 92 93 C Creation du fichier histoire pour les grilles en V et U (oblige pour l'instant, 94 C IOIPSL ne permet pas de grilles avec des nombres de point differents dans 95 C un meme fichier) 96 ! Grille V 97 do jj = 1, jjm 98 do ii = 1, iip1 99 rlong(ii,jj) = rlonv(ii) * 180. / pi 100 rlat(ii,jj) = rlatv(jj) * 180. / pi 101 enddo 102 enddo 103 104 call histbeg(dynhistvave_file, iip1, rlong(:,1), jjm, rlat(1,:), 105 . 1, iip1, 1, jjm, 106 . tau0, zjulian, tstep, vhoriid,histvaveid) 107 ! Grille U 108 do jj = 1, jjp1 109 do ii = 1, iip1 110 rlong(ii,jj) = rlonu(ii) * 180. / pi 111 rlat(ii,jj) = rlatu(jj) * 180. / pi 112 enddo 113 enddo 114 115 call histbeg(dynhistuave_file, iip1, rlong(:,1),jjp1, rlat(1,:), 116 . 1, iip1, 1, jjp1, 117 . tau0, zjulian, tstep, uhoriid,histuaveid) 94 118 C 95 119 C Appel a histvert pour la grille verticale 96 120 C 97 call histvert(fileid, 'sigss', 'Niveaux sigma','Pa', 98 . llm, nivsigs, zvertiid) 121 call histvert(histaveid,'presnivs','Niveaux Pression 122 & approximatifs','mb',llm, presnivs/100., zvertiid,'down') 123 call histvert(histuaveid,'presnivs','Niveaux Pression 124 & approximatifs','mb',llm, presnivs/100., zvertiid,'down') 125 call histvert(histvaveid,'presnivs','Niveaux Pression 126 & approximatifs','mb',llm, presnivs/100., zvertiid,'down') 99 127 C 100 128 C Appels a histdef pour la definition des variables a sauvegarder … … 102 130 C Vents U 103 131 C 104 write(6,*)'inithistave',tstep 105 call histdef(fileid, 'u', 'vents u scalaires moyennes', 106 . 'm/s', iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 107 . 32, 'ave(X)', t_ops, t_wrt) 108 109 C 132 ! write(6,*)'inithistave',tstep 133 call histdef(histuaveid, 'u', 'vent u moyen ', 134 . 'm/s', iip1, jjp1, uhoriid, llm, 1, llm, zvertiid, 135 . 32, 'ave(X)', t_ops, t_wrt) 136 110 137 C Vents V 111 138 C 112 call histdef( fileid, 'v', 'vents v scalaires moyennes',113 . 'm/s', iip1, jj p1, thoriid, llm, 1, llm, zvertiid,139 call histdef(histvaveid, 'v', 'vent v moyen', 140 . 'm/s', iip1, jjm, vhoriid, llm, 1, llm, zvertiid, 114 141 . 32, 'ave(X)', t_ops, t_wrt) 115 142 … … 117 144 C Temperature 118 145 C 119 call histdef( fileid, 'temp', 'temperature moyennee', 'K',146 call histdef(histaveid, 'temp', 'temperature moyenne', 'K', 120 147 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 121 148 . 32, 'ave(X)', t_ops, t_wrt) … … 123 150 C Temperature potentielle 124 151 C 125 call histdef(fileid, 'theta', 'temperature potentielle', 'K', 126 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 127 . 32, 'ave(X)', t_ops, t_wrt) 128 129 152 call histdef(histaveid, 'theta', 'temperature potentielle', 'K', 153 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 154 . 32, 'ave(X)', t_ops, t_wrt) 130 155 C 131 156 C Geopotentiel 132 157 C 133 call histdef( fileid, 'phi', 'geopotentiel moyenne', '-',158 call histdef(histaveid, 'phi', 'geopotentiel moyen', '-', 134 159 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 135 160 . 32, 'ave(X)', t_ops, t_wrt) … … 137 162 C Traceurs 138 163 C 139 DO iq=1,nqtot140 call histdef(fileid, ttext(iq), ttext(iq), '-',141 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid,142 . 32, 'ave(X)', t_ops, t_wrt)143 enddo164 ! DO iq=1,nqtot 165 ! call histdef(histaveid, ttext(iq), ttext(iq), '-', 166 ! . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 167 ! . 32, 'ave(X)', t_ops, t_wrt) 168 ! enddo 144 169 C 145 170 C Masse 146 171 C 147 call histdef(fileid, 'masse', 'masse', 'kg', 172 call histdef(histaveid, 'masse', 'masse', 'kg', 173 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 174 . 32, 'ave(X)', t_ops, t_wrt) 175 C 176 C Pression au sol 177 C 178 call histdef(histaveid, 'ps', 'pression naturelle au sol', 'Pa', 148 179 . iip1, jjp1, thoriid, 1, 1, 1, -99, 149 180 . 32, 'ave(X)', t_ops, t_wrt) 150 181 C 151 C Pression au sol 152 C 153 call histdef(fileid, 'ps', 'pression naturelle au sol', 'Pa', 154 . iip1, jjp1, thoriid, 1, 1, 1, -99, 155 . 32, 'ave(X)', t_ops, t_wrt) 156 C 157 C Pression au sol 158 C 159 call histdef(fileid, 'phis', 'geopotentiel au sol', '-', 160 . iip1, jjp1, thoriid, 1, 1, 1, -99, 161 . 32, 'ave(X)', t_ops, t_wrt) 162 C 182 C Geopotentiel au sol 183 C 184 ! call histdef(histaveid, 'phis', 'geopotentiel au sol', '-', 185 ! . iip1, jjp1, thoriid, 1, 1, 1, -99, 186 ! . 32, 'ave(X)', t_ops, t_wrt) 187 !C 163 188 C Fin 164 189 C 165 call histend(fileid) 190 call histend(histaveid) 191 call histend(histuaveid) 192 call histend(histvaveid) 166 193 #else 167 194 ! tell the user this routine should be run with ioipsl -
LMDZ4/trunk/libf/bibio/inithist.F
r1279 r1403 2 2 ! $Id$ 3 3 ! 4 subroutine inithist(infile,day0,anne0,tstep,t_ops,t_wrt,fileid, 5 . filevid) 4 subroutine inithist(day0,anne0,tstep,t_ops,t_wrt) 6 5 7 6 #ifdef CPP_IOIPSL … … 9 8 #endif 10 9 USE infotrac, ONLY : nqtot, ttext 10 use com_io_dyn_mod, only : histid,histvid,histuid, & 11 & dynhist_file,dynhistv_file,dynhistu_file 11 12 12 13 implicit none … … 31 32 C nq: nombre de traceurs 32 33 C 33 C Sortie:34 C fileid: ID du fichier netcdf cree35 C filevid:ID du fichier netcdf pour la grille v36 34 C 37 35 C L. Fairhead, LMD, 03/99 … … 54 52 C Arguments 55 53 C 56 character*(*) infile57 54 integer day0, anne0 58 55 real tstep, t_ops, t_wrt 59 integer fileid, filevid60 56 61 57 #ifdef CPP_IOIPSL … … 83 79 tau0 = itau_dyn 84 80 81 ! ------------------------------------------------------------- 82 ! Creation des 3 fichiers pour les grilles horizontales U,V,Scal 83 ! ------------------------------------------------------------- 84 !Grille U 85 85 do jj = 1, jjp1 86 86 do ii = 1, iip1 … … 90 90 enddo 91 91 92 call histbeg( infile, iip1, rlong(:,1), jjp1, rlat(1,:),92 call histbeg(dynhistu_file, iip1, rlong(:,1), jjp1, rlat(1,:), 93 93 . 1, iip1, 1, jjp1, 94 . tau0, zjulian, tstep, uhoriid, fileid) 95 C 96 C Creation du fichier histoire pour la grille en V (oblige pour l'instant, 97 C IOIPSL ne permet pas de grilles avec des nombres de point differents dans 98 C un meme fichier) 94 . tau0, zjulian, tstep, uhoriid, histuid) 99 95 96 ! Grille V 100 97 do jj = 1, jjm 101 98 do ii = 1, iip1 … … 105 102 enddo 106 103 107 call histbeg( 'dyn_histv.nc', iip1, rlong(:,1), jjm, rlat(1,:),104 call histbeg(dynhistv_file, iip1, rlong(:,1), jjm, rlat(1,:), 108 105 . 1, iip1, 1, jjm, 109 . tau0, zjulian, tstep, vhoriid, filevid) 110 C 111 C Appel a histhori pour rajouter les autres grilles horizontales 112 C 106 . tau0, zjulian, tstep, vhoriid, histvid) 107 108 !Grille Scalaire 113 109 do jj = 1, jjp1 114 110 do ii = 1, iip1 … … 118 114 enddo 119 115 120 call histhori(fileid, iip1, rlong, jjp1, rlat, 'scalar', 121 . 'Grille points scalaires', thoriid) 116 call histbeg(dynhist_file, iip1, rlong(:,1), jjp1, rlat(1,:), 117 . 1, iip1, 1, jjp1, 118 . tau0, zjulian, tstep, thoriid, histid) 119 ! ------------------------------------------------------------- 120 C Appel a histvert pour la grille verticale 121 ! ------------------------------------------------------------- 122 call histvert(histid, 'presnivs', 'Niveaux pression','mb', 123 . llm, presnivs/100., zvertiid,'down') 124 call histvert(histvid, 'presnivs', 'Niveaux pression','mb', 125 . llm, presnivs/100., zvertiid,'down') 126 call histvert(histuid, 'presnivs', 'Niveaux pression','mb', 127 . llm, presnivs/100., zvertiid,'down') 122 128 C 123 C Appel a histvert pour la grille verticale 124 C 125 call histvert(fileid, 'sig_s', 'Niveaux sigma','-', 126 . llm, nivsigs, zvertiid) 127 C Pour le fichier V 128 call histvert(filevid, 'sig_s', 'Niveaux sigma','-', 129 . llm, nivsigs, zvertiid) 130 C 129 ! ------------------------------------------------------------- 131 130 C Appels a histdef pour la definition des variables a sauvegarder 131 ! ------------------------------------------------------------- 132 132 C 133 133 C Vents U 134 134 C 135 call histdef( fileid, 'ucov', 'vents u covariants', 'm/s',135 call histdef(histuid, 'u', 'vent u', 'm/s', 136 136 . iip1, jjp1, uhoriid, llm, 1, llm, zvertiid, 137 137 . 32, 'inst(X)', t_ops, t_wrt) … … 139 139 C Vents V 140 140 C 141 call histdef( filevid, 'vcov', 'vents v covariants', 'm/s',141 call histdef(histvid, 'v', 'vent v', 'm/s', 142 142 . iip1, jjm, vhoriid, llm, 1, llm, zvertiid, 143 143 . 32, 'inst(X)', t_ops, t_wrt) … … 146 146 C Temperature potentielle 147 147 C 148 call histdef( fileid, 'teta', 'temperature potentielle', '-',148 call histdef(histid, 'teta', 'temperature potentielle', '-', 149 149 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 150 150 . 32, 'inst(X)', t_ops, t_wrt) … … 152 152 C Geopotentiel 153 153 C 154 call histdef( fileid, 'phi', 'geopotentiel instantane', '-',154 call histdef(histid, 'phi', 'geopotentiel', '-', 155 155 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 156 156 . 32, 'inst(X)', t_ops, t_wrt) … … 158 158 C Traceurs 159 159 C 160 DO iq=1,nqtot 161 call histdef(fileid, ttext(iq), ttext(iq), '-', 162 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 163 . 32, 'inst(X)', t_ops, t_wrt) 164 enddo 165 C 160 ! 161 ! DO iq=1,nqtot 162 ! call histdef(histid, ttext(iq), ttext(iq), '-', 163 ! . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 164 ! . 32, 'inst(X)', t_ops, t_wrt) 165 ! enddo 166 !C 166 167 C Masse 167 168 C 168 call histdef( fileid, 'masse', 'masse', 'kg',169 . iip1, jjp1, thoriid, 1, 1, 1, -99,169 call histdef(histid, 'masse', 'masse', 'kg', 170 . iip1, jjp1, thoriid, llm, 1, llm, zvertiid, 170 171 . 32, 'inst(X)', t_ops, t_wrt) 171 172 C 172 173 C Pression au sol 173 174 C 174 call histdef( fileid, 'ps', 'pression naturelle au sol', 'Pa',175 call histdef(histid, 'ps', 'pression naturelle au sol', 'Pa', 175 176 . iip1, jjp1, thoriid, 1, 1, 1, -99, 176 177 . 32, 'inst(X)', t_ops, t_wrt) 177 178 C 178 C Pressionau sol179 C180 call histdef(fileid, 'phis', 'geopotentiel au sol', '-',181 . iip1, jjp1, thoriid, 1, 1, 1, -99,182 . 32, 'inst(X)', t_ops, t_wrt)183 C179 C Geopotentiel au sol 180 !C 181 ! call histdef(histid, 'phis', 'geopotentiel au sol', '-', 182 ! . iip1, jjp1, thoriid, 1, 1, 1, -99, 183 ! . 32, 'inst(X)', t_ops, t_wrt) 184 !C 184 185 C Fin 185 186 C 186 call histend(fileid) 187 call histend(filevid) 187 call histend(histid) 188 call histend(histuid) 189 call histend(histvid) 188 190 #else 189 191 ! tell the user this routine should be run with ioipsl -
LMDZ4/trunk/libf/bibio/writedynav.F
r1279 r1403 2 2 ! $Id$ 3 3 ! 4 subroutine writedynav( histid,time, vcov,5 , 4 subroutine writedynav(time, vcov, 5 , ucov,teta,ppk,phi,q,masse,ps,phis) 6 6 7 7 #ifdef CPP_IOIPSL … … 9 9 #endif 10 10 USE infotrac, ONLY : nqtot, ttext 11 use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid 11 12 implicit none 12 13 … … 17 18 C 18 19 C Entree: 19 C histid: ID du fichier histoire20 20 C time: temps de l'ecriture 21 21 C vcov: vents v covariants … … 29 29 C 30 30 C 31 C Sortie:32 C fileid: ID du fichier netcdf cree33 31 C 34 32 C L. Fairhead, LMD, 03/99 … … 53 51 C 54 52 55 INTEGER histid56 53 REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) 57 REAL teta(ip1jmp1*llm),phi(ip1jmp1,llm),ppk(ip1jmp1*llm) 54 REAL teta(ip1jmp1*llm),phi(ip1jmp1,llm),ppk(ip1jmp1*llm) 58 55 REAL ps(ip1jmp1),masse(ip1jmp1,llm) 59 56 REAL phis(ip1jmp1) … … 66 63 C Variables locales 67 64 C 68 integer ndex2d(i ip1*jjp1),ndex3d(iip1*jjp1*llm),iq, ii, ll69 real us(ip1jmp1*llm), vs(ip1jmp1*llm)65 integer ndex2d(ip1jmp1),ndexu(ip1jmp1*llm),ndexv(ip1jm*llm) 66 INTEGER iq, ii, ll 70 67 real tm(ip1jmp1*llm) 71 68 REAL vnat(ip1jm,llm),unat(ip1jmp1,llm) … … 75 72 C Initialisations 76 73 C 77 ndex3d = 0 74 ndexu = 0 75 ndexv = 0 78 76 ndex2d = 0 79 77 ok_sync = .TRUE. 80 us = 999.99981 vs = 999.99982 78 tm = 999.999 83 79 vnat = 999.999 … … 91 87 C Appels a histwrite pour l'ecriture des variables a sauvegarder 92 88 C 93 C Vents U scalaire89 C Vents U 94 90 C 95 call gr_u_scal(llm, unat, us) 96 call histwrite(histid, 'u', itau_w, us, 97 . iip1*jjp1*llm, ndex3d) 91 call histwrite(histuaveid, 'u', itau_w, unat, 92 . iip1*jjp1*llm, ndexu) 98 93 C 99 C Vents V scalaire94 C Vents V 100 95 C 101 call gr_v_scal(llm, vnat, vs) 102 call histwrite(histid, 'v', itau_w, vs, 103 . iip1*jjp1*llm, ndex3d) 96 call histwrite(histvaveid, 'v', itau_w, vnat, 97 . iip1*jjm*llm, ndexv) 104 98 C 105 99 C Temperature potentielle moyennee 106 100 C 107 call histwrite(hist id, 'theta', itau_w, teta,108 . iip1*jjp1*llm, ndex 3d)101 call histwrite(histaveid, 'theta', itau_w, teta, 102 . iip1*jjp1*llm, ndexu) 109 103 C 110 104 C Temperature moyennee … … 113 107 tm(ii) = teta(ii) * ppk(ii)/cpp 114 108 enddo 115 call histwrite(hist id, 'temp', itau_w, tm,116 . iip1*jjp1*llm, ndex 3d)109 call histwrite(histaveid, 'temp', itau_w, tm, 110 . iip1*jjp1*llm, ndexu) 117 111 C 118 112 C Geopotentiel 119 113 C 120 call histwrite(hist id, 'phi', itau_w, phi,121 . iip1*jjp1*llm, ndex 3d)114 call histwrite(histaveid, 'phi', itau_w, phi, 115 . iip1*jjp1*llm, ndexu) 122 116 C 123 117 C Traceurs 124 118 C 125 DO iq=1,nqtot126 call histwrite(histid, ttext(iq), itau_w, q(:,:,iq),127 . iip1*jjp1*llm, ndex3d)128 enddo119 ! DO iq=1,nqtot 120 ! call histwrite(histaveid, ttext(iq), itau_w, q(:,:,iq), 121 ! . iip1*jjp1*llm, ndexu) 122 ! enddo 129 123 C 130 124 C Masse 131 125 C 132 call histwrite(histid, 'masse', itau_w, masse, iip1*jjp1, ndex2d) 126 call histwrite(histaveid, 'masse', itau_w, masse, 127 $ iip1*jjp1*llm, ndexu) 133 128 C 134 129 C Pression au sol 135 130 C 136 call histwrite(hist id, 'ps', itau_w, ps, iip1*jjp1, ndex2d)131 call histwrite(histaveid, 'ps', itau_w, ps, iip1*jjp1, ndex2d) 137 132 C 138 133 C Geopotentiel au sol 139 134 C 140 call histwrite(histid, 'phis', itau_w, phis,iip1*jjp1, ndex2d)135 ! call histwrite(histaveid,'phis',itau_w, phis,iip1*jjp1, ndex2d) 141 136 C 142 137 C Fin 143 138 C 144 if (ok_sync) call histsync(histid) 139 if (ok_sync) then 140 call histsync(histaveid) 141 call histsync(histvaveid) 142 call histsync(histuaveid) 143 ENDIF 145 144 146 145 #else -
LMDZ4/trunk/libf/bibio/writehist.F
r1279 r1403 2 2 ! $Id$ 3 3 ! 4 subroutine writehist( histid, histvid, time, vcov, 5 , ucov,teta,phi,q,masse,ps,phis) 4 subroutine writehist(time,vcov,ucov,teta,phi,q,masse,ps,phis) 6 5 7 6 #ifdef CPP_IOIPSL … … 9 8 #endif 10 9 USE infotrac, ONLY : nqtot, ttext 10 use com_io_dyn_mod, only : histid,histvid,histuid 11 11 implicit none 12 12 … … 17 17 C 18 18 C Entree: 19 C histid: ID du fichier histoire20 C histvid:ID du fichier histoire pour les vents V (appele a disparaitre)21 19 C time: temps de l'ecriture 22 20 C vcov: vents v covariants … … 29 27 C phis : geopotentiel au sol 30 28 C 31 C32 C Sortie:33 C fileid: ID du fichier netcdf cree34 29 C 35 30 C L. Fairhead, LMD, 03/99 … … 54 49 C 55 50 56 INTEGER histid, histvid57 51 REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) 58 52 REAL teta(ip1jmp1,llm),phi(ip1jmp1,llm) … … 71 65 logical ok_sync 72 66 integer itau_w 67 REAL vnat(ip1jm,llm),unat(ip1jmp1,llm) 68 73 69 C 74 70 C Initialisations … … 79 75 ok_sync =.TRUE. 80 76 itau_w = itau_dyn + time 77 ! Passage aux composantes naturelles du vent 78 call covnat(llm, ucov, vcov, unat, vnat) 81 79 C 82 80 C Appels a histwrite pour l'ecriture des variables a sauvegarder … … 84 82 C Vents U 85 83 C 86 call histwrite(hist id, 'ucov', itau_w, ucov,84 call histwrite(histuid, 'u', itau_w, unat, 87 85 . iip1*jjp1*llm, ndexu) 88 89 86 C 90 87 C Vents V 91 88 C 92 call histwrite(histvid, 'v cov', itau_w, vcov,89 call histwrite(histvid, 'v', itau_w, vnat, 93 90 . iip1*jjm*llm, ndexv) 94 91 … … 106 103 C Traceurs 107 104 C 108 DO iq=1,nqtot109 call histwrite(histid, ttext(iq), itau_w, q(:,:,iq),110 . iip1*jjp1*llm, ndexu)111 enddo112 C105 ! DO iq=1,nqtot 106 ! call histwrite(histid, ttext(iq), itau_w, q(:,:,iq), 107 ! . iip1*jjp1*llm, ndexu) 108 ! enddo 109 !C 113 110 C Masse 114 111 C 115 call histwrite(histid, 'masse', itau_w, masse, iip1*jjp1, ndex2d)112 call histwrite(histid,'masse',itau_w, masse,iip1*jjp1*llm,ndexu) 116 113 C 117 114 C Pression au sol … … 121 118 C Geopotentiel au sol 122 119 C 123 call histwrite(histid, 'phis', itau_w, phis, iip1*jjp1, ndex2d)120 ! call histwrite(histid, 'phis', itau_w, phis, iip1*jjp1, ndex2d) 124 121 C 125 122 C Fin … … 128 125 call histsync(histid) 129 126 call histsync(histvid) 127 call histsync(histuid) 130 128 endif 131 129 #else -
LMDZ4/trunk/libf/dyn3d/adaptdt.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine adaptdt(nadv,dtbon,n,pbaru, 5 5 c masse) 6 6 7 USE control_mod 7 8 IMPLICIT NONE 8 9 … … 16 17 #include "logic.h" 17 18 #include "temps.h" 18 #include "control.h"19 19 #include "ener.h" 20 20 #include "description.h" -
LMDZ4/trunk/libf/dyn3d/advtrac.F
r1279 r1403 16 16 c 17 17 USE infotrac 18 USE control_mod 19 18 20 19 21 IMPLICIT NONE … … 27 29 #include "logic.h" 28 30 #include "temps.h" 29 #include "control.h"30 31 #include "ener.h" 31 32 #include "description.h" … … 121 122 122 123 ! ... Flux de masse diaganostiques traceurs 123 flxw = wg / FLOAT(iapp_tracvl)124 flxw = wg / REAL(iapp_tracvl) 124 125 125 126 c test sur l'eventuelle creation de valeurs negatives de la masse -
LMDZ4/trunk/libf/dyn3d/bilan_dyn.F
r1279 r1403 423 423 Q_cum(:,:,:,iQ)=Q_cum(:,:,:,iQ)/masse_cum(:,:,:) 424 424 enddo 425 zz=1./ float(ncum)425 zz=1./REAL(ncum) 426 426 ps_cum=ps_cum*zz 427 427 masse_cum=masse_cum*zz -
LMDZ4/trunk/libf/dyn3d/caladvtrac.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 9 9 c 10 10 USE infotrac 11 USE control_mod 12 11 13 IMPLICIT NONE 12 14 c … … 24 26 #include "paramet.h" 25 27 #include "comconst.h" 26 #include "control.h"27 28 28 29 c Arguments: -
LMDZ4/trunk/libf/dyn3d/calfis.F
r1279 r1403 31 31 c ......... 32 32 USE infotrac 33 USE control_mod 34 33 35 34 36 IMPLICIT NONE … … 96 98 #include "comvert.h" 97 99 #include "comgeom2.h" 98 #include " control.h"100 #include "iniprint.h" 99 101 100 102 c Arguments : … … 149 151 REAL zdpsrf(ngridmx) 150 152 c 153 REAL zdufic(ngridmx,llm),zdvfic(ngridmx,llm) 154 REAL zdtfic(ngridmx,llm),zdqfic(ngridmx,llm,nqtot) 155 REAL jH_cur_split,zdt_split 156 LOGICAL debut_split,lafin_split 157 INTEGER isplit 158 151 159 REAL zsin(iim),zcos(iim),z1(iim) 152 160 REAL zsinbis(iim),zcosbis(iim),z1bis(iim) … … 181 189 debut = .TRUE. 182 190 IF (ngridmx.NE.2+(jjm-1)*iim) THEN 183 PRINT*,'STOP dans calfis' 184 PRINT*,'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim' 185 PRINT*,' ngridmx jjm iim ' 186 PRINT*,ngridmx,jjm,iim 191 write(lunout,*) 'STOP dans calfis' 192 write(lunout,*) 193 & 'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim' 194 write(lunout,*) ' ngridmx jjm iim ' 195 write(lunout,*) ngridmx,jjm,iim 187 196 STOP 188 197 ENDIF … … 308 317 CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,pphis,zphis) 309 318 DO l=1,llm 310 311 312 319 DO ig=1,ngridmx 320 zphi(ig,l)=zphi(ig,l)-zphis(ig) 321 ENDDO 313 322 ENDDO 314 323 … … 408 417 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv(i,jjm) 409 418 z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv(i,jjm) 410 419 ENDDO 411 420 412 421 DO i=1,iim … … 415 424 zsin(i) = SIN(rlonv(i))*z1(i) 416 425 zsinbis(i) = SIN(rlonv(i))*z1bis(i) 417 426 ENDDO 418 427 419 428 zufi(ngridmx,l) = SSUM(iim,zcos,1)/pi … … 443 452 if (planet_type=="earth") then 444 453 #ifdef CPP_EARTH 445 CALL physiq (ngridmx, 454 455 write(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys 456 zdt_split=dtphys/nsplit_phys 457 zdufic(:,:)=0. 458 zdvfic(:,:)=0. 459 zdtfic(:,:)=0. 460 zdqfic(:,:,:)=0. 461 462 do isplit=1,nsplit_phys 463 464 jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys) 465 debut_split=debut.and.isplit==1 466 lafin_split=lafin.and.isplit==nsplit_phys 467 468 CALL physiq (ngridmx, 446 469 . llm, 447 . debut ,448 . lafin ,470 . debut_split, 471 . lafin_split, 449 472 . jD_cur, 450 . jH_cur ,451 . dtphys,473 . jH_cur_split, 474 . zdt_split, 452 475 . zplev, 453 476 . zplay, … … 469 492 . pducov, 470 493 . PVteta) 494 495 zufi(:,:)=zufi(:,:)+zdufi(:,:)*zdt_split 496 zvfi(:,:)=zvfi(:,:)+zdvfi(:,:)*zdt_split 497 ztfi(:,:)=ztfi(:,:)+zdtfi(:,:)*zdt_split 498 zqfi(:,:,:)=zqfi(:,:,:)+zdqfi(:,:,:)*zdt_split 499 500 zdufic(:,:)=zdufic(:,:)+zdufi(:,:) 501 zdvfic(:,:)=zdvfic(:,:)+zdvfi(:,:) 502 zdtfic(:,:)=zdtfic(:,:)+zdtfi(:,:) 503 zdqfic(:,:,:)=zdqfic(:,:,:)+zdqfi(:,:,:) 504 505 enddo 506 zdufi(:,:)=zdufic(:,:)/nsplit_phys 507 zdvfi(:,:)=zdvfic(:,:)/nsplit_phys 508 zdtfi(:,:)=zdtfic(:,:)/nsplit_phys 509 zdqfi(:,:,:)=zdqfic(:,:,:)/nsplit_phys 510 471 511 #endif 472 512 endif !of if (planet_type=="earth") -
LMDZ4/trunk/libf/dyn3d/ce0l.F90
r1323 r1403 14 14 ! masque is created in etat0, passed to limit to ensure consistancy. 15 15 !------------------------------------------------------------------------------- 16 USE control_mod 16 17 #ifdef CPP_EARTH 17 18 ! This prog. is designed to work for Earth … … 36 37 #include "indicesol.h" 37 38 #include "iniprint.h" 38 #include "control.h"39 39 #include "temps.h" 40 40 #include "logic.h" -
LMDZ4/trunk/libf/dyn3d/conf_gcm.F
r1323 r1403 6 6 SUBROUTINE conf_gcm( tapedef, etatinit, clesphy0 ) 7 7 c 8 USE control_mod 8 9 #ifdef CPP_IOIPSL 9 10 use IOIPSL … … 34 35 #include "dimensions.h" 35 36 #include "paramet.h" 36 #include "control.h"37 37 #include "logic.h" 38 38 #include "serre.h" … … 162 162 day_step = 240 163 163 CALL getin('day_step',day_step) 164 165 !Config Key = nsplit_phys 166 !Config Desc = nombre de pas par jour 167 !Config Def = 1 168 !Config Help = nombre de pas par jour (multiple de iperiod) ( 169 !Config ici pour dt = 1 min ) 170 nsplit_phys = 1 171 CALL getin('nsplit_phys',nsplit_phys) 164 172 165 173 !Config Key = iperiod … … 573 581 CALL getin('config_inca',config_inca) 574 582 575 576 583 !Config Key = ok_dynzon 577 584 !Config Desc = calcul et sortie des transports … … 581 588 ok_dynzon = .FALSE. 582 589 CALL getin('ok_dynzon',ok_dynzon) 590 591 !Config Key = ok_dyn_ins 592 !Config Desc = sorties instantanees dans la dynamique 593 !Config Def = n 594 !Config Help = 595 !Config 596 ok_dyn_ins = .FALSE. 597 CALL getin('ok_dyn_ins',ok_dyn_ins) 598 599 !Config Key = ok_dyn_ave 600 !Config Desc = sorties moyennes dans la dynamique 601 !Config Def = n 602 !Config Help = 603 !Config 604 ok_dyn_ave = .FALSE. 605 CALL getin('ok_dyn_ave',ok_dyn_ave) 606 583 607 584 608 write(lunout,*)' #########################################' … … 620 644 write(lunout,*)' config_inca = ', config_inca 621 645 write(lunout,*)' ok_dynzon = ', ok_dynzon 646 write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins 647 write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave 622 648 623 649 RETURN … … 746 772 747 773 !Config Key = ok_dynzon 748 !Config Desc = calcul et sortie des transports774 !Config Desc = sortie des transports zonaux dans la dynamique 749 775 !Config Def = n 750 !Config Help = Permet de mettre en route le calcul des transports776 !Config Help = 751 777 !Config 752 778 ok_dynzon = .FALSE. 753 779 CALL getin('ok_dynzon',ok_dynzon) 780 781 !Config Key = ok_dyn_ins 782 !Config Desc = sorties instantanees dans la dynamique 783 !Config Def = n 784 !Config Help = 785 !Config 786 ok_dyn_ins = .FALSE. 787 CALL getin('ok_dyn_ins',ok_dyn_ins) 788 789 !Config Key = ok_dyn_ave 790 !Config Desc = sorties moyennes dans la dynamique 791 !Config Def = n 792 !Config Help = 793 !Config 794 ok_dyn_ave = .FALSE. 795 CALL getin('ok_dyn_ave',ok_dyn_ave) 754 796 755 797 !Config key = ok_strato … … 824 866 write(lunout,*)' config_inca = ', config_inca 825 867 write(lunout,*)' ok_dynzon = ', ok_dynzon 868 write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins 869 write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave 826 870 write(lunout,*)' ok_strato = ', ok_strato 827 871 write(lunout,*)' ok_gradsfile = ', ok_gradsfile -
LMDZ4/trunk/libf/dyn3d/defrun.F
r956 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 6 6 SUBROUTINE defrun( tapedef, etatinit, clesphy0 ) 7 7 c 8 USE control_mod 9 8 10 IMPLICIT NONE 9 11 c----------------------------------------------------------------------- … … 28 30 #include "dimensions.h" 29 31 #include "paramet.h" 30 #include "control.h"31 32 #include "logic.h" 32 33 #include "serre.h" … … 239 240 clesphy0(i) = 0. 240 241 ENDDO 241 clesphy0(1) = FLOAT( iflag_con )242 clesphy0(2) = FLOAT( nbapp_rad )242 clesphy0(1) = REAL( iflag_con ) 243 clesphy0(2) = REAL( nbapp_rad ) 243 244 244 245 IF( cycle_diurne ) clesphy0(3) = 1. -
LMDZ4/trunk/libf/dyn3d/disvert.F
r1279 r1403 111 111 snorm = 0. 112 112 DO l = 1, llm 113 x = 2.*asin(1.) * ( FLOAT(l)-0.5) / float(llm+1)113 x = 2.*asin(1.) * (REAL(l)-0.5) / REAL(llm+1) 114 114 115 115 IF (ok_strato) THEN … … 135 135 136 136 DO l=1,llm 137 nivsigs(l) = FLOAT(l)137 nivsigs(l) = REAL(l) 138 138 ENDDO 139 139 140 140 DO l=1,llmp1 141 nivsig(l)= FLOAT(l)141 nivsig(l)= REAL(l) 142 142 ENDDO 143 143 -
LMDZ4/trunk/libf/dyn3d/dynetat0.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 4 SUBROUTINE dynetat0(fichnom,vcov,ucov, … … 34 34 #include "serre.h" 35 35 #include "logic.h" 36 #include "iniprint.h" 36 37 37 38 c Arguments: … … 58 59 ierr = NF_OPEN (fichnom, NF_NOWRITE,nid) 59 60 IF (ierr.NE.NF_NOERR) THEN 60 write( 6,*)'Pb d''ouverture du fichier start.nc'61 write( 6,*)' ierr = ', ierr61 write(lunout,*)'dynetat0: Pb d''ouverture du fichier start.nc' 62 write(lunout,*)' ierr = ', ierr 62 63 CALL ABORT 63 64 ENDIF … … 66 67 ierr = NF_INQ_VARID (nid, "controle", nvarid) 67 68 IF (ierr .NE. NF_NOERR) THEN 68 PRINT*,"dynetat0: Le champ <controle> est absent"69 write(lunout,*)"dynetat0: Le champ <controle> est absent" 69 70 CALL abort 70 71 ENDIF … … 75 76 #endif 76 77 IF (ierr .NE. NF_NOERR) THEN 77 PRINT*,"dynetat0: Lecture echoue pour <controle>"78 write(lunout,*)"dynetat0: Lecture echoue pour <controle>" 78 79 CALL abort 79 80 ENDIF … … 121 122 c 122 123 c 123 PRINT*,'rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa 124 write(lunout,*)'dynetat0: rad,omeg,g,cpp,kappa', 125 & rad,omeg,g,cpp,kappa 124 126 125 127 IF( im.ne.iim ) THEN … … 136 138 ierr = NF_INQ_VARID (nid, "rlonu", nvarid) 137 139 IF (ierr .NE. NF_NOERR) THEN 138 PRINT*,"dynetat0: Le champ <rlonu> est absent"140 write(lunout,*)"dynetat0: Le champ <rlonu> est absent" 139 141 CALL abort 140 142 ENDIF … … 145 147 #endif 146 148 IF (ierr .NE. NF_NOERR) THEN 147 PRINT*,"dynetat0: Lecture echouee pour <rlonu>"149 write(lunout,*)"dynetat0: Lecture echouee pour <rlonu>" 148 150 CALL abort 149 151 ENDIF … … 151 153 ierr = NF_INQ_VARID (nid, "rlatu", nvarid) 152 154 IF (ierr .NE. NF_NOERR) THEN 153 PRINT*,"dynetat0: Le champ <rlatu> est absent"155 write(lunout,*)"dynetat0: Le champ <rlatu> est absent" 154 156 CALL abort 155 157 ENDIF … … 160 162 #endif 161 163 IF (ierr .NE. NF_NOERR) THEN 162 PRINT*,"dynetat0: Lecture echouee pour <rlatu>"164 write(lunout,*)"dynetat0: Lecture echouee pour <rlatu>" 163 165 CALL abort 164 166 ENDIF … … 166 168 ierr = NF_INQ_VARID (nid, "rlonv", nvarid) 167 169 IF (ierr .NE. NF_NOERR) THEN 168 PRINT*,"dynetat0: Le champ <rlonv> est absent"170 write(lunout,*)"dynetat0: Le champ <rlonv> est absent" 169 171 CALL abort 170 172 ENDIF … … 175 177 #endif 176 178 IF (ierr .NE. NF_NOERR) THEN 177 PRINT*,"dynetat0: Lecture echouee pour <rlonv>"179 write(lunout,*)"dynetat0: Lecture echouee pour <rlonv>" 178 180 CALL abort 179 181 ENDIF … … 181 183 ierr = NF_INQ_VARID (nid, "rlatv", nvarid) 182 184 IF (ierr .NE. NF_NOERR) THEN 183 PRINT*,"dynetat0: Le champ <rlatv> est absent"185 write(lunout,*)"dynetat0: Le champ <rlatv> est absent" 184 186 CALL abort 185 187 ENDIF … … 190 192 #endif 191 193 IF (ierr .NE. NF_NOERR) THEN 192 PRINT*,"dynetat0: Lecture echouee pour rlatv"194 write(lunout,*)"dynetat0: Lecture echouee pour rlatv" 193 195 CALL abort 194 196 ENDIF … … 196 198 ierr = NF_INQ_VARID (nid, "cu", nvarid) 197 199 IF (ierr .NE. NF_NOERR) THEN 198 PRINT*,"dynetat0: Le champ <cu> est absent"200 write(lunout,*)"dynetat0: Le champ <cu> est absent" 199 201 CALL abort 200 202 ENDIF … … 205 207 #endif 206 208 IF (ierr .NE. NF_NOERR) THEN 207 PRINT*,"dynetat0: Lecture echouee pour <cu>"209 write(lunout,*)"dynetat0: Lecture echouee pour <cu>" 208 210 CALL abort 209 211 ENDIF … … 211 213 ierr = NF_INQ_VARID (nid, "cv", nvarid) 212 214 IF (ierr .NE. NF_NOERR) THEN 213 PRINT*,"dynetat0: Le champ <cv> est absent"215 write(lunout,*)"dynetat0: Le champ <cv> est absent" 214 216 CALL abort 215 217 ENDIF … … 220 222 #endif 221 223 IF (ierr .NE. NF_NOERR) THEN 222 PRINT*,"dynetat0: Lecture echouee pour <cv>"224 write(lunout,*)"dynetat0: Lecture echouee pour <cv>" 223 225 CALL abort 224 226 ENDIF … … 226 228 ierr = NF_INQ_VARID (nid, "aire", nvarid) 227 229 IF (ierr .NE. NF_NOERR) THEN 228 PRINT*,"dynetat0: Le champ <aire> est absent"230 write(lunout,*)"dynetat0: Le champ <aire> est absent" 229 231 CALL abort 230 232 ENDIF … … 235 237 #endif 236 238 IF (ierr .NE. NF_NOERR) THEN 237 PRINT*,"dynetat0: Lecture echouee pour <aire>"239 write(lunout,*)"dynetat0: Lecture echouee pour <aire>" 238 240 CALL abort 239 241 ENDIF … … 241 243 ierr = NF_INQ_VARID (nid, "phisinit", nvarid) 242 244 IF (ierr .NE. NF_NOERR) THEN 243 PRINT*,"dynetat0: Le champ <phisinit> est absent"245 write(lunout,*)"dynetat0: Le champ <phisinit> est absent" 244 246 CALL abort 245 247 ENDIF … … 250 252 #endif 251 253 IF (ierr .NE. NF_NOERR) THEN 252 PRINT*,"dynetat0: Lecture echouee pour <phisinit>"254 write(lunout,*)"dynetat0: Lecture echouee pour <phisinit>" 253 255 CALL abort 254 256 ENDIF … … 256 258 ierr = NF_INQ_VARID (nid, "temps", nvarid) 257 259 IF (ierr .NE. NF_NOERR) THEN 258 PRINT*,"dynetat0: Le champ <temps> est absent"260 write(lunout,*)"dynetat0: Le champ <temps> est absent" 259 261 CALL abort 260 262 ENDIF … … 265 267 #endif 266 268 IF (ierr .NE. NF_NOERR) THEN 267 PRINT*,"dynetat0: Lecture echouee <temps>"269 write(lunout,*)"dynetat0: Lecture echouee <temps>" 268 270 CALL abort 269 271 ENDIF … … 271 273 ierr = NF_INQ_VARID (nid, "ucov", nvarid) 272 274 IF (ierr .NE. NF_NOERR) THEN 273 PRINT*,"dynetat0: Le champ <ucov> est absent"275 write(lunout,*)"dynetat0: Le champ <ucov> est absent" 274 276 CALL abort 275 277 ENDIF … … 280 282 #endif 281 283 IF (ierr .NE. NF_NOERR) THEN 282 PRINT*,"dynetat0: Lecture echouee pour <ucov>"284 write(lunout,*)"dynetat0: Lecture echouee pour <ucov>" 283 285 CALL abort 284 286 ENDIF … … 286 288 ierr = NF_INQ_VARID (nid, "vcov", nvarid) 287 289 IF (ierr .NE. NF_NOERR) THEN 288 PRINT*,"dynetat0: Le champ <vcov> est absent"290 write(lunout,*)"dynetat0: Le champ <vcov> est absent" 289 291 CALL abort 290 292 ENDIF … … 295 297 #endif 296 298 IF (ierr .NE. NF_NOERR) THEN 297 PRINT*,"dynetat0: Lecture echouee pour <vcov>"299 write(lunout,*)"dynetat0: Lecture echouee pour <vcov>" 298 300 CALL abort 299 301 ENDIF … … 301 303 ierr = NF_INQ_VARID (nid, "teta", nvarid) 302 304 IF (ierr .NE. NF_NOERR) THEN 303 PRINT*,"dynetat0: Le champ <teta> est absent"305 write(lunout,*)"dynetat0: Le champ <teta> est absent" 304 306 CALL abort 305 307 ENDIF … … 310 312 #endif 311 313 IF (ierr .NE. NF_NOERR) THEN 312 PRINT*,"dynetat0: Lecture echouee pour <teta>"314 write(lunout,*)"dynetat0: Lecture echouee pour <teta>" 313 315 CALL abort 314 316 ENDIF … … 319 321 ierr = NF_INQ_VARID (nid, tname(iq), nvarid) 320 322 IF (ierr .NE. NF_NOERR) THEN 321 PRINT*, "dynetat0: Le champ <"//tname(iq)//"> est absent" 322 PRINT*, " Il est donc initialise a zero" 323 write(lunout,*)"dynetat0: Le champ <"//tname(iq)// 324 & "> est absent" 325 write(lunout,*)" Il est donc initialise a zero" 323 326 q(:,:,iq)=0. 324 327 ELSE … … 329 332 #endif 330 333 IF (ierr .NE. NF_NOERR) THEN 331 PRINT*,"dynetat0: Lecture echouee pour "//tname(iq)332 334 write(lunout,*)"dynetat0: Lecture echouee pour "//tname(iq) 335 CALL abort 333 336 ENDIF 334 337 ENDIF … … 338 341 ierr = NF_INQ_VARID (nid, "masse", nvarid) 339 342 IF (ierr .NE. NF_NOERR) THEN 340 PRINT*,"dynetat0: Le champ <masse> est absent"343 write(lunout,*)"dynetat0: Le champ <masse> est absent" 341 344 CALL abort 342 345 ENDIF … … 347 350 #endif 348 351 IF (ierr .NE. NF_NOERR) THEN 349 PRINT*,"dynetat0: Lecture echouee pour <masse>"352 write(lunout,*)"dynetat0: Lecture echouee pour <masse>" 350 353 CALL abort 351 354 ENDIF … … 353 356 ierr = NF_INQ_VARID (nid, "ps", nvarid) 354 357 IF (ierr .NE. NF_NOERR) THEN 355 PRINT*,"dynetat0: Le champ <ps> est absent"358 write(lunout,*)"dynetat0: Le champ <ps> est absent" 356 359 CALL abort 357 360 ENDIF … … 362 365 #endif 363 366 IF (ierr .NE. NF_NOERR) THEN 364 PRINT*,"dynetat0: Lecture echouee pour <ps>"367 write(lunout,*)"dynetat0: Lecture echouee pour <ps>" 365 368 CALL abort 366 369 ENDIF -
LMDZ4/trunk/libf/dyn3d/dynredem.F
r1279 r1403 8 8 #endif 9 9 USE infotrac 10 10 11 IMPLICIT NONE 11 12 c======================================================================= … … 25 26 #include "description.h" 26 27 #include "serre.h" 28 #include "iniprint.h" 27 29 28 30 c Arguments: … … 72 74 tab_cntrl(l) = 0. 73 75 ENDDO 74 tab_cntrl(1) = FLOAT(iim)75 tab_cntrl(2) = FLOAT(jjm)76 tab_cntrl(3) = FLOAT(llm)77 tab_cntrl(4) = FLOAT(day_ref)78 tab_cntrl(5) = FLOAT(annee_ref)76 tab_cntrl(1) = REAL(iim) 77 tab_cntrl(2) = REAL(jjm) 78 tab_cntrl(3) = REAL(llm) 79 tab_cntrl(4) = REAL(day_ref) 80 tab_cntrl(5) = REAL(annee_ref) 79 81 tab_cntrl(6) = rad 80 82 tab_cntrl(7) = omeg … … 116 118 ENDIF 117 119 118 tab_cntrl(30) = FLOAT(iday_end)119 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)120 tab_cntrl(30) = REAL(iday_end) 121 tab_cntrl(31) = REAL(itau_dyn + itaufin) 120 122 c 121 123 c ......................................................... … … 125 127 ierr = NF_CREATE(fichnom, NF_CLOBBER, nid) 126 128 IF (ierr.NE.NF_NOERR) THEN 127 WRITE(6,*)" Pb d ouverture du fichier "//fichnom 128 WRITE(6,*)' ierr = ', ierr 129 write(lunout,*)"dynredem0: Pb d ouverture du fichier " 130 & //trim(fichnom) 131 write(lunout,*)' ierr = ', ierr 129 132 CALL ABORT 130 133 ENDIF … … 508 511 ierr = NF_CLOSE(nid) ! fermer le fichier 509 512 510 PRINT*,'iim,jjm,llm,iday_end',iim,jjm,llm,iday_end 511 PRINT*,'rad,omeg,g,cpp,kappa', 512 , rad,omeg,g,cpp,kappa 513 write(lunout,*)'dynredem0: iim,jjm,llm,iday_end', 514 & iim,jjm,llm,iday_end 515 write(lunout,*)'dynredem0: rad,omeg,g,cpp,kappa', 516 & rad,omeg,g,cpp,kappa 513 517 514 518 RETURN … … 517 521 . vcov,ucov,teta,q,masse,ps) 518 522 USE infotrac 523 USE control_mod 524 519 525 IMPLICIT NONE 520 526 c================================================================= … … 528 534 #include "comgeom.h" 529 535 #include "temps.h" 530 #include "control.h" 536 #include "iniprint.h" 537 531 538 532 539 INTEGER l … … 555 562 ierr = NF_OPEN(fichnom, NF_WRITE, nid) 556 563 IF (ierr .NE. NF_NOERR) THEN 557 PRINT*, "Pb. d ouverture "//fichnom564 write(lunout,*)"dynredem1: Pb. d ouverture "//trim(fichnom) 558 565 CALL abort 559 566 ENDIF … … 564 571 ierr = NF_INQ_VARID(nid, "temps", nvarid) 565 572 IF (ierr .NE. NF_NOERR) THEN 566 print *,NF_STRERROR(ierr)573 write(lunout,*) NF_STRERROR(ierr) 567 574 abort_message='Variable temps n est pas definie' 568 575 CALL abort_gcm(modname,abort_message,ierr) … … 573 580 ierr = NF_PUT_VAR1_REAL (nid,nvarid,nb,time) 574 581 #endif 575 PRINT*, "Enregistrement pour ", nb, time582 write(lunout,*) "dynredem1: Enregistrement pour ", nb, time 576 583 577 584 c … … 589 596 ierr = NF_GET_VAR_REAL(nid, nvarid, tab_cntrl) 590 597 #endif 591 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)598 tab_cntrl(31) = REAL(itau_dyn + itaufin) 592 599 #ifdef NC_DOUBLE 593 600 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl) … … 600 607 ierr = NF_INQ_VARID(nid, "ucov", nvarid) 601 608 IF (ierr .NE. NF_NOERR) THEN 602 PRINT*, "Variable ucov n est pas definie" 603 CALL abort 609 abort_message="Variable ucov n est pas definie" 610 ierr=1 611 CALL abort_gcm(modname,abort_message,ierr) 604 612 ENDIF 605 613 #ifdef NC_DOUBLE … … 611 619 ierr = NF_INQ_VARID(nid, "vcov", nvarid) 612 620 IF (ierr .NE. NF_NOERR) THEN 613 PRINT*, "Variable vcov n est pas definie" 614 CALL abort 621 abort_message="Variable vcov n est pas definie" 622 ierr=1 623 CALL abort_gcm(modname,abort_message,ierr) 615 624 ENDIF 616 625 #ifdef NC_DOUBLE … … 622 631 ierr = NF_INQ_VARID(nid, "teta", nvarid) 623 632 IF (ierr .NE. NF_NOERR) THEN 624 PRINT*, "Variable teta n est pas definie" 625 CALL abort 633 abort_message="Variable teta n est pas definie" 634 ierr=1 635 CALL abort_gcm(modname,abort_message,ierr) 626 636 ENDIF 627 637 #ifdef NC_DOUBLE … … 635 645 ierr_file = NF_OPEN ("start_trac.nc", NF_NOWRITE,nid_trac) 636 646 IF (ierr_file .NE.NF_NOERR) THEN 637 write(6,*)' Pb d''ouverture du fichier start_trac.nc' 638 write(6,*)' ierr = ', ierr_file 647 write(lunout,*)'dynredem1: Pb d''ouverture du fichier', 648 & ' start_trac.nc' 649 write(lunout,*)' ierr = ', ierr_file 639 650 ENDIF 640 651 END IF … … 646 657 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 647 658 IF (ierr .NE. NF_NOERR) THEN 648 PRINT*, "Variable tname(iq) n est pas definie" 649 CALL abort 659 abort_message="Variable tname(iq) n est pas definie" 660 ierr=1 661 CALL abort_gcm(modname,abort_message,ierr) 650 662 ENDIF 651 663 #ifdef NC_DOUBLE … … 659 671 ierr = NF_INQ_VARID (nid_trac, tname(iq), nvarid_trac) 660 672 IF (ierr .NE. NF_NOERR) THEN 661 PRINT*, tname(iq),"est absent de start_trac.nc" 673 write(lunout,*) "dynredem1: ",trim(tname(iq)), 674 & " est absent de start_trac.nc" 662 675 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 663 676 IF (ierr .NE. NF_NOERR) THEN 664 PRINT*, "Variable ", tname(iq)," n est pas definie" 665 CALL abort 677 abort_message="dynredem1: Variable "// 678 & trim(tname(iq))//" n est pas definie" 679 ierr=1 680 CALL abort_gcm(modname,abort_message,ierr) 666 681 ENDIF 667 682 #ifdef NC_DOUBLE … … 672 687 673 688 ELSE 674 PRINT*, tname(iq), "est present dans start_trac.nc" 689 write(lunout,*) "dynredem1: ",trim(tname(iq)), 690 & " est present dans start_trac.nc" 675 691 #ifdef NC_DOUBLE 676 692 ierr = NF_GET_VAR_DOUBLE(nid_trac, nvarid_trac, trac_tmp) … … 679 695 #endif 680 696 IF (ierr .NE. NF_NOERR) THEN 681 PRINT*, "Lecture echouee pour", tname(iq) 682 CALL abort 697 abort_message="dynredem1: Lecture echouee pour"// 698 & trim(tname(iq)) 699 ierr=1 700 CALL abort_gcm(modname,abort_message,ierr) 683 701 ENDIF 684 702 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 685 703 IF (ierr .NE. NF_NOERR) THEN 686 PRINT*, "Variable ", tname(iq)," n est pas definie" 687 CALL abort 704 abort_message="dynredem1: Variable "// 705 & trim(tname(iq))//" n est pas definie" 706 ierr=1 707 CALL abort_gcm(modname,abort_message,ierr) 688 708 ENDIF 689 709 #ifdef NC_DOUBLE … … 699 719 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 700 720 IF (ierr .NE. NF_NOERR) THEN 701 PRINT*, "Variable tname(iq) n est pas definie" 702 CALL abort 721 abort_message="dynredem1: Variable "// 722 & trim(tname(iq))//" n est pas definie" 723 ierr=1 724 CALL abort_gcm(modname,abort_message,ierr) 703 725 ENDIF 704 726 #ifdef NC_DOUBLE … … 715 737 ierr = NF_INQ_VARID(nid, "masse", nvarid) 716 738 IF (ierr .NE. NF_NOERR) THEN 717 PRINT*, "Variable masse n est pas definie" 718 CALL abort 739 abort_message="dynredem1: Variable masse n est pas definie" 740 ierr=1 741 CALL abort_gcm(modname,abort_message,ierr) 719 742 ENDIF 720 743 #ifdef NC_DOUBLE … … 726 749 ierr = NF_INQ_VARID(nid, "ps", nvarid) 727 750 IF (ierr .NE. NF_NOERR) THEN 728 PRINT*, "Variable ps n est pas definie" 729 CALL abort 751 abort_message="dynredem1: Variable ps n est pas definie" 752 ierr=1 753 CALL abort_gcm(modname,abort_message,ierr) 730 754 ENDIF 731 755 #ifdef NC_DOUBLE -
LMDZ4/trunk/libf/dyn3d/etat0_netcdf.F90
r1328 r1403 11 11 ! Note: This routine is designed to work for Earth 12 12 !------------------------------------------------------------------------------- 13 USE control_mod 13 14 #ifdef CPP_EARTH 14 15 USE startvar … … 72 73 73 74 #include "comdissnew.h" 74 #include "control.h"75 75 #include "serre.h" 76 76 #include "clesphys.h" … … 103 103 REAL :: tau_thermals, solarlong0, seuil_inversion 104 104 INTEGER :: read_climoz ! read ozone climatology 105 REAL :: alp_offset 105 106 ! Allowed values are 0, 1 and 2 106 107 ! 0: do not read an ozone climatology … … 132 133 iflag_thermals,nsplit_thermals,tau_thermals, & 133 134 iflag_thermals_ed,iflag_thermals_optflux, & 134 iflag_coupl,iflag_clos,iflag_wake, read_climoz ) 135 iflag_coupl,iflag_clos,iflag_wake, read_climoz, & 136 alp_offset ) 135 137 136 138 ! co2_ppm0 : initial value of atmospheric CO2 from .def file (co2_ppm value) -
LMDZ4/trunk/libf/dyn3d/exner_hyb.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 4 SUBROUTINE exner_hyb ( ngrid, ps, p,alpha,beta, pks, pk, pkf ) … … 51 51 REAL SSUM 52 52 c 53 54 if (llm.eq.1) then 55 ! Specific behaviour for Shallow Water (1 vertical layer) case 53 56 57 ! Sanity checks 58 if (kappa.ne.1) then 59 call abort_gcm("exner_hyb", 60 & "kappa!=1 , but running in Shallow Water mode!!",42) 61 endif 62 if (cpp.ne.r) then 63 call abort_gcm("exner_hyb", 64 & "cpp!=r , but running in Shallow Water mode!!",42) 65 endif 66 67 ! Compute pks(:),pk(:),pkf(:) 68 69 DO ij = 1, ngrid 70 pks(ij) = (cpp/preff) * ps(ij) 71 pk(ij,1) = .5*pks(ij) 72 ENDDO 73 74 CALL SCOPY ( ngrid * llm, pk, 1, pkf, 1 ) 75 CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 ) 76 77 ! our work is done, exit routine 78 return 79 endif ! of if (llm.eq.1) 80 81 54 82 unpl2k = 1.+ 2.* kappa 55 83 c -
LMDZ4/trunk/libf/dyn3d/extrapol.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 C … … 158 158 jlat = jy(k) 159 159 pwork(i,j) = pwork(i,j) 160 $ + pfild(ilon,jlat) * zmask(k)/ FLOAT(inbor)160 $ + pfild(ilon,jlat) * zmask(k)/REAL(inbor) 161 161 ENDDO 162 162 ENDIF -
LMDZ4/trunk/libf/dyn3d/fluxstokenc.F
r1279 r1403 4 4 SUBROUTINE fluxstokenc(pbaru,pbarv,masse,teta,phi,phis, 5 5 . time_step,itau ) 6 #ifdef CPP_ EARTH7 ! This routine is designed to work for Earth andwith ioipsl6 #ifdef CPP_IOIPSL 7 ! This routine is designed to work with ioipsl 8 8 9 9 USE IOIPSL … … 114 114 DO l=1,llm 115 115 DO ij = 1,ip1jmp1 116 pbaruc(ij,l) = pbaruc(ij,l)/ float(istdyn)117 tetac(ij,l) = tetac(ij,l)/ float(istdyn)118 phic(ij,l) = phic(ij,l)/ float(istdyn)116 pbaruc(ij,l) = pbaruc(ij,l)/REAL(istdyn) 117 tetac(ij,l) = tetac(ij,l)/REAL(istdyn) 118 phic(ij,l) = phic(ij,l)/REAL(istdyn) 119 119 ENDDO 120 120 DO ij = 1,ip1jm 121 pbarvc(ij,l) = pbarvc(ij,l)/ float(istdyn)121 pbarvc(ij,l) = pbarvc(ij,l)/REAL(istdyn) 122 122 ENDDO 123 123 ENDDO … … 141 141 142 142 iadvtr=0 143 Print*,'ITAU auqel on stoke les fluxmasses',itau143 write(lunout,*)'ITAU auquel on stoke les fluxmasses',itau 144 144 145 145 call histwrite(fluxid, 'masse', itau, massem, … … 167 167 #else 168 168 write(lunout,*) 169 & 'fluxstokenc: Needs Earth physics (and ioipsl)to function'169 & 'fluxstokenc: Needs IOIPSL to function' 170 170 #endif 171 ! of #ifdef CPP_ EARTH171 ! of #ifdef CPP_IOIPSL 172 172 RETURN 173 173 END -
LMDZ4/trunk/libf/dyn3d/friction.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c======================================================================= 5 5 SUBROUTINE friction(ucov,vcov,pdt) 6 7 USE control_mod 8 6 9 IMPLICIT NONE 7 10 … … 21 24 #include "paramet.h" 22 25 #include "comgeom2.h" 23 #include "control.h"24 26 #include "comconst.h" 25 27 -
LMDZ4/trunk/libf/dyn3d/fxhyp.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 89 89 90 90 DO i = 0, nmax2 91 xtild(i) = - pi + FLOAT(i) * depi /nmax291 xtild(i) = - pi + REAL(i) * depi /nmax2 92 92 ENDDO 93 93 … … 235 235 DO 1500 i = ii1, ii2 236 236 237 xlon2 = - pi + ( FLOAT(i) + xuv - decalx) * depi / FLOAT(iim)237 xlon2 = - pi + (REAL(i) + xuv - decalx) * depi / REAL(iim) 238 238 239 239 Xfi = xlon2 … … 280 280 550 CONTINUE 281 281 282 xxprim(i) = depi/ ( FLOAT(iim) * Xprimin )282 xxprim(i) = depi/ ( REAL(iim) * Xprimin ) 283 283 xvrai(i) = xi + xzoom 284 284 -
LMDZ4/trunk/libf/dyn3d/fxy.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE fxy (rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1, … … 32 32 c 33 33 DO j = 1, jjm + 1 34 rlatu(j) = fy ( FLOAT( j ) )35 yprimu(j) = fyprim( FLOAT( j ) )34 rlatu(j) = fy ( REAL( j ) ) 35 yprimu(j) = fyprim( REAL( j ) ) 36 36 ENDDO 37 37 … … 39 39 DO j = 1, jjm 40 40 41 rlatv(j) = fy ( FLOAT( j ) + 0.5 )42 rlatu1(j) = fy ( FLOAT( j ) + 0.25 )43 rlatu2(j) = fy ( FLOAT( j ) + 0.75 )41 rlatv(j) = fy ( REAL( j ) + 0.5 ) 42 rlatu1(j) = fy ( REAL( j ) + 0.25 ) 43 rlatu2(j) = fy ( REAL( j ) + 0.75 ) 44 44 45 yprimv(j) = fyprim( FLOAT( j ) + 0.5 )46 yprimu1(j) = fyprim( FLOAT( j ) + 0.25 )47 yprimu2(j) = fyprim( FLOAT( j ) + 0.75 )45 yprimv(j) = fyprim( REAL( j ) + 0.5 ) 46 yprimu1(j) = fyprim( REAL( j ) + 0.25 ) 47 yprimu2(j) = fyprim( REAL( j ) + 0.75 ) 48 48 49 49 ENDDO … … 53 53 c 54 54 DO i = 1, iim + 1 55 rlonv(i) = fx ( FLOAT( i ) )56 rlonu(i) = fx ( FLOAT( i ) + 0.5 )57 rlonm025(i) = fx ( FLOAT( i ) - 0.25 )58 rlonp025(i) = fx ( FLOAT( i ) + 0.25 )55 rlonv(i) = fx ( REAL( i ) ) 56 rlonu(i) = fx ( REAL( i ) + 0.5 ) 57 rlonm025(i) = fx ( REAL( i ) - 0.25 ) 58 rlonp025(i) = fx ( REAL( i ) + 0.25 ) 59 59 60 xprimv (i) = fxprim ( FLOAT( i ) )61 xprimu (i) = fxprim ( FLOAT( i ) + 0.5 )62 xprimm025(i) = fxprim ( FLOAT( i ) - 0.25 )63 xprimp025(i) = fxprim ( FLOAT( i ) + 0.25 )60 xprimv (i) = fxprim ( REAL( i ) ) 61 xprimu (i) = fxprim ( REAL( i ) + 0.5 ) 62 xprimm025(i) = fxprim ( REAL( i ) - 0.25 ) 63 xprimp025(i) = fxprim ( REAL( i ) + 0.25 ) 64 64 ENDDO 65 65 -
LMDZ4/trunk/libf/dyn3d/fxysinus.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE fxysinus (rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1, … … 32 32 c 33 33 DO j = 1, jjm + 1 34 rlatu(j) = fy ( FLOAT( j ) )35 yprimu(j) = fyprim( FLOAT( j ) )34 rlatu(j) = fy ( REAL( j ) ) 35 yprimu(j) = fyprim( REAL( j ) ) 36 36 ENDDO 37 37 … … 39 39 DO j = 1, jjm 40 40 41 rlatv(j) = fy ( FLOAT( j ) + 0.5 )42 rlatu1(j) = fy ( FLOAT( j ) + 0.25 )43 rlatu2(j) = fy ( FLOAT( j ) + 0.75 )41 rlatv(j) = fy ( REAL( j ) + 0.5 ) 42 rlatu1(j) = fy ( REAL( j ) + 0.25 ) 43 rlatu2(j) = fy ( REAL( j ) + 0.75 ) 44 44 45 yprimv(j) = fyprim( FLOAT( j ) + 0.5 )46 yprimu1(j) = fyprim( FLOAT( j ) + 0.25 )47 yprimu2(j) = fyprim( FLOAT( j ) + 0.75 )45 yprimv(j) = fyprim( REAL( j ) + 0.5 ) 46 yprimu1(j) = fyprim( REAL( j ) + 0.25 ) 47 yprimu2(j) = fyprim( REAL( j ) + 0.75 ) 48 48 49 49 ENDDO … … 53 53 c 54 54 DO i = 1, iim + 1 55 rlonv(i) = fx ( FLOAT( i ) )56 rlonu(i) = fx ( FLOAT( i ) + 0.5 )57 rlonm025(i) = fx ( FLOAT( i ) - 0.25 )58 rlonp025(i) = fx ( FLOAT( i ) + 0.25 )55 rlonv(i) = fx ( REAL( i ) ) 56 rlonu(i) = fx ( REAL( i ) + 0.5 ) 57 rlonm025(i) = fx ( REAL( i ) - 0.25 ) 58 rlonp025(i) = fx ( REAL( i ) + 0.25 ) 59 59 60 xprimv (i) = fxprim ( FLOAT( i ) )61 xprimu (i) = fxprim ( FLOAT( i ) + 0.5 )62 xprimm025(i) = fxprim ( FLOAT( i ) - 0.25 )63 xprimp025(i) = fxprim ( FLOAT( i ) + 0.25 )60 xprimv (i) = fxprim ( REAL( i ) ) 61 xprimu (i) = fxprim ( REAL( i ) + 0.5 ) 62 xprimm025(i) = fxprim ( REAL( i ) - 0.25 ) 63 xprimp025(i) = fxprim ( REAL( i ) + 0.25 ) 64 64 ENDDO 65 65 -
LMDZ4/trunk/libf/dyn3d/fyhyp.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 75 75 depi = 2. * pi 76 76 pis2 = pi/2. 77 pisjm = pi/ FLOAT(jjm)77 pisjm = pi/ REAL(jjm) 78 78 epsilon = 1.e-3 79 79 y0 = yzoomdeg * pi/180. … … 94 94 95 95 DO i = 0, nmax2 96 yt(i) = - pis2 + FLOAT(i)* pi /nmax296 yt(i) = - pis2 + REAL(i)* pi /nmax2 97 97 ENDDO 98 98 … … 210 210 DO 1500 j = 1,jlat 211 211 yo1 = 0. 212 ylon2 = - pis2 + pisjm * ( FLOAT(j) + yuv -1.)212 ylon2 = - pis2 + pisjm * ( REAL(j) + yuv -1.) 213 213 yfi = ylon2 214 214 c -
LMDZ4/trunk/libf/dyn3d/gcm.F
r1315 r1403 15 15 USE filtreg_mod 16 16 USE infotrac 17 USE control_mod 17 18 18 19 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! … … 68 69 #include "logic.h" 69 70 #include "temps.h" 70 #include "control.h"71 !!!!!!!!!!!#include "control.h" 71 72 #include "ener.h" 72 73 #include "description.h" 73 74 #include "serre.h" 74 #include "com_io_dyn.h"75 !#include "com_io_dyn.h" 75 76 #include "iniprint.h" 76 77 #include "tracstoke.h" 78 #ifdef INCA 79 ! Only INCA needs these informations (from the Earth's physics) 77 80 #include "indicesol.h" 78 81 #endif 79 82 INTEGER longcles 80 83 PARAMETER ( longcles = 20 ) … … 181 184 if (planet_type.eq."earth") then 182 185 #ifdef CPP_EARTH 183 CALL Init_Phys_lmdz(iim,jjp1,llm,1,( jjm-1)*iim+2)186 CALL Init_Phys_lmdz(iim,jjp1,llm,1,(/(jjm-1)*iim+2/)) 184 187 call InitComgeomphy 185 188 #endif … … 241 244 if (read_start) then 242 245 ! we still need to run iniacademic to initialize some 243 ! constants & fields, if we run the 'newtonian' case:244 if (iflag_phys. eq.2) then246 ! constants & fields, if we run the 'newtonian' or 'SW' cases: 247 if (iflag_phys.ne.1) then 245 248 CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0) 246 249 endif 247 !#ifdef CPP_IOIPSL 250 248 251 if (planet_type.eq."earth") then 249 252 #ifdef CPP_EARTH 250 253 ! Load an Earth-format start file 251 254 CALL dynetat0("start.nc",vcov,ucov, 252 . teta,q,masse,ps,phis, time_0) 255 & teta,q,masse,ps,phis, time_0) 256 #else 257 ! SW model also has Earth-format start files 258 ! (but can be used without the CPP_EARTH directive) 259 if (iflag_phys.eq.0) then 260 CALL dynetat0("start.nc",vcov,ucov, 261 & teta,q,masse,ps,phis, time_0) 262 endif 253 263 #endif 254 264 endif ! of if (planet_type.eq."earth") 265 255 266 c write(73,*) 'ucov',ucov 256 267 c write(74,*) 'vcov',vcov … … 294 305 ENDIF 295 306 296 zdtvr = daysec/ FLOAT(day_step)307 zdtvr = daysec/REAL(day_step) 297 308 IF(dtvr.NE.zdtvr) THEN 298 309 WRITE(lunout,*) … … 303 314 C on remet le calendrier à zero si demande 304 315 c 305 if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then 316 IF (raz_date == 1) THEN 317 annee_ref = anneeref 318 day_ref = dayref 319 day_ini = dayref 320 itau_dyn = 0 321 itau_phy = 0 322 time_0 = 0. 323 write(lunout,*) 324 . 'GCM: On reinitialise a la date lue dans gcm.def' 325 ELSE IF (annee_ref .ne. anneeref .or. day_ref .ne. dayref) THEN 306 326 write(lunout,*) 307 327 . 'GCM: Attention les dates initiales lues dans le fichier' … … 309 329 . ' restart ne correspondent pas a celles lues dans ' 310 330 write(lunout,*)' gcm.def' 311 write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 312 write(lunout,*)' day_ref=',day_ref," dayref=",dayref 313 if (raz_date .ne. 1) then 314 write(lunout,*) 315 . 'GCM: On garde les dates du fichier restart' 316 else 317 annee_ref = anneeref 318 day_ref = dayref 319 day_ini = dayref 320 itau_dyn = 0 321 itau_phy = 0 322 time_0 = 0. 323 write(lunout,*) 324 . 'GCM: On reinitialise a la date lue dans gcm.def' 325 endif 326 ELSE 327 raz_date = 0 328 endif 331 write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 332 write(lunout,*)' day_ref=',day_ref," dayref=",dayref 333 write(lunout,*)' Pas de remise a zero' 334 ENDIF 335 336 c if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then 337 c write(lunout,*) 338 c . 'GCM: Attention les dates initiales lues dans le fichier' 339 c write(lunout,*) 340 c . ' restart ne correspondent pas a celles lues dans ' 341 c write(lunout,*)' gcm.def' 342 c write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 343 c write(lunout,*)' day_ref=',day_ref," dayref=",dayref 344 c if (raz_date .ne. 1) then 345 c write(lunout,*) 346 c . 'GCM: On garde les dates du fichier restart' 347 c else 348 c annee_ref = anneeref 349 c day_ref = dayref 350 c day_ini = dayref 351 c itau_dyn = 0 352 c itau_phy = 0 353 c time_0 = 0. 354 c write(lunout,*) 355 c . 'GCM: On reinitialise a la date lue dans gcm.def' 356 c endif 357 c ELSE 358 c raz_date = 0 359 c endif 329 360 330 361 #ifdef CPP_IOIPSL … … 355 386 nbetatmoy = nday / periodav + 1 356 387 388 if (iflag_phys.eq.1) then 389 ! these initialisations have already been done (via iniacademic) 390 ! if running in SW or Newtonian mode 357 391 c----------------------------------------------------------------------- 358 392 c Initialisation des constantes dynamiques : 359 393 c ------------------------------------------ 360 dtvr = zdtvr361 CALL iniconst394 dtvr = zdtvr 395 CALL iniconst 362 396 363 397 c----------------------------------------------------------------------- 364 398 c Initialisation de la geometrie : 365 399 c -------------------------------- 366 CALL inigeom400 CALL inigeom 367 401 368 402 c----------------------------------------------------------------------- 369 403 c Initialisation du filtre : 370 404 c -------------------------- 371 CALL inifilr 405 CALL inifilr 406 endif ! of if (iflag_phys.eq.1) 372 407 c 373 408 c----------------------------------------------------------------------- … … 405 440 if (planet_type.eq."earth") then 406 441 #ifdef CPP_EARTH 407 CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys ,442 CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys/nsplit_phys , 408 443 , latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp ) 409 444 #endif … … 440 475 441 476 #ifdef CPP_IOIPSL 442 if ( 1.eq.1) then443 477 time_step = zdtvr 444 t_ops = iecri * daysec 445 t_wrt = iecri * daysec 446 ! CALL inithist(dynhist_file,day_ref,annee_ref,time_step, 447 ! . t_ops, t_wrt, histid, histvid) 448 449 ! IF (ok_dynzon) THEN 450 ! t_ops = iperiod * time_step 451 ! t_wrt = periodav * daysec 452 ! CALL initdynav(dynhistave_file,day_ref,annee_ref,time_step, 453 ! . t_ops, t_wrt, histaveid) 454 ! END IF 478 if (ok_dyn_ins) then 479 ! initialize output file for instantaneous outputs 480 ! t_ops = iecri * daysec ! do operations every t_ops 481 t_ops =((1.0*iecri)/day_step) * daysec 482 t_wrt = daysec ! iecri * daysec ! write output every t_wrt 483 CALL inithist(day_ref,annee_ref,time_step, 484 & t_ops,t_wrt) 485 endif 486 487 IF (ok_dyn_ave) THEN 488 ! initialize output file for averaged outputs 489 t_ops = iperiod * time_step ! do operations every t_ops 490 t_wrt = periodav * daysec ! write output every t_wrt 491 CALL initdynav(day_ref,annee_ref,time_step, 492 & t_ops,t_wrt) 493 END IF 455 494 dtav = iperiod*dtvr/daysec 456 endif457 458 459 495 #endif 460 496 ! #endif of #ifdef CPP_IOIPSL -
LMDZ4/trunk/libf/dyn3d/grid_atob.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE grille_m(imdep, jmdep, xdata, ydata, entree, … … 717 717 c Calculs intermediares: 718 718 c 719 xtmp(1) = -180.0 + 360.0/ FLOAT(imtmp) / 2.0719 xtmp(1) = -180.0 + 360.0/REAL(imtmp) / 2.0 720 720 DO i = 2, imtmp 721 xtmp(i) = xtmp(i-1) + 360.0/ FLOAT(imtmp)721 xtmp(i) = xtmp(i-1) + 360.0/REAL(imtmp) 722 722 ENDDO 723 723 DO i = 1, imtmp 724 724 xtmp(i) = xtmp(i) /180.0 * 4.0*ATAN(1.0) 725 725 ENDDO 726 ytmp(1) = -90.0 + 180.0/ FLOAT(jmtmp) / 2.0726 ytmp(1) = -90.0 + 180.0/REAL(jmtmp) / 2.0 727 727 DO j = 2, jmtmp 728 ytmp(j) = ytmp(j-1) + 180.0/ FLOAT(jmtmp)728 ytmp(j) = ytmp(j-1) + 180.0/REAL(jmtmp) 729 729 ENDDO 730 730 DO j = 1, jmtmp -
LMDZ4/trunk/libf/dyn3d/grid_noro.F
r773 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 93 93 xpi=acos(-1.) 94 94 rad = 6 371 229. 95 zdeltay=2.*xpi/ float(jusn)*rad95 zdeltay=2.*xpi/REAL(jusn)*rad 96 96 c 97 97 c utilise-t'on un masque lu? … … 215 215 c SUMMATION OVER GRIDPOINT AREA 216 216 c 217 zleny=xpi/ float(jusn)*rad218 xincr=xpi/2./ float(jusn)217 zleny=xpi/REAL(jusn)*rad 218 xincr=xpi/2./REAL(jusn) 219 219 DO ii = 1, imar+1 220 220 DO jj = 1, jmar … … 468 468 DO IS=-1,1 469 469 DO JS=-1,1 470 WEIGHTpb(IS,JS)=1./ FLOAT((1+IS**2)*(1+JS**2))470 WEIGHTpb(IS,JS)=1./REAL((1+IS**2)*(1+JS**2)) 471 471 SUM=SUM+WEIGHTpb(IS,JS) 472 472 ENDDO -
LMDZ4/trunk/libf/dyn3d/grilles_gcm_netcdf.F
r636 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 218 218 open (20,file='grille.dat',form='unformatted',access='direct' 219 219 s ,recl=4*ip1jmp1) 220 write(20,rec=1) (( float(mod(i,2)+mod(j,2)),i=1,iip1),j=1,jjp1)221 write(20,rec=2) (( float(mod(i,2)*mod(j,2)),i=1,iip1),j=1,jjp1)220 write(20,rec=1) ((REAL(mod(i,2)+mod(j,2)),i=1,iip1),j=1,jjp1) 221 write(20,rec=2) ((REAL(mod(i,2)*mod(j,2)),i=1,iip1),j=1,jjp1) 222 222 do j=2,jjm 223 223 dlat1(j)=180.*(rlatv(j)-rlatv(j-1))/pi 224 c dlat2(j)=180.*fyprim( float(j))/pi224 c dlat2(j)=180.*fyprim(REAL(j))/pi 225 225 enddo 226 226 do i=2,iip1 227 227 dlon1(i)=180.*(rlonu(i)-rlonu(i-1))/pi 228 c dlon2(i)=180.*fxprim( float(i))/pi228 c dlon2(i)=180.*fxprim(REAL(i))/pi 229 229 enddo 230 230 do j=2,jjm -
LMDZ4/trunk/libf/dyn3d/guide_mod.F90
r1304 r1403 62 62 SUBROUTINE guide_init 63 63 64 USE control_mod 65 64 66 IMPLICIT NONE 65 67 … … 67 69 INCLUDE "paramet.h" 68 70 INCLUDE "netcdf.inc" 69 INCLUDE "control.h"70 71 71 72 INTEGER :: error,ncidpl,rid,rcod … … 269 270 !======================================================================= 270 271 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps) 272 273 USE control_mod 271 274 272 275 IMPLICIT NONE … … 274 277 INCLUDE "dimensions.h" 275 278 INCLUDE "paramet.h" 276 INCLUDE "control.h"277 279 INCLUDE "comconst.h" 278 280 INCLUDE "comvert.h" … … 354 356 dday_step=real(day_step) 355 357 IF (iguide_read.LT.0) THEN 356 tau=ditau/dday_step/ FLOAT(iguide_read)358 tau=ditau/dday_step/REAL(iguide_read) 357 359 ELSE 358 tau= FLOAT(iguide_read)*ditau/dday_step360 tau=REAL(iguide_read)*ditau/dday_step 359 361 ENDIF 360 362 reste=tau-AINT(tau) … … 541 543 ENDDO 542 544 ENDDO 543 fieldm(:,l)=fieldm(:,l)/ FLOAT(imax(typ)-imin(typ)+1)545 fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1) 544 546 ! Compute forcing 545 547 DO j=1,hsize -
LMDZ4/trunk/libf/dyn3d/infotrac.F90
r1279 r1403 31 31 32 32 SUBROUTINE infotrac_init 33 34 USE control_mod 35 33 36 IMPLICIT NONE 34 37 !======================================================================= … … 49 52 50 53 INCLUDE "dimensions.h" 51 INCLUDE "control.h"52 54 INCLUDE "iniprint.h" 53 55 … … 217 219 new_iq=new_iq+10 ! 9 tracers added 218 220 ELSE 219 WRITE(lunout,*) 'This choice of advection schema is not available' 221 WRITE(lunout,*) 'This choice of advection schema is not available',iq,hadv(iq),vadv(iq) 220 222 CALL abort_gcm('infotrac_init','Bad choice of advection schema - 1',1) 221 223 END IF … … 258 260 iadv(new_iq)=11 259 261 ELSE 260 WRITE(lunout,*)'This choice of advection schema is not available' 262 WRITE(lunout,*)'This choice of advection schema is not available',iq,hadv(iq),vadv(iq) 261 263 CALL abort_gcm('infotrac_init','Bad choice of advection schema - 2',1) 262 264 END IF -
LMDZ4/trunk/libf/dyn3d/iniacademic.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 8 8 USE filtreg_mod 9 9 USE infotrac, ONLY : nqtot 10 USE control_mod 11 10 12 11 13 c%W% %G% … … 44 46 #include "ener.h" 45 47 #include "temps.h" 46 #include "control.h"47 48 #include "iniprint.h" 49 #include "logic.h" 48 50 49 51 c Arguments: … … 84 86 time_0=0. 85 87 day_ref=0 86 88 annee_ref=0 87 89 88 90 im = iim … … 93 95 g = 9.8 94 96 daysec = 86400. 95 dtvr = daysec/ FLOAT(day_step)97 dtvr = daysec/REAL(day_step) 96 98 zdtvr=dtvr 97 99 kappa = 0.2857143 … … 105 107 ang0 = 0. 106 108 109 if (llm.eq.1) then 110 ! specific initializations for the shallow water case 111 kappa=1 112 endif 113 107 114 CALL iniconst 108 115 CALL inigeom 109 116 CALL inifilr 110 117 111 ps=0. 112 phis=0. 118 if (llm.eq.1) then 119 ! initialize fields for the shallow water case, if required 120 if (.not.read_start) then 121 phis(:)=0. 122 q(:,:,1)=1.e-10 123 q(:,:,2)=1.e-15 124 q(:,:,3:nqtot)=0. 125 CALL sw_case_williamson91_6(vcov,ucov,teta,masse,ps) 126 endif 127 endif 128 129 if (iflag_phys.eq.2) then 130 ! initializations for the academic case 131 ps(:)=1.e5 132 phis(:)=0. 113 133 c--------------------------------------------------------------------- 114 134 115 taurappel=10.*daysec135 taurappel=10.*daysec 116 136 117 137 c--------------------------------------------------------------------- … … 119 139 c -------------------------------------- 120 140 121 DO l=1,llm122 zsig=ap(l)/preff+bp(l)123 if (zsig.gt.0.3) then124 lsup=l125 tetarappell=1./8.*(-log(zsig)-.5)126 DO j=1,jjp1141 DO l=1,llm 142 zsig=ap(l)/preff+bp(l) 143 if (zsig.gt.0.3) then 144 lsup=l 145 tetarappell=1./8.*(-log(zsig)-.5) 146 DO j=1,jjp1 127 147 ddsin=sin(rlatu(j))-sin(pi/20.) 128 148 tetajl(j,l)=300.*(1+1./18.*(1.-3.*ddsin*ddsin)+tetarappell) 129 ENDDO130 else149 ENDDO 150 else 131 151 c Choix isotherme au-dessus de 300 mbar 132 do j=1,jjp1133 tetajl(j,l)=tetajl(j,lsup)*(0.3/zsig)**kappa134 enddo135 endif ! of if (zsig.gt.0.3)136 ENDDO ! of DO l=1,llm137 138 do l=1,llm139 do j=1,jjp1152 do j=1,jjp1 153 tetajl(j,l)=tetajl(j,lsup)*(0.3/zsig)**kappa 154 enddo 155 endif ! of if (zsig.gt.0.3) 156 ENDDO ! of DO l=1,llm 157 158 do l=1,llm 159 do j=1,jjp1 140 160 do i=1,iip1 141 161 ij=(j-1)*iip1+i 142 162 tetarappel(ij,l)=tetajl(j,l) 143 163 enddo 144 enddo145 enddo164 enddo 165 enddo 146 166 147 167 c call dump2d(jjp1,llm,tetajl,'TEQ ') 148 168 149 ps=1.e5 150 phis=0. 151 CALL pression ( ip1jmp1, ap, bp, ps, p ) 152 CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf ) 153 CALL massdair(p,masse) 169 CALL pression ( ip1jmp1, ap, bp, ps, p ) 170 CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf ) 171 CALL massdair(p,masse) 154 172 155 173 c intialisation du vent et de la temperature 156 teta(:,:)=tetarappel(:,:)157 CALL geopot(ip1jmp1,teta,pk,pks,phis,phi)158 call ugeostr(phi,ucov)159 vcov=0.160 q(:,:,1 )=1.e-10161 q(:,:,2 )=1.e-15162 q(:,:,3:nqtot)=0.174 teta(:,:)=tetarappel(:,:) 175 CALL geopot(ip1jmp1,teta,pk,pks,phis,phi) 176 call ugeostr(phi,ucov) 177 vcov=0. 178 q(:,:,1 )=1.e-10 179 q(:,:,2 )=1.e-15 180 q(:,:,3:nqtot)=0. 163 181 164 182 165 183 c perturbation aleatoire sur la temperature 166 idum = -1167 zz = ran1(idum)168 idum = 0169 do l=1,llm170 do ij=iip2,ip1jm184 idum = -1 185 zz = ran1(idum) 186 idum = 0 187 do l=1,llm 188 do ij=iip2,ip1jm 171 189 teta(ij,l)=teta(ij,l)*(1.+0.005*ran1(idum)) 172 enddo173 enddo174 175 do l=1,llm176 do ij=1,ip1jmp1,iip1190 enddo 191 enddo 192 193 do l=1,llm 194 do ij=1,ip1jmp1,iip1 177 195 teta(ij+iim,l)=teta(ij,l) 178 enddo179 enddo196 enddo 197 enddo 180 198 181 199 … … 187 205 188 206 c initialisation d'un traceur sur une colonne 189 j=jjp1*3/4 190 i=iip1/2 191 ij=(j-1)*iip1+i 192 q(ij,:,3)=1. 193 207 j=jjp1*3/4 208 i=iip1/2 209 ij=(j-1)*iip1+i 210 q(ij,:,3)=1. 211 endif ! of if (iflag_phys.eq.2) 212 194 213 else 195 214 write(lunout,*)"iniacademic: planet types other than earth", -
LMDZ4/trunk/libf/dyn3d/iniconst.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE iniconst 5 6 USE control_mod 5 7 6 8 IMPLICIT NONE … … 16 18 #include "comconst.h" 17 19 #include "temps.h" 18 #include "control.h"19 20 #include "comvert.h" 21 #include "iniprint.h" 20 22 21 23 … … 47 49 r = cpp * kappa 48 50 49 PRINT*,'R CP Kappa ', r , cpp, kappa51 write(lunout,*)'iniconst: R CP Kappa ', r , cpp, kappa 50 52 c 51 53 c----------------------------------------------------------------------- -
LMDZ4/trunk/libf/dyn3d/inidissip.F
r1279 r1403 11 11 c ------------- 12 12 13 USE control_mod 14 13 15 IMPLICIT NONE 14 16 #include "dimensions.h" … … 17 19 #include "comconst.h" 18 20 #include "comvert.h" 19 #include "control.h"20 21 #include "logic.h" 21 22 … … 165 166 166 167 c IF(.NOT.lstardis) THEN 167 fact = rad*24./ float(jjm)168 fact = rad*24./REAL(jjm) 168 169 fact = fact*fact 169 170 PRINT*,'coef u ', fact/cdivu, 1./cdivu -
LMDZ4/trunk/libf/dyn3d/inigeom.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 168 168 c 169 169 IF( nitergdiv.NE.2 ) THEN 170 gamdi_gdiv = coefdis/ ( float(nitergdiv) -2. )170 gamdi_gdiv = coefdis/ ( REAL(nitergdiv) -2. ) 171 171 ELSE 172 172 gamdi_gdiv = 0. 173 173 ENDIF 174 174 IF( nitergrot.NE.2 ) THEN 175 gamdi_grot = coefdis/ ( float(nitergrot) -2. )175 gamdi_grot = coefdis/ ( REAL(nitergrot) -2. ) 176 176 ELSE 177 177 gamdi_grot = 0. 178 178 ENDIF 179 179 IF( niterh.NE.2 ) THEN 180 gamdi_h = coefdis/ ( float(niterh) -2. )180 gamdi_h = coefdis/ ( REAL(niterh) -2. ) 181 181 ELSE 182 182 gamdi_h = 0. … … 381 381 yprp = yprimu2(j-1) 382 382 rlatp = rlatu2 (j-1) 383 ccc yprp = fyprim( FLOAT(j) - 0.25 )384 ccc rlatp = fy ( FLOAT(j) - 0.25 )383 ccc yprp = fyprim( REAL(j) - 0.25 ) 384 ccc rlatp = fy ( REAL(j) - 0.25 ) 385 385 c 386 386 coslatp = COS( rlatp ) … … 416 416 rlatm = rlatu1 ( j ) 417 417 yprm = yprimu1( j ) 418 cc rlatp = fy ( FLOAT(j) - 0.25 )419 cc yprp = fyprim( FLOAT(j) - 0.25 )420 cc rlatm = fy ( FLOAT(j) + 0.25 )421 cc yprm = fyprim( FLOAT(j) + 0.25 )418 cc rlatp = fy ( REAL(j) - 0.25 ) 419 cc yprp = fyprim( REAL(j) - 0.25 ) 420 cc rlatm = fy ( REAL(j) + 0.25 ) 421 cc yprm = fyprim( REAL(j) + 0.25 ) 422 422 423 423 coslatm = COS( rlatm ) -
LMDZ4/trunk/libf/dyn3d/integrd.F
r1279 r1403 5 5 $ ( nq,vcovm1,ucovm1,tetam1,psm1,massem1, 6 6 $ dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis,finvmaold ) 7 8 USE control_mod 7 9 8 10 IMPLICIT NONE … … 32 34 #include "temps.h" 33 35 #include "serre.h" 34 #include "control.h"35 36 36 37 c Arguments: -
LMDZ4/trunk/libf/dyn3d/interp_horiz.F
r616 r1403 1 1 c 2 c $ Header$2 c $Id$ 3 3 c 4 4 subroutine interp_horiz (varo,varn,imo,jmo,imn,jmn,lm, … … 101 101 end do 102 102 do ii =1, imn+1 103 varn(ii,1,l) = totn/ float(imn+1)104 varn(ii,jmn+1,l) = tots/ float(imn+1)103 varn(ii,1,l) = totn/REAL(imn+1) 104 varn(ii,jmn+1,l) = tots/REAL(imn+1) 105 105 end do 106 106 end do -
LMDZ4/trunk/libf/dyn3d/interpre.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine interpre(q,qppm,w,fluxwppm,masse, 5 5 s apppm,bpppm,massebx,masseby,pbaru,pbarv, 6 6 s unatppm,vnatppm,psppm) 7 8 USE control_mod 7 9 8 10 implicit none … … 17 19 #include "logic.h" 18 20 #include "temps.h" 19 #include "control.h"20 21 #include "ener.h" 21 22 #include "description.h" -
LMDZ4/trunk/libf/dyn3d/juldate.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine juldate(ian,imoi,ijou,oh,om,os,tjd,tjdsec) -
LMDZ4/trunk/libf/dyn3d/leapfrog.F
r1286 r1403 15 15 USE guide_mod, ONLY : guide_main 16 16 USE write_field 17 USE control_mod 17 18 IMPLICIT NONE 18 19 … … 56 57 #include "logic.h" 57 58 #include "temps.h" 58 #include "control.h"59 59 #include "ener.h" 60 60 #include "description.h" 61 61 #include "serre.h" 62 #include "com_io_dyn.h"62 !#include "com_io_dyn.h" 63 63 #include "iniprint.h" 64 64 #include "academic.h" … … 197 197 198 198 itau = 0 199 c $$$iday = day_ini+itau/day_step200 c $$$ time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0201 c $$$IF(time.GT.1.) THEN202 c $$$time = time-1.203 c $$$iday = iday+1204 c $$$ENDIF199 c iday = day_ini+itau/day_step 200 c time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 201 c IF(time.GT.1.) THEN 202 c time = time-1. 203 c iday = iday+1 204 c ENDIF 205 205 206 206 … … 276 276 277 277 IF( purmats ) THEN 278 ! Purely Matsuno time stepping 278 279 IF( MOD(itau,iconser) .EQ.0.AND. forward ) conser = .TRUE. 279 280 IF( MOD(itau,idissip ).EQ.0.AND..NOT.forward ) apdiss = .TRUE. … … 281 282 s .and. iflag_phys.EQ.1 ) apphys = .TRUE. 282 283 ELSE 284 ! Leapfrog/Matsuno time stepping 283 285 IF( MOD(itau ,iconser) .EQ. 0 ) conser = .TRUE. 284 286 IF( MOD(itau+1,idissip) .EQ. 0 ) apdiss = .TRUE. 285 287 IF( MOD(itau+1,iphysiq).EQ.0.AND.iflag_phys.EQ.1) apphys=.TRUE. 286 288 END IF 289 290 ! Ehouarn: for Shallow Water case (ie: 1 vertical layer), 291 ! supress dissipation step 292 if (llm.eq.1) then 293 apdiss=.false. 294 endif 287 295 288 296 c----------------------------------------------------------------------- … … 522 530 IF(forward. OR. leapf) THEN 523 531 itau= itau + 1 524 c $$$iday= day_ini+itau/day_step525 c $$$ time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0526 c $$$IF(time.GT.1.) THEN527 c $$$time = time-1.528 c $$$iday = iday+1529 c $$$ENDIF532 c iday= day_ini+itau/day_step 533 c time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 534 c IF(time.GT.1.) THEN 535 c time = time-1. 536 c iday = iday+1 537 c ENDIF 530 538 ENDIF 531 539 … … 559 567 IF (ok_dynzon) THEN 560 568 #ifdef CPP_IOIPSL 561 ! CALL writedynav(histaveid, itau,vcov , 562 ! , ucov,teta,pk,phi,q,masse,ps,phis) 563 CALL bilan_dyn (2,dtvr*iperiod,dtvr*day_step*periodav, 564 , ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q) 569 CALL bilan_dyn(2,dtvr*iperiod,dtvr*day_step*periodav, 570 & ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q) 565 571 #endif 566 572 END IF 567 568 ENDIF 573 IF (ok_dyn_ave) THEN 574 #ifdef CPP_IOIPSL 575 CALL writedynav(itau,vcov, 576 & ucov,teta,pk,phi,q,masse,ps,phis) 577 #endif 578 ENDIF 579 580 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 569 581 570 582 c----------------------------------------------------------------------- … … 572 584 c ------------------------------ 573 585 574 IF( MOD(itau,iecri 575 c IF( MOD(itau,iecri*day_step).EQ.0) THEN 576 586 IF( MOD(itau,iecri).EQ.0) THEN 587 ! Ehouarn: output only during LF or Backward Matsuno 588 if (leapf.or.(.not.leapf.and.(.not.forward))) then 577 589 nbetat = nbetatdem 578 590 CALL geopot(ip1jmp1,teta,pk,pks,phis,phi) … … 583 595 enddo 584 596 #ifdef CPP_IOIPSL 585 c CALL writehist(histid,histvid,itau,vcov, 586 c & ucov,teta,phi,q,masse,ps,phis) 597 if (ok_dyn_ins) then 598 ! write(lunout,*) "leapfrog: call writehist, itau=",itau 599 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis) 600 ! call WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/))) 601 ! call WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/))) 602 ! call WriteField('teta',reshape(teta,(/iip1,jmp1,llm/))) 603 ! call WriteField('ps',reshape(ps,(/iip1,jmp1/))) 604 ! call WriteField('masse',reshape(masse,(/iip1,jmp1,llm/))) 605 endif ! of if (ok_dyn_ins) 587 606 #endif 588 607 ! For some Grads outputs of fields 589 if (output_grads_dyn) then608 if (output_grads_dyn) then 590 609 #include "write_grads_dyn.h" 591 endif592 610 endif 611 endif ! of if (leapf.or.(.not.leapf.and.(.not.forward))) 593 612 ENDIF ! of IF(MOD(itau,iecri).EQ.0) 594 613 … … 645 664 646 665 itau = itau + 1 647 c $$$iday = day_ini+itau/day_step648 c $$$ time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0649 c $$$650 c $$$IF(time.GT.1.) THEN651 c $$$time = time-1.652 c $$$iday = iday+1653 c $$$ENDIF666 c iday = day_ini+itau/day_step 667 c time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 668 c 669 c IF(time.GT.1.) THEN 670 c time = time-1. 671 c iday = iday+1 672 c ENDIF 654 673 655 674 forward = .FALSE. … … 660 679 GO TO 2 661 680 662 ELSE ! of IF(forward) 681 ELSE ! of IF(forward) i.e. backward step 663 682 664 683 IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN … … 671 690 IF (ok_dynzon) THEN 672 691 #ifdef CPP_IOIPSL 673 ! CALL writedynav(histaveid, itau,vcov , 674 ! , ucov,teta,pk,phi,q,masse,ps,phis) 675 CALL bilan_dyn (2,dtvr*iperiod,dtvr*day_step*periodav, 676 , ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q) 677 #endif 678 END IF 692 CALL bilan_dyn(2,dtvr*iperiod,dtvr*day_step*periodav, 693 & ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q) 694 #endif 695 ENDIF 696 IF (ok_dyn_ave) THEN 697 #ifdef CPP_IOIPSL 698 CALL writedynav(itau,vcov, 699 & ucov,teta,pk,phi,q,masse,ps,phis) 700 #endif 701 ENDIF 679 702 680 703 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) … … 690 713 enddo 691 714 #ifdef CPP_IOIPSL 692 c CALL writehist( histid, histvid, itau,vcov , 693 c & ucov,teta,phi,q,masse,ps,phis) 715 if (ok_dyn_ins) then 716 ! write(lunout,*) "leapfrog: call writehist (b)", 717 ! & itau,iecri 718 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis) 719 endif ! of if (ok_dyn_ins) 694 720 #endif 695 721 ! For some Grads outputs -
LMDZ4/trunk/libf/dyn3d/limit_netcdf.F90
r1328 r1403 20 20 ! * 12/2009: D. Cugnet (f77->f90, calendars, files from coupled runs) 21 21 !------------------------------------------------------------------------------- 22 USE control_mod 22 23 #ifdef CPP_EARTH 23 24 USE dimphy … … 27 28 NF90_DEF_DIM, NF90_DEF_VAR, NF90_PUT_VAR, NF90_PUT_ATT, & 28 29 NF90_NOERR, NF90_NOWRITE, NF90_DOUBLE, NF90_GLOBAL, & 29 NF90_CLOBBER, NF90_ENDDEF, NF90_UNLIMITED 30 NF90_CLOBBER, NF90_ENDDEF, NF90_UNLIMITED, NF90_FLOAT 30 31 USE inter_barxy_m, only: inter_barxy 31 32 #endif … … 45 46 !------------------------------------------------------------------------------- 46 47 ! Local variables: 47 #include "control.h"48 48 #include "logic.h" 49 49 #include "comvert.h" … … 293 293 USE dimphy, ONLY : klon 294 294 USE phys_state_var_mod, ONLY : pctsrf 295 USE control_mod 295 296 IMPLICIT NONE 296 297 #include "dimensions.h" 297 298 #include "paramet.h" 298 299 #include "comgeom2.h" 299 #include "control.h"300 300 #include "indicesol.h" 301 301 #include "iniprint.h" -
LMDZ4/trunk/libf/dyn3d/ppm3d.F
r695 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 … … 345 345 C 346 346 PI = 4. * ATAN(1.) 347 DL = 2.*PI / float(IMR)348 DP = PI / float(JMR)347 DL = 2.*PI / REAL(IMR) 348 DP = PI / REAL(JMR) 349 349 C 350 350 if(IGD.eq.0) then … … 388 388 ZTC = acos(CR1) * (180./PI) 389 389 C 390 JS0 = float(JMR)*(90.-ZTC)/180. + 2390 JS0 = REAL(JMR)*(90.-ZTC)/180. + 2 391 391 JS0 = max(JS0, J1+1) 392 392 IML = min(6*JS0/(J1-1)+2, 4*IMR/5) … … 628 628 C Contribution from the N-S advection 629 629 do i=1,imr*(j2-j1+1) 630 JT = float(J1) - VA(i,j1)630 JT = REAL(J1) - VA(i,j1) 631 631 wk1(i,j1,2) = VA(i,j1) * (q(i,jt,k,IC) - q(i,jt+1,k,IC)) 632 632 enddo … … 949 949 IF(IORD.eq.1 .or. j.eq.j1. or. j.eq.j2) THEN 950 950 DO 1406 i=1,IMR 951 iu = float(i) - uc(i,j)951 iu = REAL(i) - uc(i,j) 952 952 1406 fx1(i) = qtmp(iu) 953 953 ELSE … … 957 957 if(IORD.eq.2 .or. j.le.j1vl .or. j.ge.j2vl) then 958 958 DO 1408 i=1,IMR 959 iu = float(i) - uc(i,j)959 iu = REAL(i) - uc(i,j) 960 960 1408 fx1(i) = qtmp(iu) + DC(iu)*(sign(1.,uc(i,j))-uc(i,j)) 961 961 else … … 1111 1111 if(JORD.eq.1) then 1112 1112 DO 1000 i=1,len 1113 JT = float(J1) - VC(i,J1)1113 JT = REAL(J1) - VC(i,J1) 1114 1114 1000 fx(i,j1) = p(i,JT) 1115 1115 else … … 1123 1123 else 1124 1124 DO 1200 i=1,len 1125 JT = float(J1) - VC(i,J1)1125 JT = REAL(J1) - VC(i,J1) 1126 1126 1200 fx(i,j1) = p(i,JT) + (sign(1.,VC(i,j1))-VC(i,j1))*DC2(i,JT) 1127 1127 endif … … 1358 1358 do j=j1-1,j2+1 1359 1359 do i=1,imr 1360 JP = float(j)-VA(i,j)1360 JP = REAL(j)-VA(i,j) 1361 1361 ady(i,j) = VA(i,j)*(wk(i,jp)-wk(i,jp+1)) 1362 1362 enddo … … 1582 1582 JMR = JNP-1 1583 1583 do 55 j=2,JNP 1584 ph5 = -0.5*PI + ( FLOAT(J-1)-0.5)*DP1584 ph5 = -0.5*PI + (REAL(J-1)-0.5)*DP 1585 1585 55 cose(j) = cos(ph5) 1586 1586 C … … 1834 1834 C 1835 1835 c if(first) then 1836 DP = 4.*ATAN(1.)/ float(JNP-1)1836 DP = 4.*ATAN(1.)/REAL(JNP-1) 1837 1837 CAP1 = IMR*(1.-COS((j1-1.5)*DP))/DP 1838 1838 c first = .false. … … 1889 1889 C Check Poles. 1890 1890 if(q(1,1).lt.0.) then 1891 dq = q(1,1)*cap1/ float(IMR)*acosp(j1)1891 dq = q(1,1)*cap1/REAL(IMR)*acosp(j1) 1892 1892 do i=1,imr 1893 1893 q(i,1) = 0. … … 1898 1898 C 1899 1899 if(q(1,JNP).lt.0.) then 1900 dq = q(1,JNP)*cap1/ float(IMR)*acosp(j2)1900 dq = q(1,JNP)*cap1/REAL(IMR)*acosp(j2) 1901 1901 do i=1,imr 1902 1902 q(i,JNP) = 0. -
LMDZ4/trunk/libf/dyn3d/ran1.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 FUNCTION RAN1(IDUM) … … 20 20 IX1=MOD(IA1*IX1+IC1,M1) 21 21 IX2=MOD(IA2*IX2+IC2,M2) 22 R(J)=( FLOAT(IX1)+FLOAT(IX2)*RM2)*RM122 R(J)=(REAL(IX1)+REAL(IX2)*RM2)*RM1 23 23 11 CONTINUE 24 24 IDUM=1 … … 30 30 IF(J.GT.97.OR.J.LT.1)PAUSE 31 31 RAN1=R(J) 32 R(J)=( FLOAT(IX1)+FLOAT(IX2)*RM2)*RM132 R(J)=(REAL(IX1)+REAL(IX2)*RM2)*RM1 33 33 RETURN 34 34 END -
LMDZ4/trunk/libf/dyn3d/sortvarc.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE sortvarc … … 59 59 60 60 dtvrs1j = dtvr/daysec 61 rjour = FLOAT( INT( itau * dtvrs1j ))61 rjour = REAL( INT( itau * dtvrs1j )) 62 62 heure = ( itau*dtvrs1j-rjour ) * 24. 63 63 imjmp1 = iim * jjp1 … … 129 129 ang = SSUM( llm, angl, 1 ) 130 130 131 c rday = FLOAT(INT ( day_ini + time ))131 c rday = REAL(INT ( day_ini + time )) 132 132 c 133 rday = FLOAT(INT(time-jD_ref-jH_ref))133 rday = REAL(INT(time-jD_ref-jH_ref)) 134 134 IF(ptot0.eq.0.) THEN 135 135 PRINT 3500, itau, rday, heure,time -
LMDZ4/trunk/libf/dyn3d/sortvarc0.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE sortvarc0 … … 60 60 61 61 dtvrs1j = dtvr/daysec 62 rjour = FLOAT( INT( itau * dtvrs1j ))62 rjour = REAL( INT( itau * dtvrs1j )) 63 63 heure = ( itau*dtvrs1j-rjour ) * 24. 64 64 imjmp1 = iim * jjp1 … … 130 130 ang0 = SSUM( llm, angl, 1 ) 131 131 132 rday = FLOAT(INT (time ))132 rday = REAL(INT (time )) 133 133 c 134 134 PRINT 3500, itau, rday, heure, time -
LMDZ4/trunk/libf/dyn3d/tourabs.F
r644 r1403 57 57 ELSE 58 58 rot( ij,l ) = (vcov(ij+1,l)/cv(ij+1)-vcov(ij,l)/cv(ij))/ 59 $ (2.*pi*RAD*cos(rlatv(j)))* float(iim)59 $ (2.*pi*RAD*cos(rlatv(j)))*REAL(iim) 60 60 $ +(ucov(ij+iip1,l)/cu(ij+iip1)-ucov(ij,l)/cu(ij))/ 61 $ (pi*RAD)*( float(jjm)-1.)61 $ (pi*RAD)*(REAL(jjm)-1.) 62 62 c 63 63 ENDIF -
LMDZ4/trunk/libf/dyn3d/traceurpole.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine traceurpole(q,masse) 5 6 USE control_mod 5 7 6 8 implicit none … … 15 17 #include "logic.h" 16 18 #include "temps.h" 17 #include "control.h"18 19 #include "ener.h" 19 20 #include "description.h" -
LMDZ4/trunk/libf/dyn3d/ugeostr.F
r1279 r1403 40 40 DO i=1,iim 41 41 u(i,j,l)=fact*(phi(i,j+1,l)-phi(i,j,l)) 42 um(j,l)=um(j,l)+u(i,j,l)/ float(iim)42 um(j,l)=um(j,l)+u(i,j,l)/REAL(iim) 43 43 ENDDO 44 44 ENDDO -
LMDZ4/trunk/libf/dyn3d/write_paramLMDZ_dyn.h
r1279 r1403 7 7 itau_w=itau_dyn+itau 8 8 c 9 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(prt_level)9 zx_tmp_2d(1:iip1,1:jjp1)=REAL(prt_level) 10 10 CALL histwrite(nid_ctesGCM, "prt_level", itau_w, 11 11 . zx_tmp_2d,iip1*jjp1,ndex2d) 12 12 c 13 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(dayref)13 zx_tmp_2d(1:iip1,1:jjp1)=REAL(dayref) 14 14 CALL histwrite(nid_ctesGCM, "dayref", itau_w, 15 15 . zx_tmp_2d,iip1*jjp1,ndex2d) 16 16 c 17 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(anneeref)17 zx_tmp_2d(1:iip1,1:jjp1)=REAL(anneeref) 18 18 CALL histwrite(nid_ctesGCM, "anneeref", itau_w, 19 19 . zx_tmp_2d,iip1*jjp1,ndex2d) 20 20 c 21 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(raz_date)21 zx_tmp_2d(1:iip1,1:jjp1)=REAL(raz_date) 22 22 CALL histwrite(nid_ctesGCM, "raz_date", itau_w, 23 23 . zx_tmp_2d,iip1*jjp1,ndex2d) 24 24 c 25 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(nday)25 zx_tmp_2d(1:iip1,1:jjp1)=REAL(nday) 26 26 CALL histwrite(nid_ctesGCM, "nday", itau_w, 27 27 . zx_tmp_2d,iip1*jjp1,ndex2d) 28 28 c 29 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(day_step)29 zx_tmp_2d(1:iip1,1:jjp1)=REAL(day_step) 30 30 CALL histwrite(nid_ctesGCM, "day_step", itau_w, 31 31 . zx_tmp_2d,iip1*jjp1,ndex2d) 32 32 c 33 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iperiod)33 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iperiod) 34 34 CALL histwrite(nid_ctesGCM, "iperiod", itau_w, 35 35 . zx_tmp_2d,iip1*jjp1,ndex2d) 36 36 c 37 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iapp_tracvl)37 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iapp_tracvl) 38 38 CALL histwrite(nid_ctesGCM, "iapp_tracvl", itau_w, 39 39 . zx_tmp_2d,iip1*jjp1,ndex2d) 40 40 c 41 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iconser)41 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iconser) 42 42 CALL histwrite(nid_ctesGCM, "iconser", itau_w, 43 43 . zx_tmp_2d,iip1*jjp1,ndex2d) 44 44 c 45 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iecri)45 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iecri) 46 46 CALL histwrite(nid_ctesGCM, "iecri", itau_w, 47 47 . zx_tmp_2d,iip1*jjp1,ndex2d) … … 51 51 . zx_tmp_2d,iip1*jjp1,ndex2d) 52 52 c 53 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(idissip)53 zx_tmp_2d(1:iip1,1:jjp1)=REAL(idissip) 54 54 CALL histwrite(nid_ctesGCM, "idissip", itau_w, 55 55 . zx_tmp_2d,iip1*jjp1,ndex2d) … … 63 63 . zx_tmp_2d,iip1*jjp1,ndex2d) 64 64 c 65 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(nitergdiv)65 zx_tmp_2d(1:iip1,1:jjp1)=REAL(nitergdiv) 66 66 CALL histwrite(nid_ctesGCM, "nitergdiv", itau_w, 67 67 . zx_tmp_2d,iip1*jjp1,ndex2d) 68 68 c 69 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(nitergrot)69 zx_tmp_2d(1:iip1,1:jjp1)=REAL(nitergrot) 70 70 CALL histwrite(nid_ctesGCM, "nitergrot", itau_w, 71 71 . zx_tmp_2d,iip1*jjp1,ndex2d) 72 72 c 73 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(niterh)73 zx_tmp_2d(1:iip1,1:jjp1)=REAL(niterh) 74 74 CALL histwrite(nid_ctesGCM, "niterh", itau_w, 75 75 . zx_tmp_2d,iip1*jjp1,ndex2d) … … 118 118 . zx_tmp_2d,iip1*jjp1,ndex2d) 119 119 c 120 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iflag_phys)120 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iflag_phys) 121 121 CALL histwrite(nid_ctesGCM, "iflag_phys", itau_w, 122 122 . zx_tmp_2d,iip1*jjp1,ndex2d) 123 123 c 124 zx_tmp_2d(1:iip1,1:jjp1)= FLOAT(iphysiq)124 zx_tmp_2d(1:iip1,1:jjp1)=REAL(iphysiq) 125 125 CALL histwrite(nid_ctesGCM, "iphysiq", itau_w, 126 126 . zx_tmp_2d,iip1*jjp1,ndex2d) -
LMDZ4/trunk/libf/dyn3dpar/adaptdt.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine adaptdt(nadv,dtbon,n,pbaru, 5 5 c masse) 6 7 USE control_mod 6 8 7 9 IMPLICIT NONE … … 16 18 #include "logic.h" 17 19 #include "temps.h" 18 #include "control.h"19 20 #include "ener.h" 20 21 #include "description.h" -
LMDZ4/trunk/libf/dyn3dpar/advtrac_p.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 23 23 USE times 24 24 USE infotrac 25 USE control_mod 25 26 IMPLICIT NONE 26 27 c … … 33 34 #include "logic.h" 34 35 #include "temps.h" 35 #include "control.h"36 36 #include "ener.h" 37 37 #include "description.h" … … 215 215 ijb=ij_begin 216 216 ije=ij_end 217 flxw(ijb:ije,1:llm)=wg(ijb:ije,1:llm)/ FLOAT(iapp_tracvl)217 flxw(ijb:ije,1:llm)=wg(ijb:ije,1:llm)/REAL(iapp_tracvl) 218 218 219 219 c test sur l'eventuelle creation de valeurs negatives de la masse -
LMDZ4/trunk/libf/dyn3dpar/bilan_dyn_p.F
r1279 r1403 511 511 . /masse_cum(:,jjb:jje,:) 512 512 enddo 513 zz=1./ float(ncum)513 zz=1./REAL(ncum) 514 514 515 515 jjb=jj_begin -
LMDZ4/trunk/libf/dyn3dpar/caladvtrac_p.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 9 9 USE parallel 10 10 USE infotrac 11 USE control_mod 11 12 c 12 13 IMPLICIT NONE … … 25 26 #include "paramet.h" 26 27 #include "comconst.h" 27 #include "control.h"28 28 29 29 c Arguments: -
LMDZ4/trunk/libf/dyn3dpar/calfis_p.F
r1279 r1403 34 34 USE dimphy 35 35 USE mod_phys_lmdz_para, mpi_root_xx=>mpi_root 36 USE mod_interface_dyn_phys 37 USE IOPHY 38 #endif 36 39 USE parallel, ONLY : omp_chunk, using_mpi 37 USE mod_interface_dyn_phys38 40 USE Write_Field 39 41 Use Write_field_p 40 42 USE Times 41 USE IOPHY42 43 USE infotrac 44 USE control_mod 43 45 44 46 IMPLICIT NONE … … 107 109 #include "comvert.h" 108 110 #include "comgeom2.h" 109 #include " control.h"111 #include "iniprint.h" 110 112 #ifdef CPP_MPI 111 113 include 'mpif.h' … … 114 116 c ----------- 115 117 LOGICAL lafin 116 REAL heure117 118 ! REAL heure 119 REAL, intent(in):: jD_cur, jH_cur 118 120 REAL pvcov(iip1,jjm,llm) 119 121 REAL pucov(iip1,jjp1,llm) … … 128 130 REAL pdteta(iip1,jjp1,llm) 129 131 REAL pdq(iip1,jjp1,llm,nqtot) 132 REAL flxw(iip1,jjp1,llm) ! Flux de masse verticale sur la grille dynamique 130 133 c 131 134 REAL pps(iip1,jjp1) … … 143 146 REAL clesphy0( longcles ) 144 147 145 148 #ifdef CPP_EARTH 146 149 c Local variables : 147 150 c ----------------- … … 180 183 REAL,SAVE,ALLOCATABLE :: flxwfi_omp(:,:) ! Flux de masse verticale sur la grille physiq 181 184 185 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 186 ! Introduction du splitting (FH) 187 ! Question pour Yann : 188 ! J'ai été surpris au début que les tableaux zufi_omp, zdufi_omp n'co soitent 189 ! en SAVE. Je crois comprendre que c'est parce que tu voulais qu'il 190 ! soit allocatable (plutot par exemple que de passer une dimension 191 ! dépendant du process en argument des routines) et que, du coup, 192 ! le SAVE évite d'avoir à refaire l'allocation à chaque appel. 193 ! Tu confirmes ? 194 ! J'ai suivi le même principe pour les zdufic_omp 195 ! Mais c'est surement bien que tu controles. 196 ! 197 198 REAL,ALLOCATABLE,SAVE :: zdufic_omp(:,:) 199 REAL,ALLOCATABLE,SAVE :: zdvfic_omp(:,:) 200 REAL,ALLOCATABLE,SAVE :: zdtfic_omp(:,:) 201 REAL,ALLOCATABLE,SAVE :: zdqfic_omp(:,:,:) 202 REAL jH_cur_split,zdt_split 203 LOGICAL debut_split,lafin_split 204 INTEGER isplit 205 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 206 182 207 c$OMP THREADPRIVATE(zplev_omp,zplay_omp,zphi_omp,zphis_omp, 183 208 c$OMP+ presnivs_omp,zufi_omp,zvfi_omp,ztfi_omp, 184 209 c$OMP+ zqfi_omp,zdufi_omp,zdvfi_omp, 185 c$OMP+ zdtfi_omp,zdqfi_omp,zdpsrf_omp,flxwfi_omp) 210 c$OMP+ zdtfi_omp,zdqfi_omp,zdpsrf_omp,flxwfi_omp, 211 c$OMP+ zdufic_omp,zdvfic_omp,zdtfic_omp,zdqfic_omp) 186 212 187 213 LOGICAL,SAVE :: first_omp=.true. … … 199 225 REAL PVteta(klon,ntetaSTD) 200 226 201 REAL flxw(iip1,jjp1,llm) ! Flux de masse verticale sur la grille dynamique202 227 203 228 REAL SSUM … … 207 232 SAVE firstcal,debut 208 233 c$OMP THREADPRIVATE(firstcal,debut) 209 REAL, intent(in):: jD_cur, jH_cur210 234 211 235 REAL,SAVE,dimension(1:iim,1:llm):: du_send,du_recv,dv_send,dv_recv … … 235 259 debut = .TRUE. 236 260 IF (ngridmx.NE.2+(jjm-1)*iim) THEN 237 PRINT*,'STOP dans calfis' 238 PRINT*,'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim' 239 PRINT*,' ngridmx jjm iim ' 240 PRINT*,ngridmx,jjm,iim 261 write(lunout,*) 'STOP dans calfis' 262 write(lunout,*) 263 & 'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim' 264 write(lunout,*) ' ngridmx jjm iim ' 265 write(lunout,*) ngridmx,jjm,iim 241 266 STOP 242 267 ENDIF … … 498 523 allocate(zdtfi_omp(klon,llm)) 499 524 allocate(zdqfi_omp(klon,llm,nqtot)) 525 allocate(zdufic_omp(klon,llm)) 526 allocate(zdvfic_omp(klon,llm)) 527 allocate(zdtfic_omp(klon,llm)) 528 allocate(zdqfic_omp(klon,llm,nqtot)) 500 529 allocate(zdpsrf_omp(klon)) 501 530 allocate(flxwfi_omp(klon,llm)) … … 600 629 if (planet_type=="earth") then 601 630 #ifdef CPP_EARTH 631 632 !$OMP MASTER 633 write(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys 634 !$OMP END MASTER 635 zdt_split=dtphys/nsplit_phys 636 zdufic_omp(:,:)=0. 637 zdvfic_omp(:,:)=0. 638 zdtfic_omp(:,:)=0. 639 zdqfic_omp(:,:,:)=0. 640 641 do isplit=1,nsplit_phys 642 643 jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys) 644 debut_split=debut.and.isplit==1 645 lafin_split=lafin.and.isplit==nsplit_phys 646 647 602 648 CALL physiq (klon, 603 649 . llm, 604 . debut ,605 . lafin ,650 . debut_split, 651 . lafin_split, 606 652 . jD_cur, 607 . jH_cur ,608 . dtphys,653 . jH_cur_split, 654 . zdt_split, 609 655 . zplev_omp, 610 656 . zplay_omp, … … 628 674 . pducov, 629 675 . PVteta) 676 677 zufi_omp(:,:)=zufi_omp(:,:)+zdufi_omp(:,:)*zdt_split 678 zvfi_omp(:,:)=zvfi_omp(:,:)+zdvfi_omp(:,:)*zdt_split 679 ztfi_omp(:,:)=ztfi_omp(:,:)+zdtfi_omp(:,:)*zdt_split 680 zqfi_omp(:,:,:)=zqfi_omp(:,:,:)+zdqfi_omp(:,:,:)*zdt_split 681 682 zdufic_omp(:,:)=zdufic_omp(:,:)+zdufi_omp(:,:) 683 zdvfic_omp(:,:)=zdvfic_omp(:,:)+zdvfi_omp(:,:) 684 zdtfic_omp(:,:)=zdtfic_omp(:,:)+zdtfi_omp(:,:) 685 zdqfic_omp(:,:,:)=zdqfic_omp(:,:,:)+zdqfi_omp(:,:,:) 686 687 enddo 688 689 zdufi_omp(:,:)=zdufic_omp(:,:)/nsplit_phys 690 zdvfi_omp(:,:)=zdvfic_omp(:,:)/nsplit_phys 691 zdtfi_omp(:,:)=zdtfic_omp(:,:)/nsplit_phys 692 zdqfi_omp(:,:,:)=zdqfic_omp(:,:,:)/nsplit_phys 693 630 694 #endif 631 695 endif !of if (planet_type=="earth") … … 1047 1111 1048 1112 #else 1049 write(*,*) "calfis_p: for now can only work with parallel physics" 1113 write(lunout,*) 1114 & "calfis_p: for now can only work with parallel physics" 1050 1115 stop 1051 1116 #endif -
LMDZ4/trunk/libf/dyn3dpar/ce0l.F90
r1319 r1403 15 15 ! masque is created in etat0, passed to limit to ensure consistancy. 16 16 !------------------------------------------------------------------------------- 17 USE control_mod 17 18 #ifdef CPP_EARTH 18 19 ! This prog. is designed to work for Earth … … 39 40 #include "indicesol.h" 40 41 #include "iniprint.h" 41 #include "control.h"42 42 #include "temps.h" 43 43 #include "logic.h" -
LMDZ4/trunk/libf/dyn3dpar/conf_gcm.F
r1323 r1403 16 16 use mod_hallo, ONLY : use_mpi_alloc 17 17 use parallel, ONLY : omp_chunk 18 USE control_mod 18 19 IMPLICIT NONE 19 20 c----------------------------------------------------------------------- … … 38 39 #include "dimensions.h" 39 40 #include "paramet.h" 40 #include "control.h"41 41 #include "logic.h" 42 42 #include "serre.h" … … 173 173 CALL getin('day_step',day_step) 174 174 175 !Config Key = nsplit_phys 176 !Config Desc = nombre d'iteration de la physique 177 !Config Def = 240 178 !Config Help = nombre d'itration de la physique 179 ! 180 nsplit_phys = 1 181 CALL getin('nsplit_phys',nsplit_phys) 182 175 183 !Config Key = iperiod 176 184 !Config Desc = periode pour le pas Matsuno … … 589 597 CALL getin('ok_dynzon',ok_dynzon) 590 598 599 !Config Key = ok_dyn_ins 600 !Config Desc = sorties instantanees dans la dynamique 601 !Config Def = n 602 !Config Help = 603 !Config 604 ok_dyn_ins = .FALSE. 605 CALL getin('ok_dyn_ins',ok_dyn_ins) 606 607 !Config Key = ok_dyn_ave 608 !Config Desc = sorties moyennes dans la dynamique 609 !Config Def = n 610 !Config Help = 611 !Config 612 ok_dyn_ave = .FALSE. 613 CALL getin('ok_dyn_ave',ok_dyn_ave) 591 614 592 615 write(lunout,*)' #########################################' … … 599 622 write(lunout,*)' day_step = ', day_step 600 623 write(lunout,*)' iperiod = ', iperiod 624 write(lunout,*)' nsplit_phys = ', nsplit_phys 601 625 write(lunout,*)' iconser = ', iconser 602 626 write(lunout,*)' iecri = ', iecri … … 628 652 write(lunout,*)' config_inca = ', config_inca 629 653 write(lunout,*)' ok_dynzon = ', ok_dynzon 654 write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins 655 write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave 630 656 631 657 RETURN … … 760 786 ok_dynzon = .FALSE. 761 787 CALL getin('ok_dynzon',ok_dynzon) 788 789 !Config Key = ok_dyn_ins 790 !Config Desc = sorties instantanees dans la dynamique 791 !Config Def = n 792 !Config Help = 793 !Config 794 ok_dyn_ins = .FALSE. 795 CALL getin('ok_dyn_ins',ok_dyn_ins) 796 797 !Config Key = ok_dyn_ave 798 !Config Desc = sorties moyennes dans la dynamique 799 !Config Def = n 800 !Config Help = 801 !Config 802 ok_dyn_ave = .FALSE. 803 CALL getin('ok_dyn_ave',ok_dyn_ave) 762 804 763 805 !Config Key = use_filtre_fft … … 870 912 write(lunout,*)' config_inca = ', config_inca 871 913 write(lunout,*)' ok_dynzon = ', ok_dynzon 914 write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins 915 write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave 872 916 write(lunout,*)' use_filtre_fft = ', use_filtre_fft 873 917 write(lunout,*)' use_mpi_alloc = ', use_mpi_alloc -
LMDZ4/trunk/libf/dyn3dpar/defrun.F
r985 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 6 6 SUBROUTINE defrun( tapedef, etatinit, clesphy0 ) 7 7 c 8 USE control_mod 8 9 IMPLICIT NONE 9 10 c----------------------------------------------------------------------- … … 28 29 #include "dimensions.h" 29 30 #include "paramet.h" 30 #include "control.h"31 31 #include "logic.h" 32 32 #include "serre.h" … … 241 241 clesphy0(i) = 0. 242 242 ENDDO 243 clesphy0(1) = FLOAT( iflag_con )244 clesphy0(2) = FLOAT( nbapp_rad )243 clesphy0(1) = REAL( iflag_con ) 244 clesphy0(2) = REAL( nbapp_rad ) 245 245 246 246 IF( cycle_diurne ) clesphy0(3) = 1. -
LMDZ4/trunk/libf/dyn3dpar/disvert.F
r1279 r1403 111 111 snorm = 0. 112 112 DO l = 1, llm 113 x = 2.*asin(1.) * ( FLOAT(l)-0.5) / float(llm+1)113 x = 2.*asin(1.) * (REAL(l)-0.5) / REAL(llm+1) 114 114 115 115 IF (ok_strato) THEN … … 135 135 136 136 DO l=1,llm 137 nivsigs(l) = FLOAT(l)137 nivsigs(l) = REAL(l) 138 138 ENDDO 139 139 140 140 DO l=1,llmp1 141 nivsig(l)= FLOAT(l)141 nivsig(l)= REAL(l) 142 142 ENDDO 143 143 -
LMDZ4/trunk/libf/dyn3dpar/dynetat0.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 4 SUBROUTINE dynetat0(fichnom,vcov,ucov, 5 5 . teta,q,masse,ps,phis,time) 6 6 7 USE infotrac 7 8 IMPLICIT NONE … … 33 34 #include "serre.h" 34 35 #include "logic.h" 36 #include "iniprint.h" 35 37 36 38 c Arguments: … … 52 54 53 55 c----------------------------------------------------------------------- 56 54 57 c Ouverture NetCDF du fichier etat initial 55 58 56 59 ierr = NF_OPEN (fichnom, NF_NOWRITE,nid) 57 60 IF (ierr.NE.NF_NOERR) THEN 58 write( 6,*)'Pb d''ouverture du fichier start.nc'59 write( 6,*)' ierr = ', ierr61 write(lunout,*)'dynetat0: Pb d''ouverture du fichier start.nc' 62 write(lunout,*)' ierr = ', ierr 60 63 CALL ABORT 61 64 ENDIF … … 64 67 ierr = NF_INQ_VARID (nid, "controle", nvarid) 65 68 IF (ierr .NE. NF_NOERR) THEN 66 PRINT*,"dynetat0: Le champ <controle> est absent"69 write(lunout,*)"dynetat0: Le champ <controle> est absent" 67 70 CALL abort 68 71 ENDIF … … 73 76 #endif 74 77 IF (ierr .NE. NF_NOERR) THEN 75 PRINT*,"dynetat0: Lecture echoue pour <controle>"78 write(lunout,*)"dynetat0: Lecture echoue pour <controle>" 76 79 CALL abort 77 80 ENDIF … … 119 122 c 120 123 c 121 PRINT*,'rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa 124 write(lunout,*)'dynetat0: rad,omeg,g,cpp,kappa', 125 & rad,omeg,g,cpp,kappa 122 126 123 127 IF( im.ne.iim ) THEN … … 134 138 ierr = NF_INQ_VARID (nid, "rlonu", nvarid) 135 139 IF (ierr .NE. NF_NOERR) THEN 136 PRINT*,"dynetat0: Le champ <rlonu> est absent"140 write(lunout,*)"dynetat0: Le champ <rlonu> est absent" 137 141 CALL abort 138 142 ENDIF … … 143 147 #endif 144 148 IF (ierr .NE. NF_NOERR) THEN 145 PRINT*,"dynetat0: Lecture echouee pour <rlonu>"149 write(lunout,*)"dynetat0: Lecture echouee pour <rlonu>" 146 150 CALL abort 147 151 ENDIF … … 149 153 ierr = NF_INQ_VARID (nid, "rlatu", nvarid) 150 154 IF (ierr .NE. NF_NOERR) THEN 151 PRINT*,"dynetat0: Le champ <rlatu> est absent"155 write(lunout,*)"dynetat0: Le champ <rlatu> est absent" 152 156 CALL abort 153 157 ENDIF … … 158 162 #endif 159 163 IF (ierr .NE. NF_NOERR) THEN 160 PRINT*,"dynetat0: Lecture echouee pour <rlatu>"164 write(lunout,*)"dynetat0: Lecture echouee pour <rlatu>" 161 165 CALL abort 162 166 ENDIF … … 164 168 ierr = NF_INQ_VARID (nid, "rlonv", nvarid) 165 169 IF (ierr .NE. NF_NOERR) THEN 166 PRINT*,"dynetat0: Le champ <rlonv> est absent"170 write(lunout,*)"dynetat0: Le champ <rlonv> est absent" 167 171 CALL abort 168 172 ENDIF … … 173 177 #endif 174 178 IF (ierr .NE. NF_NOERR) THEN 175 PRINT*,"dynetat0: Lecture echouee pour <rlonv>"179 write(lunout,*)"dynetat0: Lecture echouee pour <rlonv>" 176 180 CALL abort 177 181 ENDIF … … 179 183 ierr = NF_INQ_VARID (nid, "rlatv", nvarid) 180 184 IF (ierr .NE. NF_NOERR) THEN 181 PRINT*,"dynetat0: Le champ <rlatv> est absent"185 write(lunout,*)"dynetat0: Le champ <rlatv> est absent" 182 186 CALL abort 183 187 ENDIF … … 188 192 #endif 189 193 IF (ierr .NE. NF_NOERR) THEN 190 PRINT*,"dynetat0: Lecture echouee pour rlatv"194 write(lunout,*)"dynetat0: Lecture echouee pour rlatv" 191 195 CALL abort 192 196 ENDIF … … 194 198 ierr = NF_INQ_VARID (nid, "cu", nvarid) 195 199 IF (ierr .NE. NF_NOERR) THEN 196 PRINT*,"dynetat0: Le champ <cu> est absent"200 write(lunout,*)"dynetat0: Le champ <cu> est absent" 197 201 CALL abort 198 202 ENDIF … … 203 207 #endif 204 208 IF (ierr .NE. NF_NOERR) THEN 205 PRINT*,"dynetat0: Lecture echouee pour <cu>"209 write(lunout,*)"dynetat0: Lecture echouee pour <cu>" 206 210 CALL abort 207 211 ENDIF … … 209 213 ierr = NF_INQ_VARID (nid, "cv", nvarid) 210 214 IF (ierr .NE. NF_NOERR) THEN 211 PRINT*,"dynetat0: Le champ <cv> est absent"215 write(lunout,*)"dynetat0: Le champ <cv> est absent" 212 216 CALL abort 213 217 ENDIF … … 218 222 #endif 219 223 IF (ierr .NE. NF_NOERR) THEN 220 PRINT*,"dynetat0: Lecture echouee pour <cv>"224 write(lunout,*)"dynetat0: Lecture echouee pour <cv>" 221 225 CALL abort 222 226 ENDIF … … 224 228 ierr = NF_INQ_VARID (nid, "aire", nvarid) 225 229 IF (ierr .NE. NF_NOERR) THEN 226 PRINT*,"dynetat0: Le champ <aire> est absent"230 write(lunout,*)"dynetat0: Le champ <aire> est absent" 227 231 CALL abort 228 232 ENDIF … … 233 237 #endif 234 238 IF (ierr .NE. NF_NOERR) THEN 235 PRINT*,"dynetat0: Lecture echouee pour <aire>"239 write(lunout,*)"dynetat0: Lecture echouee pour <aire>" 236 240 CALL abort 237 241 ENDIF … … 239 243 ierr = NF_INQ_VARID (nid, "phisinit", nvarid) 240 244 IF (ierr .NE. NF_NOERR) THEN 241 PRINT*,"dynetat0: Le champ <phisinit> est absent"245 write(lunout,*)"dynetat0: Le champ <phisinit> est absent" 242 246 CALL abort 243 247 ENDIF … … 248 252 #endif 249 253 IF (ierr .NE. NF_NOERR) THEN 250 PRINT*,"dynetat0: Lecture echouee pour <phisinit>"254 write(lunout,*)"dynetat0: Lecture echouee pour <phisinit>" 251 255 CALL abort 252 256 ENDIF … … 254 258 ierr = NF_INQ_VARID (nid, "temps", nvarid) 255 259 IF (ierr .NE. NF_NOERR) THEN 256 PRINT*,"dynetat0: Le champ <temps> est absent"260 write(lunout,*)"dynetat0: Le champ <temps> est absent" 257 261 CALL abort 258 262 ENDIF … … 263 267 #endif 264 268 IF (ierr .NE. NF_NOERR) THEN 265 PRINT*,"dynetat0: Lecture echouee <temps>"269 write(lunout,*)"dynetat0: Lecture echouee <temps>" 266 270 CALL abort 267 271 ENDIF … … 269 273 ierr = NF_INQ_VARID (nid, "ucov", nvarid) 270 274 IF (ierr .NE. NF_NOERR) THEN 271 PRINT*,"dynetat0: Le champ <ucov> est absent"275 write(lunout,*)"dynetat0: Le champ <ucov> est absent" 272 276 CALL abort 273 277 ENDIF … … 278 282 #endif 279 283 IF (ierr .NE. NF_NOERR) THEN 280 PRINT*,"dynetat0: Lecture echouee pour <ucov>"284 write(lunout,*)"dynetat0: Lecture echouee pour <ucov>" 281 285 CALL abort 282 286 ENDIF … … 284 288 ierr = NF_INQ_VARID (nid, "vcov", nvarid) 285 289 IF (ierr .NE. NF_NOERR) THEN 286 PRINT*,"dynetat0: Le champ <vcov> est absent"290 write(lunout,*)"dynetat0: Le champ <vcov> est absent" 287 291 CALL abort 288 292 ENDIF … … 293 297 #endif 294 298 IF (ierr .NE. NF_NOERR) THEN 295 PRINT*,"dynetat0: Lecture echouee pour <vcov>"299 write(lunout,*)"dynetat0: Lecture echouee pour <vcov>" 296 300 CALL abort 297 301 ENDIF … … 299 303 ierr = NF_INQ_VARID (nid, "teta", nvarid) 300 304 IF (ierr .NE. NF_NOERR) THEN 301 PRINT*,"dynetat0: Le champ <teta> est absent"305 write(lunout,*)"dynetat0: Le champ <teta> est absent" 302 306 CALL abort 303 307 ENDIF … … 308 312 #endif 309 313 IF (ierr .NE. NF_NOERR) THEN 310 PRINT*, "dynetat0: Lecture echouee pour <teta>" 311 CALL abort 312 ENDIF 313 314 314 write(lunout,*)"dynetat0: Lecture echouee pour <teta>" 315 CALL abort 316 ENDIF 317 318 319 IF(nqtot.GE.1) THEN 315 320 DO iq=1,nqtot 316 321 ierr = NF_INQ_VARID (nid, tname(iq), nvarid) 317 322 IF (ierr .NE. NF_NOERR) THEN 318 PRINT*, "dynetat0: Le champ <"//tname(iq)//"> est absent" 319 PRINT*, " Il est donc initialise a zero" 323 write(lunout,*)"dynetat0: Le champ <"//tname(iq)// 324 & "> est absent" 325 write(lunout,*)" Il est donc initialise a zero" 320 326 q(:,:,iq)=0. 321 327 ELSE … … 326 332 #endif 327 333 IF (ierr .NE. NF_NOERR) THEN 328 PRINT*,"dynetat0: Lecture echouee pour "//tname(iq)329 334 write(lunout,*)"dynetat0: Lecture echouee pour "//tname(iq) 335 CALL abort 330 336 ENDIF 331 337 ENDIF 332 338 ENDDO 339 ENDIF 333 340 334 341 ierr = NF_INQ_VARID (nid, "masse", nvarid) 335 342 IF (ierr .NE. NF_NOERR) THEN 336 PRINT*,"dynetat0: Le champ <masse> est absent"343 write(lunout,*)"dynetat0: Le champ <masse> est absent" 337 344 CALL abort 338 345 ENDIF … … 343 350 #endif 344 351 IF (ierr .NE. NF_NOERR) THEN 345 PRINT*,"dynetat0: Lecture echouee pour <masse>"352 write(lunout,*)"dynetat0: Lecture echouee pour <masse>" 346 353 CALL abort 347 354 ENDIF … … 349 356 ierr = NF_INQ_VARID (nid, "ps", nvarid) 350 357 IF (ierr .NE. NF_NOERR) THEN 351 PRINT*,"dynetat0: Le champ <ps> est absent"358 write(lunout,*)"dynetat0: Le champ <ps> est absent" 352 359 CALL abort 353 360 ENDIF … … 358 365 #endif 359 366 IF (ierr .NE. NF_NOERR) THEN 360 PRINT*,"dynetat0: Lecture echouee pour <ps>"367 write(lunout,*)"dynetat0: Lecture echouee pour <ps>" 361 368 CALL abort 362 369 ENDIF -
LMDZ4/trunk/libf/dyn3dpar/dynredem.F
r1279 r1403 8 8 #endif 9 9 USE infotrac 10 10 11 IMPLICIT NONE 11 12 c======================================================================= … … 25 26 #include "description.h" 26 27 #include "serre.h" 28 #include "iniprint.h" 27 29 28 30 c Arguments: … … 72 74 tab_cntrl(l) = 0. 73 75 ENDDO 74 tab_cntrl(1) = FLOAT(iim)75 tab_cntrl(2) = FLOAT(jjm)76 tab_cntrl(3) = FLOAT(llm)77 tab_cntrl(4) = FLOAT(day_ref)78 tab_cntrl(5) = FLOAT(annee_ref)76 tab_cntrl(1) = REAL(iim) 77 tab_cntrl(2) = REAL(jjm) 78 tab_cntrl(3) = REAL(llm) 79 tab_cntrl(4) = REAL(day_ref) 80 tab_cntrl(5) = REAL(annee_ref) 79 81 tab_cntrl(6) = rad 80 82 tab_cntrl(7) = omeg … … 116 118 ENDIF 117 119 118 tab_cntrl(30) = FLOAT(iday_end)119 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)120 tab_cntrl(30) = REAL(iday_end) 121 tab_cntrl(31) = REAL(itau_dyn + itaufin) 120 122 c 121 123 c ......................................................... … … 125 127 ierr = NF_CREATE(fichnom, NF_CLOBBER, nid) 126 128 IF (ierr.NE.NF_NOERR) THEN 127 WRITE(6,*)" Pb d ouverture du fichier "//fichnom 128 WRITE(6,*)' ierr = ', ierr 129 write(lunout,*)"dynredem0: Pb d ouverture du fichier " 130 & //trim(fichnom) 131 write(lunout,*)' ierr = ', ierr 129 132 CALL ABORT 130 133 ENDIF … … 508 511 ierr = NF_CLOSE(nid) ! fermer le fichier 509 512 510 PRINT*,'iim,jjm,llm,iday_end',iim,jjm,llm,iday_end 511 PRINT*,'rad,omeg,g,cpp,kappa', 512 , rad,omeg,g,cpp,kappa 513 write(lunout,*)'dynredem0: iim,jjm,llm,iday_end', 514 & iim,jjm,llm,iday_end 515 write(lunout,*)'dynredem0: rad,omeg,g,cpp,kappa', 516 & rad,omeg,g,cpp,kappa 513 517 514 518 RETURN … … 517 521 . vcov,ucov,teta,q,masse,ps) 518 522 USE infotrac 523 USE control_mod 524 519 525 IMPLICIT NONE 520 526 c================================================================= … … 528 534 #include "comgeom.h" 529 535 #include "temps.h" 530 #include "control.h" 536 #include "iniprint.h" 537 531 538 532 539 INTEGER l … … 555 562 ierr = NF_OPEN(fichnom, NF_WRITE, nid) 556 563 IF (ierr .NE. NF_NOERR) THEN 557 PRINT*, "Pb. d ouverture "//fichnom564 write(lunout,*)"dynredem1: Pb. d ouverture "//trim(fichnom) 558 565 CALL abort 559 566 ENDIF … … 564 571 ierr = NF_INQ_VARID(nid, "temps", nvarid) 565 572 IF (ierr .NE. NF_NOERR) THEN 566 print *,NF_STRERROR(ierr)573 write(lunout,*) NF_STRERROR(ierr) 567 574 abort_message='Variable temps n est pas definie' 568 575 CALL abort_gcm(modname,abort_message,ierr) … … 573 580 ierr = NF_PUT_VAR1_REAL (nid,nvarid,nb,time) 574 581 #endif 575 PRINT*, "Enregistrement pour ", nb, time582 write(lunout,*) "dynredem1: Enregistrement pour ", nb, time 576 583 577 584 c … … 589 596 ierr = NF_GET_VAR_REAL(nid, nvarid, tab_cntrl) 590 597 #endif 591 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)598 tab_cntrl(31) = REAL(itau_dyn + itaufin) 592 599 #ifdef NC_DOUBLE 593 600 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl) … … 600 607 ierr = NF_INQ_VARID(nid, "ucov", nvarid) 601 608 IF (ierr .NE. NF_NOERR) THEN 602 PRINT*, "Variable ucov n est pas definie" 603 CALL abort 609 abort_message="Variable ucov n est pas definie" 610 ierr=1 611 CALL abort_gcm(modname,abort_message,ierr) 604 612 ENDIF 605 613 #ifdef NC_DOUBLE … … 611 619 ierr = NF_INQ_VARID(nid, "vcov", nvarid) 612 620 IF (ierr .NE. NF_NOERR) THEN 613 PRINT*, "Variable vcov n est pas definie" 614 CALL abort 621 abort_message="Variable vcov n est pas definie" 622 ierr=1 623 CALL abort_gcm(modname,abort_message,ierr) 615 624 ENDIF 616 625 #ifdef NC_DOUBLE … … 622 631 ierr = NF_INQ_VARID(nid, "teta", nvarid) 623 632 IF (ierr .NE. NF_NOERR) THEN 624 PRINT*, "Variable teta n est pas definie" 625 CALL abort 633 abort_message="Variable teta n est pas definie" 634 ierr=1 635 CALL abort_gcm(modname,abort_message,ierr) 626 636 ENDIF 627 637 #ifdef NC_DOUBLE … … 635 645 ierr_file = NF_OPEN ("start_trac.nc", NF_NOWRITE,nid_trac) 636 646 IF (ierr_file .NE.NF_NOERR) THEN 637 write(6,*)' Pb d''ouverture du fichier start_trac.nc' 638 write(6,*)' ierr = ', ierr_file 647 write(lunout,*)'dynredem1: Pb d''ouverture du fichier', 648 & ' start_trac.nc' 649 write(lunout,*)' ierr = ', ierr_file 639 650 ENDIF 640 651 END IF … … 646 657 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 647 658 IF (ierr .NE. NF_NOERR) THEN 648 PRINT*, "Variable tname(iq) n est pas definie" 649 CALL abort 659 abort_message="Variable tname(iq) n est pas definie" 660 ierr=1 661 CALL abort_gcm(modname,abort_message,ierr) 650 662 ENDIF 651 663 #ifdef NC_DOUBLE … … 659 671 ierr = NF_INQ_VARID (nid_trac, tname(iq), nvarid_trac) 660 672 IF (ierr .NE. NF_NOERR) THEN 661 PRINT*, tname(iq),"est absent de start_trac.nc" 673 write(lunout,*) "dynredem1: ",trim(tname(iq)), 674 & " est absent de start_trac.nc" 662 675 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 663 676 IF (ierr .NE. NF_NOERR) THEN 664 PRINT*, "Variable ", tname(iq)," n est pas definie" 665 CALL abort 677 abort_message="dynredem1: Variable "// 678 & trim(tname(iq))//" n est pas definie" 679 ierr=1 680 CALL abort_gcm(modname,abort_message,ierr) 666 681 ENDIF 667 682 #ifdef NC_DOUBLE … … 672 687 673 688 ELSE 674 PRINT*, tname(iq), "est present dans start_trac.nc" 689 write(lunout,*) "dynredem1: ",trim(tname(iq)), 690 & " est present dans start_trac.nc" 675 691 #ifdef NC_DOUBLE 676 692 ierr = NF_GET_VAR_DOUBLE(nid_trac, nvarid_trac, trac_tmp) … … 679 695 #endif 680 696 IF (ierr .NE. NF_NOERR) THEN 681 PRINT*, "Lecture echouee pour", tname(iq) 682 CALL abort 697 abort_message="dynredem1: Lecture echouee pour"// 698 & trim(tname(iq)) 699 ierr=1 700 CALL abort_gcm(modname,abort_message,ierr) 683 701 ENDIF 684 702 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 685 703 IF (ierr .NE. NF_NOERR) THEN 686 PRINT*, "Variable ", tname(iq)," n est pas definie" 687 CALL abort 704 abort_message="dynredem1: Variable "// 705 & trim(tname(iq))//" n est pas definie" 706 ierr=1 707 CALL abort_gcm(modname,abort_message,ierr) 688 708 ENDIF 689 709 #ifdef NC_DOUBLE … … 699 719 ierr = NF_INQ_VARID(nid, tname(iq), nvarid) 700 720 IF (ierr .NE. NF_NOERR) THEN 701 PRINT*, "Variable tname(iq) n est pas definie" 702 CALL abort 721 abort_message="dynredem1: Variable "// 722 & trim(tname(iq))//" n est pas definie" 723 ierr=1 724 CALL abort_gcm(modname,abort_message,ierr) 703 725 ENDIF 704 726 #ifdef NC_DOUBLE … … 715 737 ierr = NF_INQ_VARID(nid, "masse", nvarid) 716 738 IF (ierr .NE. NF_NOERR) THEN 717 PRINT*, "Variable masse n est pas definie" 718 CALL abort 739 abort_message="dynredem1: Variable masse n est pas definie" 740 ierr=1 741 CALL abort_gcm(modname,abort_message,ierr) 719 742 ENDIF 720 743 #ifdef NC_DOUBLE … … 726 749 ierr = NF_INQ_VARID(nid, "ps", nvarid) 727 750 IF (ierr .NE. NF_NOERR) THEN 728 PRINT*, "Variable ps n est pas definie" 729 CALL abort 751 abort_message="dynredem1: Variable ps n est pas definie" 752 ierr=1 753 CALL abort_gcm(modname,abort_message,ierr) 730 754 ENDIF 731 755 #ifdef NC_DOUBLE -
LMDZ4/trunk/libf/dyn3dpar/dynredem_p.F
r1279 r1403 74 74 tab_cntrl(l) = 0. 75 75 ENDDO 76 tab_cntrl(1) = FLOAT(iim)77 tab_cntrl(2) = FLOAT(jjm)78 tab_cntrl(3) = FLOAT(llm)79 tab_cntrl(4) = FLOAT(day_ref)80 tab_cntrl(5) = FLOAT(annee_ref)76 tab_cntrl(1) = REAL(iim) 77 tab_cntrl(2) = REAL(jjm) 78 tab_cntrl(3) = REAL(llm) 79 tab_cntrl(4) = REAL(day_ref) 80 tab_cntrl(5) = REAL(annee_ref) 81 81 tab_cntrl(6) = rad 82 82 tab_cntrl(7) = omeg … … 118 118 ENDIF 119 119 120 tab_cntrl(30) = FLOAT(iday_end)121 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)120 tab_cntrl(30) = REAL(iday_end) 121 tab_cntrl(31) = REAL(itau_dyn + itaufin) 122 122 c 123 123 c ......................................................... … … 521 521 USE parallel 522 522 USE infotrac 523 USE control_mod 523 524 IMPLICIT NONE 524 525 c================================================================= … … 532 533 #include "comgeom.h" 533 534 #include "temps.h" 534 #include "control.h"535 535 536 536 INTEGER l … … 608 608 ierr = NF_GET_VAR_REAL(nid, nvarid, tab_cntrl) 609 609 #endif 610 tab_cntrl(31) = FLOAT(itau_dyn + itaufin)610 tab_cntrl(31) = REAL(itau_dyn + itaufin) 611 611 #ifdef NC_DOUBLE 612 612 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,tab_cntrl) -
LMDZ4/trunk/libf/dyn3dpar/etat0_netcdf.F90
r1328 r1403 24 24 USE netcdf, ONLY : NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR 25 25 #endif 26 USE control_mod 26 27 IMPLICIT NONE 27 28 !------------------------------------------------------------------------------- … … 72 73 73 74 #include "comdissnew.h" 74 #include "control.h"75 75 #include "serre.h" 76 76 #include "clesphys.h" … … 103 103 REAL :: tau_thermals, solarlong0, seuil_inversion 104 104 INTEGER :: read_climoz ! read ozone climatology 105 REAL :: alp_offset 105 106 ! Allowed values are 0, 1 and 2 106 107 ! 0: do not read an ozone climatology … … 132 133 iflag_thermals,nsplit_thermals,tau_thermals, & 133 134 iflag_thermals_ed,iflag_thermals_optflux, & 134 iflag_coupl,iflag_clos,iflag_wake, read_climoz ) 135 iflag_coupl,iflag_clos,iflag_wake, read_climoz, & 136 alp_offset) 135 137 136 138 ! co2_ppm0 : initial value of atmospheric CO2 from .def file (co2_ppm value) -
LMDZ4/trunk/libf/dyn3dpar/exner_hyb.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 4 SUBROUTINE exner_hyb ( ngrid, ps, p,alpha,beta, pks, pk, pkf ) … … 51 51 REAL SSUM 52 52 c 53 54 if (llm.eq.1) then 55 ! Specific behaviour for Shallow Water (1 vertical layer) case 53 56 57 ! Sanity checks 58 if (kappa.ne.1) then 59 call abort_gcm("exner_hyb", 60 & "kappa!=1 , but running in Shallow Water mode!!",42) 61 endif 62 if (cpp.ne.r) then 63 call abort_gcm("exner_hyb", 64 & "cpp!=r , but running in Shallow Water mode!!",42) 65 endif 66 67 ! Compute pks(:),pk(:),pkf(:) 68 69 DO ij = 1, ngrid 70 pks(ij) = (cpp/preff) * ps(ij) 71 pk(ij,1) = .5*pks(ij) 72 ENDDO 73 74 CALL SCOPY ( ngrid * llm, pk, 1, pkf, 1 ) 75 CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 ) 76 77 ! our work is done, exit routine 78 return 79 endif ! of if (llm.eq.1) 80 81 54 82 unpl2k = 1.+ 2.* kappa 55 83 c -
LMDZ4/trunk/libf/dyn3dpar/exner_hyb_p.F
r985 r1403 1 ! 2 ! $Id $ 3 ! 1 4 SUBROUTINE exner_hyb_p ( ngrid, ps, p,alpha,beta, pks, pk, pkf ) 2 5 c … … 51 54 INTEGER ije,ijb,jje,jjb 52 55 c 53 c$OMP BARRIER 56 c$OMP BARRIER 57 58 if (llm.eq.1) then 59 ! Specific behaviour for Shallow Water (1 vertical layer) case 60 61 ! Sanity checks 62 if (kappa.ne.1) then 63 call abort_gcm("exner_hyb", 64 & "kappa!=1 , but running in Shallow Water mode!!",42) 65 endif 66 if (cpp.ne.r) then 67 call abort_gcm("exner_hyb", 68 & "cpp!=r , but running in Shallow Water mode!!",42) 69 endif 70 71 ! Compute pks(:),pk(:),pkf(:) 72 ijb=ij_begin 73 ije=ij_end 74 !$OMP DO SCHEDULE(STATIC) 75 DO ij=ijb, ije 76 pks(ij)=(cpp/preff)*ps(ij) 77 pk(ij,1) = .5*pks(ij) 78 pkf(ij,1)=pk(ij,1) 79 ENDDO 80 !$OMP ENDDO 81 82 !$OMP MASTER 83 if (pole_nord) then 84 DO ij = 1, iim 85 ppn(ij) = aire( ij ) * pks( ij ) 86 ENDDO 87 xpn = SSUM(iim,ppn,1) /apoln 88 89 DO ij = 1, iip1 90 pks( ij ) = xpn 91 pk(ij,1) = .5*pks(ij) 92 pkf(ij,1)=pk(ij,1) 93 ENDDO 94 endif 95 96 if (pole_sud) then 97 DO ij = 1, iim 98 pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm ) 99 ENDDO 100 xps = SSUM(iim,pps,1) /apols 101 102 DO ij = 1, iip1 103 pks( ij+ip1jm ) = xps 104 pk(ij+ip1jm,1)=.5*pks(ij+ip1jm) 105 pkf(ij+ip1jm,1)=pk(ij+ip1jm,1) 106 ENDDO 107 endif 108 !$OMP END MASTER 109 110 jjb=jj_begin 111 jje=jj_end 112 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 113 114 ! our work is done, exit routine 115 return 116 endif ! of if (llm.eq.1) 117 118 54 119 unpl2k = 1.+ 2.* kappa 55 120 c -
LMDZ4/trunk/libf/dyn3dpar/extrapol.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 C … … 158 158 jlat = jy(k) 159 159 pwork(i,j) = pwork(i,j) 160 $ + pfild(ilon,jlat) * zmask(k)/ FLOAT(inbor)160 $ + pfild(ilon,jlat) * zmask(k)/ REAL(inbor) 161 161 ENDDO 162 162 ENDIF -
LMDZ4/trunk/libf/dyn3dpar/fluxstokenc_p.F
r1279 r1403 4 4 SUBROUTINE fluxstokenc_p(pbaru,pbarv,masse,teta,phi,phis, 5 5 . time_step,itau ) 6 #ifdef CPP_ EARTH7 ! This routine is designed to work for Earth andwith ioipsl6 #ifdef CPP_IOIPSL 7 ! This routine is designed to work with ioipsl 8 8 9 9 USE IOIPSL … … 153 153 DO l=1,llm 154 154 DO ij = ijb,ije 155 pbaruc(ij,l) = pbaruc(ij,l)/ float(istdyn)156 tetac(ij,l) = tetac(ij,l)/ float(istdyn)157 phic(ij,l) = phic(ij,l)/ float(istdyn)155 pbaruc(ij,l) = pbaruc(ij,l)/REAL(istdyn) 156 tetac(ij,l) = tetac(ij,l)/REAL(istdyn) 157 phic(ij,l) = phic(ij,l)/REAL(istdyn) 158 158 ENDDO 159 159 ENDDO … … 165 165 DO l=1,llm 166 166 DO ij = ijb,ije 167 pbarvc(ij,l) = pbarvc(ij,l)/ float(istdyn)167 pbarvc(ij,l) = pbarvc(ij,l)/REAL(istdyn) 168 168 ENDDO 169 169 ENDDO … … 202 202 203 203 iadvtr=0 204 Print*,'ITAU auqel on stoke les fluxmasses',itau204 write(lunout,*)'ITAU auquel on stoke les fluxmasses',itau 205 205 206 206 ijb=ij_begin … … 244 244 #else 245 245 write(lunout,*) 246 & 'fluxstokenc: Needs Earth physics (and ioipsl)to function'246 & 'fluxstokenc: Needs IOIPSL to function' 247 247 #endif 248 ! of #ifdef CPP_ EARTH248 ! of #ifdef CPP_IOIPSL 249 249 RETURN 250 250 END -
LMDZ4/trunk/libf/dyn3dpar/friction_p.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c======================================================================= 5 5 SUBROUTINE friction_p(ucov,vcov,pdt) 6 6 USE parallel 7 USE control_mod 7 8 IMPLICIT NONE 8 9 … … 22 23 #include "paramet.h" 23 24 #include "comgeom2.h" 24 #include "control.h"25 25 #include "comconst.h" 26 26 -
LMDZ4/trunk/libf/dyn3dpar/fxhyp.F
r764 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 89 89 90 90 DO i = 0, nmax2 91 xtild(i) = - pi + FLOAT(i) * depi /nmax291 xtild(i) = - pi + REAL(i) * depi /nmax2 92 92 ENDDO 93 93 … … 235 235 DO 1500 i = ii1, ii2 236 236 237 xlon2 = - pi + ( FLOAT(i) + xuv - decalx) * depi / FLOAT(iim)237 xlon2 = - pi + (REAL(i) + xuv - decalx) * depi / REAL(iim) 238 238 239 239 Xfi = xlon2 … … 280 280 550 CONTINUE 281 281 282 xxprim(i) = depi/ ( FLOAT(iim) * Xprimin )282 xxprim(i) = depi/ ( REAL(iim) * Xprimin ) 283 283 xvrai(i) = xi + xzoom 284 284 -
LMDZ4/trunk/libf/dyn3dpar/fxy.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE fxy (rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1, … … 32 32 c 33 33 DO j = 1, jjm + 1 34 rlatu(j) = fy ( FLOAT( j ) )35 yprimu(j) = fyprim( FLOAT( j ) )34 rlatu(j) = fy ( REAL( j ) ) 35 yprimu(j) = fyprim( REAL( j ) ) 36 36 ENDDO 37 37 … … 39 39 DO j = 1, jjm 40 40 41 rlatv(j) = fy ( FLOAT( j ) + 0.5 )42 rlatu1(j) = fy ( FLOAT( j ) + 0.25 )43 rlatu2(j) = fy ( FLOAT( j ) + 0.75 )41 rlatv(j) = fy ( REAL( j ) + 0.5 ) 42 rlatu1(j) = fy ( REAL( j ) + 0.25 ) 43 rlatu2(j) = fy ( REAL( j ) + 0.75 ) 44 44 45 yprimv(j) = fyprim( FLOAT( j ) + 0.5 )46 yprimu1(j) = fyprim( FLOAT( j ) + 0.25 )47 yprimu2(j) = fyprim( FLOAT( j ) + 0.75 )45 yprimv(j) = fyprim( REAL( j ) + 0.5 ) 46 yprimu1(j) = fyprim( REAL( j ) + 0.25 ) 47 yprimu2(j) = fyprim( REAL( j ) + 0.75 ) 48 48 49 49 ENDDO … … 53 53 c 54 54 DO i = 1, iim + 1 55 rlonv(i) = fx ( FLOAT( i ) )56 rlonu(i) = fx ( FLOAT( i ) + 0.5 )57 rlonm025(i) = fx ( FLOAT( i ) - 0.25 )58 rlonp025(i) = fx ( FLOAT( i ) + 0.25 )55 rlonv(i) = fx ( REAL( i ) ) 56 rlonu(i) = fx ( REAL( i ) + 0.5 ) 57 rlonm025(i) = fx ( REAL( i ) - 0.25 ) 58 rlonp025(i) = fx ( REAL( i ) + 0.25 ) 59 59 60 xprimv (i) = fxprim ( FLOAT( i ) )61 xprimu (i) = fxprim ( FLOAT( i ) + 0.5 )62 xprimm025(i) = fxprim ( FLOAT( i ) - 0.25 )63 xprimp025(i) = fxprim ( FLOAT( i ) + 0.25 )60 xprimv (i) = fxprim ( REAL( i ) ) 61 xprimu (i) = fxprim ( REAL( i ) + 0.5 ) 62 xprimm025(i) = fxprim ( REAL( i ) - 0.25 ) 63 xprimp025(i) = fxprim ( REAL( i ) + 0.25 ) 64 64 ENDDO 65 65 -
LMDZ4/trunk/libf/dyn3dpar/fxysinus.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE fxysinus (rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1, … … 32 32 c 33 33 DO j = 1, jjm + 1 34 rlatu(j) = fy ( FLOAT( j ) )35 yprimu(j) = fyprim( FLOAT( j ) )34 rlatu(j) = fy ( REAL( j ) ) 35 yprimu(j) = fyprim( REAL( j ) ) 36 36 ENDDO 37 37 … … 39 39 DO j = 1, jjm 40 40 41 rlatv(j) = fy ( FLOAT( j ) + 0.5 )42 rlatu1(j) = fy ( FLOAT( j ) + 0.25 )43 rlatu2(j) = fy ( FLOAT( j ) + 0.75 )41 rlatv(j) = fy ( REAL( j ) + 0.5 ) 42 rlatu1(j) = fy ( REAL( j ) + 0.25 ) 43 rlatu2(j) = fy ( REAL( j ) + 0.75 ) 44 44 45 yprimv(j) = fyprim( FLOAT( j ) + 0.5 )46 yprimu1(j) = fyprim( FLOAT( j ) + 0.25 )47 yprimu2(j) = fyprim( FLOAT( j ) + 0.75 )45 yprimv(j) = fyprim( REAL( j ) + 0.5 ) 46 yprimu1(j) = fyprim( REAL( j ) + 0.25 ) 47 yprimu2(j) = fyprim( REAL( j ) + 0.75 ) 48 48 49 49 ENDDO … … 53 53 c 54 54 DO i = 1, iim + 1 55 rlonv(i) = fx ( FLOAT( i ) )56 rlonu(i) = fx ( FLOAT( i ) + 0.5 )57 rlonm025(i) = fx ( FLOAT( i ) - 0.25 )58 rlonp025(i) = fx ( FLOAT( i ) + 0.25 )55 rlonv(i) = fx ( REAL( i ) ) 56 rlonu(i) = fx ( REAL( i ) + 0.5 ) 57 rlonm025(i) = fx ( REAL( i ) - 0.25 ) 58 rlonp025(i) = fx ( REAL( i ) + 0.25 ) 59 59 60 xprimv (i) = fxprim ( FLOAT( i ) )61 xprimu (i) = fxprim ( FLOAT( i ) + 0.5 )62 xprimm025(i) = fxprim ( FLOAT( i ) - 0.25 )63 xprimp025(i) = fxprim ( FLOAT( i ) + 0.25 )60 xprimv (i) = fxprim ( REAL( i ) ) 61 xprimu (i) = fxprim ( REAL( i ) + 0.5 ) 62 xprimm025(i) = fxprim ( REAL( i ) - 0.25 ) 63 xprimp025(i) = fxprim ( REAL( i ) + 0.25 ) 64 64 ENDDO 65 65 -
LMDZ4/trunk/libf/dyn3dpar/fyhyp.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 75 75 depi = 2. * pi 76 76 pis2 = pi/2. 77 pisjm = pi/ FLOAT(jjm)77 pisjm = pi/ REAL(jjm) 78 78 epsilon = 1.e-3 79 79 y0 = yzoomdeg * pi/180. … … 94 94 95 95 DO i = 0, nmax2 96 yt(i) = - pis2 + FLOAT(i)* pi /nmax296 yt(i) = - pis2 + REAL(i)* pi /nmax2 97 97 ENDDO 98 98 … … 210 210 DO 1500 j = 1,jlat 211 211 yo1 = 0. 212 ylon2 = - pis2 + pisjm * ( FLOAT(j) + yuv -1.)212 ylon2 = - pis2 + pisjm * ( REAL(j) + yuv -1.) 213 213 yfi = ylon2 214 214 c -
LMDZ4/trunk/libf/dyn3dpar/gcm.F
r1315 r1403 18 18 USE getparam 19 19 USE filtreg_mod 20 USE control_mod 20 21 21 22 ! Ehouarn: for now these only apply to Earth: … … 66 67 #include "logic.h" 67 68 #include "temps.h" 68 #include "control.h"69 69 #include "ener.h" 70 70 #include "description.h" 71 71 #include "serre.h" 72 #include "com_io_dyn.h"72 !#include "com_io_dyn.h" 73 73 #include "iniprint.h" 74 74 #include "tracstoke.h" 75 76 #ifdef INCA 77 ! Only INCA needs these informations (from the Earth's physics) 75 78 #include "indicesol.h" 79 #endif 76 80 77 81 INTEGER longcles … … 267 271 if (read_start) then 268 272 ! we still need to run iniacademic to initialize some 269 ! constants & fields, if we run the 'newtonian' case:270 if (iflag_phys. eq.2) then273 ! constants & fields, if we run the 'newtonian' or 'SW' cases: 274 if (iflag_phys.ne.1) then 271 275 CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0) 272 276 endif 273 !#ifdef CPP_IOIPSL 277 274 278 if (planet_type.eq."earth") then 275 279 #ifdef CPP_EARTH 276 280 ! Load an Earth-format start file 277 281 CALL dynetat0("start.nc",vcov,ucov, 278 . teta,q,masse,ps,phis, time_0) 282 & teta,q,masse,ps,phis, time_0) 283 #else 284 ! SW model also has Earth-format start files 285 ! (but can be used without the CPP_EARTH directive) 286 if (iflag_phys.eq.0) then 287 CALL dynetat0("start.nc",vcov,ucov, 288 & teta,q,masse,ps,phis, time_0) 289 endif 279 290 #endif 280 291 endif ! of if (planet_type.eq."earth") … … 311 322 ENDIF 312 323 313 zdtvr = daysec/ FLOAT(day_step)324 zdtvr = daysec/REAL(day_step) 314 325 IF(dtvr.NE.zdtvr) THEN 315 326 WRITE(lunout,*) … … 320 331 C on remet le calendrier à zero si demande 321 332 c 322 if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then 333 IF (raz_date == 1) THEN 334 annee_ref = anneeref 335 day_ref = dayref 336 day_ini = dayref 337 itau_dyn = 0 338 itau_phy = 0 339 time_0 = 0. 340 write(lunout,*) 341 . 'GCM: On reinitialise a la date lue dans gcm.def' 342 ELSE IF (annee_ref .ne. anneeref .or. day_ref .ne. dayref) THEN 323 343 write(lunout,*) 324 344 . 'GCM: Attention les dates initiales lues dans le fichier' … … 326 346 . ' restart ne correspondent pas a celles lues dans ' 327 347 write(lunout,*)' gcm.def' 328 write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 329 write(lunout,*)' day_ref=',day_ref," dayref=",dayref 330 if (raz_date .ne. 1) then 331 write(lunout,*) 332 . 'GCM: On garde les dates du fichier restart' 333 else 334 annee_ref = anneeref 335 day_ref = dayref 336 day_ini = dayref 337 itau_dyn = 0 338 itau_phy = 0 339 time_0 = 0. 340 write(lunout,*) 341 . 'GCM: On reinitialise a la date lue dans gcm.def' 342 endif 343 ELSE 344 raz_date = 0 345 endif 348 write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 349 write(lunout,*)' day_ref=',day_ref," dayref=",dayref 350 write(lunout,*)' Pas de remise a zero' 351 ENDIF 352 c if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then 353 c write(lunout,*) 354 c . 'GCM: Attention les dates initiales lues dans le fichier' 355 c write(lunout,*) 356 c . ' restart ne correspondent pas a celles lues dans ' 357 c write(lunout,*)' gcm.def' 358 c write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref 359 c write(lunout,*)' day_ref=',day_ref," dayref=",dayref 360 c if (raz_date .ne. 1) then 361 c write(lunout,*) 362 c . 'GCM: On garde les dates du fichier restart' 363 c else 364 c annee_ref = anneeref 365 c day_ref = dayref 366 c day_ini = dayref 367 c itau_dyn = 0 368 c itau_phy = 0 369 c time_0 = 0. 370 c write(lunout,*) 371 c . 'GCM: On reinitialise a la date lue dans gcm.def' 372 c endif 373 c ELSE 374 c raz_date = 0 375 c endif 346 376 347 377 #ifdef CPP_IOIPSL … … 372 402 nbetatmoy = nday / periodav + 1 373 403 404 if (iflag_phys.eq.1) then 405 ! these initialisations have already been done (via iniacademic) 406 ! if running in SW or Newtonian mode 374 407 c----------------------------------------------------------------------- 375 408 c Initialisation des constantes dynamiques : 376 409 c ------------------------------------------ 377 dtvr = zdtvr378 CALL iniconst410 dtvr = zdtvr 411 CALL iniconst 379 412 380 413 c----------------------------------------------------------------------- 381 414 c Initialisation de la geometrie : 382 415 c -------------------------------- 383 CALL inigeom416 CALL inigeom 384 417 385 418 c----------------------------------------------------------------------- 386 419 c Initialisation du filtre : 387 420 c -------------------------- 388 CALL inifilr 421 CALL inifilr 422 endif ! of if (iflag_phys.eq.1) 389 423 c 390 424 c----------------------------------------------------------------------- … … 422 456 if (planet_type.eq."earth") then 423 457 #ifdef CPP_EARTH 424 CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys ,458 CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys/nsplit_phys , 425 459 , latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp ) 426 460 #endif … … 467 501 468 502 #ifdef CPP_IOIPSL 469 if ( 1.eq.1) then470 503 time_step = zdtvr 471 t_ops = iecri * daysec 472 t_wrt = iecri * daysec 473 ! CALL inithist_p(dynhist_file,day_ref,annee_ref,time_step, 474 ! . t_ops, t_wrt, histid, histvid) 475 476 IF (ok_dynzon) THEN 477 t_ops = iperiod * time_step 478 t_wrt = periodav * daysec 504 IF (mpi_rank==0) then 505 if (ok_dyn_ins) then 506 ! initialize output file for instantaneous outputs 507 ! t_ops = iecri * daysec ! do operations every t_ops 508 t_ops =((1.0*iecri)/day_step) * daysec 509 t_wrt = daysec ! iecri * daysec ! write output every t_wrt 510 t_wrt = daysec ! iecri * daysec ! write output every t_wrt 511 CALL inithist(day_ref,annee_ref,time_step, 512 & t_ops,t_wrt) 513 endif 514 515 IF (ok_dyn_ave) THEN 516 ! initialize output file for averaged outputs 517 t_ops = iperiod * time_step ! do operations every t_ops 518 t_wrt = periodav * daysec ! write output every t_wrt 519 CALL initdynav(day_ref,annee_ref,time_step, 520 & t_ops,t_wrt) 479 521 ! CALL initdynav_p(dynhistave_file,day_ref,annee_ref,time_step, 480 522 ! . t_ops, t_wrt, histaveid) 481 END IF 523 END IF 524 ENDIF 482 525 dtav = iperiod*dtvr/daysec 483 endif484 485 486 526 #endif 487 527 ! #endif of #ifdef CPP_IOIPSL -
LMDZ4/trunk/libf/dyn3dpar/grid_atob.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE grille_m(imdep, jmdep, xdata, ydata, entree, … … 717 717 c Calculs intermediares: 718 718 c 719 xtmp(1) = -180.0 + 360.0/ FLOAT(imtmp) / 2.0719 xtmp(1) = -180.0 + 360.0/REAL(imtmp) / 2.0 720 720 DO i = 2, imtmp 721 xtmp(i) = xtmp(i-1) + 360.0/ FLOAT(imtmp)721 xtmp(i) = xtmp(i-1) + 360.0/REAL(imtmp) 722 722 ENDDO 723 723 DO i = 1, imtmp 724 724 xtmp(i) = xtmp(i) /180.0 * 4.0*ATAN(1.0) 725 725 ENDDO 726 ytmp(1) = -90.0 + 180.0/ FLOAT(jmtmp) / 2.0726 ytmp(1) = -90.0 + 180.0/REAL(jmtmp) / 2.0 727 727 DO j = 2, jmtmp 728 ytmp(j) = ytmp(j-1) + 180.0/ FLOAT(jmtmp)728 ytmp(j) = ytmp(j-1) + 180.0/REAL(jmtmp) 729 729 ENDDO 730 730 DO j = 1, jmtmp -
LMDZ4/trunk/libf/dyn3dpar/grid_noro.F
r764 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 93 93 xpi=acos(-1.) 94 94 rad = 6 371 229. 95 zdeltay=2.*xpi/ float(jusn)*rad95 zdeltay=2.*xpi/REAL(jusn)*rad 96 96 c 97 97 c utilise-t'on un masque lu? … … 215 215 c SUMMATION OVER GRIDPOINT AREA 216 216 c 217 zleny=xpi/ float(jusn)*rad218 xincr=xpi/2./ float(jusn)217 zleny=xpi/REAL(jusn)*rad 218 xincr=xpi/2./REAL(jusn) 219 219 DO ii = 1, imar+1 220 220 DO jj = 1, jmar … … 468 468 DO IS=-1,1 469 469 DO JS=-1,1 470 WEIGHTpb(IS,JS)=1./ FLOAT((1+IS**2)*(1+JS**2))470 WEIGHTpb(IS,JS)=1./REAL((1+IS**2)*(1+JS**2)) 471 471 SUM=SUM+WEIGHTpb(IS,JS) 472 472 ENDDO -
LMDZ4/trunk/libf/dyn3dpar/grilles_gcm_netcdf.F
r764 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 218 218 open (20,file='grille.dat',form='unformatted',access='direct' 219 219 s ,recl=4*ip1jmp1) 220 write(20,rec=1) (( float(mod(i,2)+mod(j,2)),i=1,iip1),j=1,jjp1)221 write(20,rec=2) (( float(mod(i,2)*mod(j,2)),i=1,iip1),j=1,jjp1)220 write(20,rec=1) (( REAL(mod(i,2)+mod(j,2)),i=1,iip1),j=1,jjp1) 221 write(20,rec=2) (( REAL(mod(i,2)*mod(j,2)),i=1,iip1),j=1,jjp1) 222 222 do j=2,jjm 223 223 dlat1(j)=180.*(rlatv(j)-rlatv(j-1))/pi 224 c dlat2(j)=180.*fyprim( float(j))/pi224 c dlat2(j)=180.*fyprim( REAL(j))/pi 225 225 enddo 226 226 do i=2,iip1 227 227 dlon1(i)=180.*(rlonu(i)-rlonu(i-1))/pi 228 c dlon2(i)=180.*fxprim( float(i))/pi228 c dlon2(i)=180.*fxprim( REAL(i))/pi 229 229 enddo 230 230 do j=2,jjm -
LMDZ4/trunk/libf/dyn3dpar/guide_p_mod.F90
r1304 r1403 1 1 ! 2 ! $ Header: /home/cvsroot/LMDZ4/libf/dyn3d/guide.F,v 1.3.4.1 2006/11/06 15:51:16 fairhead Exp$2 ! $Id$ 3 3 ! 4 4 MODULE guide_p_mod … … 66 66 SUBROUTINE guide_init 67 67 68 USE control_mod 68 69 IMPLICIT NONE 69 70 … … 71 72 INCLUDE "paramet.h" 72 73 INCLUDE "netcdf.inc" 73 INCLUDE "control.h"74 74 75 75 INTEGER :: error,ncidpl,rid,rcod … … 274 274 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps) 275 275 use parallel 276 USE control_mod 276 277 277 278 IMPLICIT NONE … … 279 280 INCLUDE "dimensions.h" 280 281 INCLUDE "paramet.h" 281 INCLUDE "control.h"282 282 INCLUDE "comconst.h" 283 283 INCLUDE "comvert.h" … … 380 380 dday_step=real(day_step) 381 381 IF (iguide_read.LT.0) THEN 382 tau=ditau/dday_step/ FLOAT(iguide_read)382 tau=ditau/dday_step/ REAL(iguide_read) 383 383 ELSE 384 tau= FLOAT(iguide_read)*ditau/dday_step384 tau= REAL(iguide_read)*ditau/dday_step 385 385 ENDIF 386 386 reste=tau-AINT(tau) … … 580 580 ENDDO 581 581 ENDDO 582 fieldm(:,l)=fieldm(:,l)/ FLOAT(imax(typ)-imin(typ)+1)582 fieldm(:,l)=fieldm(:,l)/ REAL(imax(typ)-imin(typ)+1) 583 583 ! Compute forcing 584 584 DO j=jjb_v,jje_v … … 598 598 ENDDO 599 599 ENDDO 600 fieldm(:,l)=fieldm(:,l)/ FLOAT(imax(typ)-imin(typ)+1)600 fieldm(:,l)=fieldm(:,l)/ REAL(imax(typ)-imin(typ)+1) 601 601 ! Compute forcing 602 602 DO j=jjb_u,jje_u -
LMDZ4/trunk/libf/dyn3dpar/infotrac.F90
r1279 r1403 31 31 32 32 SUBROUTINE infotrac_init 33 USE control_mod 33 34 IMPLICIT NONE 34 35 !======================================================================= … … 49 50 50 51 INCLUDE "dimensions.h" 51 INCLUDE "control.h"52 52 INCLUDE "iniprint.h" 53 53 -
LMDZ4/trunk/libf/dyn3dpar/iniacademic.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 8 8 USE filtreg_mod 9 9 USE infotrac, ONLY : nqtot 10 USE control_mod 11 10 12 11 13 c%W% %G% … … 44 46 #include "ener.h" 45 47 #include "temps.h" 46 #include "control.h"47 48 #include "iniprint.h" 49 #include "logic.h" 48 50 49 51 c Arguments: … … 55 57 REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants 56 58 REAL teta(ip1jmp1,llm) ! temperature potentielle 57 REAL q(ip1jmp1,llm,nqtot) ! champs advectes59 REAL q(ip1jmp1,llm,nqtot) ! champs advectes 58 60 REAL ps(ip1jmp1) ! pression au sol 59 61 REAL masse(ip1jmp1,llm) ! masse d'air … … 84 86 time_0=0. 85 87 day_ref=0 86 88 annee_ref=0 87 89 88 90 im = iim … … 93 95 g = 9.8 94 96 daysec = 86400. 95 dtvr = daysec/ FLOAT(day_step)97 dtvr = daysec/REAL(day_step) 96 98 zdtvr=dtvr 97 99 kappa = 0.2857143 … … 105 107 ang0 = 0. 106 108 109 if (llm.eq.1) then 110 ! specific initializations for the shallow water case 111 kappa=1 112 endif 113 107 114 CALL iniconst 108 115 CALL inigeom 109 116 CALL inifilr 110 117 111 ps=0. 112 phis=0. 118 if (llm.eq.1) then 119 ! initialize fields for the shallow water case, if required 120 if (.not.read_start) then 121 phis(:)=0. 122 q(:,:,1)=1.e-10 123 q(:,:,2)=1.e-15 124 q(:,:,3:nqtot)=0. 125 CALL sw_case_williamson91_6(vcov,ucov,teta,masse,ps) 126 endif 127 endif 128 129 if (iflag_phys.eq.2) then 130 ! initializations for the academic case 131 ps(:)=1.e5 132 phis(:)=0. 113 133 c--------------------------------------------------------------------- 114 134 115 taurappel=10.*daysec135 taurappel=10.*daysec 116 136 117 137 c--------------------------------------------------------------------- … … 119 139 c -------------------------------------- 120 140 121 DO l=1,llm122 zsig=ap(l)/preff+bp(l)123 if (zsig.gt.0.3) then124 lsup=l125 tetarappell=1./8.*(-log(zsig)-.5)126 DO j=1,jjp1141 DO l=1,llm 142 zsig=ap(l)/preff+bp(l) 143 if (zsig.gt.0.3) then 144 lsup=l 145 tetarappell=1./8.*(-log(zsig)-.5) 146 DO j=1,jjp1 127 147 ddsin=sin(rlatu(j))-sin(pi/20.) 128 148 tetajl(j,l)=300.*(1+1./18.*(1.-3.*ddsin*ddsin)+tetarappell) 129 ENDDO130 else149 ENDDO 150 else 131 151 c Choix isotherme au-dessus de 300 mbar 132 do j=1,jjp1133 tetajl(j,l)=tetajl(j,lsup)*(0.3/zsig)**kappa134 enddo135 endif ! of if (zsig.gt.0.3)136 ENDDO ! of DO l=1,llm137 138 do l=1,llm139 do j=1,jjp1152 do j=1,jjp1 153 tetajl(j,l)=tetajl(j,lsup)*(0.3/zsig)**kappa 154 enddo 155 endif ! of if (zsig.gt.0.3) 156 ENDDO ! of DO l=1,llm 157 158 do l=1,llm 159 do j=1,jjp1 140 160 do i=1,iip1 141 161 ij=(j-1)*iip1+i 142 162 tetarappel(ij,l)=tetajl(j,l) 143 163 enddo 144 enddo145 enddo164 enddo 165 enddo 146 166 147 167 c call dump2d(jjp1,llm,tetajl,'TEQ ') 148 168 149 ps=1.e5 150 phis=0. 151 CALL pression ( ip1jmp1, ap, bp, ps, p ) 152 CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf ) 153 CALL massdair(p,masse) 169 CALL pression ( ip1jmp1, ap, bp, ps, p ) 170 CALL exner_hyb( ip1jmp1, ps, p,alpha,beta, pks, pk, pkf ) 171 CALL massdair(p,masse) 154 172 155 173 c intialisation du vent et de la temperature 156 teta(:,:)=tetarappel(:,:)157 CALL geopot(ip1jmp1,teta,pk,pks,phis,phi)158 call ugeostr(phi,ucov)159 vcov=0.160 q(:,:,1 )=1.e-10161 q(:,:,2 )=1.e-15162 q(:,:,3:nqtot)=0.174 teta(:,:)=tetarappel(:,:) 175 CALL geopot(ip1jmp1,teta,pk,pks,phis,phi) 176 call ugeostr(phi,ucov) 177 vcov=0. 178 q(:,:,1 )=1.e-10 179 q(:,:,2 )=1.e-15 180 q(:,:,3:nqtot)=0. 163 181 164 182 165 183 c perturbation aleatoire sur la temperature 166 idum = -1167 zz = ran1(idum)168 idum = 0169 do l=1,llm170 do ij=iip2,ip1jm184 idum = -1 185 zz = ran1(idum) 186 idum = 0 187 do l=1,llm 188 do ij=iip2,ip1jm 171 189 teta(ij,l)=teta(ij,l)*(1.+0.005*ran1(idum)) 172 enddo173 enddo174 175 do l=1,llm176 do ij=1,ip1jmp1,iip1190 enddo 191 enddo 192 193 do l=1,llm 194 do ij=1,ip1jmp1,iip1 177 195 teta(ij+iim,l)=teta(ij,l) 178 enddo179 enddo196 enddo 197 enddo 180 198 181 199 … … 187 205 188 206 c initialisation d'un traceur sur une colonne 189 j=jjp1*3/4 190 i=iip1/2 191 ij=(j-1)*iip1+i 192 q(ij,:,3)=1. 193 207 j=jjp1*3/4 208 i=iip1/2 209 ij=(j-1)*iip1+i 210 q(ij,:,3)=1. 211 endif ! of if (iflag_phys.eq.2) 212 194 213 else 195 214 write(lunout,*)"iniacademic: planet types other than earth", -
LMDZ4/trunk/libf/dyn3dpar/iniconst.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE iniconst 5 6 USE control_mod 5 7 6 8 IMPLICIT NONE … … 16 18 #include "comconst.h" 17 19 #include "temps.h" 18 #include "control.h"19 20 #include "comvert.h" 21 #include "iniprint.h" 20 22 21 23 … … 47 49 r = cpp * kappa 48 50 49 PRINT*,'R CP Kappa ', r , cpp, kappa51 write(lunout,*)'iniconst: R CP Kappa ', r , cpp, kappa 50 52 c 51 53 c----------------------------------------------------------------------- -
LMDZ4/trunk/libf/dyn3dpar/inidissip.F
r1279 r1403 11 11 c ------------- 12 12 13 USE control_mod 14 13 15 IMPLICIT NONE 14 16 #include "dimensions.h" … … 17 19 #include "comconst.h" 18 20 #include "comvert.h" 19 #include "control.h"20 21 #include "logic.h" 21 22 … … 165 166 166 167 c IF(.NOT.lstardis) THEN 167 fact = rad*24./ float(jjm)168 fact = rad*24./REAL(jjm) 168 169 fact = fact*fact 169 170 PRINT*,'coef u ', fact/cdivu, 1./cdivu -
LMDZ4/trunk/libf/dyn3dpar/inigeom.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 168 168 c 169 169 IF( nitergdiv.NE.2 ) THEN 170 gamdi_gdiv = coefdis/ ( float(nitergdiv) -2. )170 gamdi_gdiv = coefdis/ ( REAL(nitergdiv) -2. ) 171 171 ELSE 172 172 gamdi_gdiv = 0. 173 173 ENDIF 174 174 IF( nitergrot.NE.2 ) THEN 175 gamdi_grot = coefdis/ ( float(nitergrot) -2. )175 gamdi_grot = coefdis/ ( REAL(nitergrot) -2. ) 176 176 ELSE 177 177 gamdi_grot = 0. 178 178 ENDIF 179 179 IF( niterh.NE.2 ) THEN 180 gamdi_h = coefdis/ ( float(niterh) -2. )180 gamdi_h = coefdis/ ( REAL(niterh) -2. ) 181 181 ELSE 182 182 gamdi_h = 0. … … 381 381 yprp = yprimu2(j-1) 382 382 rlatp = rlatu2 (j-1) 383 ccc yprp = fyprim( FLOAT(j) - 0.25 )384 ccc rlatp = fy ( FLOAT(j) - 0.25 )383 ccc yprp = fyprim( REAL(j) - 0.25 ) 384 ccc rlatp = fy ( REAL(j) - 0.25 ) 385 385 c 386 386 coslatp = COS( rlatp ) … … 416 416 rlatm = rlatu1 ( j ) 417 417 yprm = yprimu1( j ) 418 cc rlatp = fy ( FLOAT(j) - 0.25 )419 cc yprp = fyprim( FLOAT(j) - 0.25 )420 cc rlatm = fy ( FLOAT(j) + 0.25 )421 cc yprm = fyprim( FLOAT(j) + 0.25 )418 cc rlatp = fy ( REAL(j) - 0.25 ) 419 cc yprp = fyprim( REAL(j) - 0.25 ) 420 cc rlatm = fy ( REAL(j) + 0.25 ) 421 cc yprm = fyprim( REAL(j) + 0.25 ) 422 422 423 423 coslatm = COS( rlatm ) -
LMDZ4/trunk/libf/dyn3dpar/integrd_p.F
r1279 r1403 6 6 $ dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps0,masse,phis,finvmaold) 7 7 USE parallel 8 USE control_mod 8 9 IMPLICIT NONE 9 10 … … 32 33 #include "temps.h" 33 34 #include "serre.h" 34 #include "control.h"35 35 36 36 c Arguments: -
LMDZ4/trunk/libf/dyn3dpar/interpre.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine interpre(q,qppm,w,fluxwppm,masse, … … 6 6 s unatppm,vnatppm,psppm) 7 7 8 implicit none 8 USE control_mod 9 implicit none 9 10 10 11 #include "dimensions.h" … … 17 18 #include "logic.h" 18 19 #include "temps.h" 19 #include "control.h"20 20 #include "ener.h" 21 21 #include "description.h" -
LMDZ4/trunk/libf/dyn3dpar/leapfrog_p.F
r1286 r1403 20 20 USE guide_p_mod, ONLY : guide_main 21 21 USE getparam 22 USE control_mod 22 23 23 24 IMPLICIT NONE … … 62 63 #include "logic.h" 63 64 #include "temps.h" 64 #include "control.h"65 65 #include "ener.h" 66 66 #include "description.h" 67 67 #include "serre.h" 68 #include "com_io_dyn.h"68 !#include "com_io_dyn.h" 69 69 #include "iniprint.h" 70 70 #include "academic.h" … … 212 212 itau = 0 213 213 ! iday = day_ini+itau/day_step 214 ! time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0214 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 215 215 ! IF(time.GT.1.) THEN 216 216 ! time = time-1. … … 352 352 c idissip=1 353 353 IF( purmats ) THEN 354 ! Purely Matsuno time stepping 354 355 IF( MOD(itau,iconser) .EQ.0.AND. forward ) conser = .TRUE. 355 356 IF( MOD(itau,idissip ).EQ.0.AND..NOT.forward ) apdiss = .TRUE. … … 357 358 s .and. iflag_phys.EQ.1 ) apphys = .TRUE. 358 359 ELSE 360 ! Leapfrog/Matsuno time stepping 359 361 IF( MOD(itau ,iconser) .EQ. 0 ) conser = .TRUE. 360 362 IF( MOD(itau+1,idissip) .EQ. 0 ) apdiss = .TRUE. … … 362 364 END IF 363 365 366 ! Ehouarn: for Shallow Water case (ie: 1 vertical layer), 367 ! supress dissipation step 368 if (llm.eq.1) then 369 apdiss=.false. 370 endif 371 364 372 cym ---> Pour le moment 365 373 cym apphys = .FALSE. 366 374 statcl = .FALSE. 367 conser = .FALSE. 375 conser = .FALSE. ! ie: no output of control variables to stdout in // 368 376 369 377 if (firstCaldyn) then … … 677 685 call suspend_timer(timer_caldyn) 678 686 687 if (prt_level >= 10) then 679 688 write(lunout,*) 680 689 & 'leapfrog_p: Entree dans la physique : Iteration No ',true_itau 690 endif 681 691 c$OMP END MASTER 682 692 … … 964 974 ijb=ij_begin 965 975 ije=ij_end 966 teta(ijb:ije,:)=teta(ijb:ije,:) 967 s -iphysiq*dtvr*(teta(ijb:ije,:)-tetarappel(ijb:ije,:))/taurappel 976 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 977 do l=1,llm 978 teta(ijb:ije,l)=teta(ijb:ije,l) 979 & -iphysiq*dtvr*(teta(ijb:ije,l)-tetarappel(ijb:ije,l))/taurappel 980 enddo 981 !$OMP END DO 968 982 969 983 call Register_Hallo(ucov,ip1jmp1,llm,0,1,1,0,Request_Physic) … … 972 986 c$OMP BARRIER 973 987 call WaitRequest(Request_Physic) 974 988 c$OMP BARRIER 989 !$OMP MASTER 975 990 call friction_p(ucov,vcov,iphysiq*dtvr) 991 !$OMP END MASTER 992 !$OMP BARRIER 976 993 ENDIF ! of IF(iflag_phys.EQ.2) 977 994 … … 1089 1106 enddo 1090 1107 c$OMP END DO NOWAIT 1091 endif 1108 endif ! of if (dissip_conservative) 1092 1109 1093 1110 ijb=ij_begin … … 1198 1215 c$OMP END MASTER 1199 1216 c$OMP BARRIER 1200 END IF 1217 END IF ! of IF(apdiss) 1201 1218 1202 1219 cc$OMP END PARALLEL … … 1280 1297 itau= itau + 1 1281 1298 ! iday= day_ini+itau/day_step 1282 ! time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_01299 ! time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 1283 1300 ! IF(time.GT.1.) THEN 1284 1301 ! time = time-1. … … 1337 1354 ENDIF !ok_dynzon 1338 1355 #endif 1339 ENDIF 1356 IF (ok_dyn_ave) THEN 1357 !$OMP MASTER 1358 #ifdef CPP_IOIPSL 1359 ! Ehouarn: Gather fields and make master send to output 1360 call Gather_Field(vcov,ip1jm,llm,0) 1361 call Gather_Field(ucov,ip1jmp1,llm,0) 1362 call Gather_Field(teta,ip1jmp1,llm,0) 1363 call Gather_Field(pk,ip1jmp1,llm,0) 1364 call Gather_Field(phi,ip1jmp1,llm,0) 1365 do iq=1,nqtot 1366 call Gather_Field(q(1,1,iq),ip1jmp1,llm,0) 1367 enddo 1368 call Gather_Field(masse,ip1jmp1,llm,0) 1369 call Gather_Field(ps,ip1jmp1,1,0) 1370 call Gather_Field(phis,ip1jmp1,1,0) 1371 if (mpi_rank==0) then 1372 CALL writedynav(itau,vcov, 1373 & ucov,teta,pk,phi,q,masse,ps,phis) 1374 endif 1375 #endif 1376 !$OMP END MASTER 1377 ENDIF ! of IF (ok_dyn_ave) 1378 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 1340 1379 1341 1380 c----------------------------------------------------------------------- … … 1343 1382 c ------------------------------ 1344 1383 1345 c IF( MOD(itau,iecri).EQ.0) THEN1346 1347 IF( MOD(itau,iecri*day_step).EQ.0) THEN 1384 IF( MOD(itau,iecri).EQ.0) THEN 1385 ! Ehouarn: output only during LF or Backward Matsuno 1386 if (leapf.or.(.not.leapf.and.(.not.forward))) then 1348 1387 c$OMP BARRIER 1349 1388 c$OMP MASTER … … 1379 1418 1380 1419 #ifdef CPP_IOIPSL 1381 1420 if (ok_dyn_ins) then 1421 ! Ehouarn: Gather fields and make master write to output 1422 call Gather_Field(vcov,ip1jm,llm,0) 1423 call Gather_Field(ucov,ip1jmp1,llm,0) 1424 call Gather_Field(teta,ip1jmp1,llm,0) 1425 call Gather_Field(phi,ip1jmp1,llm,0) 1426 do iq=1,nqtot 1427 call Gather_Field(q(1,1,iq),ip1jmp1,llm,0) 1428 enddo 1429 call Gather_Field(masse,ip1jmp1,llm,0) 1430 call Gather_Field(ps,ip1jmp1,1,0) 1431 call Gather_Field(phis,ip1jmp1,1,0) 1432 if (mpi_rank==0) then 1433 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis) 1434 endif 1382 1435 ! CALL writehist_p(histid,histvid, itau,vcov, 1383 1436 ! & ucov,teta,phi,q,masse,ps,phis) 1384 1437 ! or use writefield_p 1438 ! call WriteField_p('ucov',reshape(ucov,(/iip1,jmp1,llm/))) 1439 ! call WriteField_p('vcov',reshape(vcov,(/iip1,jjm,llm/))) 1440 ! call WriteField_p('teta',reshape(teta,(/iip1,jmp1,llm/))) 1441 ! call WriteField_p('ps',reshape(ps,(/iip1,jmp1/))) 1442 endif ! of if (ok_dyn_ins) 1385 1443 #endif 1386 1444 ! For some Grads outputs of fields … … 1399 1457 endif ! of if (output_grads_dyn) 1400 1458 c$OMP END MASTER 1459 endif ! of if (leapf.or.(.not.leapf.and.(.not.forward))) 1401 1460 ENDIF ! of IF(MOD(itau,iecri).EQ.0) 1402 1461 … … 1458 1517 itau = itau + 1 1459 1518 ! iday = day_ini+itau/day_step 1460 ! time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_01519 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 1461 1520 ! 1462 1521 ! IF(time.GT.1.) THEN … … 1477 1536 GO TO 2 1478 1537 1479 ELSE ! of IF(forward) 1538 ELSE ! of IF(forward) i.e. backward step 1480 1539 1481 1540 IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN … … 1488 1547 IF (ok_dynzon) THEN 1489 1548 c$OMP BARRIER 1490 1491 1549 call Register_Hallo(vcov,ip1jm,llm,1,0,0,1,TestRequest) 1492 1550 call SendRequest(TestRequest) 1493 1551 c$OMP BARRIER 1494 1552 call WaitRequest(TestRequest) 1495 1496 1553 c$OMP BARRIER 1497 1554 c$OMP MASTER … … 1503 1560 END IF !ok_dynzon 1504 1561 #endif 1562 IF (ok_dyn_ave) THEN 1563 !$OMP MASTER 1564 #ifdef CPP_IOIPSL 1565 ! Ehouarn: Gather fields and make master send to output 1566 call Gather_Field(vcov,ip1jm,llm,0) 1567 call Gather_Field(ucov,ip1jmp1,llm,0) 1568 call Gather_Field(teta,ip1jmp1,llm,0) 1569 call Gather_Field(pk,ip1jmp1,llm,0) 1570 call Gather_Field(phi,ip1jmp1,llm,0) 1571 do iq=1,nqtot 1572 call Gather_Field(q(1,1,iq),ip1jmp1,llm,0) 1573 enddo 1574 call Gather_Field(masse,ip1jmp1,llm,0) 1575 call Gather_Field(ps,ip1jmp1,1,0) 1576 call Gather_Field(phis,ip1jmp1,1,0) 1577 if (mpi_rank==0) then 1578 CALL writedynav(itau,vcov, 1579 & ucov,teta,pk,phi,q,masse,ps,phis) 1580 endif 1581 #endif 1582 !$OMP END MASTER 1583 ENDIF ! of IF (ok_dyn_ave) 1584 1505 1585 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) 1506 1586 1507 1587 1508 cIF(MOD(itau,iecri ).EQ.0) THEN1509 IF(MOD(itau,iecri*day_step).EQ.0) THEN1588 IF(MOD(itau,iecri ).EQ.0) THEN 1589 c IF(MOD(itau,iecri*day_step).EQ.0) THEN 1510 1590 c$OMP BARRIER 1511 1591 c$OMP MASTER … … 1540 1620 1541 1621 #ifdef CPP_IOIPSL 1542 1622 if (ok_dyn_ins) then 1623 ! Ehouarn: Gather fields and make master send to output 1624 call Gather_Field(vcov,ip1jm,llm,0) 1625 call Gather_Field(ucov,ip1jmp1,llm,0) 1626 call Gather_Field(teta,ip1jmp1,llm,0) 1627 call Gather_Field(phi,ip1jmp1,llm,0) 1628 do iq=1,nqtot 1629 call Gather_Field(q(1,1,iq),ip1jmp1,llm,0) 1630 enddo 1631 call Gather_Field(masse,ip1jmp1,llm,0) 1632 call Gather_Field(ps,ip1jmp1,1,0) 1633 call Gather_Field(phis,ip1jmp1,1,0) 1634 if (mpi_rank==0) then 1635 CALL writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis) 1636 endif 1543 1637 ! CALL writehist_p(histid, histvid, itau,vcov , 1544 1638 ! & ucov,teta,phi,q,masse,ps,phis) 1639 endif ! of if (ok_dyn_ins) 1545 1640 #endif 1546 1641 ! For some Grads output (but does it work?) … … 1560 1655 1561 1656 c$OMP END MASTER 1562 ENDIF ! of IF(MOD(itau,iecri *day_step).EQ.0)1657 ENDIF ! of IF(MOD(itau,iecri).EQ.0) 1563 1658 1564 1659 IF(itau.EQ.itaufin) THEN -
LMDZ4/trunk/libf/dyn3dpar/limit_netcdf.F90
r1328 r1403 30 30 USE inter_barxy_m, only: inter_barxy 31 31 #endif 32 USE control_mod 32 33 IMPLICIT NONE 33 34 !------------------------------------------------------------------------------- … … 45 46 !------------------------------------------------------------------------------- 46 47 ! Local variables: 47 #include "control.h"48 48 #include "logic.h" 49 49 #include "comvert.h" … … 293 293 USE dimphy, ONLY : klon 294 294 USE phys_state_var_mod, ONLY : pctsrf 295 USE control_mod 295 296 IMPLICIT NONE 296 297 #include "dimensions.h" 297 298 #include "paramet.h" 298 299 #include "comgeom2.h" 299 #include "control.h"300 300 #include "indicesol.h" 301 301 #include "iniprint.h" -
LMDZ4/trunk/libf/dyn3dpar/ppm3d.F
r764 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 … … 345 345 C 346 346 PI = 4. * ATAN(1.) 347 DL = 2.*PI / float(IMR)348 DP = PI / float(JMR)347 DL = 2.*PI / REAL(IMR) 348 DP = PI / REAL(JMR) 349 349 C 350 350 if(IGD.eq.0) then … … 388 388 ZTC = acos(CR1) * (180./PI) 389 389 C 390 JS0 = float(JMR)*(90.-ZTC)/180. + 2390 JS0 = REAL(JMR)*(90.-ZTC)/180. + 2 391 391 JS0 = max(JS0, J1+1) 392 392 IML = min(6*JS0/(J1-1)+2, 4*IMR/5) … … 628 628 C Contribution from the N-S advection 629 629 do i=1,imr*(j2-j1+1) 630 JT = float(J1) - VA(i,j1)630 JT = REAL(J1) - VA(i,j1) 631 631 wk1(i,j1,2) = VA(i,j1) * (q(i,jt,k,IC) - q(i,jt+1,k,IC)) 632 632 enddo … … 949 949 IF(IORD.eq.1 .or. j.eq.j1. or. j.eq.j2) THEN 950 950 DO 1406 i=1,IMR 951 iu = float(i) - uc(i,j)951 iu = REAL(i) - uc(i,j) 952 952 1406 fx1(i) = qtmp(iu) 953 953 ELSE … … 957 957 if(IORD.eq.2 .or. j.le.j1vl .or. j.ge.j2vl) then 958 958 DO 1408 i=1,IMR 959 iu = float(i) - uc(i,j)959 iu = REAL(i) - uc(i,j) 960 960 1408 fx1(i) = qtmp(iu) + DC(iu)*(sign(1.,uc(i,j))-uc(i,j)) 961 961 else … … 1111 1111 if(JORD.eq.1) then 1112 1112 DO 1000 i=1,len 1113 JT = float(J1) - VC(i,J1)1113 JT = REAL(J1) - VC(i,J1) 1114 1114 1000 fx(i,j1) = p(i,JT) 1115 1115 else … … 1123 1123 else 1124 1124 DO 1200 i=1,len 1125 JT = float(J1) - VC(i,J1)1125 JT = REAL(J1) - VC(i,J1) 1126 1126 1200 fx(i,j1) = p(i,JT) + (sign(1.,VC(i,j1))-VC(i,j1))*DC2(i,JT) 1127 1127 endif … … 1358 1358 do j=j1-1,j2+1 1359 1359 do i=1,imr 1360 JP = float(j)-VA(i,j)1360 JP = REAL(j)-VA(i,j) 1361 1361 ady(i,j) = VA(i,j)*(wk(i,jp)-wk(i,jp+1)) 1362 1362 enddo … … 1582 1582 JMR = JNP-1 1583 1583 do 55 j=2,JNP 1584 ph5 = -0.5*PI + ( FLOAT(J-1)-0.5)*DP1584 ph5 = -0.5*PI + (REAL(J-1)-0.5)*DP 1585 1585 55 cose(j) = cos(ph5) 1586 1586 C … … 1834 1834 C 1835 1835 c if(first) then 1836 DP = 4.*ATAN(1.)/ float(JNP-1)1836 DP = 4.*ATAN(1.)/REAL(JNP-1) 1837 1837 CAP1 = IMR*(1.-COS((j1-1.5)*DP))/DP 1838 1838 c first = .false. … … 1889 1889 C Check Poles. 1890 1890 if(q(1,1).lt.0.) then 1891 dq = q(1,1)*cap1/ float(IMR)*acosp(j1)1891 dq = q(1,1)*cap1/REAL(IMR)*acosp(j1) 1892 1892 do i=1,imr 1893 1893 q(i,1) = 0. … … 1898 1898 C 1899 1899 if(q(1,JNP).lt.0.) then 1900 dq = q(1,JNP)*cap1/ float(IMR)*acosp(j2)1900 dq = q(1,JNP)*cap1/REAL(IMR)*acosp(j2) 1901 1901 do i=1,imr 1902 1902 q(i,JNP) = 0. -
LMDZ4/trunk/libf/dyn3dpar/ran1.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 FUNCTION RAN1(IDUM) … … 20 20 IX1=MOD(IA1*IX1+IC1,M1) 21 21 IX2=MOD(IA2*IX2+IC2,M2) 22 R(J)=( FLOAT(IX1)+FLOAT(IX2)*RM2)*RM122 R(J)=(REAL(IX1)+REAL(IX2)*RM2)*RM1 23 23 11 CONTINUE 24 24 IDUM=1 … … 30 30 IF(J.GT.97.OR.J.LT.1)PAUSE 31 31 RAN1=R(J) 32 R(J)=( FLOAT(IX1)+FLOAT(IX2)*RM2)*RM132 R(J)=(REAL(IX1)+REAL(IX2)*RM2)*RM1 33 33 RETURN 34 34 END -
LMDZ4/trunk/libf/dyn3dpar/sortvarc.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE sortvarc … … 59 59 60 60 dtvrs1j = dtvr/daysec 61 rjour = FLOAT( INT( itau * dtvrs1j ))61 rjour = REAL( INT( itau * dtvrs1j )) 62 62 heure = ( itau*dtvrs1j-rjour ) * 24. 63 63 imjmp1 = iim * jjp1 … … 129 129 ang = SSUM( llm, angl, 1 ) 130 130 131 c rday = FLOAT(INT ( day_ini + time ))131 c rday = REAL(INT ( day_ini + time )) 132 132 c 133 rday = FLOAT(INT(time-jD_ref-jH_ref))133 rday = REAL(INT(time-jD_ref-jH_ref)) 134 134 IF(ptot0.eq.0.) THEN 135 135 PRINT 3500, itau, rday, heure,time -
LMDZ4/trunk/libf/dyn3dpar/sortvarc0.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE sortvarc0 … … 60 60 61 61 dtvrs1j = dtvr/daysec 62 rjour = FLOAT( INT( itau * dtvrs1j ))62 rjour = REAL( INT( itau * dtvrs1j )) 63 63 heure = ( itau*dtvrs1j-rjour ) * 24. 64 64 imjmp1 = iim * jjp1 … … 130 130 ang0 = SSUM( llm, angl, 1 ) 131 131 132 rday = FLOAT(INT (time ))132 rday = REAL(INT (time )) 133 133 c 134 134 PRINT 3500, itau, rday, heure, time -
LMDZ4/trunk/libf/dyn3dpar/tourabs.F
r763 r1403 57 57 ELSE 58 58 rot( ij,l ) = (vcov(ij+1,l)/cv(ij+1)-vcov(ij,l)/cv(ij))/ 59 $ (2.*pi*RAD*cos(rlatv(j)))* float(iim)59 $ (2.*pi*RAD*cos(rlatv(j)))*REAL(iim) 60 60 $ +(ucov(ij+iip1,l)/cu(ij+iip1)-ucov(ij,l)/cu(ij))/ 61 $ (pi*RAD)*( float(jjm)-1.)61 $ (pi*RAD)*(REAL(jjm)-1.) 62 62 c 63 63 ENDIF -
LMDZ4/trunk/libf/dyn3dpar/traceurpole.F
r774 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine traceurpole(q,masse) 5 6 USE control_mod 5 7 6 8 implicit none … … 15 17 #include "logic.h" 16 18 #include "temps.h" 17 #include "control.h"18 19 #include "ener.h" 19 20 #include "description.h" -
LMDZ4/trunk/libf/dyn3dpar/ugeostr.F
r1279 r1403 40 40 DO i=1,iim 41 41 u(i,j,l)=fact*(phi(i,j+1,l)-phi(i,j,l)) 42 um(j,l)=um(j,l)+u(i,j,l)/ float(iim)42 um(j,l)=um(j,l)+u(i,j,l)/REAL(iim) 43 43 ENDDO 44 44 ENDDO -
LMDZ4/trunk/libf/filtrez/mod_fft_fftw.F90
r986 r1403 1 ! 2 ! $Id$ 3 ! 4 1 5 MODULE mod_fft_fftw 2 6 3 7 #ifdef FFT_FFTW 4 8 5 REAL,SAVE,ALLOCATABLE :: Table_forward(:) 6 REAL,SAVE,ALLOCATABLE :: Table_backward(:) 7 REAL,SAVE :: scale_factor 8 INTEGER,SAVE :: vsize 9 INTEGER,PARAMETER :: inc=1 9 REAL, SAVE :: scale_factor 10 INTEGER, SAVE :: vsize 11 INTEGER, PARAMETER :: inc=1 10 12 11 INTEGER ,SAVE:: plan_forward12 INTEGER ,SAVE:: plan_backward13 INTEGER*8, ALLOCATABLE, DIMENSION(:), SAVE :: plan_forward 14 INTEGER*8, ALLOCATABLE, DIMENSION(:), SAVE :: plan_backward 13 15 14 16 CONTAINS 15 17 16 SUBROUTINE Init_fft(iim )18 SUBROUTINE Init_fft(iim,nvectmax) 17 19 IMPLICIT NONE 18 #include < rfftw.h>20 #include <fftw3.f> 19 21 INTEGER :: iim 20 REAL :: rtmp=1. 21 COMPLEX*16 :: ctmp 22 INTEGER :: itmp=1 23 INTEGER :: isign=0 24 INTEGER :: ierr 22 INTEGER :: nvectmax 23 24 INTEGER :: itmp 25 26 INTEGER :: rank 27 INTEGER :: howmany 28 INTEGER :: istride, idist 29 INTEGER :: ostride, odist 30 INTEGER, DIMENSION(1) :: n_array, inembed, onembed 31 32 REAL, DIMENSION(iim+1,nvectmax) :: dbidon 33 COMPLEX, DIMENSION(iim/2+1,nvectmax) :: cbidon 34 35 vsize = iim 36 scale_factor = 1./SQRT(1.*vsize) 37 38 dbidon = 0 39 cbidon = 0 40 41 ALLOCATE(plan_forward(nvectmax)) 42 ALLOCATE(plan_backward(nvectmax)) 25 43 26 vsize=iim 27 scale_factor=1./SQRT(1.*vsize) 28 ALLOCATE(Table_forward(2*vsize+64)) 29 ALLOCATE(Table_backward(2*vsize+64)) 44 WRITE(*,*)"!---------------------!" 45 WRITE(*,*)"! !" 46 WRITE(*,*)"! INITIALISATION FFTW !" 47 WRITE(*,*)"! !" 48 WRITE(*,*)"!---------------------!" 30 49 31 ! CALL DZFFTM(isign,vsize,itmp,scale_factor,rtmp,vsize+inc,ctmp,vsize/2+1,table_forward,rtmp,ierr) 32 33 ! CALL ZDFFTM(isign,vsize,itmp,scale_factor,ctmp,vsize/2+1,rtmp,vsize+inc,table_backward,rtmp,ierr) 50 ! On initialise tous les plans 51 DO itmp = 1, nvectmax 52 rank = 1 53 n_array(1) = iim 54 howmany = itmp 55 inembed(1) = iim + 1 ; onembed(1) = iim/2 + 1 56 istride = 1 ; ostride = 1 57 idist = iim + 1 ; odist = iim/2 + 1 34 58 35 CALL rfftw_f77_create_plan(plan_forward,iim,FFTW_REAL_TO_COMPLEX,FFTW_ESTIMATE) 36 CALL rfftw_f77_create_plan(plan_backward,iim,FFTW_COMPLEX_TO_REAL,FFTW_ESTIMATE) 37 59 CALL dfftw_plan_many_dft_r2c(plan_forward(itmp), rank, n_array, howmany, & 60 & dbidon, inembed, istride, idist, & 61 & cbidon, onembed, ostride, odist, & 62 & FFTW_ESTIMATE) 63 64 rank = 1 65 n_array(1) = iim 66 howmany = itmp 67 inembed(1) = iim/2 + 1 ; onembed(1) = iim + 1 68 istride = 1 ; ostride = 1 69 idist = iim/2 + 1 ; odist = iim + 1 70 CALL dfftw_plan_many_dft_c2r(plan_backward(itmp), rank, n_array, howmany, & 71 & cbidon, inembed, istride, idist, & 72 & dbidon, onembed, ostride, odist, & 73 & FFTW_ESTIMATE) 74 75 ENDDO 76 77 WRITE(*,*)"!-------------------------!" 78 WRITE(*,*)"! !" 79 WRITE(*,*)"! FIN INITIALISATION FFTW !" 80 WRITE(*,*)"! !" 81 WRITE(*,*)"!-------------------------!" 82 38 83 END SUBROUTINE Init_fft 39 84 … … 41 86 SUBROUTINE fft_forward(vect,TF_vect,nb_vect) 42 87 IMPLICIT NONE 43 #include <rfftw.h> 44 INTEGER,INTENT(IN) :: nb_vect 45 REAL,INTENT(IN) :: vect(vsize+inc,nb_vect) 46 COMPLEX*16,INTENT(OUT) :: TF_vect(vsize/2+1,nb_vect) 47 REAL :: work(4*vsize*nb_vect) 48 INTEGER :: ierr 49 INTEGER, PARAMETER :: isign=-1 50 51 ! CALL DZFFTM(isign,vsize,nb_vect,scale_factor,vect,vsize+inc,TF_vect,vsize/2+1,table_forward,work,ierr) 52 CALL rfftwnd_f77_real_to_complex(plan_forward,nb_vect,vect, 1, vsize+inc , TF_vect, 1, vsize/2+1); 53 88 #include <fftw3.f> 89 INTEGER,INTENT(IN) :: nb_vect 90 REAL,INTENT(IN) :: vect(vsize+inc,nb_vect) 91 COMPLEX,INTENT(OUT) :: TF_vect(vsize/2+1,nb_vect) 92 93 CALL dfftw_execute_dft_r2c(plan_forward(nb_vect),vect,TF_vect) 94 95 TF_vect = scale_factor * TF_vect 96 54 97 END SUBROUTINE fft_forward 55 98 56 99 SUBROUTINE fft_backward(TF_vect,vect,nb_vect) 57 100 IMPLICIT NONE 58 #include <rfftw.h> 59 INTEGER,INTENT(IN) :: nb_vect 60 REAL,INTENT(OUT) :: vect(vsize+inc,nb_vect) 61 COMPLEX*16,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect) 62 REAL :: work(4*vsize*nb_vect) 63 INTEGER :: ierr 64 INTEGER, PARAMETER :: isign=1 65 66 ! CALL ZDFFTM(isign,vsize,nb_vect,scale_factor,TF_vect,vsize/2+1,vect,vsize+inc,table_backward,work,ierr) 67 CALL rfftwnd_f77_complex_to_real(plan_forward,nb_vect,TF_vect, 1, vsize/2+1 , vect, 1, vsize+inc); 101 #include <fftw3.f> 102 INTEGER,INTENT(IN) :: nb_vect 103 REAL,INTENT(OUT) :: vect(vsize+inc,nb_vect) 104 COMPLEX,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect) 105 106 CALL dfftw_execute_dft_c2r(plan_backward(nb_vect),TF_vect,vect) 107 108 vect = scale_factor * vect 68 109 69 110 END SUBROUTINE fft_backward … … 72 113 73 114 END MODULE mod_fft_fftw 74 -
LMDZ4/trunk/libf/filtrez/mod_fft_mathkeisan.F90
r986 r1403 15 15 INTEGER :: nb_vect_max 16 16 REAL :: rtmp=1. 17 COMPLEX *16:: ctmp17 COMPLEX :: ctmp 18 18 INTEGER :: itmp=1 19 19 INTEGER :: isign=0 … … 37 37 INTEGER,INTENT(IN) :: nb_vect 38 38 REAL,INTENT(IN) :: vect(vsize+inc,nb_vect) 39 COMPLEX *16,INTENT(OUT) :: TF_vect(vsize/2+1,nb_vect)39 COMPLEX,INTENT(OUT) :: TF_vect(vsize/2+1,nb_vect) 40 40 REAL :: work(4*vsize*nb_vect) 41 41 INTEGER :: ierr … … 51 51 INTEGER,INTENT(IN) :: nb_vect 52 52 REAL,INTENT(OUT) :: vect(vsize+inc,nb_vect) 53 COMPLEX *16,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect)53 COMPLEX,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect) 54 54 REAL :: work(4*vsize*nb_vect) 55 55 INTEGER :: ierr -
LMDZ4/trunk/libf/filtrez/mod_fft_mkl.F90
r1279 r1403 24 24 INTEGER :: nb_vect_max 25 25 REAL :: rtmp=1. 26 COMPLEX *16:: ctmp26 COMPLEX :: ctmp 27 27 INTEGER :: itmp=1 28 28 INTEGER :: isign=0 … … 60 60 INTEGER,INTENT(IN) :: nb_vect 61 61 REAL,INTENT(IN) :: vect((vsize+inc)*nb_vect) 62 COMPLEX *16,INTENT(OUT) :: TF_vect((vsize/2+1)*nb_vect)62 COMPLEX,INTENT(OUT) :: TF_vect((vsize/2+1)*nb_vect) 63 63 REAL :: work(4*vsize*nb_vect) 64 64 INTEGER :: ierr … … 102 102 INTEGER,INTENT(IN) :: nb_vect 103 103 REAL,INTENT(OUT) :: vect((vsize+inc)*nb_vect) 104 COMPLEX *16,INTENT(IN ) :: TF_vect((vsize/2+1)*nb_vect)104 COMPLEX,INTENT(IN ) :: TF_vect((vsize/2+1)*nb_vect) 105 105 REAL :: work(4*vsize*nb_vect) 106 106 INTEGER :: ierr -
LMDZ4/trunk/libf/filtrez/mod_fft_wrapper.F90
r1279 r1403 19 19 INTEGER,INTENT(IN) :: nb_vect 20 20 REAL,INTENT(IN) :: vect(vsize+inc,nb_vect) 21 COMPLEX *16,INTENT(INOUT) :: TF_vect(vsize/2+1,nb_vect)21 COMPLEX,INTENT(INOUT) :: TF_vect(vsize/2+1,nb_vect) 22 22 23 23 STOP "wrapper fft : une FFT doit etre specifiee a l'aide d'une clee CPP, sinon utiliser le filtre classique" … … 29 29 INTEGER,INTENT(IN) :: nb_vect 30 30 REAL,INTENT(INOUT) :: vect(vsize+inc,nb_vect) 31 COMPLEX *16,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect)31 COMPLEX,INTENT(IN ) :: TF_vect(vsize/2+1,nb_vect) 32 32 33 33 STOP "wrapper fft : une FFT doit etre specifiee a l'aide d'une clee CPP, sinon utiliser le filtre classique" -
LMDZ4/trunk/libf/filtrez/mod_filtre_fft.F90
r1279 r1403 1 ! 2 ! $Id$ 3 ! 4 1 5 MODULE mod_filtre_fft 2 6 … … 23 27 INTEGER :: index_vp(iim) 24 28 INTEGER :: i,j 25 29 INTEGER :: l,ll_nb 30 26 31 index_vp(1)=1 27 32 DO i=1,iim/2 … … 98 103 ENDDO 99 104 100 105 #ifdef FFT_FFTW 106 107 WRITE (*,*)"COTH jfiltnu,jfiltsu,jfiltnv,jjm-jfiltsv" 108 WRITE (*,*)jfiltnu,jfiltsu,jfiltnv,jjm-jfiltsv 109 WRITE (*,*)MAX(jfiltnu-2,jjm-jfiltsu,jfiltnv-2,jjm-jfiltsv)+1 110 CALL Init_FFT(iim,(llm+1)*(MAX(jfiltnu-2,jjm-jfiltsu,jfiltnv-2,jjm-jfiltsv)+1)) 111 #else 101 112 CALL Init_FFT(iim,(jjm+1)*(llm+1)) 102 113 #endif 103 114 104 115 END SUBROUTINE Init_filtre_fft … … 118 129 119 130 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv) 120 ! REAL :: vect_test(iim+inc,jj_end-jj_begin+1,nbniv) 121 COMPLEX*16 :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv) 122 ! COMPLEX*16 :: TF_vect_test(iim/2+1,jj_end-jj_begin+1,nbniv) 131 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv) 123 132 INTEGER :: nb_vect 124 133 INTEGER :: i,j,l 125 134 INTEGER :: ll_nb 126 ! REAL :: vect_tmp(iim+inc,jj_end-jj_begin+1,nbniv)127 135 128 136 ll_nb=0 … … 140 148 nb_vect=(jj_end-jj_begin+1)*ll_nb 141 149 142 ! vect_tmp=vect143 144 150 CALL FFT_forward(vect,TF_vect,nb_vect) 145 146 ! CALL FFT_forward(vect,TF_vect_test,nb_vect)147 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx"148 ! DO j=1,jj_end-jj_begin+1149 ! DO i=1,iim/2+1150 ! PRINT *,"====",i,j,"----->",TF_vect_test(i,j,1)151 ! ENDDO152 ! ENDDO153 151 154 152 DO l=1,ll_nb … … 159 157 ENDDO 160 158 ENDDO 161 159 162 160 CALL FFT_backward(TF_vect,vect,nb_vect) 163 ! CALL FFT_backward(TF_vect_test,vect_test,nb_vect) 164 165 ! PRINT *,"XXXXXXXXXXXXX Filtre_u_FFT xxxxxxxxxxxx" 166 ! DO j=1,jj_end-jj_begin+1 167 ! DO i=1,iim 168 ! PRINT *,"====",i,j,"----->",vect_test(i,j,1) 169 ! ENDDO 170 ! ENDDO 171 161 162 172 163 ll_nb=0 173 164 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 199 190 200 191 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv) 201 COMPLEX *16:: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv)192 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv) 202 193 INTEGER :: nb_vect 203 194 INTEGER :: i,j,l … … 260 251 REAL,INTENT(INOUT) :: vect_inout(iim+1,nlat,nbniv) 261 252 262 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv)263 COMPLEX *16:: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv)253 REAL :: vect(iim+inc,jj_end-jj_begin+1,nbniv) 254 COMPLEX :: TF_vect(iim/2+1,jj_end-jj_begin+1,nbniv) 264 255 INTEGER :: nb_vect 265 256 INTEGER :: i,j,l … … 305 296 306 297 END SUBROUTINE Filtre_inv_fft 307 308 309 ! SUBROUTINE get_ll_index(nbniv,ll_index,ll_nb)310 ! IMPLICIT NONE311 ! INTEGER,INTENT(IN) :: nbniv312 ! INTEGER,INTENT(OUT) :: ll_index(nbniv)313 ! INTEGER,INTENT(OUT) :: ll_nb314 !315 ! INTEGER :: l,ll_begin, ll_end316 ! INTEGER :: omp_rank,omp_size317 ! INTEGER :: OMP_GET_NUM_THREADS318 ! INTEGER :: omp_chunk319 ! EXTERNAL OMP_GET_NUM_THREADS320 ! INTEGER :: OMP_GET_THREAD_NUM321 ! EXTERNAL OMP_GET_THREAD_NUM322 !323 !324 ! omp_size=OMP_GET_NUM_THREADS()325 ! omp_rank=OMP_GET_THREAD_NUM()326 ! omp_chunk=nbniv/omp_size+min(1,MOD(nbniv,omp_size))327 !328 ! ll_begin=omp_rank*OMP_CHUNK+1329 ! ll_nb=0330 ! DO WHILE (ll_begin<=nbniv)331 ! ll_end=min(ll_begin+OMP_CHUNK-1,nbniv)332 ! DO l=ll_begin,ll_end333 ! ll_nb=ll_nb+1334 ! ll_index(ll_nb)=l335 ! ENDDO336 ! ll_begin=ll_begin+omp_size*OMP_CHUNK337 ! ENDDO338 !339 ! END SUBROUTINE get_ll_index340 298 341 299 END MODULE mod_filtre_fft -
LMDZ4/trunk/libf/grid/fxy_new.h
r524 r1403 8 8 c....stretching in x... 9 9 c 10 ripx( ri )= (ri-1.0) *2.*pi/ FLOAT(iim)10 ripx( ri )= (ri-1.0) *2.*pi/REAL(iim) 11 11 fx ( ri )= ripx(ri) + transx + 12 12 * alphax * SIN( ripx(ri)+transx-pxo ) - pi 13 fxprim(ri) = 2.*pi/ FLOAT(iim) *13 fxprim(ri) = 2.*pi/REAL(iim) * 14 14 * ( 1.+ alphax * COS( ripx(ri)+transx-pxo ) ) 15 15 16 16 c....stretching in y... 17 17 c 18 bigy(rj) = 2.* ( FLOAT(jjp1)-rj ) *pi/jjm18 bigy(rj) = 2.* (REAL(jjp1)-rj ) *pi/jjm 19 19 fy(rj) = ( bigy(rj) + transy + 20 20 * alphay * SIN( bigy(rj)+transy-pyo ) ) /2. - pi/2. -
LMDZ4/trunk/libf/grid/fxy_reg.h
r524 r1403 13 13 c 14 14 c 15 fy ( rj ) = pi/ FLOAT(jjm) * ( 0.5 * FLOAT(jjm) + 1. - rj )16 fyprim( rj ) = pi/ FLOAT(jjm)15 fy ( rj ) = pi/REAL(jjm) * ( 0.5 * REAL(jjm) + 1. - rj ) 16 fyprim( rj ) = pi/REAL(jjm) 17 17 18 c fy(rj)=ASIN(1.+2.*((1.-rj)/ FLOAT(jjm)))18 c fy(rj)=ASIN(1.+2.*((1.-rj)/REAL(jjm))) 19 19 c fyprim(rj)=1./SQRT((rj-1.)*(jjm+1.-rj)) 20 20 21 fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* FLOAT(iim) - 1. )22 c fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* ( FLOAT(iim) + 1.) )23 fxprim( ri ) = 2.*pi/ FLOAT(iim)21 fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* REAL(iim) - 1. ) 22 c fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* ( REAL(iim) + 1.) ) 23 fxprim( ri ) = 2.*pi/REAL(iim) 24 24 c 25 25 c -
LMDZ4/trunk/libf/grid/fxy_sin.h
r524 r1403 13 13 c 14 14 c 15 fy(rj)=ASIN(1.+2.*((1.-rj)/ FLOAT(jjm)))15 fy(rj)=ASIN(1.+2.*((1.-rj)/REAL(jjm))) 16 16 fyprim(rj)=1./SQRT((rj-1.)*(jjm+1.-rj)) 17 17 18 fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* FLOAT(iim) - 1. )19 c fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* ( FLOAT(iim) + 1.) )20 fxprim( ri ) = 2.*pi/ FLOAT(iim)18 fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* REAL(iim) - 1. ) 19 c fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* ( REAL(iim) + 1.) ) 20 fxprim( ri ) = 2.*pi/REAL(iim) 21 21 c 22 22 c -
LMDZ4/trunk/libf/grid/fxyprim.h
r524 r1403 13 13 c 14 14 c 15 fy ( rj ) = pi/ FLOAT(jjm) * ( 0.5 * FLOAT(jjm) + 1. - rj )16 fyprim( rj ) = pi/ FLOAT(jjm)15 fy ( rj ) = pi/REAL(jjm) * ( 0.5 * REAL(jjm) + 1. - rj ) 16 fyprim( rj ) = pi/REAL(jjm) 17 17 18 c fy(rj)=ASIN(1.+2.*((1.-rj)/ FLOAT(jjm)))18 c fy(rj)=ASIN(1.+2.*((1.-rj)/REAL(jjm))) 19 19 c fyprim(rj)=1./SQRT((rj-1.)*(jjm+1.-rj)) 20 20 21 fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* FLOAT(iim) - 1. )22 c fx ( ri ) = 2.*pi/ FLOAT(iim) * ( ri - 0.5* ( FLOAT(iim) + 1.) )23 fxprim( ri ) = 2.*pi/ FLOAT(iim)21 fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* REAL(iim) - 1. ) 22 c fx ( ri ) = 2.*pi/REAL(iim) * ( ri - 0.5* ( REAL(iim) + 1.) ) 23 fxprim( ri ) = 2.*pi/REAL(iim) 24 24 c 25 25 c -
LMDZ4/trunk/libf/phylmd/aaam_bud.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine aaam_bud (iam,nlon,nlev,rjour,rsec, … … 117 117 REAL BLSU(801,401),BLSV(801,401) 118 118 REAL ZLON(801),ZLAT(401) 119 120 CHARACTER (LEN=20) :: modname='aaam_bud' 121 CHARACTER (LEN=80) :: abort_message 122 123 119 124 C 120 125 C PUT AAM QUANTITIES AT ZERO: 121 126 C 122 127 if(iim+1.gt.801.or.jjm+1.gt.401)then 123 print *,'Pb de dimension dans aaam_bud'124 stop128 abort_message = 'Pb de dimension dans aaam_bud' 129 CALL abort_gcm (modname,abort_message,1) 125 130 endif 126 131 … … 128 133 hadley=1.e18 129 134 hadday=1.e18*24.*3600. 130 dlat=xpi/ float(jjm)131 dlon=2.*xpi/ float(iim)135 dlat=xpi/REAL(jjm) 136 dlon=2.*xpi/REAL(iim) 132 137 133 138 do iax=1,3 -
LMDZ4/trunk/libf/phylmd/aeropt.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE aeropt(pplay, paprs, t_seri, msulfate, RHcl, … … 39 39 REAL alpha_aer_sulfate(nbre_RH,5) !--unit m2/g SO4 40 40 REAL alphasulfate 41 42 CHARACTER (LEN=20) :: modname='aeropt' 43 CHARACTER (LEN=80) :: abort_message 44 41 45 c 42 46 c Proprietes optiques … … 85 89 rh=MIN(RHcl(i,k)*100.,RH_MAX) 86 90 RH_num = INT( rh/10. + 1.) 87 IF (rh.LT.0.) STOP 'aeropt: RH < 0 not possible' 91 IF (rh.LT.0.) THEN 92 abort_message = 'aeropt: RH < 0 not possible' 93 CALL abort_gcm (modname,abort_message,1) 94 ENDIF 88 95 IF (rh.gt.85.) RH_num=10 89 96 IF (rh.gt.90.) RH_num=11 -
LMDZ4/trunk/libf/phylmd/albedo.F
r900 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 67 67 c prend en compte l'autre moitie de la journee): 68 68 DO k = 1, npts 69 rmu = aa + bb * COS( FLOAT(k)/FLOAT(npts)*zpi)69 rmu = aa + bb * COS(REAL(k)/REAL(npts)*zpi) 70 70 rmu = MAX(0.0, rmu) 71 71 fauxo = (1.47-ACOS(rmu))/.15 … … 110 110 c prend en compte l'autre moitie de la journee): 111 111 DO k = 1, npts 112 rmu = aa + bb * COS( FLOAT(k)/FLOAT(npts)*zpi)112 rmu = aa + bb * COS(REAL(k)/REAL(npts)*zpi) 113 113 rmu = MAX(0.0, rmu) 114 114 cIM cf. PB alb = 0.058/(rmu + 0.30) -
LMDZ4/trunk/libf/phylmd/calcul_simulISCCP.h
r1279 r1403 1 1 c 2 c $ Header$2 c $Id$ 3 3 c 4 4 c on appelle le simulateur ISCCP toutes les 3h … … 18 18 sunlit(i)=1 19 19 IF(rmu0(i).EQ.0.) sunlit(i)=0 20 nbsunlit(1,i,n)= FLOAT(sunlit(i))20 nbsunlit(1,i,n)=REAL(sunlit(i)) 21 21 ENDDO 22 22 c … … 88 88 print*,'seed=0 i paprs aa seed_re', 89 89 . i,paprs(i,2),aa,seed_re(i,n) 90 STOP 90 abort_message = '' 91 CALL abort_gcm (modname,abort_message,1) 91 92 ELSE IF(seed(i,n).LT.0) THEN 92 93 print*,'seed < 0, i seed itap paprs',i, 93 94 . seed(i,n),itap,paprs(i,2) 94 STOP 95 abort_message = '' 96 CALL abort_gcm (modname,abort_message,1) 95 97 ENDIF 96 98 c -
LMDZ4/trunk/libf/phylmd/calltherm.F90
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine calltherm(dtime & … … 8 8 & ,fm_therm,entr_therm,detr_therm,zqasc,clwcon0,lmax,ratqscth, & 9 9 & ratqsdiff,zqsatth,Ale_bl,Alp_bl,lalim_conv,wght_th, & 10 & zmax0,f0,zw2,fraca )10 & zmax0,f0,zw2,fraca,ztv,zpspsk,ztla,zthl) 11 11 12 12 USE dimphy … … 45 45 !******************************************************** 46 46 ! declarations 47 LOGICAL flag_bidouille_stratocu 47 48 real fmc_therm(klon,klev+1),zqasc(klon,klev) 48 49 real zqla(klon,klev) 49 50 real zqta(klon,klev) 51 real ztv(klon,klev) 52 real zpspsk(klon,klev) 53 real ztla(klon,klev) 54 real zthl(klon,klev) 50 55 real wmax_sec(klon) 51 56 real zmax_sec(klon) … … 82 87 ! save zentr_therm,zfm_therm 83 88 89 character (len=20) :: modname='calltherm' 90 character (len=80) :: abort_message 91 84 92 integer i,k 85 93 logical, save :: first=.true. … … 136 144 if(nbptspb.GT.0) print*,'Number of points with q_seri(i,k)<=0 ',nbptspb 137 145 138 zdt=dtime/ float(nsplit_thermals)146 zdt=dtime/REAL(nsplit_thermals) 139 147 do isplit=1,nsplit_thermals 140 148 … … 172 180 & ,tau_thermals,3) 173 181 else if (iflag_thermals.eq.11) then 174 stop 'cas non prevu dans calltherm' 182 abort_message = 'cas non prevu dans calltherm' 183 CALL abort_gcm (modname,abort_message,1) 184 175 185 ! CALL thermcell_pluie(klon,klev,zdt & 176 186 ! & ,pplay,paprs,pphi,zlev & … … 187 197 & ,r_aspect_thermals,l_mix_thermals,w2di_thermals & 188 198 & ,tau_thermals) 189 else if (iflag_thermals .ge.13) then190 CALL thermcell _main(itap,klon,klev,zdt &199 else if (iflag_thermals==13.or.iflag_thermals==14) then 200 CALL thermcellV0_main(itap,klon,klev,zdt & 191 201 & ,pplay,paprs,pphi,debut & 192 202 & ,u_seri,v_seri,t_seri,q_seri & … … 197 207 & ,tau_thermals,Ale,Alp,lalim_conv,wght_th & 198 208 & ,zmax0,f0,zw2,fraca) 209 else if (iflag_thermals==15.or.iflag_thermals==16) then 210 211 ! print*,'THERM iflag_thermas_ed=',iflag_thermals_ed 212 CALL thermcell_main(itap,klon,klev,zdt & 213 & ,pplay,paprs,pphi,debut & 214 & ,u_seri,v_seri,t_seri,q_seri & 215 & ,d_u_the,d_v_the,d_t_the,d_q_the & 216 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax & 217 & ,ratqscth,ratqsdiff,zqsatth & 218 & ,r_aspect_thermals,l_mix_thermals & 219 & ,tau_thermals,iflag_thermals_ed,Ale,Alp,lalim_conv,wght_th & 220 & ,zmax0,f0,zw2,fraca,ztv,zpspsk & 221 & ,ztla,zthl) 222 if (prt_level.gt.10) write(lunout,*)'Apres thermcell_main OK' 223 else 224 abort_message = 'Cas des thermiques non prevu' 225 CALL abort_gcm (modname,abort_message,1) 199 226 endif 200 227 228 flag_bidouille_stratocu=iflag_thermals.eq.14.or.iflag_thermals.eq.16 201 229 202 230 fact(:)=0. 203 231 DO i=1,klon 204 logexpr1(i)= iflag_thermals.lt.14.or.weak_inversion(i).gt.0.5205 IF(logexpr1(i)) fact(i)=1./ float(nsplit_thermals)232 logexpr1(i)=flag_bidouille_stratocu.or.weak_inversion(i).gt.0.5 233 IF(logexpr1(i)) fact(i)=1./REAL(nsplit_thermals) 206 234 ENDDO 207 235 … … 235 263 qmemoire(:,:)=q_seri(:,:) 236 264 q_seri(:,:) = q_seri(:,:) + d_q_the(:,:) 265 if (prt_level.gt.10) write(lunout,*)'Apres apres thermcell_main OK' 237 266 238 267 DO i=1,klon 239 268 if(prt_level.GE.10) print*,'calltherm i Alp_bl Alp Ale_bl Ale',i,Alp_bl(i),Alp(i),Ale_bl(i),Ale(i) 240 269 fm_therm(i,klev+1)=0. 241 Ale_bl(i)=Ale_bl(i)+Ale(i)/ float(nsplit_thermals)270 Ale_bl(i)=Ale_bl(i)+Ale(i)/REAL(nsplit_thermals) 242 271 ! write(22,*)'ALE CALLTHERM',Ale_bl(i),Ale(i) 243 Alp_bl(i)=Alp_bl(i)+Alp(i)/ float(nsplit_thermals)272 Alp_bl(i)=Alp_bl(i)+Alp(i)/REAL(nsplit_thermals) 244 273 ! write(23,*)'ALP CALLTHERM',Alp_bl(i),Alp(i) 245 274 ENDDO … … 260 289 ! & 'fm=',zfm_therm(i,k),'entr=',entr_therm(i,k) 261 290 endif 262 ! stop263 291 ENDDO 264 292 ENDDO -
LMDZ4/trunk/libf/phylmd/calwake.F
r990 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE CALWAKE(paprs,pplay,dtime 2 5 : ,t,q,omgb … … 189 192 $ ,Cstar,d_deltat_gw 190 193 $ ,d_deltatw,d_deltaqw) 191 192 DO i=1,klon193 IF (ktopw(i) .GT. 0) THEN194 DO l=1,klev194 c 195 DO l=1,klev 196 DO i=1,klon 197 IF (ktopw(i) .GT. 0) THEN 195 198 wake_deltat(i,l)= dtw(i,l) 196 199 wake_deltaq(i,l)= dqw(i,l) … … 212 215 wake_ddeltat(i,l) = d_deltatw(i,l) 213 216 wake_ddeltaq(i,l) = d_deltaqw(i,l) 214 ENDDO 215 ELSE 216 DO l = 1,klev 217 ELSE 217 218 wake_deltat(i,l)= 0. 218 219 wake_deltaq(i,l)= 0. … … 222 223 wake_dtKE(i,l) = 0. 223 224 wake_dqKE(i,l) = 0. 225 wake_dtPBL(i,l) = 0. 226 wake_dqPBL(i,l) = 0. 224 227 wake_omg(i,l) = 0. 225 228 wake_dp_deltomg(i,l) = 0. … … 230 233 undi_t(i,l)=te(i,l) 231 234 undi_q(i,l)=qe(i,l) 232 ENDDO 233 ENDIF 234 235 wake_ddeltat(i,l) = 0. 236 wake_ddeltaq(i,l) = 0. 237 ENDIF 238 ENDDO 239 ENDDO 240 c 241 DO i=1,klon 235 242 wake_h(i)= hw(i) 236 243 wake_s(i)= sigmaw(i) … … 241 248 wake_Cstar(i) = Cstar(i) 242 249 wake_dens(i) = wdens(i) 243 c 244 cIM 290108 999 CONTINUE 245 c 246 ENDDO 250 ENDDO 251 c 247 252 RETURN 248 253 END 254 249 255 SUBROUTINE CALWAKE_scal(paprs,pplay,dtime 250 256 : ,t,q,omgb -
LMDZ4/trunk/libf/phylmd/clesphys.h
r1374 r1403 1 1 2 ! 2 3 ! $Id$ … … 48 49 INTEGER lev_histdayNMC 49 50 Integer lev_histins, lev_histLES 51 52 50 53 !IM ok_histNMC : sortie fichiers niveaux de pression (histmthNMC, histdayNMC, histhfNMC) 51 54 !IM freq_outNMC : frequences de sortie fichiers niveaux de pression (histmthNMC, histdayNMC, histhfNMC) … … 55 58 LOGICAL ok_histNMC(3) 56 59 REAL freq_outNMC(3) , freq_calNMC(3) 60 57 61 CHARACTER(len=4) type_run 58 62 ! aer_type: pour utiliser un fichier constant dans readaerosol … … 69 73 LOGICAL :: ok_strato 70 74 LOGICAL :: ok_hines 75 INTEGER :: nseuil 71 76 72 77 COMMON/clesphys/cycle_diurne, soil_model, new_oliq, & … … 78 83 & , f_cdrag_ter,f_cdrag_oce,f_rugoro & 79 84 & , lev_histhf, lev_histday, lev_histmth & 85 80 86 & , lev_histins, lev_histLES, lev_histdayNMC & 81 87 & , pasphys, ok_histNMC, freq_outNMC, freq_calNMC & … … 88 94 & , ok_lic_melt, cvl_corr, aer_type & 89 95 & , qsol0, iflag_rrtm, ok_strato,ok_hines,ecrit_LES & 90 & , co2_ppm0 96 & , co2_ppm0, nseuil 91 97 92 98 !$OMP THREADPRIVATE(/clesphys/) -
LMDZ4/trunk/libf/phylmd/conema3.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE conema3 (dtime,paprs,pplay,t,q,u,v,tra,ntra, … … 360 360 cape(i) = em_CAPE 361 361 wd(i) = em_wd 362 rflag(i) = float(iflag)362 rflag(i) = REAL(iflag) 363 363 c SB kbas(i) = em_bas 364 364 c SB ktop(i) = em_top -
LMDZ4/trunk/libf/phylmd/conf_phys.F90
r1374 r1403 22 22 iflag_thermals,nsplit_thermals,tau_thermals, & 23 23 iflag_thermals_ed,iflag_thermals_optflux, & 24 iflag_coupl,iflag_clos,iflag_wake, read_climoz) 24 iflag_coupl,iflag_clos,iflag_wake, read_climoz, & 25 alp_offset) 25 26 26 27 use IOIPSL … … 28 29 USE phys_cal_mod 29 30 USE carbon_cycle_mod, ONLY : carbon_cycle_tr, carbon_cycle_cpl 31 use control_mod 30 32 31 33 include "conema3.h" … … 37 39 include "clesphys.h" 38 40 include "compbl.h" 39 include "control.h"40 41 include "comsoil.h" 41 42 ! … … 111 112 integer :: iflag_clos 112 113 integer :: iflag_wake 114 real :: alp_offset 115 REAL, SAVE :: alp_offset_omp 113 116 integer,SAVE :: iflag_coupl_omp,iflag_clos_omp,iflag_wake_omp 114 117 integer,SAVE :: iflag_cvl_sigd_omp … … 150 153 REAL,SAVE :: ecrit_LES_omp 151 154 REAL,SAVE :: ecrit_tra_omp 155 INTEGER, SAVE :: nseuil_omp 152 156 REAL,SAVE :: cvl_corr_omp 153 157 LOGICAL,SAVE :: ok_lic_melt_omp … … 1038 1042 call getin('iflag_wake',iflag_wake_omp) 1039 1043 1044 !Config Key = alp_offset 1045 !Config Desc = 1046 !Config Def = 0 1047 !Config Help = 1048 ! 1049 alp_offset_omp = 0. 1050 call getin('alp_offset',alp_offset_omp) 1051 1040 1052 ! 1041 1053 !Config Key = lev_histhf … … 1256 1268 ecrit_tra_omp = 30. 1257 1269 call getin('ecrit_tra',ecrit_tra_omp) 1270 ! 1271 !Config Key = nseuil 1272 !Config Desc = Numero du traceur a partir duquel on ne transporte 1273 ! pas par convection 1274 !Config Def = 7 !a partir du numero 7 pour les pseudo-traceurs de Remy 1275 !Config Help = 1276 ! 1277 nseuil_omp = 7 1278 call getin('nseuil',nseuil_omp) 1279 ! 1258 1280 ! 1259 1281 !Config Key = ecrit_reg … … 1531 1553 iflag_clos = iflag_clos_omp 1532 1554 iflag_wake = iflag_wake_omp 1555 alp_offset = alp_offset_omp 1533 1556 iflag_cvl_sigd = iflag_cvl_sigd_omp 1534 1557 type_run = type_run_omp … … 1548 1571 ecrit_mth = ecrit_mth_omp 1549 1572 ecrit_tra = ecrit_tra_omp 1573 nseuil = nseuil_omp 1550 1574 ecrit_reg = ecrit_reg_omp 1551 1575 cvl_corr = cvl_corr_omp … … 1708 1732 write(numout,*)' Fmax = ', Fmax 1709 1733 write(numout,*)' alphas = ', alphas 1734 write(numout,*)' iflag_wake = ', iflag_wake 1735 write(numout,*)' alp_offset = ', alp_offset 1710 1736 1711 1737 write(numout,*)' lonmin lonmax latmin latmax bilKP_ins =',& … … 1713 1739 write(numout,*)' ecrit_ hf, ins, day, mth, reg, tra, ISCCP, LES',& 1714 1740 ecrit_hf, ecrit_ins, ecrit_day, ecrit_mth, ecrit_reg, ecrit_tra, ecrit_ISCCP, ecrit_LES 1741 write(numout,*)' nseuil ',nseuil 1715 1742 1716 1743 write(numout,*) 'ok_strato = ', ok_strato -
LMDZ4/trunk/libf/phylmd/convect2.F
r766 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 subroutine convect2(ncum,idcum,len,nd,ndp1,nl,minorig, -
LMDZ4/trunk/libf/phylmd/cpl_mod.F90
r1279 r1403 24 24 USE oasis 25 25 USE write_field_phy 26 USE control_mod 27 26 28 27 29 ! Global attributes … … 101 103 INCLUDE "dimensions.h" 102 104 INCLUDE "indicesol.h" 103 INCLUDE "control.h"104 105 INCLUDE "temps.h" 105 106 INCLUDE "iniprint.h" … … 583 584 DO ig = 1, knon 584 585 cpl_sols(ig,cpl_index) = cpl_sols(ig,cpl_index) + & 585 swdown(ig) / FLOAT(nexca)586 swdown(ig) / REAL(nexca) 586 587 cpl_nsol(ig,cpl_index) = cpl_nsol(ig,cpl_index) + & 587 (lwdown(ig) + fluxlat(ig) +fluxsens(ig)) / FLOAT(nexca)588 (lwdown(ig) + fluxlat(ig) +fluxsens(ig)) / REAL(nexca) 588 589 cpl_rain(ig,cpl_index) = cpl_rain(ig,cpl_index) + & 589 precip_rain(ig) / FLOAT(nexca)590 precip_rain(ig) / REAL(nexca) 590 591 cpl_snow(ig,cpl_index) = cpl_snow(ig,cpl_index) + & 591 precip_snow(ig) / FLOAT(nexca)592 precip_snow(ig) / REAL(nexca) 592 593 cpl_evap(ig,cpl_index) = cpl_evap(ig,cpl_index) + & 593 evap(ig) / FLOAT(nexca)594 evap(ig) / REAL(nexca) 594 595 cpl_tsol(ig,cpl_index) = cpl_tsol(ig,cpl_index) + & 595 tsurf(ig) / FLOAT(nexca)596 tsurf(ig) / REAL(nexca) 596 597 cpl_fder(ig,cpl_index) = cpl_fder(ig,cpl_index) + & 597 fder(ig) / FLOAT(nexca)598 fder(ig) / REAL(nexca) 598 599 cpl_albe(ig,cpl_index) = cpl_albe(ig,cpl_index) + & 599 albsol(ig) / FLOAT(nexca)600 albsol(ig) / REAL(nexca) 600 601 cpl_taux(ig,cpl_index) = cpl_taux(ig,cpl_index) + & 601 taux(ig) / FLOAT(nexca)602 taux(ig) / REAL(nexca) 602 603 cpl_tauy(ig,cpl_index) = cpl_tauy(ig,cpl_index) + & 603 tauy(ig) / FLOAT(nexca)604 tauy(ig) / REAL(nexca) 604 605 cpl_windsp(ig,cpl_index) = cpl_windsp(ig,cpl_index) + & 605 windsp(ig) / FLOAT(nexca)606 windsp(ig) / REAL(nexca) 606 607 cpl_taumod(ig,cpl_index) = cpl_taumod(ig,cpl_index) + & 607 SQRT ( taux(ig)*taux(ig)+tauy(ig)*tauy(ig) ) / FLOAT(nexca)608 SQRT ( taux(ig)*taux(ig)+tauy(ig)*tauy(ig) ) / REAL (nexca) 608 609 609 610 IF (carbon_cycle_cpl) THEN 610 611 cpl_atm_co2(ig,cpl_index) = cpl_atm_co2(ig,cpl_index) + & 611 co2_send(knindex(ig))/ FLOAT(nexca)612 co2_send(knindex(ig))/ REAL(nexca) 612 613 END IF 613 614 ENDDO … … 777 778 DO ig = 1, knon 778 779 cpl_sols(ig,cpl_index) = cpl_sols(ig,cpl_index) + & 779 swdown(ig) / FLOAT(nexca)780 swdown(ig) / REAL(nexca) 780 781 cpl_nsol(ig,cpl_index) = cpl_nsol(ig,cpl_index) + & 781 (lwdown(ig) + fluxlat(ig) +fluxsens(ig)) / FLOAT(nexca)782 (lwdown(ig) + fluxlat(ig) +fluxsens(ig)) / REAL(nexca) 782 783 cpl_rain(ig,cpl_index) = cpl_rain(ig,cpl_index) + & 783 precip_rain(ig) / FLOAT(nexca)784 precip_rain(ig) / REAL(nexca) 784 785 cpl_snow(ig,cpl_index) = cpl_snow(ig,cpl_index) + & 785 precip_snow(ig) / FLOAT(nexca)786 precip_snow(ig) / REAL(nexca) 786 787 cpl_evap(ig,cpl_index) = cpl_evap(ig,cpl_index) + & 787 evap(ig) / FLOAT(nexca)788 evap(ig) / REAL(nexca) 788 789 cpl_tsol(ig,cpl_index) = cpl_tsol(ig,cpl_index) + & 789 tsurf(ig) / FLOAT(nexca)790 tsurf(ig) / REAL(nexca) 790 791 cpl_fder(ig,cpl_index) = cpl_fder(ig,cpl_index) + & 791 fder(ig) / FLOAT(nexca)792 fder(ig) / REAL(nexca) 792 793 cpl_albe(ig,cpl_index) = cpl_albe(ig,cpl_index) + & 793 albsol(ig) / FLOAT(nexca)794 albsol(ig) / REAL(nexca) 794 795 cpl_taux(ig,cpl_index) = cpl_taux(ig,cpl_index) + & 795 taux(ig) / FLOAT(nexca)796 taux(ig) / REAL(nexca) 796 797 cpl_tauy(ig,cpl_index) = cpl_tauy(ig,cpl_index) + & 797 tauy(ig) / FLOAT(nexca)798 tauy(ig) / REAL(nexca) 798 799 cpl_taumod(ig,cpl_index) = cpl_taumod(ig,cpl_index) + & 799 SQRT ( taux(ig)*taux(ig)+tauy(ig)*tauy(ig) ) / FLOAT(nexca)800 SQRT ( taux(ig)*taux(ig)+tauy(ig)*tauy(ig) ) / REAL(nexca) 800 801 ENDDO 801 802 … … 944 945 !************************************************************************************* 945 946 !$OMP MASTER 946 cpl_rriv2D(:,:) = cpl_rriv2D(:,:) + rriv2D(:,:) / FLOAT(nexca)947 cpl_rcoa2D(:,:) = cpl_rcoa2D(:,:) + rcoa2D(:,:) / FLOAT(nexca)947 cpl_rriv2D(:,:) = cpl_rriv2D(:,:) + rriv2D(:,:) / REAL(nexca) 948 cpl_rcoa2D(:,:) = cpl_rcoa2D(:,:) + rcoa2D(:,:) / REAL(nexca) 948 949 !$OMP END MASTER 949 950 … … 998 999 !************************************************************************************* 999 1000 !$OMP MASTER 1000 cpl_rlic2D(:,:) = cpl_rlic2D(:,:) + rlic2D(:,:) / FLOAT(nexca)1001 cpl_rlic2D(:,:) = cpl_rlic2D(:,:) + rlic2D(:,:) / REAL(nexca) 1001 1002 !$OMP END MASTER 1002 1003 -
LMDZ4/trunk/libf/phylmd/cv30_routines.F
r879 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 749 749 750 750 #include "cv30param.h" 751 include 'iniprint.h' 751 752 752 753 c inputs: … … 778 779 c local variables: 779 780 integer i,k,nn,j 781 782 CHARACTER (LEN=20) :: modname='cv30_compress' 783 CHARACTER (LEN=80) :: abort_message 780 784 781 785 … … 820 824 821 825 if (nn.ne.ncum) then 822 print*,'strange! nn not equal to ncum: ',nn,ncum 823 stop 826 write(lunout,*)'strange! nn not equal to ncum: ',nn,ncum 827 abort_message = '' 828 CALL abort_gcm (modname,abort_message,1) 824 829 endif 825 830 -
LMDZ4/trunk/libf/phylmd/cv3_cine.F
r1146 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE cv3_cine(nloc,ncum,nd,icb,inb 2 5 : ,pbase,plcl,p,ph,tv,tvp 3 : ,cina,cinb )6 : ,cina,cinb,plfc) 4 7 5 8 *************************************************************** … … 26 29 c 27 30 c output 28 real cina(nloc),cinb(nloc) 31 real cina(nloc),cinb(nloc),plfc(nloc) 29 32 c 30 33 c local variables … … 34 37 logical lswitch(nloc),lswitch1(nloc),lswitch2(nloc) 35 38 logical exist_lfc(nloc) 36 real plfc(nloc)37 39 real dpmax 38 40 real deltap,dcin -
LMDZ4/trunk/libf/phylmd/cv3_inicp.F
r966 r1403 13 13 c 14 14 INTEGER iflag_clos 15 CHARACTER (LEN=20) :: modname='cv3_inicp' 16 CHARACTER (LEN=80) :: abort_message 15 17 c 16 18 c -- Mixing probability distribution functions … … 105 107 if (abs(aire-1.0) .gt. 0.02) then 106 108 print *,'WARNING:: AREA OF MIXING PDF IS::', aire 107 stop 109 abort_message = '' 110 CALL abort_gcm (modname,abort_message,1) 108 111 else 109 112 print *,'Area, mean & std deviation are ::', aire,mu,sigma -
LMDZ4/trunk/libf/phylmd/cv3_inip.F
r1146 r1403 12 12 c 13 13 c INTEGER iflag_mix 14 include 'iniprint.h' 15 16 CHARACTER (LEN=20) :: modname='cv3_inip' 17 CHARACTER (LEN=80) :: abort_message 18 14 19 c 15 20 c -- Mixing probability distribution functions … … 104 109 c 105 110 if (abs(aire-1.0) .gt. 0.02) then 106 print *,'WARNING:: AREA OF MIXING PDF IS::', aire 107 stop 111 write(lunout,*)'WARNING:: AREA OF MIXING PDF IS::', aire 112 abort_message = '' 113 CALL abort_gcm (modname,abort_message,1) 108 114 else 109 115 print *,'Area, mean & std deviation are ::', aire,mu,sigma -
LMDZ4/trunk/libf/phylmd/cv3_routines.F
r1334 r1403 1 1 ! 2 ! $ Header: /home/cvsroot/LMDZ4/libf/phylmd/cv3_routines.F,v 1.16 2008-11-06 16:29:35 lmdzadmin Exp$2 ! $Id$ 3 3 ! 4 4 c … … 36 36 real delt ! timestep (seconds) 37 37 38 CHARACTER (LEN=20) :: modname='cv3_param' 39 CHARACTER (LEN=80) :: abort_message 40 38 41 c noff: integer limit for convection (nd-noff) 39 42 c minorig: First level of convection … … 71 74 c dtcrit = -5.0 72 75 c tau = 3000. 73 cc tau = 1800. 74 c tau= 2800. 75 tau=8000. 76 tau = 1800. 77 cc tau=8000. 76 78 beta = 1.0 - delt/tau 77 79 alpha1 = 1.5e-3 … … 767 769 768 770 #include "cv3param.h" 771 include 'iniprint.h' 769 772 770 773 c inputs: … … 797 800 integer i,k,nn,j 798 801 802 CHARACTER (LEN=20) :: modname='cv3_compress' 803 CHARACTER (LEN=80) :: abort_message 799 804 800 805 do 110 k=1,nl+1 … … 839 844 840 845 if (nn.ne.ncum) then 841 print*,'strange! nn not equal to ncum: ',nn,ncum 842 stop 846 write(lunout,*)'strange! nn not equal to ncum: ',nn,ncum 847 abort_message = '' 848 CALL abort_gcm (modname,abort_message,1) 843 849 endif 844 850 … … 2087 2093 cc---end jyg--- 2088 2094 c 2089 c--------retour à la formulation originale d' 'Emanuel.2095 c--------retour à la formulation originale d'Emanuel. 2090 2096 b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2091 2097 c6=water(il,i+1)+bfac*wdtrain(il) … … 2093 2099 if(c6.gt.0.0)then 2094 2100 revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2095 water(il,i)=revap*revap !equation de conservation 2101 cjyg Dans sa formulation originale, Emanuel calcule l'evaporation par: 2102 cc evap(il,i)=sigt*afac*revap 2103 c ce qui n'est pas correct. Dans cv_routines, la formulation a été modifiee. 2104 c Ici,l'evaporation evap est simplement calculee par l'equation de 2105 c conservation. 2106 water(il,i)=revap*revap 2096 2107 else 2108 cjyg---- Correction : si c6 <= 0, water(il,i)=0. 2097 2109 water(il,i) = 0. 2098 2110 endif … … 2338 2350 real esum(nloc), fsum(nloc), gsum(nloc), hsum(nloc) 2339 2351 real th_wake(nloc,nd) 2340 real alpha_qpos(nloc) 2352 real alpha_qpos(nloc),alpha_qpos1(nloc) 2341 2353 real qcond(nloc,nd), nqcond(nloc,nd), wa(nloc,nd) ! cld 2342 2354 real siga(nloc,nd), sax(nloc,nd), mac(nloc,nd) ! cld … … 3043 3055 do il=1,ncum 3044 3056 IF (iflag(il) .le. 1) THEN 3057 IF (cvflag_grav) then 3058 ex=0.01*grav*ment(il,inb(il),inb(il)) 3059 : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3060 : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3061 ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3062 ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3063 : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3064 : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3065 else 3045 3066 ex=0.1*ment(il,inb(il),inb(il)) 3046 3067 : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) … … 3050 3071 : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3051 3072 : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3073 ENDIF !cvflag grav 3052 3074 ENDIF !iflag 3053 3075 enddo … … 3115 3137 c in order to ensure moisture positivity 3116 3138 DO il = 1,ncum 3139 alpha_qpos(il)=1. 3117 3140 IF (iflag(il) .le. 1) THEN 3118 alpha_qpos(il) = max(1. , -delt*fr(il,1)/ 3141 if (fr(il,1) .le. 0.) then 3142 alpha_qpos(il) = max(alpha_qpos(il) , 3143 : (-delt*fr(il,1))/ 3119 3144 : (s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1))) 3145 end if 3120 3146 ENDIF 3121 3147 ENDDO … … 3123 3149 DO il = 1,ncum 3124 3150 IF (iflag(il) .le. 1) THEN 3125 alpha_qpos(il) = max(alpha_qpos(il) , -delt*fr(il,i)/ 3151 IF (fr(il,i) .le. 0.) THEN 3152 alpha_qpos1(il)=max(1. , (-delt*fr(il,i))/ 3126 3153 : (s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i))) 3154 IF (alpha_qpos1(il) .ge. alpha_qpos(il)) 3155 : alpha_qpos(il)=alpha_qpos1(il) 3156 ENDIF 3127 3157 ENDIF 3128 3158 ENDDO -
LMDZ4/trunk/libf/phylmd/cv3a_compress.F
r1146 r1403 76 76 integer i,k,nn,j 77 77 78 CHARACTER (LEN=20) :: modname='cv3a_compress' 79 CHARACTER (LEN=80) :: abort_message 80 78 81 79 82 do 110 k=1,nl+1 … … 127 130 128 131 if (nn.ne.ncum) then 129 print*,'WARNING nn not equal to ncum: ',nn,ncum 130 stop 132 print*,'WARNING nn not equal to ncum: ',nn,ncum 133 abort_message = '' 134 CALL abort_gcm (modname,abort_message,1) 131 135 endif 132 136 … … 157 161 if (nn.ne.ncum) then 158 162 print*,'WARNING nn not equal to ncum: ',nn,ncum 159 stop 163 abort_message = '' 164 CALL abort_gcm (modname,abort_message,1) 160 165 endif 161 166 -
LMDZ4/trunk/libf/phylmd/cv3p1_closure.F
r973 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE cv3p1_closure(nloc,ncum,nd,icb,inb 2 5 : ,pbase,plcl,p,ph,tv,tvp,buoy … … 60 63 integer nsupmax(nloc) 61 64 real supcrit,temp(nloc,nd) 62 real P1(nloc),Pmin(nloc) 65 real P1(nloc),Pmin(nloc),plfc(nloc) 63 66 real asupmax0(nloc) 64 67 logical ok(nloc) … … 74 77 real wb,sigmax 75 78 data wb /2./, sigmax /0.1/ 79 80 CHARACTER (LEN=20) :: modname='cv3p1_closure' 81 CHARACTER (LEN=80) :: abort_message 76 82 c 77 83 c print *,' -> cv3p1_closure, Ale ',ale(1) … … 379 385 CALL cv3_cine (nloc,ncum,nd,icb,inb 380 386 : ,pbase,plcl,p,ph,tv,tvp 381 : ,cina,cinb )387 : ,cina,cinb,plfc) 382 388 c 383 389 DO il = 1,ncum … … 489 495 do k= 1,nl 490 496 do il = 1,ncum 491 !IM IF (k .ge. icb(il) .and. k .le. inb(il)) THEN 492 IF (k .ge. icb(il)+1 .and. k .le. inb(il)) THEN 497 !old IF (k .ge. icb(il) .and. k .le. inb(il)) THEN 498 !IM IF (k .ge. icb(il)+1 .and. k .le. inb(il)) THEN 499 IF (k .ge. icb(il) .and. k .le. inb(il) !cor jyg 500 $ .and. icb(il)+1 .le. inb(il)) THEN !cor jyg 493 501 cbmflim(il) = cbmflim(il)+MLIM(il,k) 494 502 ENDIF … … 509 517 cbmf1(il) = alp2(il)/(0.5*wb*wb-Cin(il)) 510 518 if(cbmf1(il).EQ.0.AND.alp2(il).NE.0.) THEN 511 print*,'cv3p1_closure cbmf1=0 and alp NE 0 il alp2 alp cin ',il, 519 write(lunout,*) 520 & 'cv3p1_closure cbmf1=0 and alp NE 0 il alp2 alp cin ',il, 512 521 . alp2(il),alp(il),cin(il) 513 STOP 522 abort_message = '' 523 CALL abort_gcm (modname,abort_message,1) 514 524 endif 515 525 cbmfmax(il) = sigmax*wb2(il)*100.*p(il,icb(il)) … … 540 550 do il = 1,ncum 541 551 IF ( k .ge. icb(il)+1 .AND. k .le. inb(il)) THEN 542 sig(il,k) = beta*sig(il,k)+(1.-beta)*coef(il)*siglim(il,k) 543 cc sig(il,k) = beta*sig(il,k)+siglim(il,k) 544 w0(il,k) = beta*w0(il,k) +(1.-beta)*wlim(il,k) 545 AMU=SIG(il,k)*W0(il,k) 552 amu=beta*sig(il,k)*w0(il,k)+ 553 : (1.-beta)*coef(il)*siglim(il,k)*wlim(il,k) 554 w0(il,k) = wlim(il,k) 555 w0(il,k) =max(w0(il,k),1.e-10) 556 sig(il,k)=amu/w0(il,k) 557 sig(il,k)=min(sig(il,k),1.) 546 558 cc amu = 0.5*(SIG(il,k)+sigold(il,k))*W0(il,k) 547 559 M(il,k)=AMU*0.007*P(il,k)*(PH(il,k)-PH(il,k+1))/TV(il,k) -
LMDZ4/trunk/libf/phylmd/cv_routines.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE cv_param(nd) … … 38 38 #include "cvparam.h" 39 39 integer nd 40 CHARACTER (LEN=20) :: modname='cv_routines' 41 CHARACTER (LEN=80) :: abort_message 40 42 41 43 c noff: integer limit for convection (nd-noff) … … 429 431 c local variables: 430 432 integer i,k,nn 433 CHARACTER (LEN=20) :: modname='cv_compress' 434 CHARACTER (LEN=80) :: abort_message 435 436 include 'iniprint.h' 431 437 432 438 … … 456 462 457 463 if (nn.ne.ncum) then 458 print*,'strange! nn not equal to ncum: ',nn,ncum 459 stop 464 write(lunout,*)'strange! nn not equal to ncum: ',nn,ncum 465 abort_message = '' 466 CALL abort_gcm (modname,abort_message,1) 460 467 endif 461 468 -
LMDZ4/trunk/libf/phylmd/cva_driver.F
r1398 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE cva_driver(len,nd,ndp1,ntra,nloc, 2 5 & iflag_con,iflag_mix, … … 106 109 #include "dimensions.h" 107 110 ccccc#include "dimphy.h" 111 include 'iniprint.h' 112 108 113 c 109 114 c Input … … 151 156 real Ma1(len,nd) 152 157 real mip1(len,nd) 153 ! real Vprecip1(len,nd) Correction abderr le 23 03 10158 ! real Vprecip1(len,nd) 154 159 real Vprecip1(len,nd+1) 155 160 real upwd1(len,nd) … … 421 426 logical, save :: first=.true. 422 427 c$OMP THREADPRIVATE(first) 428 CHARACTER (LEN=20) :: modname='cva_driver' 429 CHARACTER (LEN=80) :: abort_message 423 430 424 431 c … … 566 573 c test niveaux couche alimentation KE 567 574 if(sig1feed1.eq.sig2feed1) then 568 print*,'impossible de choisir sig1feed=sig2feed' 569 print*,'changer la valeur de sig2feed dans physiq.def' 570 stop 575 write(lunout,*)'impossible de choisir sig1feed=sig2feed' 576 write(lunout,*)'changer la valeur de sig2feed dans physiq.def' 577 abort_message = '' 578 CALL abort_gcm (modname,abort_message,1) 571 579 endif 572 580 c -
LMDZ4/trunk/libf/phylmd/fisrtilp.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 7 7 s pfrac_impa, pfrac_nucl, pfrac_1nucl, 8 8 s frac_impa, frac_nucl, 9 s prfl, psfl, rhcl) 9 s prfl, psfl, rhcl, zqta, fraca, 10 s ztv, zpspsk, ztla, zthl, iflag_cldcon) 10 11 11 12 c … … 41 42 REAL snow(klon) ! neige (mm/s) 42 43 REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 43 REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 44 REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 45 REAL ztv(klon,klev) 46 REAL zqta(klon,klev),fraca(klon,klev) 47 REAL sigma1(klon,klev),sigma2(klon,klev) 48 REAL qltot(klon,klev),ctot(klon,klev) 49 REAL zpspsk(klon,klev),ztla(klon,klev) 50 REAL zthl(klon,klev) 51 44 52 cAA 45 53 c Coeffients de fraction lessivee : pour OFF-LINE … … 63 71 64 72 INTEGER ninter ! sous-intervals pour la precipitation 65 INTEGER ncoreczq 73 INTEGER ncoreczq 74 INTEGER iflag_cldcon 66 75 PARAMETER (ninter=5) 67 76 LOGICAL evap_prec ! evaporation de la pluie … … 72 81 real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon) 73 82 real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon) 74 real erf 83 real erf 84 REAL qcloud(klon) 75 85 c 76 86 LOGICAL cpartiel ! condensation partielle … … 82 92 c 83 93 INTEGER i, k, n, kk 84 REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 94 REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 85 95 REAL zrfl(klon), zrfln(klon), zqev, zqevt 86 96 REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq … … 130 140 zdelq=0.0 131 141 142 print*,'CLOUDTH4 A. JAM' 132 143 IF (appel1er) THEN 133 144 c … … 135 146 PRINT*, 'fisrtilp, evap_prec:', evap_prec 136 147 PRINT*, 'fisrtilp, cpartiel:', cpartiel 137 IF (ABS(dtime/ FLOAT(ninter)-360.0).GT.0.001) THEN148 IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN 138 149 PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime 139 150 PRINT*, 'Je prefere un sous-intervalle de 6 minutes' … … 322 333 c de l'eau condensee: 323 334 c 335 324 336 IF (cpartiel) THEN 325 337 … … 351 363 zq(i)=1.e-15 352 364 endif 353 enddo 354 do i=1,klon 365 enddo 366 367 if (iflag_cldcon.eq.5) then 368 369 call cloudth(klon,klev,k,ztv, 370 . zq,zqta,fraca, 371 . qcloud,ctot,zpspsk,paprs,ztla,zthl, 372 . ratqs,zqs,t) 373 374 do i=1,klon 375 rneb(i,k)=ctot(i,k) 376 zqn(i)=qcloud(i) 377 enddo 378 379 else 380 381 do i=1,klon 355 382 zpdf_sig(i)=ratqs(i,k)*zq(i) 356 383 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2)) … … 372 399 endif 373 400 374 enddo 401 enddo 402 403 endif ! iflag_cldcon 375 404 376 405 endif ! iflag_pdf … … 436 465 zfice(i) = zfice(i)**nexpo 437 466 zneb(i) = MAX(rneb(i,k), seuil_neb) 438 radliq(i,k) = zoliq(i)/ FLOAT(ninter+1)467 radliq(i,k) = zoliq(i)/REAL(ninter+1) 439 468 ENDIF 440 469 ENDDO … … 453 482 zcl =cld_lc_con 454 483 zct =1./cld_tau_con 455 zfroi = dtime/ FLOAT(ninter)/zdz(i)*zoliq(i)484 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i) 456 485 . *fallvc(zrhol(i)) * zfice(i) 457 486 else 458 487 zcl =cld_lc_lsc 459 488 zct =1./cld_tau_lsc 460 zfroi = dtime/ FLOAT(ninter)/zdz(i)*zoliq(i)489 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i) 461 490 . *fallvs(zrhol(i)) * zfice(i) 462 491 endif 463 zchau = zct *dtime/ FLOAT(ninter) * zoliq(i)492 zchau = zct *dtime/REAL(ninter) * zoliq(i) 464 493 . *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl )**2)) *(1.-zfice(i)) 465 494 ztot = zchau + zfroi … … 468 497 ztot = MIN(ztot,zoliq(i)) 469 498 zoliq(i) = MAX(zoliq(i)-ztot , 0.0) 470 radliq(i,k) = radliq(i,k) + zoliq(i)/ FLOAT(ninter+1)499 radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1) 471 500 ENDIF 472 501 ENDDO -
LMDZ4/trunk/libf/phylmd/fisrtilp_tr.F
r766 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 140 140 PRINT*, 'fisrtilp, evap_prec:', evap_prec 141 141 PRINT*, 'fisrtilp, cpartiel:', cpartiel 142 IF (ABS(dtime/ FLOAT(ninter)-360.0).GT.0.001) THEN142 IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN 143 143 PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime 144 144 PRINT*, 'Je prefere un sous-intervalle de 6 minutes' … … 335 335 zfice(i) = zfice(i)**nexpo 336 336 zneb(i) = MAX(rneb(i,k), seuil_neb) 337 radliq(i,k) = zoliq(i)/ FLOAT(ninter+1)337 radliq(i,k) = zoliq(i)/REAL(ninter+1) 338 338 ENDIF 339 339 ENDDO … … 342 342 DO i = 1, klon 343 343 IF (rneb(i,k).GT.0.0) THEN 344 zchau(i) = ct*dtime/ FLOAT(ninter) * zoliq(i)344 zchau(i) = ct*dtime/REAL(ninter) * zoliq(i) 345 345 . * (1.0-EXP(-(zoliq(i)/zneb(i)/cl)**2)) *(1.-zfice(i)) 346 346 zrhol(i) = zrho(i) * zoliq(i) / zneb(i) 347 zfroi(i) = dtime/ FLOAT(ninter)/zdz(i)*zoliq(i)347 zfroi(i) = dtime/REAL(ninter)/zdz(i)*zoliq(i) 348 348 . *fallv(zrhol(i)) * zfice(i) 349 349 ztot(i) = zchau(i) + zfroi(i) … … 351 351 ztot(i) = MIN(MAX(ztot(i),0.0),zoliq(i)) 352 352 zoliq(i) = MAX(zoliq(i)-ztot(i), 0.0) 353 radliq(i,k) = radliq(i,k) + zoliq(i)/ FLOAT(ninter+1)353 radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1) 354 354 ENDIF 355 355 ENDDO -
LMDZ4/trunk/libf/phylmd/hines_gwd.F
r1279 r1403 847 847 C Use horizontal isotropy to calculate azimuthal variances at bottom level. 848 848 C 849 AZFAC = 1. / FLOAT(NAZ)849 AZFAC = 1. / REAL(NAZ) 850 850 DO 20 N = 1,NAZ 851 851 DO 10 I = IL1,IL2 -
LMDZ4/trunk/libf/phylmd/ini_bilKP_ave.h
r766 r1403 1 1 c 2 c $ Header$2 c $Id$ 3 3 c 4 4 IF (ok_journe) THEN … … 17 17 cym ENDDO 18 18 DO ll=1,klev 19 znivsig(ll)= float(ll)19 znivsig(ll)=REAL(ll) 20 20 ENDDO 21 21 cym CALL gr_fi_ecrit(1,klon,iim,jjmp1,rlat,zx_lat) -
LMDZ4/trunk/libf/phylmd/ini_bilKP_ins.h
r766 r1403 1 1 c 2 c $ Header$2 c $Id$ 3 3 c 4 4 IF (ok_journe) THEN … … 17 17 cym ENDDO 18 18 DO ll=1,klev 19 znivsig(ll)= float(ll)19 znivsig(ll)=REAL(ll) 20 20 ENDDO 21 21 cym CALL gr_fi_ecrit(1,klon,iim,jjmp1,rlat,zx_lat) -
LMDZ4/trunk/libf/phylmd/ini_histISCCP.h
r1045 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 IF (ok_isccp) THEN … … 49 49 c 50 50 DO l=1, ncol(n) 51 vertlev(l,n)= float(l)51 vertlev(l,n)=REAL(l) 52 52 ENDDO !ncol 53 53 c -
LMDZ4/trunk/libf/phylmd/ini_histday_seri.h
r776 r1403 1 1 c 2 c $ Header$2 c $Id$ 3 3 c 4 4 cym Ne fonctionnera pas en mode parallele … … 19 19 ENDDO 20 20 DO ll=1,klev 21 znivsig(ll)= float(ll)21 znivsig(ll)=REAL(ll) 22 22 ENDDO 23 23 CALL gr_fi_ecrit(1,klon,iim,jjmp1,rlat,zx_lat) -
LMDZ4/trunk/libf/phylmd/ini_histmthNMC.h
r1400 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c$OMP MASTER … … 17 17 cym ENDDO 18 18 DO ll=1,klev 19 znivsig(ll)= float(ll)19 znivsig(ll)=REAL(ll) 20 20 ENDDO 21 21 cym CALL gr_fi_ecrit(1,klon,iim,jjmp1,rlat,zx_lat) -
LMDZ4/trunk/libf/phylmd/ini_histrac.h
r1279 r1403 14 14 CALL histdef(nid_tra, "aire", "Grid area", "-", & 15 15 iim,jj_nb,nhori, 1,1,1, -99, 32,"once", zsto,zout) 16 CALL histdef(nid_tra, "zmasse", "column density of air in cell", & 17 "kg m-2", iim, jj_nb, nhori, klev, 1, klev, nvert, 32, "ave(X)", & 18 zsto,zout) 16 19 17 20 !TRACEURS … … 91 94 "inst(X)", zout,zout) 92 95 ! DIVERS 93 CALL histdef(nid_tra, "pplay", " flux u mont","-",&96 CALL histdef(nid_tra, "pplay", "pressure","-", & 94 97 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 95 98 "inst(X)", zout,zout) 96 CALL histdef(nid_tra, " t", "flux u mont","-", &99 CALL histdef(nid_tra, "T", "temperature","K", & 97 100 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 98 101 "inst(X)", zout,zout) -
LMDZ4/trunk/libf/phylmd/ini_undefSTD.F
r1398 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 -
LMDZ4/trunk/libf/phylmd/ini_wake.F
r970 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE INI_WAKE(wape,fip,it_wape_prescr, 2 5 : wape_prescr, fip_prescr, alp_bl_prescr, ale_bl_prescr) … … 23 26 c wape_prescr : valeur prescrite de la WAPE. 24 27 c fip_prescr : valeur prescrite de la FIP. 28 c ale_bl_prescr : valeur prescrite de la Ale de PBL. 29 c alp_bl_prescr : valeur prescrite de la Alp de PBL. 25 30 c 26 31 c Variables internes … … 29 34 c w = WAPE lue 30 35 c f = FIP lue 36 c alebl = Ale de PBL lue 37 c alpbl = Alp de PBL lue 31 38 c 39 include 'iniprint.h' 32 40 cdeclarations 33 41 real ale_bl_prescr 34 42 real alp_bl_prescr 35 43 real it 36 cCR: on rajoute ale et alp de la PBL precrits37 c open (99,file='wake.data',form='formatted')38 c read (99,*) it39 c read (99,*) w40 c read (99,*) f41 c read (99,*) u42 c read (99,*) p43 c close (99)44 44 45 45 ! FH A mettre si besoin dans physiq.def … … 48 48 w=4. 49 49 f=0.1 50 u=0.151 p=4.50 alebl=4. 51 alpbl=0.1 52 52 c 53 print *,' it,w ',it,w 53 cCR: on rajoute ale et alp de la PBL precrits 54 open (99,file='ini_wake_param.data',form='formatted', 55 s status='old',err=902) 56 read (99,*) it 57 read (99,*) w 58 read (99,*) f 59 read (99,*,end=901) alebl 60 read (99,*,end=901) alpbl 61 901 close (99) 62 902 continue 63 c 64 write(lunout,*)' it,wape ',it,wape 54 65 it_wape_prescr = it 55 66 if (w .lt. 0) then … … 61 72 endif 62 73 c 63 print *,' u,p ',u,p64 al p_bl_prescr=u65 al e_bl_prescr=p74 write(lunout,*)' alebl, alpbl ',alebl,alpbl 75 ale_bl_prescr=alebl 76 alp_bl_prescr=alpbl 66 77 print *,'Initialisation de la poche : WAPE, FIP imposees =' 67 78 $ ,wape_prescr, fip_prescr -
LMDZ4/trunk/libf/phylmd/inifis.F
r987 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE inifis(ngrid,nlayer, … … 45 45 cym#include "dimphy.h" 46 46 47 INCLUDE 'iniprint.h' 47 48 REAL prad,pg,pr,pcpp,punjours 48 49 … … 52 53 53 54 REAL ptimestep 55 CHARACTER (LEN=20) :: modname='inifis' 56 CHARACTER (LEN=80) :: abort_message 57 54 58 55 59 IF (nlayer.NE.klev) THEN … … 58 62 PRINT*,'nlayer = ',nlayer 59 63 PRINT*,'klev = ',klev 60 STOP 64 abort_message = '' 65 CALL abort_gcm (modname,abort_message,1) 61 66 ENDIF 62 67 … … 66 71 PRINT*,'ngrid = ',ngrid 67 72 PRINT*,'klon = ',klon 68 STOP 73 abort_message = '' 74 CALL abort_gcm (modname,abort_message,1) 69 75 ENDIF 70 76 71 77 RETURN 72 9999 STOP'Cette version demande les fichier rnatur.dat et surf.def' 78 9999 continue 79 abort_message = 'Cette version demande les fichier rnatur.dat 80 & et surf.def' 81 CALL abort_gcm (modname,abort_message,1) 82 73 83 END -
LMDZ4/trunk/libf/phylmd/iniphysiq.F
r879 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 61 61 62 62 REAL ptimestep 63 CHARACTER (LEN=20) :: modname='iniphysiq' 64 CHARACTER (LEN=80) :: abort_message 63 65 64 66 IF (nlayer.NE.klev) THEN … … 67 69 PRINT*,'nlayer = ',nlayer 68 70 PRINT*,'klev = ',klev 69 STOP 71 abort_message = '' 72 CALL abort_gcm (modname,abort_message,1) 70 73 ENDIF 71 74 … … 75 78 PRINT*,'ngrid = ',ngrid 76 79 PRINT*,'klon = ',klon_glo 77 STOP 80 abort_message = '' 81 CALL abort_gcm (modname,abort_message,1) 78 82 ENDIF 79 83 c$OMP PARALLEL PRIVATE(ibegin,iend) … … 96 100 97 101 RETURN 98 9999 STOP'Cette version demande les fichier rnatur.dat et surf.def' 102 9999 CONTINUE 103 abort_message ='Cette version demande les fichier rnatur.dat 104 & et surf.def' 105 CALL abort_gcm (modname,abort_message,1) 106 99 107 END -
LMDZ4/trunk/libf/phylmd/initphysto.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 C … … 12 12 USE IOIPSL 13 13 USE iophy 14 USE control_mod 15 14 16 implicit none 15 17 … … 52 54 #include "serre.h" 53 55 #include "indicesol.h" 54 #include "control.h"55 56 cym#include "dimphy.h" 56 57 … … 108 109 C 109 110 DO l=1,llm 110 nivsigs(l)= float(l)111 nivsigs(l)=REAL(l) 111 112 ENDDO 112 113 -
LMDZ4/trunk/libf/phylmd/initrrnpb.F90
r1279 r1403 1 1 ! 2 ! $Id 2 ! $Id$ 3 3 ! 4 4 SUBROUTINE initrrnpb(ftsol,pctsrf,masktr,fshtr,hsoltr,tautr,vdeptr,scavtr) … … 39 39 REAL :: s 40 40 41 CHARACTER (LEN=20) :: modname='initrrnpb' 42 CHARACTER (LEN=80) :: abort_message 43 44 41 45 WRITE(*,*)'PASSAGE initrrnpb ...' 42 46 ! 43 47 ! Radon it = 1 44 48 !---------------- 45 IF ( nbtr .LE. 0 ) STOP '**PHYTRAC:initrrnpb:** nbtr < 0; verifier RN dans traceur.def' 49 IF ( nbtr .LE. 0 ) then 50 abort_message = '**PHYTRAC:initrrnpb:** nbtr < 0; verifier RN dans traceur.def' 51 CALL abort_gcm (modname,abort_message,1) 52 ENDIF 46 53 it = 1 47 54 s = 1.E4 ! Source: atome par m2 … … 68 75 ! 210Pb it = 2 69 76 !---------------- 70 IF ( nbtr .LE. 1 ) STOP '**PHYTRAC**:initrrnpb:** nbtr <= 1; verifier PB dans traceur.def' 77 IF ( nbtr .LE. 1 ) THEN 78 abort_message='**PHYTRAC**:initrrnpb:** nbtr <= 1; verifier PB dans traceur.def' 79 CALL abort_gcm (modname,abort_message,1) 80 ENDIF 71 81 it = 2 72 82 s = 0. ! Pas de source -
LMDZ4/trunk/libf/phylmd/iostart.F90
r1001 r1403 5 5 INTEGER,SAVE :: nid_restart 6 6 7 INTEGER,SAVE :: idim1,idim2,idim3 7 INTEGER,SAVE :: idim1,idim2,idim3,idim4 8 8 INTEGER,PARAMETER :: length=100 9 9 … … 317 317 ierr = NF90_DEF_DIM (nid_restart, "points_physiques", klon_glo, idim2) 318 318 ierr = NF90_DEF_DIM (nid_restart, "horizon_vertical", klon_glo*klev, idim3) 319 ierr = NF90_DEF_DIM (nid_restart, "horizon_klevp1", klon_glo*klevp1, idim4) 319 320 320 321 ierr = NF90_ENDDEF(nid_restart) … … 386 387 387 388 IF (is_mpi_root .AND. is_omp_root) THEN 388 389 389 390 IF (field_size==1) THEN 390 391 idim=idim2 391 392 ELSE IF (field_size==klev) THEN 392 393 idim=idim3 394 ELSE IF (field_size==klevp1) THEN 395 idim=idim4 393 396 ELSE 394 397 PRINT *, "erreur phyredem : probleme de dimension" … … 467 470 468 471 IF (is_mpi_root .AND. is_omp_root) THEN 469 472 470 473 IF (var_size/=length) THEN 471 474 PRINT *, "erreur phyredem : probleme de dimension" -
LMDZ4/trunk/libf/phylmd/mod_phys_lmdz_omp_data.F90
r1001 r1403 1 1 ! 2 !$ Header$2 !$Id$ 3 3 ! 4 4 MODULE mod_phys_lmdz_omp_data … … 27 27 INTEGER :: i 28 28 29 CHARACTER (LEN=20) :: modname='Init_phys_lmdz_omp_data' 30 CHARACTER (LEN=80) :: abort_message 31 32 29 33 #ifdef CPP_OMP 30 34 INTEGER :: OMP_GET_NUM_THREADS … … 51 55 is_omp_root=.TRUE. 52 56 ELSE 53 PRINT *,'ANORMAL : OMP_MASTER /= 0'54 STOP57 abort_message = 'ANORMAL : OMP_MASTER /= 0' 58 CALL abort_gcm (modname,abort_message,1) 55 59 ENDIF 56 60 !$OMP END MASTER -
LMDZ4/trunk/libf/phylmd/moy_undefSTD.F
r1398 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE moy_undefSTD(itap,freq_outNMC,freq_moyNMC) -
LMDZ4/trunk/libf/phylmd/o3cm.F
r524 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE o3cm (amb, bmb, sortie, ntab) … … 19 19 c====================================================================== 20 20 external mbtozm 21 CHARACTER (LEN=20) :: modname='' 22 CHARACTER (LEN=80) :: abort_message 21 23 c====================================================================== 22 24 c la fonction en ligne w(x) donne le profil de l'ozone en fonction … … 27 29 w(x) = wp/h * EXP((x-xp)/h)/ (con+EXP((x-xp)/h))**2 28 30 c====================================================================== 29 IF (ntab .GT. 499) STOP 'BIG ntab' 30 xincr = (bmb-amb) / FLOAT(ntab) 31 IF (ntab .GT. 499) THEN 32 abort_message = 'BIG ntab' 33 CALL abort_gcm (modname,abort_message,1) 34 ENDIF 35 xincr = (bmb-amb) / REAL(ntab) 31 36 xtab(1) = amb 32 37 DO n = 2, ntab -
LMDZ4/trunk/libf/phylmd/orografi.F
r1279 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE drag_noro (nlon,nlev,dtime,paprs,pplay, … … 1497 1497 * ZDVDT(KLON) 1498 1498 REAL ZHCRIT(KLON,KLEV) 1499 CHARACTER (LEN=20) :: modname='orografi' 1500 CHARACTER (LEN=80) :: abort_message 1499 1501 C----------------------------------------------------------------------- 1500 1502 C … … 1504 1506 LIFTHIGH=.FALSE. 1505 1507 1506 IF(NLON.NE.KLON.OR.NLEV.NE.KLEV)STOP 1508 IF(NLON.NE.KLON.OR.NLEV.NE.KLEV)THEN 1509 abort_message = 'pb dimension' 1510 CALL abort_gcm (modname,abort_message,1) 1511 ENDIF 1507 1512 ZCONS1=1./RD 1508 1513 cym KLEVM1=KLEV-1 -
LMDZ4/trunk/libf/phylmd/orografi_strato.F
r1001 r1403 89 89 REAL pt(klon,klev), pu(klon,klev), pv(klon,klev) 90 90 REAL papmf(klon,klev),papmh(klon,klev+1) 91 CHARACTER (LEN=20) :: modname='orografi_strato' 92 CHARACTER (LEN=80) :: abort_message 91 93 c 92 94 c INITIALIZE OUTPUT VARIABLES … … 1680 1682 logical lifthigh 1681 1683 real zcons1,ztmst 1684 CHARACTER (LEN=20) :: modname='orolift_strato' 1685 CHARACTER (LEN=80) :: abort_message 1686 1682 1687 1683 1688 C----------------------------------------------------------------------- … … 1688 1693 lifthigh=.false. 1689 1694 1690 if(nlon.ne.klon.or.nlev.ne.klev)stop 1695 if(nlon.ne.klon.or.nlev.ne.klev) then 1696 abort_message = 'pb dimension' 1697 CALL abort_gcm (modname,abort_message,1) 1698 ENDIF 1691 1699 zcons1=1./rd 1692 1700 ztmst=ptsphy -
LMDZ4/trunk/libf/phylmd/pbl_surface_mod.F90
r1282 r1403 22 22 USE climb_wind_mod, ONLY : climb_wind_down, climb_wind_up 23 23 USE coef_diff_turb_mod, ONLY : coef_diff_turb 24 USE control_mod 25 24 26 25 27 IMPLICIT NONE … … 257 259 INCLUDE "YOETHF.h" 258 260 INCLUDE "temps.h" 259 INCLUDE "control.h"260 261 ! Input variables 261 262 !**************************************************************************************** … … 483 484 484 485 ! Initialize ok_flux_surf (for 1D model) 485 ok_flux_surf=.FALSE.486 if (klon>1) ok_flux_surf=.FALSE. 486 487 487 488 ! Initilize debug IO … … 657 658 tabindx(:)=0. 658 659 DO i=1,knon 659 tabindx(i)= FLOAT(i)660 tabindx(i)=REAL(i) 660 661 END DO 661 662 debugtab(:,:) = 0. -
LMDZ4/trunk/libf/phylmd/phyetat0.F
r1319 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 228 228 $ 'coherente ', i, zmasq(i), pctsrf(i, is_ter) 229 229 $ ,pctsrf(i, is_lic) 230 WRITE(*,*) 'Je force la coherence zmasq=fractint' 230 231 zmasq(i) = fractint(i) 231 232 ENDIF … … 238 239 $ 'coherente ', i, zmasq(i) , pctsrf(i, is_oce) 239 240 $ ,pctsrf(i, is_sic) 241 WRITE(*,*) 'Je force la coherence zmasq=fractint' 240 242 zmasq(i) = fractint(i) 241 243 ENDIF … … 987 989 PRINT*,'(ecart-type) wake_cstar:', xmin, xmax 988 990 c 991 c wake_pe 992 c 993 CALL get_field("WAKE_PE",wake_pe,found) 994 IF (.NOT. found) THEN 995 PRINT*, "phyetat0: Le champ <WAKE_PE> est absent" 996 PRINT*, "Depart legerement fausse. Mais je continue" 997 wake_pe=0. 998 ENDIF 999 xmin = 1.0E+20 1000 xmax = -1.0E+20 1001 xmin = MINval(wake_pe) 1002 xmax = MAXval(wake_pe) 1003 PRINT*,'(ecart-type) wake_pe:', xmin, xmax 1004 c 989 1005 c wake_fip 990 1006 c … … 1000 1016 xmax = MAXval(wake_fip) 1001 1017 PRINT*,'(ecart-type) wake_fip:', xmin, xmax 1018 c 1019 c thermiques 1020 c 1021 1022 CALL get_field("FM_THERM",fm_therm,found) 1023 IF (.NOT. found) THEN 1024 PRINT*, "phyetat0: Le champ <fm_therm> est absent" 1025 PRINT*, "Depart legerement fausse. Mais je continue" 1026 fm_therm=0. 1027 ENDIF 1028 xmin = 1.0E+20 1029 xmax = -1.0E+20 1030 xmin = MINval(fm_therm) 1031 xmax = MAXval(fm_therm) 1032 PRINT*,'(ecart-type) fm_therm:', xmin, xmax 1033 1034 CALL get_field("ENTR_THERM",entr_therm,found) 1035 IF (.NOT. found) THEN 1036 PRINT*, "phyetat0: Le champ <entr_therm> est absent" 1037 PRINT*, "Depart legerement fausse. Mais je continue" 1038 entr_therm=0. 1039 ENDIF 1040 xmin = 1.0E+20 1041 xmax = -1.0E+20 1042 xmin = MINval(entr_therm) 1043 xmax = MAXval(entr_therm) 1044 PRINT*,'(ecart-type) entr_therm:', xmin, xmax 1045 1046 CALL get_field("DETR_THERM",detr_therm,found) 1047 IF (.NOT. found) THEN 1048 PRINT*, "phyetat0: Le champ <detr_therm> est absent" 1049 PRINT*, "Depart legerement fausse. Mais je continue" 1050 detr_therm=0. 1051 ENDIF 1052 xmin = 1.0E+20 1053 xmax = -1.0E+20 1054 xmin = MINval(detr_therm) 1055 xmax = MAXval(detr_therm) 1056 PRINT*,'(ecart-type) detr_therm:', xmin, xmax 1057 1058 1059 1002 1060 c 1003 1061 c Read and send field trs to traclmdz -
LMDZ4/trunk/libf/phylmd/phyredem.F
r1303 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 14 14 USE traclmdz_mod, ONLY : traclmdz_to_restart 15 15 USE infotrac 16 USE control_mod 17 16 18 17 19 IMPLICIT none … … 24 26 #include "dimsoil.h" 25 27 #include "clesphys.h" 26 #include "control.h"27 28 #include "temps.h" 28 29 #include "thermcell.h" … … 247 248 ENDDO 248 249 c 249 CALL put_field("ZMEA"," ",zmea)250 c 251 CALL put_field("ZSTD"," ",zstd)252 253 CALL put_field("ZSIG"," ",zsig)254 255 CALL put_field("ZGAM"," ",zgam)256 257 CALL put_field("ZTHE"," ",zthe)258 259 CALL put_field("ZPIC"," ",zpic)260 261 CALL put_field("ZVAL"," ",zval)250 CALL put_field("ZMEA","ZMEA",zmea) 251 c 252 CALL put_field("ZSTD","ZSTD",zstd) 253 254 CALL put_field("ZSIG","ZSIG",zsig) 255 256 CALL put_field("ZGAM","ZGAM",zgam) 257 258 CALL put_field("ZTHE","ZTHE",zthe) 259 260 CALL put_field("ZPIC","ZPIC",zpic) 261 262 CALL put_field("ZVAL","ZVAL",zval) 262 263 263 264 CALL put_field("RUGSREL","RUGSREL",rugoro) 264 265 265 CALL put_field("TANCIEN"," ",t_ancien)266 267 CALL put_field("QANCIEN"," ",q_ancien)266 CALL put_field("TANCIEN","TANCIEN",t_ancien) 267 268 CALL put_field("QANCIEN","QANCIEN",q_ancien) 268 269 269 270 CALL put_field("RUGMER","Longueur de rugosite sur mer", … … 298 299 !!!!!!!!!!!!!!!!!!!! FIN TKE PBL !!!!!!!!!!!!!!!!!!!!!!!!! 299 300 cIM ajout zmax0, f0, ema_work1, ema_work2 300 cIM wake_deltat, wake_deltaq, wake_s, wake_cstar, wake_ fip301 302 CALL put_field("ZMAX0"," ",zmax0)303 304 CALL put_field("F0"," ",f0)305 306 CALL put_field("EMA_WORK1"," ",ema_work1)307 308 CALL put_field("EMA_WORK2"," ",ema_work2)301 cIM wake_deltat, wake_deltaq, wake_s, wake_cstar, wake_pe, wake_fip 302 303 CALL put_field("ZMAX0","ZMAX0",zmax0) 304 305 CALL put_field("F0","F0",f0) 306 307 CALL put_field("EMA_WORK1","EMA_WORK1",ema_work1) 308 309 CALL put_field("EMA_WORK2","EMA_WORK2",ema_work2) 309 310 310 311 c wake_deltat 311 CALL put_field("WAKE_DELTAT","",wake_deltat) 312 313 CALL put_field("WAKE_DELTAQ","",wake_deltaq) 314 315 CALL put_field("WAKE_S","",wake_s) 316 317 CALL put_field("WAKE_CSTAR","",wake_cstar) 318 319 CALL put_field("WAKE_FIP","",wake_fip) 320 312 CALL put_field("WAKE_DELTAT","WAKE_DELTAT",wake_deltat) 313 314 CALL put_field("WAKE_DELTAQ","WAKE_DELTAQ",wake_deltaq) 315 316 CALL put_field("WAKE_S","WAKE_S",wake_s) 317 318 CALL put_field("WAKE_CSTAR","WAKE_CSTAR",wake_cstar) 319 320 CALL put_field("WAKE_PE","WAKE_PE",wake_pe) 321 322 CALL put_field("WAKE_FIP","WAKE_FIP",wake_fip) 323 324 c thermiques 325 326 CALL put_field("FM_THERM","FM_THERM",fm_therm) 327 328 CALL put_field("ENTR_THERM","ENTR_THERM",entr_therm) 329 330 CALL put_field("DETR_THERM","DETR_THERM",detr_therm) 321 331 322 332 ! trs from traclmdz_mod -
LMDZ4/trunk/libf/phylmd/phys_output_mod.F90
r1400 r1403 10 10 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 11 11 12 MODULE phys_output_mod 12 MODULE phys_output_mod 13 13 14 14 IMPLICIT NONE … … 60 60 61 61 !!! 2D 62 type(ctrl_out),save :: o_flat = ctrl_out((/ 5, 1, 10, 10, 5 /),'flat') 63 type(ctrl_out),save :: o_slp = ctrl_out((/ 1, 1, 1, 10, 10 /),'slp') 64 type(ctrl_out),save :: o_tsol = ctrl_out((/ 1, 1, 1, 5, 10 /),'tsol') 65 type(ctrl_out),save :: o_t2m = ctrl_out((/ 1, 1, 1, 5, 10 /),'t2m') 62 63 type(ctrl_out),save :: o_flat = ctrl_out((/ 5, 1, 10, 5, 1 /),'flat') 64 type(ctrl_out),save :: o_slp = ctrl_out((/ 1, 1, 1, 10, 1 /),'slp') 65 type(ctrl_out),save :: o_tsol = ctrl_out((/ 1, 1, 1, 5, 1 /),'tsol') 66 type(ctrl_out),save :: o_t2m = ctrl_out((/ 1, 1, 1, 5, 1 /),'t2m') 66 67 type(ctrl_out),save :: o_t2m_min = ctrl_out((/ 1, 1, 10, 10, 10 /),'t2m_min') 67 68 type(ctrl_out),save :: o_t2m_max = ctrl_out((/ 1, 1, 10, 10, 10 /),'t2m_max') … … 74 75 type(ctrl_out),save :: o_wind10max = ctrl_out((/ 10, 1, 10, 10, 10 /),'wind10max') 75 76 type(ctrl_out),save :: o_sicf = ctrl_out((/ 1, 1, 10, 10, 10 /),'sicf') 76 type(ctrl_out),save :: o_q2m = ctrl_out((/ 1, 1, 1, 5, 1 0/),'q2m')77 type(ctrl_out),save :: o_u10m = ctrl_out((/ 1, 1, 1, 5, 1 0/),'u10m')78 type(ctrl_out),save :: o_v10m = ctrl_out((/ 1, 1, 1, 5, 1 0/),'v10m')79 type(ctrl_out),save :: o_psol = ctrl_out((/ 1, 1, 1, 5, 1 0/),'psol')77 type(ctrl_out),save :: o_q2m = ctrl_out((/ 1, 1, 1, 5, 1 /),'q2m') 78 type(ctrl_out),save :: o_u10m = ctrl_out((/ 1, 1, 1, 5, 1 /),'u10m') 79 type(ctrl_out),save :: o_v10m = ctrl_out((/ 1, 1, 1, 5, 1 /),'v10m') 80 type(ctrl_out),save :: o_psol = ctrl_out((/ 1, 1, 1, 5, 1 /),'psol') 80 81 type(ctrl_out),save :: o_qsurf = ctrl_out((/ 1, 10, 10, 10, 10 /),'qsurf') 81 82 … … 93 94 94 95 type(ctrl_out),save :: o_ndayrain = ctrl_out((/ 1, 10, 10, 10, 10 /),'ndayrain') 95 type(ctrl_out),save :: o_precip = ctrl_out((/ 1, 1, 1, 10, 5/),'precip')96 type(ctrl_out),save :: o_precip = ctrl_out((/ 1, 1, 1, 5, 10 /),'precip') 96 97 type(ctrl_out),save :: o_plul = ctrl_out((/ 1, 1, 1, 10, 10 /),'plul') 97 98 98 type(ctrl_out),save :: o_pluc = ctrl_out((/ 1, 1, 1, 10, 5/),'pluc')99 type(ctrl_out),save :: o_snow = ctrl_out((/ 1, 1, 10, 10, 5/),'snow')99 type(ctrl_out),save :: o_pluc = ctrl_out((/ 1, 1, 1, 5, 10 /),'pluc') 100 type(ctrl_out),save :: o_snow = ctrl_out((/ 1, 1, 10, 5, 10 /),'snow') 100 101 type(ctrl_out),save :: o_evap = ctrl_out((/ 1, 1, 10, 10, 10 /),'evap') 101 102 type(ctrl_out),save,dimension(4) :: o_evap_srf = (/ ctrl_out((/ 1, 1, 10, 10, 10 /),'evap_ter'), & … … 136 137 type(ctrl_out),save :: o_soll0 = ctrl_out((/ 1, 5, 10, 10, 10 /),'soll0') 137 138 type(ctrl_out),save :: o_radsol = ctrl_out((/ 1, 1, 10, 10, 10 /),'radsol') 138 type(ctrl_out),save :: o_SWupSFC = ctrl_out((/ 1, 4, 10, 10, 5/),'SWupSFC')139 type(ctrl_out),save :: o_SWupSFCclr = ctrl_out((/ 1, 4, 10, 10, 5/),'SWupSFCclr')140 type(ctrl_out),save :: o_SWdnSFC = ctrl_out((/ 1, 1, 10, 10, 5/),'SWdnSFC')141 type(ctrl_out),save :: o_SWdnSFCclr = ctrl_out((/ 1, 4, 10, 10, 5/),'SWdnSFCclr')142 type(ctrl_out),save :: o_LWupSFC = ctrl_out((/ 1, 4, 10, 10, 5/),'LWupSFC')143 type(ctrl_out),save :: o_LWupSFCclr = ctrl_out((/ 1, 4, 10, 10, 5/),'LWupSFCclr')144 type(ctrl_out),save :: o_LWdnSFC = ctrl_out((/ 1, 4, 10, 10, 5/),'LWdnSFC')145 type(ctrl_out),save :: o_LWdnSFCclr = ctrl_out((/ 1, 4, 10, 10, 5/),'LWdnSFCclr')139 type(ctrl_out),save :: o_SWupSFC = ctrl_out((/ 1, 4, 10, 5, 10 /),'SWupSFC') 140 type(ctrl_out),save :: o_SWupSFCclr = ctrl_out((/ 1, 4, 10, 10, 10 /),'SWupSFCclr') 141 type(ctrl_out),save :: o_SWdnSFC = ctrl_out((/ 1, 1, 10, 5, 10 /),'SWdnSFC') 142 type(ctrl_out),save :: o_SWdnSFCclr = ctrl_out((/ 1, 4, 10, 5, 10 /),'SWdnSFCclr') 143 type(ctrl_out),save :: o_LWupSFC = ctrl_out((/ 1, 4, 10, 10, 10 /),'LWupSFC') 144 type(ctrl_out),save :: o_LWupSFCclr = ctrl_out((/ 1, 4, 10, 5, 10 /),'LWupSFCclr') 145 type(ctrl_out),save :: o_LWdnSFC = ctrl_out((/ 1, 4, 10, 5, 10 /),'LWdnSFC') 146 type(ctrl_out),save :: o_LWdnSFCclr = ctrl_out((/ 1, 4, 10, 5, 10 /),'LWdnSFCclr') 146 147 type(ctrl_out),save :: o_bils = ctrl_out((/ 1, 2, 10, 5, 10 /),'bils') 147 type(ctrl_out),save :: o_sens = ctrl_out((/ 1, 1, 10, 10, 5/),'sens')148 type(ctrl_out),save :: o_sens = ctrl_out((/ 1, 1, 10, 5, 10 /),'sens') 148 149 type(ctrl_out),save :: o_fder = ctrl_out((/ 1, 2, 10, 10, 10 /),'fder') 149 150 type(ctrl_out),save :: o_ffonte = ctrl_out((/ 1, 10, 10, 10, 10 /),'ffonte') … … 215 216 type(ctrl_out),save :: o_cldm = ctrl_out((/ 1, 1, 10, 10, 10 /),'cldm') 216 217 type(ctrl_out),save :: o_cldh = ctrl_out((/ 1, 1, 10, 10, 10 /),'cldh') 217 type(ctrl_out),save :: o_cldt = ctrl_out((/ 1, 1, 2, 10, 5/),'cldt')218 type(ctrl_out),save :: o_cldt = ctrl_out((/ 1, 1, 2, 5, 10 /),'cldt') 218 219 type(ctrl_out),save :: o_cldq = ctrl_out((/ 1, 1, 10, 10, 10 /),'cldq') 219 220 type(ctrl_out),save :: o_lwp = ctrl_out((/ 1, 5, 10, 10, 10 /),'lwp') … … 230 231 type(ctrl_out),save :: o_prw = ctrl_out((/ 1, 1, 10, 10, 10 /),'prw') 231 232 232 type(ctrl_out),save :: o_s_pblh = ctrl_out((/ 1, 10, 10, 10, 1 0/),'s_pblh')233 type(ctrl_out),save :: o_s_pblt = ctrl_out((/ 1, 10, 10, 10, 1 0/),'s_pblt')233 type(ctrl_out),save :: o_s_pblh = ctrl_out((/ 1, 10, 10, 10, 1 /),'s_pblh') 234 type(ctrl_out),save :: o_s_pblt = ctrl_out((/ 1, 10, 10, 10, 1 /),'s_pblt') 234 235 type(ctrl_out),save :: o_s_lcl = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_lcl') 235 type(ctrl_out),save :: o_s_therm = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_therm') 236 !IM : Les champs suivants (s_capCL, s_oliqCL, s_cteiCL, s_trmb1, s_trmb2, s_trmb3) ne sont pas definis dans HBTM.F 237 ! type(ctrl_out),save :: o_s_capCL = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_capCL') 238 ! type(ctrl_out),save :: o_s_oliqCL = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_oliqCL') 239 ! type(ctrl_out),save :: o_s_cteiCL = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_cteiCL') 240 ! type(ctrl_out),save :: o_s_trmb1 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb1') 241 ! type(ctrl_out),save :: o_s_trmb2 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb2') 242 ! type(ctrl_out),save :: o_s_trmb3 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb3') 236 type(ctrl_out),save :: o_s_capCL = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_capCL') 237 type(ctrl_out),save :: o_s_oliqCL = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_oliqCL') 238 type(ctrl_out),save :: o_s_cteiCL = ctrl_out((/ 1, 10, 10, 10, 1 /),'s_cteiCL') 239 type(ctrl_out),save :: o_s_therm = ctrl_out((/ 1, 10, 10, 10, 1 /),'s_therm') 240 type(ctrl_out),save :: o_s_trmb1 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb1') 241 type(ctrl_out),save :: o_s_trmb2 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb2') 242 type(ctrl_out),save :: o_s_trmb3 = ctrl_out((/ 1, 10, 10, 10, 10 /),'s_trmb3') 243 243 244 244 type(ctrl_out),save :: o_slab_bils = ctrl_out((/ 1, 1, 10, 10, 10 /),'slab_bils_oce') … … 357 357 type(ctrl_out),save :: o_solswai = ctrl_out((/ 2, 10, 10, 10, 10 /),'solswai') 358 358 359 type(ctrl_out),save,dimension(10) :: o_tausumaero = (/ ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_ASBCM'), &360 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_ASPOMM'), &361 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_ASSO4M'), &362 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_CSSO4M'), &363 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_SSSSM'), &364 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_ASSSM'), &365 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_CSSSM'), &366 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_CIDUSTM'), &367 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_AIBCM'), &368 ctrl_out((/ 2, 6, 10, 10, 10 /),'OD550_AIPOMM') /)369 370 type(ctrl_out),save :: o_od550aer = ctrl_out((/ 2, 6, 10, 10, 10 /),'od550aer')371 type(ctrl_out),save :: o_od865aer = ctrl_out((/ 2, 6, 10, 10, 10 /),'od865aer')372 type(ctrl_out),save :: o_absvisaer = ctrl_out((/ 2, 6, 10, 10, 10 /),'absvisaer')373 type(ctrl_out),save :: o_od550lt1aer = ctrl_out((/ 2, 6, 10, 10, 10 /),'od550lt1aer')374 375 type(ctrl_out),save :: o_sconcso4 = ctrl_out((/ 2, 6, 10, 10, 10 /),'sconcso4')376 type(ctrl_out),save :: o_sconcoa = ctrl_out((/ 2, 6, 10, 10, 10 /),'sconcoa')377 type(ctrl_out),save :: o_sconcbc = ctrl_out((/ 2, 6, 10, 10, 10 /),'sconcbc')378 type(ctrl_out),save :: o_sconcss = ctrl_out((/ 2, 6, 10, 10, 10 /),'sconcss')379 type(ctrl_out),save :: o_sconcdust = ctrl_out((/ 2, 6, 10, 10, 10 /),'sconcdust')380 type(ctrl_out),save :: o_concso4 = ctrl_out((/ 2, 6, 10, 10, 10 /),'concso4')381 type(ctrl_out),save :: o_concoa = ctrl_out((/ 2, 6, 10, 10, 10 /),'concoa')382 type(ctrl_out),save :: o_concbc = ctrl_out((/ 2, 6, 10, 10, 10 /),'concbc')383 type(ctrl_out),save :: o_concss = ctrl_out((/ 2, 6, 10, 10, 10 /),'concss')384 type(ctrl_out),save :: o_concdust = ctrl_out((/ 2, 6, 10, 10, 10 /),'concdust')385 type(ctrl_out),save :: o_loadso4 = ctrl_out((/ 2, 6, 10, 10, 10 /),'loadso4')386 type(ctrl_out),save :: o_loadoa = ctrl_out((/ 2, 6, 10, 10, 10 /),'loadoa')387 type(ctrl_out),save :: o_loadbc = ctrl_out((/ 2, 6, 10, 10, 10 /),'loadbc')388 type(ctrl_out),save :: o_loadss = ctrl_out((/ 2, 6, 10, 10, 10 /),'loadss')389 type(ctrl_out),save :: o_loaddust = ctrl_out((/ 2, 6, 10, 10, 10 /),'loaddust')390 391 type(ctrl_out),save :: o_swtoaas_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoaas_nat') 392 type(ctrl_out),save :: o_sw srfas_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfas_nat')393 type(ctrl_out),save :: o_sw toacs_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoacs_nat')394 type(ctrl_out),save :: o_sw srfcs_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfcs_nat')395 396 type(ctrl_out),save :: o_swtoaas_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoaas_ant') 397 type(ctrl_out),save :: o_sw srfas_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfas_ant')398 type(ctrl_out),save :: o_sw toacs_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoacs_ant')399 type(ctrl_out),save :: o_sw srfcs_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfcs_ant')400 401 type(ctrl_out),save :: o_swtoacf_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoacf_nat')402 type(ctrl_out),save :: o_swsrfcf_nat = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfcf_nat')403 type(ctrl_out),save :: o_swtoacf_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoacf_ant')404 type(ctrl_out),save :: o_swsrfcf_ant = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfcf_ant')405 type(ctrl_out),save :: o_swtoacf_zero = ctrl_out((/ 4, 6, 10, 10, 10 /),'swtoacf_zero')406 type(ctrl_out),save :: o_swsrfcf_zero = ctrl_out((/ 4, 6, 10, 10, 10 /),'swsrfcf_zero')407 408 type(ctrl_out),save :: o_cldncl = ctrl_out((/ 2, 6, 10, 10, 10 /),'cldncl')409 type(ctrl_out),save :: o_reffclwtop = ctrl_out((/ 2, 6, 10, 10, 10 /),'reffclwtop')410 type(ctrl_out),save :: o_cldnvi = ctrl_out((/ 2, 6, 10, 10, 10 /),'cldnvi')411 type(ctrl_out),save :: o_lcc = ctrl_out((/ 2, 6, 10, 10, 10 /),'lcc')359 type(ctrl_out),save,dimension(10) :: o_tausumaero = (/ ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_ASBCM'), & 360 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_ASPOMM'), & 361 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_ASSO4M'), & 362 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_CSSO4M'), & 363 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_SSSSM'), & 364 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_ASSSM'), & 365 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_CSSSM'), & 366 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_CIDUSTM'), & 367 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_AIBCM'), & 368 ctrl_out((/ 4, 4, 10, 10, 10 /),'OD550_AIPOMM') /) 369 370 type(ctrl_out),save :: o_od550aer = ctrl_out((/ 4, 4, 10, 10, 10 /),'od550aer') 371 type(ctrl_out),save :: o_od865aer = ctrl_out((/ 4, 4, 10, 10, 10 /),'od865aer') 372 type(ctrl_out),save :: o_absvisaer = ctrl_out((/ 4, 4, 10, 10, 10 /),'absvisaer') 373 type(ctrl_out),save :: o_od550lt1aer = ctrl_out((/ 4, 4, 10, 10, 10 /),'od550lt1aer') 374 375 type(ctrl_out),save :: o_sconcso4 = ctrl_out((/ 4, 4, 10, 10, 10 /),'sconcso4') 376 type(ctrl_out),save :: o_sconcoa = ctrl_out((/ 4, 4, 10, 10, 10 /),'sconcoa') 377 type(ctrl_out),save :: o_sconcbc = ctrl_out((/ 4, 4, 10, 10, 10 /),'sconcbc') 378 type(ctrl_out),save :: o_sconcss = ctrl_out((/ 4, 4, 10, 10, 10 /),'sconcss') 379 type(ctrl_out),save :: o_sconcdust = ctrl_out((/ 4, 4, 10, 10, 10 /),'sconcdust') 380 type(ctrl_out),save :: o_concso4 = ctrl_out((/ 4, 4, 10, 10, 10 /),'concso4') 381 type(ctrl_out),save :: o_concoa = ctrl_out((/ 4, 4, 10, 10, 10 /),'concoa') 382 type(ctrl_out),save :: o_concbc = ctrl_out((/ 4, 4, 10, 10, 10 /),'concbc') 383 type(ctrl_out),save :: o_concss = ctrl_out((/ 4, 4, 10, 10, 10 /),'concss') 384 type(ctrl_out),save :: o_concdust = ctrl_out((/ 4, 4, 10, 10, 10 /),'concdust') 385 type(ctrl_out),save :: o_loadso4 = ctrl_out((/ 4, 4, 10, 10, 10 /),'loadso4') 386 type(ctrl_out),save :: o_loadoa = ctrl_out((/ 4, 4, 10, 10, 10 /),'loadoa') 387 type(ctrl_out),save :: o_loadbc = ctrl_out((/ 4, 4, 10, 10, 10 /),'loadbc') 388 type(ctrl_out),save :: o_loadss = ctrl_out((/ 4, 4, 10, 10, 10 /),'loadss') 389 type(ctrl_out),save :: o_loaddust = ctrl_out((/ 4, 4, 10, 10, 10 /),'loaddust') 390 391 392 type(ctrl_out),save :: o_swtoaas_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoaas_nat') 393 type(ctrl_out),save :: o_swsrfas_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfas_nat') 394 type(ctrl_out),save :: o_swtoacs_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoacs_nat') 395 type(ctrl_out),save :: o_swsrfcs_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfcs_nat') 396 397 type(ctrl_out),save :: o_swtoaas_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoaas_ant') 398 type(ctrl_out),save :: o_swsrfas_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfas_ant') 399 type(ctrl_out),save :: o_swtoacs_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoacs_ant') 400 type(ctrl_out),save :: o_swsrfcs_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfcs_ant') 401 type(ctrl_out),save :: o_swtoacf_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoacf_nat') 402 type(ctrl_out),save :: o_swsrfcf_nat = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfcf_nat') 403 type(ctrl_out),save :: o_swtoacf_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoacf_ant') 404 type(ctrl_out),save :: o_swsrfcf_ant = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfcf_ant') 405 type(ctrl_out),save :: o_swtoacf_zero = ctrl_out((/ 4, 4, 10, 10, 10 /),'swtoacf_zero') 406 type(ctrl_out),save :: o_swsrfcf_zero = ctrl_out((/ 4, 4, 10, 10, 10 /),'swsrfcf_zero') 407 408 type(ctrl_out),save :: o_cldncl = ctrl_out((/ 4, 4, 10, 10, 10 /),'cldncl') 409 type(ctrl_out),save :: o_reffclwtop = ctrl_out((/ 4, 4, 10, 10, 10 /),'reffclwtop') 410 type(ctrl_out),save :: o_cldnvi = ctrl_out((/ 4, 4, 10, 10, 10 /),'cldnvi') 411 type(ctrl_out),save :: o_lcc = ctrl_out((/ 4, 4, 10, 10, 10 /),'lcc') 412 412 413 413 414 414 !!!!!!!!!!!!!!!!!!!!!! 3D !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 415 type(ctrl_out),save :: o_ec550aer = ctrl_out((/ 2, 6, 10, 10, 10/),'ec550aer')416 type(ctrl_out),save :: o_lwcon = ctrl_out((/ 2, 5, 10, 10, 1 0/),'lwcon')415 type(ctrl_out),save :: o_ec550aer = ctrl_out((/ 4, 4, 10, 10, 1 /),'ec550aer') 416 type(ctrl_out),save :: o_lwcon = ctrl_out((/ 2, 5, 10, 10, 1 /),'lwcon') 417 417 type(ctrl_out),save :: o_iwcon = ctrl_out((/ 2, 5, 10, 10, 10 /),'iwcon') 418 type(ctrl_out),save :: o_temp = ctrl_out((/ 2, 3, 4, 10, 1 0/),'temp')419 type(ctrl_out),save :: o_theta = ctrl_out((/ 2, 3, 4, 10, 1 0/),'theta')420 type(ctrl_out),save :: o_ovap = ctrl_out((/ 2, 3, 4, 10, 1 0/),'ovap')421 type(ctrl_out),save :: o_ovapinit = ctrl_out((/ 2, 3, 10, 10, 10/),'ovapinit')418 type(ctrl_out),save :: o_temp = ctrl_out((/ 2, 3, 4, 10, 1 /),'temp') 419 type(ctrl_out),save :: o_theta = ctrl_out((/ 2, 3, 4, 10, 1 /),'theta') 420 type(ctrl_out),save :: o_ovap = ctrl_out((/ 2, 3, 4, 10, 1 /),'ovap') 421 type(ctrl_out),save :: o_ovapinit = ctrl_out((/ 2, 3, 10, 10, 1 /),'ovapinit') 422 422 type(ctrl_out),save :: o_wvapp = ctrl_out((/ 2, 10, 10, 10, 10 /),'wvapp') 423 type(ctrl_out),save :: o_geop = ctrl_out((/ 2, 3, 10, 10, 1 0/),'geop')424 type(ctrl_out),save :: o_vitu = ctrl_out((/ 2, 3, 4, 6, 10/),'vitu')425 type(ctrl_out),save :: o_vitv = ctrl_out((/ 2, 3, 4, 6, 10/),'vitv')426 type(ctrl_out),save :: o_vitw = ctrl_out((/ 2, 3, 10, 6, 10/),'vitw')427 type(ctrl_out),save :: o_pres = ctrl_out((/ 2, 3, 10, 10, 1 0/),'pres')428 type(ctrl_out),save :: o_paprs = ctrl_out((/ 2, 3, 10, 10, 1 0/),'paprs')429 type(ctrl_out),save :: o_rneb = ctrl_out((/ 2, 5, 10, 10, 1 0/),'rneb')430 type(ctrl_out),save :: o_rnebcon = ctrl_out((/ 2, 5, 10, 10, 1 0/),'rnebcon')423 type(ctrl_out),save :: o_geop = ctrl_out((/ 2, 3, 10, 10, 1 /),'geop') 424 type(ctrl_out),save :: o_vitu = ctrl_out((/ 2, 3, 4, 5, 1 /),'vitu') 425 type(ctrl_out),save :: o_vitv = ctrl_out((/ 2, 3, 4, 5, 1 /),'vitv') 426 type(ctrl_out),save :: o_vitw = ctrl_out((/ 2, 3, 10, 5, 1 /),'vitw') 427 type(ctrl_out),save :: o_pres = ctrl_out((/ 2, 3, 10, 10, 1 /),'pres') 428 type(ctrl_out),save :: o_paprs = ctrl_out((/ 2, 3, 10, 10, 1 /),'paprs') 429 type(ctrl_out),save :: o_rneb = ctrl_out((/ 2, 5, 10, 10, 1 /),'rneb') 430 type(ctrl_out),save :: o_rnebcon = ctrl_out((/ 2, 5, 10, 10, 1 /),'rnebcon') 431 431 type(ctrl_out),save :: o_rhum = ctrl_out((/ 2, 5, 10, 10, 10 /),'rhum') 432 432 type(ctrl_out),save :: o_ozone = ctrl_out((/ 2, 10, 10, 10, 10 /),'ozone') … … 441 441 type(ctrl_out),save :: o_re = ctrl_out((/ 5, 10, 10, 10, 10 /),'re') 442 442 type(ctrl_out),save :: o_fl = ctrl_out((/ 5, 10, 10, 10, 10 /),'fl') 443 type(ctrl_out),save :: o_scdnc = ctrl_out((/ 2, 6, 10, 10, 10/),'scdnc')444 type(ctrl_out),save :: o_reffclws = ctrl_out((/ 2, 6, 10, 10, 10/),'reffclws')445 type(ctrl_out),save :: o_reffclwc = ctrl_out((/ 2, 6, 10, 10, 10/),'reffclwc')446 type(ctrl_out),save :: o_lcc3d = ctrl_out((/ 2, 6, 10, 10, 10/),'lcc3d')447 type(ctrl_out),save :: o_lcc3dcon = ctrl_out((/ 2, 6, 10, 10, 10/),'lcc3dcon')448 type(ctrl_out),save :: o_lcc3dstra = ctrl_out((/ 2, 6, 10, 10, 10/),'lcc3dstra')443 type(ctrl_out),save :: o_scdnc =ctrl_out((/ 4, 4, 10, 10, 1 /),'scdnc') 444 type(ctrl_out),save :: o_reffclws =ctrl_out((/ 4, 4, 10, 10, 1 /),'reffclws') 445 type(ctrl_out),save :: o_reffclwc =ctrl_out((/ 4, 4, 10, 10, 1 /),'reffclwc') 446 type(ctrl_out),save :: o_lcc3d =ctrl_out((/ 4, 4, 10, 10, 1 /),'lcc3d') 447 type(ctrl_out),save :: o_lcc3dcon =ctrl_out((/ 4, 4, 10, 10, 1 /),'lcc3dcon') 448 type(ctrl_out),save :: o_lcc3dstra =ctrl_out((/ 4, 4, 10, 10, 1 /),'lcc3dstra') 449 449 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 450 450 … … 464 464 ctrl_out((/ 3, 4, 10, 10, 10 /),'rugs_sic') /) 465 465 466 type(ctrl_out),save :: o_alb1 = ctrl_out((/ 3, 10, 10, 10, 10 /),'alb 1')467 type(ctrl_out),save :: o_alb2 = ctrl_out((/ 3, 10, 10, 10, 10 /),'alb 2')466 type(ctrl_out),save :: o_alb1 = ctrl_out((/ 3, 10, 10, 10, 10 /),'albs') 467 type(ctrl_out),save :: o_alb2 = ctrl_out((/ 3, 10, 10, 10, 10 /),'albslw') 468 468 469 469 type(ctrl_out),save :: o_clwcon = ctrl_out((/ 4, 10, 10, 10, 10 /),'clwcon') … … 471 471 type(ctrl_out),save :: o_dnwd = ctrl_out((/ 4, 10, 10, 10, 10 /),'dnwd') 472 472 type(ctrl_out),save :: o_dnwd0 = ctrl_out((/ 4, 10, 10, 10, 10 /),'dnwd0') 473 type(ctrl_out),save :: o_mc = ctrl_out((/ 4, 5, 10, 10, 10 /),'mc')473 type(ctrl_out),save :: o_mc = ctrl_out((/ 4, 10, 10, 10, 10 /),'mc') 474 474 type(ctrl_out),save :: o_ftime_con = ctrl_out((/ 4, 10, 10, 10, 10 /),'ftime_con') 475 type(ctrl_out),save :: o_dtdyn = ctrl_out((/ 4, 10, 10, 10, 1 0/),'dtdyn')476 type(ctrl_out),save :: o_dqdyn = ctrl_out((/ 4, 10, 10, 10, 1 0/),'dqdyn')477 type(ctrl_out),save :: o_dudyn = ctrl_out((/ 4, 10, 10, 10, 1 0/),'dudyn') !AXC478 type(ctrl_out),save :: o_dvdyn = ctrl_out((/ 4, 10, 10, 10, 1 0/),'dvdyn') !AXC475 type(ctrl_out),save :: o_dtdyn = ctrl_out((/ 4, 10, 10, 10, 1 /),'dtdyn') 476 type(ctrl_out),save :: o_dqdyn = ctrl_out((/ 4, 10, 10, 10, 1 /),'dqdyn') 477 type(ctrl_out),save :: o_dudyn = ctrl_out((/ 4, 10, 10, 10, 1 /),'dudyn') !AXC 478 type(ctrl_out),save :: o_dvdyn = ctrl_out((/ 4, 10, 10, 10, 1 /),'dvdyn') !AXC 479 479 type(ctrl_out),save :: o_dtcon = ctrl_out((/ 4, 5, 10, 10, 10 /),'dtcon') 480 480 type(ctrl_out),save :: o_ducon = ctrl_out((/ 4, 10, 10, 10, 10 /),'ducon') … … 504 504 type(ctrl_out),save :: o_w_th = ctrl_out((/ 4, 10, 10, 10, 10 /),'w_th') 505 505 type(ctrl_out),save :: o_lambda_th = ctrl_out((/ 10, 10, 10, 10, 10 /),'lambda_th') 506 type(ctrl_out),save :: o_ftime_th = ctrl_out((/ 4, 10, 10, 10, 10 /),'ftime_th')506 type(ctrl_out),save :: o_ftime_th = ctrl_out((/ 10, 10, 10, 10, 10 /),'ftime_th') 507 507 type(ctrl_out),save :: o_q_th = ctrl_out((/ 4, 10, 10, 10, 10 /),'q_th') 508 508 type(ctrl_out),save :: o_a_th = ctrl_out((/ 4, 10, 10, 10, 10 /),'a_th') … … 524 524 type(ctrl_out),save :: o_dulif = ctrl_out((/ 4, 10, 10, 10, 10 /),'dulif') 525 525 type(ctrl_out),save :: o_dvlif = ctrl_out((/ 4, 10, 10, 10, 10 /),'dvlif') 526 527 ! Attention a refaire correctement 528 type(ctrl_out),save,dimension(2) :: o_trac = (/ ctrl_out((/ 4, 10, 10, 10, 10 /),'trac01'), & 529 ctrl_out((/ 4, 10, 10, 10, 10 /),'trac02') /) 526 type(ctrl_out),save,allocatable :: o_trac(:) 530 527 CONTAINS 531 528 … … 602 599 real, dimension(nfiles), save :: phys_out_latmin = (/ -90., -90., -90., -90., -90. /) 603 600 real, dimension(nfiles), save :: phys_out_latmax = (/ 90., 90., 90., 90., 90. /) 604 605 606 607 ! 601 602 !IM definition dynamique flag o_trac pour sortie traceurs 603 INTEGER :: nq 604 CHARACTER(len=8) :: solsym(nqtot) 605 608 606 print*,'Debut phys_output_mod.F90' 609 607 ! Initialisations (Valeurs par defaut 608 609 if (.not. allocated(o_trac)) ALLOCATE(o_trac(nqtot)) 610 610 611 levmax = (/ klev, klev, klev, klev, klev /) 611 612 … … 903 904 CALL histdef2d(iff,o_absvisaer%flag,o_absvisaer%name, "Absorption aerosol visible optical depth", "-") 904 905 CALL histdef2d(iff,o_od550lt1aer%flag,o_od550lt1aer%name, "Fine mode optical depth", "-") 905 906 907 906 CALL histdef2d(iff,o_sconcso4%flag,o_sconcso4%name,"Surface Concentration of Sulfate ","kg/m3") 908 907 CALL histdef2d(iff,o_sconcoa%flag,o_sconcoa%name,"Surface Concentration of Organic Aerosol ","kg/m3") … … 1224 1223 ENDIF 1225 1224 1226 if (nqtot>=3) THEN 1227 !Attention DO iq=3,nqtot 1228 DO iq=3,4 1225 !IM traceurs dynamiques 1226 DO nq=1,nqtot 1227 IF(nq.LT.10) THEN 1228 WRITE(solsym(nq),'(i1)') nq 1229 o_trac(nq) = ctrl_out((/ 4, 5, 1, 1, 1 /),'trac0'//TRIM(solsym(nq))) 1230 ELSE 1231 WRITE(solsym(nq),'(i2)') nq 1232 o_trac(nq) = ctrl_out((/ 4, 5, 1, 1, 1 /),'trac'//TRIM(solsym(nq))) 1233 ENDIF 1234 WRITE(*,*) 'nq, o_trac(nq)=',nq, o_trac(nq) 1235 ENDDO 1236 ! 1237 if (nqtot>=3) THEN 1238 DO iq=3,nqtot 1229 1239 iiq=niadv(iq) 1230 ! CALL histdef3d (iff, o_trac%flag,'o_'//tnom(iq)%name,ttext(iiq), "-" )1231 1240 CALL histdef3d (iff, o_trac(iq-2)%flag,o_trac(iq-2)%name,ttext(iiq), "-" ) 1232 ENDDO1233 1241 ENDDO 1242 endif 1234 1243 1235 1244 CALL histend(nid_files(iff)) -
LMDZ4/trunk/libf/phylmd/phys_output_write.h
r1398 r1403 1423 1423 ENDIF 1424 1424 1425 !IM ENDIF !iflag_thermals1426 1425 1427 1426 IF (o_f0_th%flag(iff)<=lev_files(iff)) THEN … … 1509 1508 ENDIF 1510 1509 1511 ! IF (o_trac%flag(iff)<=lev_files(iff)) THEN 1512 if (nqtot.GE.3) THEN 1513 ! DO iq=3,nqtot 1514 DO iq=3,4 1510 if (nqtot.GE.3) THEN 1511 DO iq=3,nqtot 1515 1512 IF (o_trac(iq-2)%flag(iff)<=lev_files(iff)) THEN 1516 1513 CALL histwrite_phy(nid_files(iff), 1517 1514 s o_trac(iq-2)%name,itau_w,qx(:,:,iq)) 1518 1515 ENDIF 1519 1520 1516 ENDDO 1517 endif 1521 1518 1522 1519 if (ok_sync) then -
LMDZ4/trunk/libf/phylmd/phys_state_var_mod.F90
r1398 r1403 1 ! 2 ! $Id$ 3 ! 1 4 MODULE phys_state_var_mod 2 5 ! Variables sauvegardees pour le startphy.nc … … 201 204 ! wake_Cstar : vitesse d'etalement de la poche 202 205 ! wake_s : fraction surfacique occupee par la poche froide 206 ! wake_pe : wake potential energy - WAPE 203 207 ! wake_fip : Gust Front Impinging power - ALP 204 208 ! dt_wake, dq_wake: LS tendencies due to wake … … 211 215 REAL,ALLOCATABLE,SAVE :: wake_s(:) 212 216 !$OMP THREADPRIVATE(wake_s) 217 REAL,ALLOCATABLE,SAVE :: wake_pe(:) 218 !$OMP THREADPRIVATE(wake_pe) 213 219 REAL,ALLOCATABLE,SAVE :: wake_fip(:) 214 220 !$OMP THREADPRIVATE(wake_fip) … … 321 327 SUBROUTINE phys_state_var_init(read_climoz) 322 328 use dimphy 329 USE control_mod 323 330 use aero_mod 324 331 IMPLICIT NONE … … 333 340 334 341 #include "indicesol.h" 335 #include "control.h"336 342 ALLOCATE(rlat(klon), rlon(klon)) 337 343 ALLOCATE(pctsrf(klon,nbsrf)) … … 416 422 ALLOCATE(wght_th(klon,klev)) 417 423 ALLOCATE(wake_deltat(klon,klev), wake_deltaq(klon,klev)) 418 ALLOCATE(wake_Cstar(klon), wake_s(klon), wake_fip(klon)) 424 ALLOCATE(wake_Cstar(klon), wake_s(klon)) 425 ALLOCATE(wake_pe(klon), wake_fip(klon)) 419 426 ALLOCATE(dt_wake(klon,klev), dq_wake(klon,klev)) 420 427 ALLOCATE(pfrac_impa(klon,klev), pfrac_nucl(klon,klev)) … … 457 464 SUBROUTINE phys_state_var_end 458 465 use dimphy 466 use control_mod 459 467 IMPLICIT NONE 460 468 #include "indicesol.h" 461 #include "control.h"462 469 463 470 deallocate(rlat, rlon, pctsrf, ftsol, falb1, falb2) … … 516 523 deallocate(lalim_conv, wght_th) 517 524 deallocate(wake_deltat, wake_deltaq) 518 deallocate(wake_Cstar, wake_s, wake_ fip)525 deallocate(wake_Cstar, wake_s, wake_pe, wake_fip) 519 526 deallocate(dt_wake, dq_wake) 520 527 deallocate(pfrac_impa, pfrac_nucl) -
LMDZ4/trunk/libf/phylmd/physiq.F
r1398 r1403 41 41 use conf_phys_m, only: conf_phys 42 42 use radlwsw_m, only: radlwsw 43 USE control_mod 44 43 45 44 46 IMPLICIT none … … 99 101 #include "dimsoil.h" 100 102 #include "clesphys.h" 101 #include "control.h"102 103 #include "temps.h" 103 104 #include "iniprint.h" … … 216 217 REAL d_ps(klon) 217 218 real da(klon,klev),phi(klon,klev,klev),mp(klon,klev) 219 !IM definition dynamique o_trac dans phys_output_open 220 ! type(ctrl_out) :: o_trac(nqtot) 218 221 c 219 222 cIM Amip2 PV a theta constante … … 258 261 CHARACTER*4 bb2 259 262 CHARACTER*2 bb3 260 c 263 261 264 real twriteSTD(klon,nlevSTD,nfiles) 262 265 real qwriteSTD(klon,nlevSTD,nfiles) … … 473 476 c 474 477 c cnameisccp 475 CHARACTER *2 7cnameisccp(lmaxm1,kmaxm1)478 CHARACTER *29 cnameisccp(lmaxm1,kmaxm1) 476 479 cIM bad 151205 DATA cnameisccp/'pc< 50hPa, tau< 0.3', 477 480 DATA cnameisccp/'pc= 50-180hPa, tau< 0.3', … … 639 642 REAL q_undi(klon,klev) ! humidite moyenne dans la zone non perturbee 640 643 c 641 REAL wake_pe(klon) ! Wake potential energy - WAPE 644 cjyg 645 ccc REAL wake_pe(klon) ! Wake potential energy - WAPE 642 646 643 647 REAL wake_gfl(klon) ! Gust Front Length … … 655 659 REAL dt_a(klon,klev) 656 660 REAL dq_a(klon,klev) 661 REAL, SAVE :: alp_offset 662 c$OMP THREADPRIVATE(alp_offset) 663 657 664 c 658 665 cRR:fin declarations poches froides … … 660 667 661 668 REAL zw2(klon,klev+1) 662 REAL fraca(klon,klev+1) 669 REAL fraca(klon,klev+1) 670 REAL ztv(klon,klev) 671 REAL zpspsk(klon,klev) 672 REAL ztla(klon,klev) 673 REAL zthl(klon,klev) 663 674 664 675 c Variables locales pour la couche limite (al1): … … 1217 1228 . iflag_thermals_ed,iflag_thermals_optflux, 1218 1229 c nv flags pour la convection et les poches froides 1219 . iflag_coupl,iflag_clos,iflag_wake, read_climoz) 1230 . iflag_coupl,iflag_clos,iflag_wake, read_climoz, 1231 & alp_offset) 1220 1232 call phys_state_var_init(read_climoz) 1221 1233 call phys_output_var_init … … 1239 1251 c pmflxr=0. 1240 1252 c pmflxs=0. 1241 itau_con=0 1242 first=.false. 1253 1254 itau_con=0 1255 first=.false. 1243 1256 1244 1257 endif ! first … … 1263 1276 ! Gestion calendrier : mise a jour du module phys_cal_mod 1264 1277 ! 1265 c IMCALL phys_cal_update(jD_cur,jH_cur)1278 c CALL phys_cal_update(jD_cur,jH_cur) 1266 1279 1267 1280 c … … 1386 1399 ENDIF 1387 1400 c 1388 IF (dtime* FLOAT(radpas).GT.21600..AND.cycle_diurne) THEN1401 IF (dtime*REAL(radpas).GT.21600..AND.cycle_diurne) THEN 1389 1402 WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant' 1390 1403 WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne" … … 1496 1509 & type_ocean,iflag_pbl,ok_mensuel,ok_journe, 1497 1510 & ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, 1498 & read_climoz, new_aod, aerosol_couple) 1511 & read_climoz, new_aod, aerosol_couple 1512 & ) 1499 1513 c$OMP END MASTER 1500 1514 c$OMP BARRIER … … 1558 1572 CALL VTb(VTinca) 1559 1573 ! iii = MOD(NINT(xjour),360) 1560 ! calday = FLOAT(iii) + jH_cur1561 calday = FLOAT(days_elapsed) + jH_cur1574 ! calday = REAL(iii) + jH_cur 1575 calday = REAL(days_elapsed) + jH_cur 1562 1576 WRITE(lunout,*) 'initial time chemini', days_elapsed, calday 1563 1577 … … 1841 1855 ! solarlong0 1842 1856 if (solarlong0<-999.) then 1843 CALL orbite( FLOAT(days_elapsed+1),zlongi,dist)1857 CALL orbite(REAL(days_elapsed+1),zlongi,dist) 1844 1858 else 1845 1859 zlongi=solarlong0 ! longitude solaire vraie … … 1852 1866 ! Avec ou sans cycle diurne 1853 1867 IF (cycle_diurne) THEN 1854 zdtime=dtime* FLOAT(radpas) ! pas de temps du rayonnement (s)1868 zdtime=dtime*REAL(radpas) ! pas de temps du rayonnement (s) 1855 1869 CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract) 1856 1870 ELSE … … 1862 1876 call writefield_phy('v_seri',v_seri,llm) 1863 1877 call writefield_phy('t_seri',t_seri,llm) 1864 1878 call writefield_phy('q_seri',q_seri,llm) 1865 1879 endif 1866 1880 … … 1919 1933 call writefield_phy('v_seri',v_seri,llm) 1920 1934 call writefield_phy('t_seri',t_seri,llm) 1921 1935 call writefield_phy('q_seri',q_seri,llm) 1922 1936 endif 1923 1937 … … 2001 2015 2002 2016 IF (iflag_con.EQ.1) THEN 2003 stop'reactiver le call conlmd dans physiq.F' 2017 abort_message ='reactiver le call conlmd dans physiq.F' 2018 CALL abort_gcm (modname,abort_message,1) 2004 2019 c CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q, 2005 2020 c . d_t_con, d_q_con, … … 2059 2074 c 2060 2075 ccalcul de ale_wake et alp_wake 2061 do i = 1,klon 2062 if (iflag_wake.eq.1) then 2063 ale_wake(i) = 0.5*wake_cstar(i)**2 2064 alp_wake(i) = wake_fip(i) 2065 else 2066 ale_wake(i) = 0. 2067 alp_wake(i) = 0. 2068 endif 2069 enddo 2076 if (iflag_wake.eq.1) then 2077 if (itap .le. it_wape_prescr) then 2078 do i = 1,klon 2079 ale_wake(i) = wape_prescr 2080 alp_wake(i) = fip_prescr 2081 enddo 2082 else 2083 do i = 1,klon 2084 cjyg ALE=WAPE au lieu de ALE = 1/2 Cstar**2 2085 ccc ale_wake(i) = 0.5*wake_cstar(i)**2 2086 ale_wake(i) = wake_pe(i) 2087 alp_wake(i) = wake_fip(i) 2088 enddo 2089 endif 2090 else 2091 do i = 1,klon 2092 ale_wake(i) = 0. 2093 alp_wake(i) = 0. 2094 enddo 2095 endif 2070 2096 ccombinaison avec ale et alp de couche limite: constantes si pas de couplage, valeurs calculees 2071 2097 cdans le thermique sinon 2072 2098 if (iflag_coupl.eq.0) then 2073 if (debut) print*,'ALE et ALP imposes' 2099 if (debut.and.prt_level.gt.9) 2100 $ WRITE(lunout,*)'ALE et ALP imposes' 2074 2101 do i = 1,klon 2075 2102 con ne couple que ale … … 2082 2109 else 2083 2110 IF(prt_level>9)WRITE(lunout,*)'ALE et ALP couples au thermique' 2084 do i = 1,klon 2085 ALE(i) = max(ale_wake(i),Ale_bl(i)) 2086 ALP(i) = alp_wake(i) + Alp_bl(i) 2087 c write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i) 2088 c write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i) 2089 enddo 2111 ! do i = 1,klon 2112 ! ALE(i) = max(ale_wake(i),Ale_bl(i)) 2113 ! avant ALP(i) = alp_wake(i) + Alp_bl(i) 2114 ! ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb 2115 ! write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i) 2116 ! write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i) 2117 ! enddo 2118 2119 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2120 ! Modif FH 2010/04/27. Sans doute temporaire. 2121 ! Deux options pour le alp_offset : constant si >Ã 0 ou proportionnel Ãa 2122 ! w si <0 2123 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2124 do i = 1,klon 2125 ALE(i) = max(ale_wake(i),Ale_bl(i)) 2126 if (alp_offset>=0.) then 2127 ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb 2128 else 2129 ALP(i)=alp_wake(i)+Alp_bl(i)+alp_offset*min(omega(i,6),0.) 2130 if (alp(i)<0.) then 2131 print*,'ALP ',alp(i),alp_wake(i) 2132 s ,Alp_bl(i),alp_offset*min(omega(i,6),0.) 2133 endif 2134 endif 2135 enddo 2136 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2137 2090 2138 endif 2091 2139 do i=1,klon … … 2224 2272 call writefield_phy('v_seri',v_seri,llm) 2225 2273 call writefield_phy('t_seri',t_seri,llm) 2226 2274 call writefield_phy('q_seri',q_seri,llm) 2227 2275 endif 2228 2276 … … 2246 2294 za = 0.0 2247 2295 DO i = 1, klon 2248 za = za + airephy(i)/ FLOAT(klon)2296 za = za + airephy(i)/REAL(klon) 2249 2297 zx_t = zx_t + (rain_con(i)+ 2250 . snow_con(i))*airephy(i)/ FLOAT(klon)2298 . snow_con(i))*airephy(i)/REAL(klon) 2251 2299 ENDDO 2252 2300 zx_t = zx_t/za*dtime … … 2328 2376 2329 2377 endif 2378 c 2379 c=================================================================== 2380 cJYG 2381 IF (ip_ebil_phy.ge.2) THEN 2382 ztit='after wake' 2383 CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime 2384 e , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay 2385 s , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) 2386 call diagphy(airephy,ztit,ip_ebil_phy 2387 e , zero_v, zero_v, zero_v, zero_v, zero_v 2388 e , zero_v, zero_v, zero_v, ztsol 2389 e , d_h_vcol, d_qt, d_ec 2390 s , fs_bound, fq_bound ) 2391 END IF 2392 2330 2393 c print*,'apres callwake iflag_cldcon=', iflag_cldcon 2331 2394 c … … 2347 2410 clwcon0th(:,:)=0. 2348 2411 c 2349 fm_therm(:,:)=0.2350 entr_therm(:,:)=0.2351 detr_therm(:,:)=0.2412 c fm_therm(:,:)=0. 2413 c entr_therm(:,:)=0. 2414 c detr_therm(:,:)=0. 2352 2415 c 2353 2416 IF(prt_level>9)WRITE(lunout,*) … … 2377 2440 s ,ratqsdiff,zqsatth 2378 2441 con rajoute ale et alp, et les caracteristiques de la couche alim 2379 s ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca) 2442 s ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca 2443 s ,ztv,zpspsk,ztla,zthl) 2444 2445 ! ---------------------------------------------------------------------- 2446 ! Transport de la TKE par les panaches thermiques. 2447 ! FH : 2010/02/01 2448 if (iflag_pbl.eq.10) then 2449 call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm, 2450 s rg,paprs,pbl_tke) 2451 endif 2452 ! ---------------------------------------------------------------------- 2453 2380 2454 endif 2455 2381 2456 2382 2457 … … 2430 2505 e , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay 2431 2506 s , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) 2507 call diagphy(airephy,ztit,ip_ebil_phy 2508 e , zero_v, zero_v, zero_v, zero_v, zero_v 2509 e , zero_v, zero_v, zero_v, ztsol 2510 e , d_h_vcol, d_qt, d_ec 2511 s , fs_bound, fq_bound ) 2432 2512 END IF 2433 2513 … … 2478 2558 enddo 2479 2559 tau_overturning_th(:)=zmax_th(:)/max(0.5*wmax_th(:),0.1) 2480 print*,'TAU TH OK ',tau_overturning_th(1),detr_therm(1,3) 2560 if(prt_level.ge.9) 2561 & write(lunout,*)'TAU TH OK ', 2562 & tau_overturning_th(1),detr_therm(1,3) 2481 2563 2482 2564 c On impose que l'air autour de la fraction couverte par le thermique … … 2589 2671 2590 2672 ! les ratqs sont une combinaison de ratqss et ratqsc 2591 ! print*,'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs 2673 if(prt_level.ge.9) 2674 $ write(lunout,*)'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs 2592 2675 2593 2676 if (tau_ratqs>1.e-10) then … … 2620 2703 . pfrac_impa, pfrac_nucl, pfrac_1nucl, 2621 2704 . frac_impa, frac_nucl, 2622 . prfl, psfl, rhcl) 2705 . prfl, psfl, rhcl, 2706 . zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cldcon ) 2623 2707 2624 2708 WHERE (rain_lsc < 0) rain_lsc = 0. … … 2640 2724 za = 0.0 2641 2725 DO i = 1, klon 2642 za = za + airephy(i)/ FLOAT(klon)2726 za = za + airephy(i)/REAL(klon) 2643 2727 zx_t = zx_t + (rain_lsc(i) 2644 . + snow_lsc(i))*airephy(i)/ FLOAT(klon)2728 . + snow_lsc(i))*airephy(i)/REAL(klon) 2645 2729 ENDDO 2646 2730 zx_t = zx_t/za*dtime … … 2664 2748 call writefield_phy('v_seri',v_seri,llm) 2665 2749 call writefield_phy('t_seri',t_seri,llm) 2666 2750 call writefield_phy('q_seri',q_seri,llm) 2667 2751 endif 2668 2752 … … 2741 2825 & tausum_aero, tau3d_aero) 2742 2826 ELSE 2827 cIM 170310 BEG 2828 tausum_aero(:,:,:) = 0. 2829 cIM 170310 END 2743 2830 tau_aero(:,:,:,:) = 0. 2744 2831 piz_aero(:,:,:,:) = 0. … … 2813 2900 e , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay 2814 2901 s , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) 2902 call diagphy(airephy,ztit,ip_ebil_phy 2903 e , zero_v, zero_v, zero_v, zero_v, zero_v 2904 e , zero_v, zero_v, zero_v, ztsol 2905 e , d_h_vcol, d_qt, d_ec 2906 s , fs_bound, fq_bound ) 2815 2907 END IF 2816 2908 c … … 2845 2937 IF (thermcep) THEN 2846 2938 IF(zt2m(i).LT.RTT) then 2847 2848 2849 2939 Lheat=RLSTT 2940 ELSE 2941 Lheat=RLVTT 2850 2942 ENDIF 2851 2943 ELSE … … 2853 2945 Lheat=RLSTT 2854 2946 ELSE 2855 2947 Lheat=RLVTT 2856 2948 ENDIF 2857 2949 ENDIF … … 2864 2956 CALL VTe(VTphysiq) 2865 2957 CALL VTb(VTinca) 2866 calday = FLOAT(days_elapsed + 1) + jH_cur2958 calday = REAL(days_elapsed + 1) + jH_cur 2867 2959 2868 2960 call chemtime(itap+itau_phy-1, date0, dtime) … … 2908 3000 $ cdragm, 2909 3001 $ pctsrf, 2910 $ 2911 $ 3002 $ pdtphys, 3003 $ itap) 2912 3004 2913 3005 CALL VTe(VTinca) … … 2964 3056 call writefield_phy('v_seri',v_seri,llm) 2965 3057 call writefield_phy('t_seri',t_seri,llm) 2966 3058 call writefield_phy('q_seri',q_seri,llm) 2967 3059 endif 2968 3060 … … 3020 3112 itaprad = itaprad + 1 3021 3113 3022 if (iflag_radia.eq.0 ) then3114 if (iflag_radia.eq.0 .and. prt_level.ge.9) then 3023 3115 print *,'--------------------------------------------------' 3024 3116 print *,'>>>> ATTENTION rayonnement desactive pour ce cas' … … 3043 3135 call writefield_phy('v_seri',v_seri,llm) 3044 3136 call writefield_phy('t_seri',t_seri,llm) 3045 3137 call writefield_phy('q_seri',q_seri,llm) 3046 3138 endif 3047 3139 … … 3124 3216 call writefield_phy('v_seri',v_seri,llm) 3125 3217 call writefield_phy('t_seri',t_seri,llm) 3126 3218 call writefield_phy('q_seri',q_seri,llm) 3127 3219 endif 3128 3220 … … 3188 3280 call writefield_phy('v_seri',v_seri,llm) 3189 3281 call writefield_phy('t_seri',t_seri,llm) 3190 3282 call writefield_phy('q_seri',q_seri,llm) 3191 3283 endif 3192 3284 … … 3223 3315 e , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay 3224 3316 s , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) 3317 call diagphy(airephy,ztit,ip_ebil_phy 3318 e , zero_v, zero_v, zero_v, zero_v, zero_v 3319 e , zero_v, zero_v, zero_v, ztsol 3320 e , d_h_vcol, d_qt, d_ec 3321 s , fs_bound, fq_bound ) 3225 3322 END IF 3226 3323 c … … 3292 3389 IF (offline) THEN 3293 3390 3294 print*,'Attention on met a 0 les thermiques pour phystoke' 3391 IF (prt_level.ge.9) 3392 $ print*,'Attention on met a 0 les thermiques pour phystoke' 3295 3393 call phystokenc ( 3296 3394 I nlon,klev,pdtphys,rlon,rlat, … … 3400 3498 c 3401 3499 cIM initialisation 5eme fichier de sortie 3500 cIM ajoute 5eme niveau 170310 BEG 3402 3501 twriteSTD(:,:,5)=tlevSTD(:,:) 3403 3502 qwriteSTD(:,:,5)=qlevSTD(:,:) … … 3484 3583 call writefield_phy('v_seri',v_seri,llm) 3485 3584 call writefield_phy('t_seri',t_seri,llm) 3486 3585 call writefield_phy('q_seri',q_seri,llm) 3487 3586 endif 3488 3587 -
LMDZ4/trunk/libf/phylmd/phystokenc.F
r1146 r1403 13 13 USE infotrac, ONLY : nqtot 14 14 USE iophy 15 USE control_mod 16 15 17 IMPLICIT none 16 18 … … 24 26 #include "tracstoke.h" 25 27 #include "indicesol.h" 26 #include "control.h"27 28 c====================================================================== 28 29 -
LMDZ4/trunk/libf/phylmd/phytrac.F90
r1309 r1403 33 33 USE traclmdz_mod 34 34 USE tracinca_mod 35 USE control_mod 36 35 37 36 38 … … 43 45 INCLUDE "temps.h" 44 46 INCLUDE "paramet.h" 45 INCLUDE "control.h"46 47 INCLUDE "thermcell.h" 47 48 !========================================================================== … … 212 213 SELECT CASE(type_trac) 213 214 CASE('lmdz') 214 CALL traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage) 215 !IM ajout t_seri, pplay, sh CALL traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage) 216 CALL traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage) 215 217 CASE('inca') 216 218 source(:,:)=0. … … 226 228 !############################################ END INITIALIZATION ####### 227 229 230 DO k=1,klev 231 DO i=1,klon 232 zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg 233 END DO 234 END DO 235 228 236 !=============================================================================== 229 237 ! -- Do specific treatment according to chemestry model or local LMDZ tracers … … 234 242 ! -- Traitement des traceurs avec traclmdz 235 243 236 CALL traclmdz(& 237 nstep, pdtphys, t_seri, & 238 paprs, pplay, cdragh, coefh, & 239 yu1, yv1, ftsol, pctsrf, & 240 xlat, couchelimite, & 241 tr_seri, source, solsym, d_tr_cl) 244 CALL traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, & 245 cdragh, coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, & 246 sh, tr_seri, source, solsym, d_tr_cl, zmasse) 242 247 243 248 CASE('inca') … … 276 281 END IF 277 282 283 !IM ajout traceurs RR 284 ! print*,'phytrac it,nseuil=',it,nseuil 285 IF (it.lt.nseuil) THEN 278 286 DO k = 1, klev 279 287 DO i = 1, klon … … 281 289 END DO 282 290 END DO 291 END IF !(it.lt.nseuil) then 283 292 284 293 CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'convection it = '//solsym(it)) … … 290 299 ! -- Calcul de l'effet des thermiques -- 291 300 !====================================================================== 292 293 DO k=1,klev294 DO i=1,klon295 zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg296 END DO297 END DO298 301 299 302 DO it=1,nbtr -
LMDZ4/trunk/libf/phylmd/printflag.F
r1279 r1403 85 85 IF( INT( tabcntr0( 6 ) ) .NE. nbapp_rad ) THEN 86 86 PRINT 21, INT(tabcntr0(6)), nbapp_rad 87 radpas0 = NINT( 86400./tabcntr0(1)/INT( tabcntr0(6) ) )87 ! radpas0 = NINT( 86400./tabcntr0(1)/INT( tabcntr0(6) ) ) 88 88 PRINT 100 89 89 PRINT 22, radpas0, radpas -
LMDZ4/trunk/libf/phylmd/read_pstoke.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 18 18 C****************************************************************************** 19 19 20 use netcdf 21 USE dimphy 20 use netcdf 21 USE dimphy 22 USE control_mod 23 22 24 IMPLICIT NONE 23 25 … … 33 35 #include "serre.h" 34 36 #include "indicesol.h" 35 #include "control.h"36 37 cccc#include "dimphy.h" 37 38 -
LMDZ4/trunk/libf/phylmd/read_pstoke0.F
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 c … … 19 19 use netcdf 20 20 USE dimphy 21 USE control_mod 22 21 23 IMPLICIT NONE 22 24 … … 32 34 #include "serre.h" 33 35 #include "indicesol.h" 34 #include "control.h"35 36 cccc#include "dimphy.h" 36 37 -
LMDZ4/trunk/libf/phylmd/readaerosol.F90
r1321 r1403 137 137 DO i = 1, klon 138 138 pt_out(i,k,it) = & 139 pt_out(i,k,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &139 pt_out(i,k,it) - REAL(iyr_in-iyr1)/REAL(iyr2-iyr1) * & 140 140 (pt_out(i,k,it) - pt_2(i,k,it)) 141 141 END DO … … 144 144 DO i = 1, klon 145 145 psurf(i,it) = & 146 psurf(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &146 psurf(i,it) - REAL(iyr_in-iyr1)/REAL(iyr2-iyr1) * & 147 147 (psurf(i,it) - psurf2(i,it)) 148 148 149 149 load(i,it) = & 150 load(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &150 load(i,it) - REAL(iyr_in-iyr1)/REAL(iyr2-iyr1) * & 151 151 (load(i,it) - load2(i,it)) 152 152 END DO … … 514 514 spole = spole + varyear(i,jjm+1,k,imth) 515 515 END DO 516 npole = npole/ FLOAT(iim)517 spole = spole/ FLOAT(iim)516 npole = npole/REAL(iim) 517 spole = spole/REAL(iim) 518 518 varyear(:,1, k,imth) = npole 519 519 varyear(:,jjm+1,k,imth) = spole -
LMDZ4/trunk/libf/phylmd/readaerosol_interp.F90
r1337 r1403 127 127 IF(mpi_rank == 0 .AND. debug)then 128 128 ! 0.02 is about 0.5/24, namly less than half an hour 129 OLDNEWDAY = (r_day- FLOAT(iday) < 0.02)129 OLDNEWDAY = (r_day-REAL(iday) < 0.02) 130 130 ! Once per day, update aerosol fields 131 131 lmt_pas = NINT(86400./pdtphys) 132 PRINT*,'r_day- FLOAT(iday) =',r_day-FLOAT(iday)132 PRINT*,'r_day-REAL(iday) =',r_day-REAL(iday) 133 133 PRINT*,'itap =',itap 134 134 PRINT*,'pdtphys =',pdtphys … … 234 234 ! 235 235 DO i = 2, 13 236 month_len(i) = float(ioget_mon_len(year_cur, i-1))236 month_len(i) = REAL(ioget_mon_len(year_cur, i-1)) 237 237 CALL ymds2ju(year_cur, i-1, 1, 0.0, month_start(i)) 238 238 ENDDO 239 month_len(1) = float(ioget_mon_len(year_cur-1, 12))239 month_len(1) = REAL(ioget_mon_len(year_cur-1, 12)) 240 240 CALL ymds2ju(year_cur-1, 12, 1, 0.0, month_start(1)) 241 month_len(14) = float(ioget_mon_len(year_cur+1, 1))241 month_len(14) = REAL(ioget_mon_len(year_cur+1, 1)) 242 242 CALL ymds2ju(year_cur+1, 1, 1, 0.0, month_start(14)) 243 243 month_mid(:) = month_start (:) + month_len(:)/2. -
LMDZ4/trunk/libf/phylmd/regr_pr_av_m.F90
r1279 r1403 21 21 ! latitude, pressure, julian day. 22 22 ! We assume that the input fields are already on the "rlatu" 23 ! latitudes, except hthat latitudes are in ascending order in the input23 ! latitudes, except that latitudes are in ascending order in the input 24 24 ! file. 25 ! We assume that the inputs fields have the same pressure coordinate.25 ! We assume that all the inputs fields have the same coordinates. 26 26 27 27 ! The target vertical LMDZ grid is the grid of layer boundaries. … … 91 91 if (is_mpi_root) then 92 92 do i = 1, n_var 93 call nf95_inq_varid(ncid, name(i), varid)93 call nf95_inq_varid(ncid, trim(name(i)), varid) 94 94 95 95 ! Get data at the right day from the input file: 96 96 ncerr = nf90_get_var(ncid, varid, v1(1, :, :, i), & 97 97 start=(/1, 1, julien/)) 98 call handle_err("regr_pr_av nf90_get_var " // name(i), ncerr, ncid) 98 call handle_err("regr_pr_av nf90_get_var " // trim(name(i)), ncerr, & 99 ncid) 99 100 end do 100 101 -
LMDZ4/trunk/libf/phylmd/surf_landice_mod.F90
r1334 r1403 186 186 ENDDO 187 187 188 !**************************************************************************************** 189 snow_o=0. 190 zfra_o = 0. 191 DO j = 1, knon 192 i = knindex(j) 193 snow_o(i) = snow(j) 194 zfra_o(i) = zfra(j) 195 ENDDO 196 197 188 198 END SUBROUTINE surf_landice 189 199 ! -
LMDZ4/trunk/libf/phylmd/surf_ocean_mod.F90
r1146 r1403 141 141 !**************************************************************************************** 142 142 IF ( MINVAL(rmu0) == MAXVAL(rmu0) .AND. MINVAL(rmu0) == -999.999 ) THEN 143 CALL alboc( FLOAT(jour),rlat,alb_eau)143 CALL alboc(REAL(jour),rlat,alb_eau) 144 144 ELSE ! diurnal cycle 145 145 CALL alboc_cd(rmu0,alb_eau) -
LMDZ4/trunk/libf/phylmd/thermcell.F
r987 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE calcul_sec(ngrid,nlay,ptimestep 2 5 s ,pplay,pplev,pphi,zlev … … 132 135 character*10 str10 133 136 137 character (len=20) :: modname='calcul_sec' 138 character (len=80) :: abort_message 139 140 134 141 ! LOGICAL vtest(klon),down 135 142 … … 530 537 c write(8,*)zmax(ig),lmax(ig),lentr(ig),lmin(ig) 531 538 enddo 532 con stop pe après les calculs de zmax et wmax539 con stope après les calculs de zmax et wmax 533 540 RETURN 534 541 … … 776 783 do ig=1,ngrid 777 784 if(fracd(ig,l).lt.0.1) then 778 stop'fracd trop petit' 785 abort_message = 'fracd trop petit' 786 CALL abort_gcm (modname,abort_message,1) 787 779 788 else 780 789 c vitesse descendante "diagnostique" … … 860 869 cRC 861 870 if (w2di.eq.1) then 862 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)863 entr0=entr0+ptimestep*(entr-entr0)/ float(tho)871 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 872 entr0=entr0+ptimestep*(entr-entr0)/REAL(tho) 864 873 else 865 874 fm0=fm -
LMDZ4/trunk/libf/phylmd/thermcell_closure.F90
r1146 r1403 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 2 & zlev,lalim,alim_star, alim_star_tot,zmax_sec,wmax_sec,zmax,wmax,f,lev_out)5 & zlev,lalim,alim_star,f_star,zmax,wmax,f,lev_out) 3 6 4 7 !------------------------------------------------------------------------- 5 8 !thermcell_closure: fermeture, determination de f 9 ! 10 ! Modification 7 septembre 2009 11 ! 1. On enleve alim_star_tot des arguments pour le recalculer et etre ainis 12 ! coherent avec l'integrale au numerateur. 13 ! 2. On ne garde qu'une version des couples wmax,zmax et wmax_sec,zmax_sec 14 ! l'idee etant que le choix se fasse a l'appel de thermcell_closure 15 ! 3. Vectorisation en mettant les boucles en l l'exterieur avec des if 6 16 !------------------------------------------------------------------------- 7 17 IMPLICIT NONE … … 9 19 #include "iniprint.h" 10 20 #include "thermcell.h" 11 12 13 14 21 INTEGER ngrid,nlay 22 INTEGER ig,k 23 REAL r_aspect,ptimestep 24 integer lev_out ! niveau pour les print 15 25 16 INTEGER lalim(ngrid) 17 REAL alim_star(ngrid,nlay) 18 REAL alim_star_tot(ngrid) 19 REAL rho(ngrid,nlay) 20 REAL zlev(ngrid,nlay) 21 REAL zmax(ngrid),zmax_sec(ngrid) 22 REAL wmax(ngrid),wmax_sec(ngrid) 23 real zdenom 26 INTEGER lalim(ngrid) 27 REAL alim_star(ngrid,nlay) 28 REAL f_star(ngrid,nlay+1) 29 REAL rho(ngrid,nlay) 30 REAL zlev(ngrid,nlay) 31 REAL zmax(ngrid) 32 REAL wmax(ngrid) 33 REAL zdenom(ngrid) 34 REAL alim_star2(ngrid) 35 REAL f(ngrid) 24 36 25 REAL alim_star2(ngrid) 37 REAL alim_star_tot(ngrid) 38 INTEGER llmax 26 39 27 REAL f(ngrid) 40 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41 !print*,'THERMCELL CLOSURE 26E' 28 42 29 do ig=1,ngrid 30 alim_star2(ig)=0. 31 enddo 32 do ig=1,ngrid 33 if (alim_star(ig,1).LT.1.e-10) then 34 f(ig)=0. 35 else 36 do k=1,lalim(ig) 37 alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2 & 38 & /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) 39 enddo 40 zdenom=max(500.,zmax(ig))*r_aspect*alim_star2(ig) 41 if (zdenom<1.e-14) then 42 print*,'ig=',ig 43 print*,'alim_star2',alim_star2(ig) 44 print*,'zmax',zmax(ig) 45 print*,'r_aspect',r_aspect 46 print*,'zdenom',zdenom 47 print*,'alim_star',alim_star(ig,:) 48 print*,'zmax_sec',zmax_sec(ig) 49 print*,'wmax_sec',wmax_sec(ig) 50 stop 51 endif 52 if ((zmax_sec(ig).gt.1.e-10).and.(iflag_thermals_ed.eq.0)) then 53 f(ig)=wmax_sec(ig)*alim_star_tot(ig)/(max(500.,zmax_sec(ig))*r_aspect & 54 & *alim_star2(ig)) 55 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/ & 56 ! & zmax_sec(ig))*wmax_sec(ig)) 57 if(prt_level.GE.10) write(lunout,*)'closure dry',f(ig),wmax_sec(ig),alim_star_tot(ig),zmax_sec(ig) 58 else 59 f(ig)=wmax(ig)*alim_star_tot(ig)/zdenom 60 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/ & 61 ! & zmax(ig))*wmax(ig)) 62 if(prt_level.GE.10) print*,'closure moist',f(ig),wmax(ig),alim_star_tot(ig),zmax(ig) 63 endif 64 endif 65 ! f0(ig)=f(ig) 66 enddo 67 if (prt_level.ge.1) print*,'apres fermeture' 43 alim_star2(:)=0. 44 alim_star_tot(:)=0. 45 f(:)=0. 68 46 69 ! 47 ! Indice vertical max (max de lalim) atteint par les thermiques sur le domaine 48 llmax=1 49 do ig=1,ngrid 50 if (lalim(ig)>llmax) llmax=lalim(ig) 51 enddo 52 53 54 ! Calcul des integrales sur la verticale de alim_star et de 55 ! alim_star^2/(rho dz) 56 do k=1,llmax-1 57 do ig=1,ngrid 58 if (k<lalim(ig)) then 59 alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2 & 60 & /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) 61 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,k) 62 endif 63 enddo 64 enddo 65 66 67 do ig=1,ngrid 68 if (alim_star2(ig)>1.e-10) then 69 f(ig)=wmax(ig)*alim_star_tot(ig)/ & 70 & (max(500.,zmax(ig))*r_aspect*alim_star2(ig)) 71 endif 72 enddo 73 74 75 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 76 ! TESTS POUR UNE NOUVELLE FERMETURE DANS LAQUELLE ALIM_STAR NE SERAIT 77 ! PAS NORMALISE 78 ! f(ig)=f(ig)*f_star(ig,2)/(f_star(ig,lalim(ig))) 79 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 80 70 81 return 71 82 end -
LMDZ4/trunk/libf/phylmd/thermcell_dq.F90
r983 r1403 31 31 real ztimestep 32 32 integer niter,iter 33 CHARACTER (LEN=20) :: modname='thermcell_dq' 34 CHARACTER (LEN=80) :: abort_message 33 35 34 36 … … 42 44 if (entr(ig,k).gt.zzm) then 43 45 print*,'entr dt > m ',entr(ig,k)*ptimestep,masse(ig,k) 44 stop 46 abort_message = '' 47 CALL abort_gcm (modname,abort_message,1) 45 48 endif 46 49 enddo -
LMDZ4/trunk/libf/phylmd/thermcell_dry.F90
r938 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star, & 2 5 & lalim,lmin,zmax,wmax,lev_out) … … 4 7 !-------------------------------------------------------------------------- 5 8 !thermcell_dry: calcul de zmax et wmax du thermique sec 9 ! Calcul de la vitesse maximum et de la hauteur maximum pour un panache 10 ! ascendant avec une fonction d'alimentation alim_star et sans changement 11 ! de phase. 12 ! Le calcul pourrait etre sans doute simplifier. 13 ! La temperature potentielle virtuelle dans la panache ascendant est 14 ! la temperature potentielle virtuelle pondérée par alim_star. 6 15 !-------------------------------------------------------------------------- 16 7 17 IMPLICIT NONE 8 18 #include "YOMCST.h" … … 29 39 REAL linter(ngrid),zlevinter(ngrid) 30 40 INTEGER lmix(ngrid),lmax(ngrid),lmin(ngrid) 41 CHARACTER (LEN=20) :: modname='thermcell_dry' 42 CHARACTER (LEN=80) :: abort_message 31 43 32 44 !initialisations … … 47 59 enddo 48 60 !calcul de la vitesse a partir de la CAPE en melangeant thetav 49 50 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!51 ! A eliminer52 ! Ce if complique etait fait pour reperer la premiere couche instable53 ! Ici, c'est lmin.54 !55 ! do l=1,nlay-256 ! do ig=1,ngrid57 ! if (ztv(ig,l).gt.ztv(ig,l+1) &58 ! & .and.alim_star(ig,l).gt.1.e-10 &59 ! & .and.zw2(ig,l).lt.1e-10) then60 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!61 61 62 62 … … 84 84 ! Premiere couche du panache thermique 85 85 !------------------------------------------------------------------------ 86 86 87 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) & 87 88 & *(zlev(ig,l+1)-zlev(ig,l)) & … … 96 97 ! 3. la vitesse au carré en haut zw2(ig,l+1) 97 98 !------------------------------------------------------------------------ 98 99 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!100 ! A eliminer : dans cette version, si zw2 est > 0 on a un therique.101 ! et donc, au dessus, f_star(ig,l+1) est forcement suffisamment102 ! grand puisque on n'a pas de detrainement.103 ! f_star est une fonction croissante.104 ! c'est donc vraiment sur zw2 uniquement qu'il faut faire le test.105 ! else if ((zw2(ig,l).ge.1e-10).and. &106 ! & (f_star(ig,l)+alim_star(ig,l).gt.1.e-10)) then107 ! f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)108 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!109 99 110 100 else if (zw2(ig,l).ge.1e-10) then … … 145 135 if (prt_level.ge.1) print*,'fin calcul zw2' 146 136 ! 147 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!148 ! A eliminer :149 ! Ce calcul de lmax est fait en meme temps que celui de linter, plus haut150 ! Calcul de la couche correspondant a la hauteur du thermique151 ! do ig=1,ngrid152 ! lmax(ig)=lalim(ig)153 ! enddo154 ! do ig=1,ngrid155 ! do l=nlay,lalim(ig)+1,-1156 ! if (zw2(ig,l).le.1.e-10) then157 ! lmax(ig)=l-1158 ! endif159 ! enddo160 ! enddo161 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!162 163 !164 137 ! Determination de zw2 max 165 138 do ig=1,ngrid … … 185 158 do ig=1,ngrid 186 159 ! calcul de zlevinter 187 188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!189 ! FH A eliminer190 ! Simplification191 ! zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* &192 ! & linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) &193 ! & -zlev(ig,lmax(ig)))194 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!195 196 160 zlevinter(ig)=zlev(ig,lmax(ig)) + & 197 161 & (linter(ig)-lmax(ig))*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) … … 199 163 enddo 200 164 201 ! Verification que lalim<=lmax202 do ig=1,ngrid203 if(lalim(ig)>lmax(ig)) then204 if ( prt_level > 1 ) THEN205 print*,'WARNING thermcell_dry ig=',ig,' lalim=',lalim(ig),' lmax(ig)=',lmax(ig)206 endif207 lmax(ig)=lalim(ig)208 endif209 enddo210 211 165 RETURN 212 166 END -
LMDZ4/trunk/libf/phylmd/thermcell_dv2.F90
r1146 r1403 10 10 ! de "thermiques" explicitement representes 11 11 ! calcul du dq/dt une fois qu'on connait les ascendances 12 ! 13 ! Vectorisation, FH : 2010/03/08 12 14 ! 13 15 !======================================================================= … … 31 33 real qa(ngrid,nlay),detr(ngrid,nlay),zf,zf2 32 34 real wvd(ngrid,nlay+1),wud(ngrid,nlay+1) 33 real gamma0 ,gamma(ngrid,nlay+1)35 real gamma0(ngrid,nlay+1),gamma(ngrid,nlay+1) 34 36 real ue(ngrid,nlay),ve(ngrid,nlay) 35 real dua,dva 37 LOGICAL ltherm(ngrid,nlay) 38 real dua(ngrid,nlay),dva(ngrid,nlay) 36 39 integer iter 37 40 38 integer ig,k 41 integer ig,k,nlarga0 42 43 !------------------------------------------------------------------------- 39 44 40 45 ! calcul du detrainement 46 !--------------------------- 47 48 print*,'THERMCELL DV2 OPTIMISE 3' 49 50 nlarga0=0. 41 51 42 52 do k=1,nlay … … 59 69 do k=2,nlay 60 70 do ig=1,ngrid 61 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. & 62 & 1.e-5*masse(ig,k)) then 63 ! On itère sur la valeur du coeff de freinage. 64 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 65 !IM 060508 beg 66 ! if(0.5*(fraca(ig,k+1)+fraca(ig,k)).LT.0.) THEN 67 ! print*,'th_dv2 ig k fraca(:,k) fraca(:k+1)', & 68 ! & ig,k,fraca(ig,k),fraca(ig,k+1) 69 ! endif 70 ! if(larga(ig).EQ.0.) THEN 71 ! print*,'th_dv2 ig larga=0.',ig 72 ! endif 73 if(larga(ig).GT.0.) THEN 74 !IM 060508 end 75 gamma0=masse(ig,k) & 71 ltherm(ig,k)=(fm(ig,k+1)+detr(ig,k))*ptimestep > 1.e-5*masse(ig,k) 72 if(ltherm(ig,k).and.larga(ig)>0.) then 73 gamma0(ig,k)=masse(ig,k) & 76 74 & *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) & 77 75 & *0.5/larga(ig) & 78 76 & *1. 79 !IM 060508 beg 80 else 81 if(prt_level.GE.10) print*,'WARNING cas ELSE on initialise gamma0=0.' 82 gamma0=0. 83 endif !(larga(ig).GT.0.) THEN 84 !IM 060508 end 85 ! s *0.5 86 ! gamma0=0. 87 zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) 77 else 78 gamma0(ig,k)=0. 79 endif 80 if (ltherm(ig,k).and.larga(ig)<=0.) nlarga0=nlarga0+1 81 enddo 82 enddo 83 84 gamma(:,:)=0. 85 86 do k=2,nlay 87 88 do ig=1,ngrid 89 if (ltherm(ig,k)) then 90 dua(ig,k)=ua(ig,k-1)-u(ig,k-1) 91 dva(ig,k)=va(ig,k-1)-v(ig,k-1) 92 else 93 ua(ig,k)=u(ig,k) 94 va(ig,k)=v(ig,k) 95 ue(ig,k)=u(ig,k) 96 ve(ig,k)=v(ig,k) 97 endif 98 enddo 99 100 101 ! Debut des iterations 102 !---------------------- 103 do iter=1,5 104 do ig=1,ngrid 105 ! Pour memoire : calcul prenant en compte la fraction reelle 106 ! zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) 107 ! zf2=1./(1.-zf) 108 ! Calcul avec fraction infiniement petite 88 109 zf=0. 89 zf2=1. /(1.-zf)90 ! la première fois on multiplie le coefficient de freinage 91 ! par le module du vent dans la couche en dessous.92 dua=ua(ig,k-1)-u(ig,k-1) 93 dva=va(ig,k-1)-v(ig,k-1) 94 do iter=1,5110 zf2=1. 111 112 ! la première fois on multiplie le coefficient de freinage 113 ! par le module du vent dans la couche en dessous. 114 ! Mais pourquoi donc ??? 115 if (ltherm(ig,k)) then 95 116 ! On choisit une relaxation lineaire. 96 gamma(ig,k)=gamma0 117 ! gamma(ig,k)=gamma0(ig,k) 97 118 ! On choisit une relaxation quadratique. 98 gamma(ig,k)=gamma0 *sqrt(dua**2+dva**2)119 gamma(ig,k)=gamma0(ig,k)*sqrt(dua(ig,k)**2+dva(ig,k)**2) 99 120 ua(ig,k)=(fm(ig,k)*ua(ig,k-1) & 100 121 & +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) & … … 105 126 & /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 & 106 127 & +gamma(ig,k)) 107 ! print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua ,dva108 dua =ua(ig,k)-u(ig,k)109 dva =va(ig,k)-v(ig,k)128 ! print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua(ig,k),dva(ig,k) 129 dua(ig,k)=ua(ig,k)-u(ig,k) 130 dva(ig,k)=va(ig,k)-v(ig,k) 110 131 ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 111 132 ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 112 enddo 113 else 114 ua(ig,k)=u(ig,k) 115 va(ig,k)=v(ig,k) 116 ue(ig,k)=u(ig,k) 117 ve(ig,k)=v(ig,k) 118 gamma(ig,k)=0. 119 endif 133 endif 120 134 enddo 121 enddo 135 ! Fin des iterations 136 !-------------------- 137 enddo 122 138 139 enddo ! k=2,nlay 140 141 142 ! Calcul du flux vertical de moment dans l'environnement. 143 !--------------------------------------------------------- 123 144 do k=2,nlay 124 145 do ig=1,ngrid … … 134 155 enddo 135 156 157 ! calcul des tendances. 158 !----------------------- 136 159 do k=1,nlay 137 160 do ig=1,ngrid 138 !IM139 if(prt_level.GE.10) print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), &140 & entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), &141 & masse(ig,k)142 !143 161 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) & 144 162 & -(entr(ig,k)+gamma(ig,k))*ue(ig,k) & … … 152 170 enddo 153 171 172 173 ! Sorties eventuelles. 174 !---------------------- 175 176 if(prt_level.GE.10) then 177 do k=1,nlay 178 do ig=1,ngrid 179 print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), & 180 & entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), & 181 & masse(ig,k) 182 enddo 183 enddo 184 endif 185 ! 186 if (nlarga0>0) then 187 print*,'WARNING !!!!!! DANS THERMCELL_DV2 ' 188 print*,nlarga0,' points pour lesquels laraga=0. dans un thermique' 189 print*,'Il faudrait decortiquer ces points' 190 endif 191 154 192 return 155 193 end -
LMDZ4/trunk/libf/phylmd/thermcell_env.F90
r970 r1403 1 1 SUBROUTINE thermcell_env(ngrid,nlay,po,pt,pu,pv,pplay, & 2 & pplev,zo,zh,zl,ztv,zthl,zu,zv,zpspsk, zqsat,lev_out)2 & pplev,zo,zh,zl,ztv,zthl,zu,zv,zpspsk,pqsat,lev_out) 3 3 4 4 !-------------------------------------------------------------- … … 31 31 REAL zu(ngrid,nlay) 32 32 REAL zv(ngrid,nlay) 33 REAL zqsat(ngrid,nlay)33 REAL pqsat(ngrid,nlay) 34 34 35 INTEGER ig,l ,ll35 INTEGER ig,ll 36 36 37 real zcor,zdelta,zcvm5,qlbef 38 real Tbef,qsatbef 39 real dqsat_dT,DT,num,denom 40 REAL RLvCp,DDT0 41 PARAMETER (DDT0=.01) 42 LOGICAL Zsat 37 real dqsat_dT 38 real RLvCp 43 39 44 Zsat=.false. 45 RLvCp = RLVTT/RCPD 40 logical mask(ngrid,nlay) 46 41 47 ! 48 ! Pr Tprec=Tl calcul de qsat 49 ! Si qsat>qT T=Tl, q=qT 50 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 51 ! On cherche DDT < DDT0 42 43 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 44 ! Initialisations : 45 !------------------ 46 47 mask(:,:)=.true. 48 RLvCp = RLVTT/RCPD 49 52 50 ! 53 51 ! calcul des caracteristiques de l environnement … … 57 55 zl(ig,ll)=0. 58 56 zh(ig,ll)=pt(ig,ll) 59 zqsat(ig,ll)=0.60 57 EndDO 61 58 EndDO 62 59 ! 63 60 ! 64 !recherche de saturation dans l environnement 65 DO ll=1,nlay 66 ! les points insatures sont definitifs 67 DO ig=1,ngrid 68 Tbef=pt(ig,ll) 69 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 70 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,ll) 71 qsatbef=MIN(0.5,qsatbef) 72 zcor=1./(1.-retv*qsatbef) 73 qsatbef=qsatbef*zcor 74 Zsat = (max(0.,po(ig,ll)-qsatbef) .gt. 1.e-10) 75 if (Zsat) then 76 qlbef=max(0.,po(ig,ll)-qsatbef) 77 ! si sature: ql est surestime, d'ou la sous-relax 78 DT = 0.5*RLvCp*qlbef 79 ! on pourra enchainer 2 ou 3 calculs sans Do while 80 do while (abs(DT).gt.DDT0) 81 ! il faut verifier si c,a conserve quand on repasse en insature ... 82 Tbef=Tbef+DT 83 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 84 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,ll) 85 qsatbef=MIN(0.5,qsatbef) 86 zcor=1./(1.-retv*qsatbef) 87 qsatbef=qsatbef*zcor 88 ! on veut le signe de qlbef 89 qlbef=po(ig,ll)-qsatbef 90 ! dqsat_dT 91 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 92 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 93 zcor=1./(1.-retv*qsatbef) 94 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 95 num=-Tbef+pt(ig,ll)+RLvCp*qlbef 96 denom=1.+RLvCp*dqsat_dT 97 if (denom.lt.1.e-10) then 98 print*,'pb denom' 99 endif 100 DT=num/denom 101 enddo 102 ! on ecrit de maniere conservative (sat ou non) 103 zl(ig,ll) = max(0.,qlbef) 104 ! T = Tl +Lv/Cp ql 105 zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll) 106 zo(ig,ll) = po(ig,ll)-zl(ig,ll) 107 endif 108 !on ecrit zqsat 109 zqsat(ig,ll)=qsatbef 110 EndDO 111 EndDO 61 ! Condensation : 62 !--------------- 63 ! Calcul de l'humidite a saturation et de la condensation 64 65 call thermcell_qsat(ngrid*nlay,mask,pplev,pt,po,pqsat) 66 DO ll=1,nlay 67 DO ig=1,ngrid 68 zl(ig,ll) = max(0.,po(ig,ll)-pqsat(ig,ll)) 69 zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll) ! T = Tl + Lv/Cp ql 70 zo(ig,ll) = po(ig,ll)-zl(ig,ll) 71 ENDDO 72 ENDDO 112 73 ! 113 74 ! 114 75 !----------------------------------------------------------------------- 115 ! incrementation eventuelle de tendances precedentes:116 ! ---------------------------------------------------117 76 118 77 if (prt_level.ge.1) print*,'0 OK convect8' 119 78 120 DO 1010l=1,nlay121 DO 1015ig=1,ngrid122 zpspsk(ig,l )=(pplay(ig,l)/100000.)**RKAPPA123 zu(ig,l )=pu(ig,l)124 zv(ig,l )=pv(ig,l)79 DO ll=1,nlay 80 DO ig=1,ngrid 81 zpspsk(ig,ll)=(pplay(ig,ll)/100000.)**RKAPPA 82 zu(ig,ll)=pu(ig,ll) 83 zv(ig,ll)=pv(ig,ll) 125 84 !attention zh est maintenant le profil de T et plus le profil de theta ! 85 ! Quelle horreur ! A eviter. 126 86 ! 127 87 ! T-> Theta 128 ztv(ig,l )=zh(ig,l)/zpspsk(ig,l)88 ztv(ig,ll)=zh(ig,ll)/zpspsk(ig,ll) 129 89 !Theta_v 130 ztv(ig,l)=ztv(ig,l)*(1.+RETV*(zo(ig,l)) & 131 & -zl(ig,l)) 90 ztv(ig,ll)=ztv(ig,ll)*(1.+RETV*(zo(ig,ll))-zl(ig,ll)) 132 91 !Thetal 133 zthl(ig,l )=pt(ig,l)/zpspsk(ig,l)92 zthl(ig,ll)=pt(ig,ll)/zpspsk(ig,ll) 134 93 ! 135 1015 CONTINUE 136 1010 CONTINUE 94 ENDDO 95 ENDDO 137 96 138 97 RETURN -
LMDZ4/trunk/libf/phylmd/thermcell_flux.F90
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 … … 51 51 !$OMP THREADPRIVATE(fomass_max,alphamax) 52 52 53 character (len=20) :: modname='thermcell_flux' 54 character (len=80) :: abort_message 55 53 56 fomass_max=0.5 54 57 alphamax=0.7 … … 92 95 print*,'alim_star(ig,l)',alim_star(ig,l) 93 96 print*,'detr_star(ig,l)',detr_star(ig,l) 94 ! stop95 97 endif 96 98 else … … 100 102 print*,'alim_star(ig,l)',alim_star(ig,l) 101 103 print*,'detr_star(ig,l)',detr_star(ig,l) 102 stop 104 abort_message = '' 105 CALL abort_gcm (modname,abort_message,1) 103 106 endif 104 107 endif … … 264 267 if (entr(ig,l)<0.) then 265 268 print*,'N1 ig,l,entr',ig,l,entr(ig,l) 266 stop 'entr negatif' 269 abort_message = 'entr negatif' 270 CALL abort_gcm (modname,abort_message,1) 267 271 endif 268 272 if (detr(ig,l).gt.fm(ig,l)) then … … 292 296 print*,'entr(ig,l)',entr(ig,l) 293 297 print*,'fm(ig,l)',fm(ig,l) 294 stop 'probleme dans thermcell flux' 298 abort_message = 'probleme dans thermcell flux' 299 CALL abort_gcm (modname,abort_message,1) 295 300 endif 296 301 enddo … … 319 324 print*,'detr(ig,l)',detr(ig,l) 320 325 print*,'fm(ig,l)',fm(ig,l) 321 stop 'probleme dans thermcell flux' 326 abort_message = 'probleme dans thermcell flux' 327 CALL abort_gcm (modname,abort_message,1) 322 328 endif 323 329 enddo … … 420 426 print*,'fm(ig,l+1)',fm(ig,l+1) 421 427 print*,'fm(ig,l)',fm(ig,l) 422 stop 'probleme dans thermcell_flux' 428 abort_message = 'probleme dans thermcell_flux' 429 CALL abort_gcm (modname,abort_message,1) 423 430 endif 424 431 entr(ig,l+1)=entr(ig,l+1)-ddd … … 478 485 character*3 descr 479 486 487 character (len=20) :: modname='thermcell_flux' 488 character (len=80) :: abort_message 489 480 490 lm=lmax(igout)+5 481 491 if(lm.gt.klev) lm=klev … … 500 510 print*,'detr(igout,l)',detr(igout,l) 501 511 print*,'fm(igout,l)',fm(igout,l) 502 stop 512 abort_message = '' 513 CALL abort_gcm (modname,abort_message,1) 503 514 endif 504 515 enddo -
LMDZ4/trunk/libf/phylmd/thermcell_flux2.F90
r1146 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE thermcell_flux2(ngrid,klev,ptimestep,masse, & 2 5 & lalim,lmax,alim_star, & … … 38 41 REAL zfm 39 42 40 integer igout 43 integer igout,lout 41 44 integer lev_out 42 45 integer lunout1 … … 46 49 REAL fomass_max,alphamax 47 50 save fomass_max,alphamax 51 52 logical check_debug,labort_gcm 53 54 character (len=20) :: modname='thermcell_flux2' 55 character (len=80) :: abort_message 48 56 49 57 fomass_max=0.5 … … 78 86 ! Verification de la nullite des entrainement et detrainement au dessus 79 87 ! de lmax(ig) 80 !------------------------------------------------------------------------- 81 88 ! Active uniquement si check_debug=.true. ou prt_level>=10 89 !------------------------------------------------------------------------- 90 91 check_debug=.false..or.prt_level>=10 92 93 if (check_debug) then 82 94 do l=1,klev 83 95 do ig=1,ngrid … … 88 100 print*,'alim_star(ig,l)',alim_star(ig,l) 89 101 print*,'detr_star(ig,l)',detr_star(ig,l) 90 ! stop91 102 endif 92 103 else … … 96 107 print*,'alim_star(ig,l)',alim_star(ig,l) 97 108 print*,'detr_star(ig,l)',detr_star(ig,l) 98 stop 109 abort_message = '' 110 labort_gcm=.true. 111 CALL abort_gcm (modname,abort_message,1) 99 112 endif 100 113 endif 101 114 enddo 102 115 enddo 116 endif 103 117 104 118 !------------------------------------------------------------------------- … … 253 267 254 268 ! do l=1,klev 269 270 271 272 labort_gcm=.false. 255 273 do ig=1,ngrid 256 274 if (entr(ig,l)<0.) then 257 print*,'N1 ig,l,entr',ig,l,entr(ig,l) 258 stop 'entr negatif' 259 endif 275 labort_gcm=.true. 276 igout=ig 277 lout=l 278 endif 279 enddo 280 281 if (labort_gcm) then 282 print*,'N1 ig,l,entr',igout,lout,entr(igout,lout) 283 abort_message = 'entr negatif' 284 CALL abort_gcm (modname,abort_message,1) 285 endif 286 287 do ig=1,ngrid 260 288 if (detr(ig,l).gt.fm(ig,l)) then 261 289 ncorecfm6=ncorecfm6+1 … … 280 308 entr(ig,l)=0. 281 309 endif 282 310 enddo 311 312 labort_gcm=.false. 313 do ig=1,ngrid 283 314 if (entr(ig,l).lt.0.) then 284 print*,'ig,l,lmax(ig)',ig,l,lmax(ig) 285 print*,'entr(ig,l)',entr(ig,l) 286 print*,'fm(ig,l)',fm(ig,l) 287 stop 'probleme dans thermcell flux' 288 endif 289 enddo 315 labort_gcm=.true. 316 igout=ig 317 endif 318 enddo 319 if (labort_gcm) then 320 ig=igout 321 print*,'ig,l,lmax(ig)',ig,l,lmax(ig) 322 print*,'entr(ig,l)',entr(ig,l) 323 print*,'fm(ig,l)',fm(ig,l) 324 abort_message = 'probleme dans thermcell flux' 325 CALL abort_gcm (modname,abort_message,1) 326 endif 327 328 290 329 ! enddo 291 330 endif … … 305 344 detr(ig,l)=detr(ig,l)+fm(ig,l+1) 306 345 fm(ig,l+1)=0. 307 ! print*,'fm2<0',l+1,lmax(ig)308 346 ncorecfm2=ncorecfm2+1 309 347 endif 348 enddo 349 350 labort_gcm=.false. 351 do ig=1,ngrid 310 352 if (detr(ig,l).lt.0.) then 353 labort_gcm=.true. 354 igout=ig 355 endif 356 enddo 357 if (labort_gcm) then 358 ig=igout 311 359 print*,'cas 2 : ig,l,lmax(ig)',ig,l,lmax(ig) 312 360 print*,'detr(ig,l)',detr(ig,l) 313 361 print*,'fm(ig,l)',fm(ig,l) 314 stop'probleme dans thermcell flux'315 endif316 end do362 abort_message = 'probleme dans thermcell flux' 363 CALL abort_gcm (modname,abort_message,1) 364 endif 317 365 ! enddo 318 366 … … 379 427 380 428 if (1.eq.1) then 429 labort_gcm=.false. 381 430 do l=1,klev-1 382 431 do ig=1,ngrid … … 399 448 else 400 449 if(l.ge.lmax(ig).and.0.eq.1) then 450 igout=ig 451 lout=l 452 labort_gcm=.true. 453 endif 454 entr(ig,l+1)=entr(ig,l+1)-ddd 455 detr(ig,l)=0. 456 fm(ig,l+1)=fm(ig,l)+entr(ig,l) 457 detr(ig,l)=0. 458 endif 459 endif 460 endif 461 enddo 462 enddo 463 if (labort_gcm) then 464 ig=igout 465 l=lout 401 466 print*,'ig,l',ig,l 402 467 print*,'eee0',eee0 … … 413 478 print*,'fm(ig,l+1)',fm(ig,l+1) 414 479 print*,'fm(ig,l)',fm(ig,l) 415 stop 'probleme dans thermcell_flux' 416 endif 417 entr(ig,l+1)=entr(ig,l+1)-ddd 418 detr(ig,l)=0. 419 fm(ig,l+1)=fm(ig,l)+entr(ig,l) 420 detr(ig,l)=0. 421 endif 422 endif 423 endif 424 enddo 425 enddo 480 abort_message = 'probleme dans thermcell_flux' 481 CALL abort_gcm (modname,abort_message,1) 482 endif 426 483 endif 427 484 ! -
LMDZ4/trunk/libf/phylmd/thermcell_height.F90
r1026 r1403 40 40 enddo 41 41 enddo 42 43 ! On traite le cas particulier qu'il faudrait éviter ou le thermique 44 ! atteind le haut du modele ... 45 do ig=1,ngrid 46 if ( zw2(ig,nlay) > 1.e-10 ) then 47 print*,'WARNING !!!!! W2 thermiques non nul derniere couche ' 48 lmax(ig)=nlay 49 endif 50 enddo 51 42 52 ! pas de thermique si couche 1 stable 43 53 do ig=1,ngrid -
LMDZ4/trunk/libf/phylmd/thermcell_init.F90
r1057 r1403 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_init(ngrid,nlay,ztv,zlay,zlev, & 2 5 & lalim,lmin,alim_star,alim_star_tot,lev_out) … … 26 29 !def des alim_star tels que alim=f*alim_star 27 30 28 do l=1,nlay29 do ig=1,ngrid30 alim_star(ig,l)=0.31 enddo32 enddo33 ! determination de la longueur de la couche d entrainement34 do ig=1,ngrid35 lalim(ig)=136 enddo37 31 38 if (iflag_thermals_ed.ge.1) then 39 !si la première couche est instable, on declenche un thermique 32 write(lunout,*)'THERM INIT V20C ' 33 34 alim_star_tot(:)=0. 35 alim_star(:,:)=0. 36 lmin(:)=1 37 lalim(:)=1 38 39 do l=1,nlay-1 40 40 do ig=1,ngrid 41 if (ztv(ig,1).gt.ztv(ig,2)) then 42 lmin(ig)=1 43 lalim(ig)=2 44 alim_star(ig,1)=1. 45 alim_star_tot(ig)=alim_star(ig,1) 46 if(prt_level.GE.10) print*,'init',alim_star(ig,1),alim_star_tot(ig) 47 else 48 lmin(ig)=1 49 lalim(ig)=1 50 alim_star(ig,1)=0. 51 alim_star_tot(ig)=0. 52 endif 53 enddo 54 55 else 56 !else iflag_thermals_ed=0 ancienne def de l alim 57 58 !on ne considere que les premieres couches instables 59 do l=nlay-2,1,-1 60 do ig=1,ngrid 61 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 62 & ztv(ig,l+1).le.ztv(ig,l+2)) then 63 lalim(ig)=l+1 64 endif 65 enddo 66 enddo 67 68 ! determination du lmin: couche d ou provient le thermique 69 70 do ig=1,ngrid 71 ! FH initialisation de lmin a nlay plutot que 1. 72 ! lmin(ig)=nlay 73 lmin(ig)=1 74 enddo 75 do l=nlay,2,-1 76 do ig=1,ngrid 77 if (ztv(ig,l-1).gt.ztv(ig,l)) then 78 lmin(ig)=l-1 41 if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then 42 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 43 & *sqrt(zlev(ig,l+1)) 44 lalim(:)=l+1 45 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 79 46 endif 80 47 enddo 81 48 enddo 82 ! 83 zzalim(:)=0. 84 do l=1,nlay-1 49 do l=1,nlay 85 50 do ig=1,ngrid 86 if (l<lalim(ig)) then 87 zzalim(ig)=zzalim(ig)+zlay(ig,l)*(ztv(ig,l)-ztv(ig,l+1)) 88 endif 89 enddo 90 enddo 91 do ig=1,ngrid 92 if (lalim(ig)>1) then 93 zzalim(ig)=zlay(ig,1)+zzalim(ig)/(ztv(ig,1)-ztv(ig,lalim(ig))) 94 else 95 zzalim(ig)=zlay(ig,1) 96 endif 97 enddo 98 99 if(prt_level.GE.10) print*,'ZZALIM LALIM ',zzalim,lalim,zlay(1,lalim(1)) 100 101 ! definition de l'entrainement des couches 102 if (1.eq.1) then 103 do l=1,nlay-1 104 do ig=1,ngrid 105 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 106 & l.ge.lmin(ig).and.l.lt.lalim(ig)) then 107 !def possibles pour alim_star: zdthetadz, dthetadz, zdtheta 108 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 109 & *sqrt(zlev(ig,l+1)) 110 endif 111 enddo 112 enddo 113 else 114 do l=1,nlay-1 115 do ig=1,ngrid 116 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 117 & l.ge.lmin(ig).and.l.lt.lalim(ig)) then 118 alim_star(ig,l)=max(3.*zzalim(ig)-zlay(ig,l),0.) & 119 & *(zlev(ig,l+1)-zlev(ig,l)) 120 endif 121 enddo 122 enddo 123 endif 124 125 ! pas de thermique si couche 1 stable 126 do ig=1,ngrid 127 !CRnouveau test 128 if (alim_star(ig,1).lt.1.e-10) then 129 do l=1,nlay 130 alim_star(ig,l)=0. 131 enddo 132 lmin(ig)=1 133 endif 134 enddo 135 ! calcul de l alimentation totale 136 do ig=1,ngrid 137 alim_star_tot(ig)=0. 138 enddo 139 do l=1,nlay 140 do ig=1,ngrid 141 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 142 enddo 143 enddo 144 ! 145 ! Calcul entrainement normalise 146 do l=1,nlay 147 do ig=1,ngrid 148 if (alim_star_tot(ig).gt.1.e-10) then 51 if (alim_star_tot(ig) > 1.e-10 ) then 149 52 alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) 150 53 endif 151 54 enddo 152 55 enddo 153 154 !on remet alim_star_tot a 1 155 do ig=1,ngrid 156 alim_star_tot(ig)=1. 157 enddo 56 alim_star_tot(:)=1. 158 57 159 endif 160 !endif iflag_thermals_ed 161 return 58 return 162 59 end -
LMDZ4/trunk/libf/phylmd/thermcell_main.F90
r1146 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE thermcell_main(itap,ngrid,nlay,ptimestep & … … 8 8 & ,fm0,entr0,detr0,zqta,zqla,lmax & 9 9 & ,ratqscth,ratqsdiff,zqsatth & 10 & ,r_aspect,l_mix,tau_thermals &10 & ,r_aspect,l_mix,tau_thermals,iflag_thermals_ed & 11 11 & ,Ale_bl,Alp_bl,lalim_conv,wght_th & 12 & ,zmax0, f0,zw2,fraca) 12 & ,zmax0, f0,zw2,fraca,ztv & 13 & ,zpspsk,ztla,zthl) 13 14 14 15 USE dimphy … … 22 23 ! de "thermiques" explicitement representes avec processus nuageux 23 24 ! 24 ! R éécriture à partir d'un listing papier àHabas, le 14/02/0025 ! 26 ! le thermique est suppos é homogène et dissipé par mélange avec27 ! son environnement. la longueur l_mix contr ôle l'efficacitédu28 ! m élange29 ! 30 ! Le calcul du transport des diff érentes espèces se fait en prenant25 ! Reecriture a partir d'un listing papier a Habas, le 14/02/00 26 ! 27 ! le thermique est suppose homogene et dissipe par melange avec 28 ! son environnement. la longueur l_mix controle l'efficacite du 29 ! melange 30 ! 31 ! Le calcul du transport des differentes especes se fait en prenant 31 32 ! en compte: 32 33 ! 1. un flux de masse montant … … 55 56 INTEGER ngrid,nlay,w2di 56 57 real tau_thermals 58 integer iflag_thermals_ed 57 59 real ptimestep,l_mix,r_aspect 58 60 REAL pt(ngrid,nlay),pdtadj(ngrid,nlay) … … 85 87 real linter(klon) 86 88 real zmix(klon) 87 real zmax(klon),zw2(klon,klev+1),ztva(klon,klev),zw_est(klon,klev+1) 89 real zmax(klon),zw2(klon,klev+1),ztva(klon,klev),zw_est(klon,klev+1),ztva_est(klon,klev) 88 90 ! real fraca(klon,klev) 89 91 … … 115 117 ! FH probleme de dimensionnement avec l'allocation dynamique 116 118 ! common/comtherm/thetath2,wth2 119 real wq(klon,klev) 120 real wthl(klon,klev) 121 real wthv(klon,klev) 117 122 118 123 real ratqscth(klon,klev) … … 126 131 127 132 real wmax(klon) 133 real wmax_tmp(klon) 128 134 real wmax_sec(klon) 129 135 real fm0(klon,klev+1),entr0(klon,klev),detr0(klon,klev) … … 142 148 real f_star(klon,klev+1),entr_star(klon,klev) 143 149 real detr_star(klon,klev) 144 real alim_star_tot(klon) ,alim_star2(klon)150 real alim_star_tot(klon) 145 151 real alim_star(klon,klev) 152 real alim_star_clos(klon,klev) 146 153 real f(klon), f0(klon) 147 154 !FH/IM save f0 … … 149 156 logical debut 150 157 real seuil 158 real csc(klon,klev) 151 159 152 160 ! … … 166 174 character*10 str10 167 175 176 character (len=20) :: modname='thermcell_main' 177 character (len=80) :: abort_message 178 168 179 EXTERNAL SCOPY 169 180 ! … … 182 193 183 194 184 ! #define wrgrads_thermcell185 195 #undef wrgrads_thermcell 186 196 #ifdef wrgrads_thermcell … … 200 210 fm=0. ; entr=0. ; detr=0. 201 211 212 202 213 icount=icount+1 203 214 … … 220 231 ENDIF 221 232 ! 222 !Initialisation 223 ! 224 ! IF (1.eq.0) THEN 225 ! do ig=1,klon 226 !FH/IM 130308 if ((debut).or.((.not.debut).and.(f0(ig).lt.1.e-10))) then 227 ! if ((.not.debut).and.(f0(ig).lt.1.e-10)) then 228 ! f0(ig)=1.e-5 229 ! zmax0(ig)=40. 230 !v1d therm=.false. 231 ! endif 232 ! enddo 233 ! ENDIF !(1.eq.0) THEN 234 if (prt_level.ge.10)write(lunout,*) & 235 & 'WARNING thermcell_main f0=max(f0,1.e-2)' 233 ! write(lunout,*)'WARNING thermcell_main f0=max(f0,1.e-2)' 236 234 do ig=1,klon 237 235 if (prt_level.ge.20) then … … 239 237 endif 240 238 f0(ig)=max(f0(ig),1.e-2) 239 zmax0(ig)=max(zmax0(ig),40.) 241 240 !IMmarche pas ?! if (f0(ig)<1.e-2) f0(ig)=1.e-2 242 241 enddo … … 364 363 365 364 !------------------------------------------------------------------ 366 ! 1. alim_star est le profil vertical de l'alimentation àla base du367 ! panache thermique, calcul é à partir de la flotabilitéde l'air sec365 ! 1. alim_star est le profil vertical de l'alimentation a la base du 366 ! panache thermique, calcule a partir de la flotabilite de l'air sec 368 367 ! 2. lmin et lalim sont les indices inferieurs et superieurs de alim_star 369 368 !------------------------------------------------------------------ 370 369 ! 371 370 entr_star=0. ; detr_star=0. ; alim_star=0. ; alim_star_tot=0. 372 CALL thermcell_init(ngrid,nlay,ztv,zlay,zlev, & 373 & lalim,lmin,alim_star,alim_star_tot,lev_out) 374 375 call test_ltherm(ngrid,nlay,pplev,pplay,lmin,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_init lmin ') 376 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_init lalim ') 377 378 379 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_init' 380 if (prt_level.ge.10) then 381 write(lunout1,*) 'Dans thermcell_main 1' 382 write(lunout1,*) 'lmin ',lmin(igout) 383 write(lunout1,*) 'lalim ',lalim(igout) 384 write(lunout1,*) ' ig l alim_star thetav' 385 write(lunout1,'(i6,i4,2e15.5)') (igout,l,alim_star(igout,l) & 386 & ,ztv(igout,l),l=1,lalim(igout)+4) 387 endif 388 389 !v1d do ig=1,klon 390 !v1d if (alim_star(ig,1).gt.1.e-10) then 391 !v1d therm=.true. 392 !v1d endif 393 !v1d enddo 371 lmin=1 372 394 373 !----------------------------------------------------------------------------- 395 374 ! 3. wmax_sec et zmax_sec sont les vitesses et altitudes maximum d'un 396 375 ! panache sec conservatif (e=d=0) alimente selon alim_star 397 376 ! Il s'agit d'un calcul de type CAPE 398 ! zmax_sec est utilis é pour déterminer la géométrie du thermique.377 ! zmax_sec est utilise pour determiner la geometrie du thermique. 399 378 !------------------------------------------------------------------------------ 400 ! 379 !--------------------------------------------------------------------------------- 380 !calcul du melange et des variables dans le thermique 381 !-------------------------------------------------------------------------------- 382 ! 383 if (prt_level.ge.1) print*,'avant thermcell_plume ',lev_out 384 !IM 140508 CALL thermcell_plume(ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 385 386 ! Gestion temporaire de plusieurs appels à thermcell_plume au travers 387 ! de la variable iflag_thermals 388 389 ! print*,'THERM thermcell_main iflag_thermals_ed=',iflag_thermals_ed 390 if (iflag_thermals_ed<=9) then 391 ! print*,'THERM NOUVELLE/NOUVELLE Arnaud' 392 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz,& 393 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 394 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 395 & ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 396 & ,lev_out,lunout1,igout) 397 398 elseif (iflag_thermals_ed>9) then 399 ! print*,'THERM RIO et al 2010, version d Arnaud' 400 CALL thermcellV1_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz,& 401 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 402 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 403 & ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 404 & ,lev_out,lunout1,igout) 405 406 endif 407 408 if (prt_level.ge.1) print*,'apres thermcell_plume ',lev_out 409 410 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 411 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 412 413 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_plume' 414 if (prt_level.ge.10) then 415 write(lunout1,*) 'Dans thermcell_main 2' 416 write(lunout1,*) 'lmin ',lmin(igout) 417 write(lunout1,*) 'lalim ',lalim(igout) 418 write(lunout1,*) ' ig l alim_star entr_star detr_star f_star ' 419 write(lunout1,'(i6,i4,4e15.5)') (igout,l,alim_star(igout,l),entr_star(igout,l),detr_star(igout,l) & 420 & ,f_star(igout,l+1),l=1,nint(linter(igout))+5) 421 endif 422 423 !------------------------------------------------------------------------------- 424 ! Calcul des caracteristiques du thermique:zmax,zmix,wmax 425 !------------------------------------------------------------------------------- 426 ! 427 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 428 & zlev,lmax,zmax,zmax0,zmix,wmax,lev_out) 429 ! Attention, w2 est transforme en sa racine carree dans cette routine 430 ! Le probleme vient du fait que linter et lmix sont souvent égaux à 1. 431 wmax_tmp=0. 432 do l=1,nlay 433 wmax_tmp(:)=max(wmax_tmp(:),zw2(:,l)) 434 enddo 435 ! print*,"ZMAX ",lalim,lmin,linter,lmix,lmax,zmax,zmax0,zmix,wmax 436 437 438 439 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ') 440 call test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ') 441 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ') 442 call test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ') 443 444 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_height' 445 446 !------------------------------------------------------------------------------- 447 ! Fermeture,determination de f 448 !------------------------------------------------------------------------------- 449 ! 450 ! 451 !! write(lunout,*)'THERM NOUVEAU XXXXX' 401 452 CALL thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star, & 402 453 & lalim,lmin,zmax_sec,wmax_sec,lev_out) 403 454 404 455 call test_ltherm(ngrid,nlay,pplev,pplay,lmin,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lmin ') … … 417 468 418 469 419 !--------------------------------------------------------------------------------- 420 !calcul du melange et des variables dans le thermique 421 !-------------------------------------------------------------------------------- 422 ! 423 if (prt_level.ge.1) print*,'avant thermcell_plume ',lev_out 424 !IM 140508 CALL thermcell_plume(ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 425 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 426 & zlev,pplev,pphi,zpspsk,l_mix,r_aspect,alim_star,alim_star_tot, & 427 & lalim,zmax_sec,f0,detr_star,entr_star,f_star,ztva, & 428 & ztla,zqla,zqta,zha,zw2,zw_est,zqsatth,lmix,lmix_bis,linter & 429 & ,lev_out,lunout1,igout) 430 if (prt_level.ge.1) print*,'apres thermcell_plume ',lev_out 431 432 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 433 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 434 435 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_plume' 436 if (prt_level.ge.10) then 437 write(lunout1,*) 'Dans thermcell_main 2' 438 write(lunout1,*) 'lmin ',lmin(igout) 439 write(lunout1,*) 'lalim ',lalim(igout) 440 write(lunout1,*) ' ig l alim_star entr_star detr_star f_star ' 441 write(lunout1,'(i6,i4,4e15.5)') (igout,l,alim_star(igout,l),entr_star(igout,l),detr_star(igout,l) & 442 & ,f_star(igout,l+1),l=1,nint(linter(igout))+5) 443 endif 444 445 !------------------------------------------------------------------------------- 446 ! Calcul des caracteristiques du thermique:zmax,zmix,wmax 447 !------------------------------------------------------------------------------- 448 ! 449 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 450 & zlev,lmax,zmax,zmax0,zmix,wmax,lev_out) 451 452 453 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ') 454 call test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ') 455 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ') 456 call test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ') 457 458 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_height' 459 460 !------------------------------------------------------------------------------- 461 ! Fermeture,determination de f 462 !------------------------------------------------------------------------------- 463 ! 464 !avant closure: on redéfinit lalim, alim_star_tot et alim_star 465 ! do ig=1,klon 466 ! do l=2,lalim(ig) 467 ! alim_star(ig,l)=entr_star(ig,l) 468 ! entr_star(ig,l)=0. 469 ! enddo 470 ! enddo 471 470 471 ! Choix de la fonction d'alimentation utilisee pour la fermeture. 472 ! Apparemment sans importance 473 alim_star_clos(:,:)=alim_star(:,:) 474 alim_star_clos(:,:)=entr_star(:,:)+alim_star(:,:) 475 476 ! Appel avec la version seche 472 477 CALL thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 473 & zlev,lalim,alim_star,alim_star_tot,zmax_sec,wmax_sec,zmax,wmax,f,lev_out) 478 & zlev,lalim,alim_star_clos,f_star,zmax_sec,wmax_sec,f,lev_out) 479 480 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 481 ! Appel avec les zmax et wmax tenant compte de la condensation 482 ! Semble moins bien marcher 483 ! CALL thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 484 ! & zlev,lalim,alim_star,f_star,zmax,wmax,f,lev_out) 485 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 474 486 475 487 if(prt_level.ge.1)print*,'thermcell_closure apres thermcell_closure' … … 484 496 ! Test valable seulement en 1D mais pas genant 485 497 if (.not. (f0(1).ge.0.) ) then 486 stop 'Dans thermcell_main' 498 abort_message = '.not. (f0(1).ge.0.)' 499 CALL abort_gcm (modname,abort_message,1) 487 500 endif 488 501 … … 511 524 fm0=(1.-lambda)*fm+lambda*fm0 512 525 entr0=(1.-lambda)*entr+lambda*entr0 513 !detr0=(1.-lambda)*detr+lambda*detr0526 detr0=(1.-lambda)*detr+lambda*detr0 514 527 else 515 528 fm0=fm … … 560 573 & ,fraca,zmax & 561 574 & ,zu,zv,pduadj,pdvadj,zua,zva,lev_out) 562 !IM 050508 & ,zu,zv,pduadj,pdvadj,zua,zva,igout,lev_out) 575 563 576 else 564 577 … … 596 609 pcon(ig)=pplay(ig,1)*(zo(ig,1)/zqsat(ig,1))**CHI 597 610 enddo 598 do k=1,nlay 611 !IM do k=1,nlay 612 do k=1,nlay-1 599 613 do ig=1,ngrid 600 614 if ((pcon(ig).le.pplay(ig,k)) & … … 603 617 endif 604 618 enddo 619 enddo 620 !IM 621 do ig=1,ngrid 622 if (pcon(ig).le.pplay(ig,nlay)) then 623 zcon2(ig)=zlay(ig,nlay)-(pcon(ig)-pplay(ig,nlay))/(RG*rho(ig,nlay))/100. 624 abort_message = 'thermcellV0_main: les thermiques vont trop haut ' 625 CALL abort_gcm (modname,abort_message,1) 626 endif 605 627 enddo 606 628 if (prt_level.ge.1) print*,'14b OK convect8' … … 636 658 ! 637 659 if (prt_level.ge.10) print*,'14f OK convect8 ig,l,zha zh zpspsk ',ig,l,zha(ig,l),zh(ig,l),zpspsk(ig,l) 638 thetath2(ig,l)=zf2*(z ha(ig,l)-zh(ig,l)/zpspsk(ig,l))**2660 thetath2(ig,l)=zf2*(ztla(ig,l)-zthl(ig,l))**2 639 661 if(zw2(ig,l).gt.1.e-10) then 640 662 wth2(ig,l)=zf2*(zw2(ig,l))**2 … … 651 673 enddo 652 674 enddo 653 !calcul de ale_bl et alp_bl 654 !pour le calcul d'une valeur intégrée entre la surface et lmax 655 do ig=1,ngrid 656 alp_int(ig)=0. 657 ale_int(ig)=0. 658 n_int(ig)=0 659 enddo 660 ! 661 do l=1,nlay 662 do ig=1,ngrid 663 if(l.LE.lmax(ig)) THEN 664 alp_int(ig)=alp_int(ig)+0.5*rhobarz(ig,l)*wth3(ig,l) 665 ale_int(ig)=ale_int(ig)+0.5*zw2(ig,l)**2 666 n_int(ig)=n_int(ig)+1 667 endif 668 enddo 669 enddo 675 !calcul des flux: q, thetal et thetav 676 do l=1,nlay 677 do ig=1,ngrid 678 wq(ig,l)=fraca(ig,l)*zw2(ig,l)*(zqta(ig,l)*1000.-po(ig,l)*1000.) 679 wthl(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztla(ig,l)-zthl(ig,l)) 680 wthv(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztva(ig,l)-ztv(ig,l)) 681 enddo 682 enddo 683 ! 670 684 ! print*,'avant calcul ale et alp' 671 685 !calcul de ALE et ALP pour la convection 672 do ig=1,ngrid 673 ! Alp_bl(ig)=0.5*rhobarz(ig,lmix_bis(ig))*wth3(ig,lmix(ig)) 674 ! Alp_bl(ig)=0.5*rhobarz(ig,nivcon(ig))*wth3(ig,nivcon(ig)) 675 ! Alp_bl(ig)=0.5*rhobarz(ig,lmix(ig))*wth3(ig,lmix(ig)) 676 ! & *0.1 677 !valeur integree de alp_bl * 0.5: 678 if (n_int(ig).gt.0) then 679 Alp_bl(ig)=0.5*alp_int(ig)/n_int(ig) 680 ! if (Alp_bl(ig).lt.0.) then 681 ! Alp_bl(ig)=0. 682 endif 683 ! endif 684 ! write(18,*),'rhobarz,wth3,Alp',rhobarz(ig,nivcon(ig)), 685 ! s wth3(ig,nivcon(ig)),Alp_bl(ig) 686 ! write(18,*),'ALP_BL',Alp_bl(ig),lmix(ig) 687 ! Ale_bl(ig)=0.5*zw2(ig,lmix_bis(ig))**2 688 ! if (nivcon(ig).eq.1) then 689 ! Ale_bl(ig)=0. 690 ! else 691 !valeur max de ale_bl: 692 Ale_bl(ig)=0.5*zw2(ig,lmix(ig))**2 693 ! & /2. 694 ! & *0.1 695 ! Ale_bl(ig)=0.5*zw2(ig,lmix_bis(ig))**2 696 ! if (n_int(ig).gt.0) then 697 ! Ale_bl(ig)=ale_int(ig)/n_int(ig) 698 ! Ale_bl(ig)=4. 699 ! endif 700 ! endif 701 ! Ale_bl(ig)=0.5*wth2(ig,lmix_bis(ig)) 702 ! Ale_bl(ig)=wth2(ig,nivcon(ig)) 703 ! write(19,*),'wth2,ALE_BL',wth2(ig,nivcon(ig)),Ale_bl(ig) 704 enddo 686 Alp_bl(:)=0. 687 Ale_bl(:)=0. 688 ! print*,'ALE,ALP ,l,zw2(ig,l),Ale_bl(ig),Alp_bl(ig)' 689 do l=1,nlay 690 do ig=1,ngrid 691 Alp_bl(ig)=max(Alp_bl(ig),0.5*rhobarz(ig,l)*wth3(ig,l) ) 692 Ale_bl(ig)=max(Ale_bl(ig),0.5*zw2(ig,l)**2) 693 ! print*,'ALE,ALP',l,zw2(ig,l),Ale_bl(ig),Alp_bl(ig) 694 enddo 695 enddo 696 697 ! print*,'AAAAAAA ',Alp_bl,Ale_bl,lmix 698 699 700 ! TEST. IL FAUT REECRIRE LES ALE et ALP 701 ! Ale_bl(:)=0.5*wmax(:)*wmax(:) 702 ! Alp_bl(:)=0.1*wmax(:)*wmax(:)*wmax(:) 703 705 704 !test:calcul de la ponderation des couches pour KE 706 705 !initialisations … … 782 781 ! print*,'15 OK convect8' 783 782 783 #ifdef wrgrads_thermcell 784 784 if (prt_level.ge.1) print*,'thermcell_main sorties 3D' 785 #ifdef wrgrads_thermcell786 785 #include "thermcell_out3d.h" 787 786 #endif … … 791 790 if (prt_level.ge.1) print*,'thermcell_main FIN OK' 792 791 793 ! if(icount.eq.501) stop'au pas 301 dans thermcell_main'794 792 return 795 793 end … … 827 825 write(6,'(i3,7f10.3)') k,pplay(i,k),ztv(i,k),1000*po(i,k),ztva(i,k),1000*zqla(i,k),f_star(i,k),zw2(i,k) 828 826 enddo 829 ! stop830 827 endif 831 828 enddo -
LMDZ4/trunk/libf/phylmd/thermcell_old.F
r987 r1403 112 112 character (len=10) :: str10 113 113 114 character (len=20) :: modname='thermcell2002' 115 character (len=80) :: abort_message 116 114 117 LOGICAL vtest(klon),down 115 118 … … 336 339 if(w2di.eq.2) then 337 340 entr(ig,k)=entr(ig,k)+ 338 s ptimestep*(zzz-entr(ig,k))/ float(tho)341 s ptimestep*(zzz-entr(ig,k))/REAL(tho) 339 342 else 340 343 entr(ig,k)=zzz … … 379 382 c print*,'ig,l+1,ztv(ig,l+1)' 380 383 c print*, ig,l+1,ztv(ig,l+1) 381 c stop'dans thermiques'382 384 c endif 383 385 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) … … 395 397 c print*,'Tv ',(ztv(ig,ll),ll=1,klev) 396 398 c print*,'Entr ',(entr(ig,ll),ll=1,klev) 397 c stop'dans thermiques'398 399 c endif 399 400 ztva(ig,l)=(fmc(ig,l)*ztva(ig,l-1)+entr(ig,l)*ztv(ig,l)) … … 517 518 do ig=1,ngrid 518 519 if(fracd(ig,l).lt.0.1) then 519 stop'fracd trop petit' 520 else 520 abort_message = 'fracd trop petit' 521 CALL abort_gcm (modname,abort_message,1) 522 else 521 523 c vitesse descendante "diagnostique" 522 524 wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l)) … … 588 590 589 591 if (w2di.eq.1) then 590 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)591 entr0=entr0+ptimestep*(entr-entr0)/ float(tho)592 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 593 entr0=entr0+ptimestep*(entr-entr0)/REAL(tho) 592 594 else 593 595 fm0=fm … … 1000 1002 character*2 str2 1001 1003 character*10 str10 1004 1005 character (len=20) :: modname='thermcell_cld' 1006 character (len=80) :: abort_message 1002 1007 1003 1008 LOGICAL vtest(klon),down … … 1855 1860 if (l.eq.klev) then 1856 1861 print*,'THERMCELL PB ig=',ig,' l=',l 1857 stop 1862 abort_message = 'THERMCELL PB' 1863 CALL abort_gcm (modname,abort_message,1) 1858 1864 endif 1859 1865 ! if ((zw2(ig,l+1).gt.1.e-10).and.(zw2(ig,l).gt.1.e-10).and. … … 2164 2170 do ig=1,ngrid 2165 2171 if(fracd(ig,l).lt.0.1.and.(test(ig).eq.1)) then 2166 stop'fracd trop petit' 2172 abort_message = 'fracd trop petit' 2173 CALL abort_gcm (modname,abort_message,1) 2167 2174 else 2168 2175 c vitesse descendante "diagnostique" … … 2262 2269 2263 2270 if (w2di.eq.1) then 2264 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)2265 entr0=entr0+ptimestep*(alim+entr-entr0)/ float(tho)2271 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 2272 entr0=entr0+ptimestep*(alim+entr-entr0)/REAL(tho) 2266 2273 else 2267 2274 fm0=fm … … 2747 2754 character*10 str10 2748 2755 2756 character (len=20) :: modname='thermcell_eau' 2757 character (len=80) :: abort_message 2758 2749 2759 LOGICAL vtest(klon),down 2750 2760 LOGICAL Zsat(klon) … … 3410 3420 do ig=1,ngrid 3411 3421 if(fracd(ig,l).lt.0.1) then 3412 stop'fracd trop petit' 3422 abort_message = 'fracd trop petit' 3423 CALL abort_gcm (modname,abort_message,1) 3413 3424 else 3414 3425 c vitesse descendante "diagnostique" … … 3481 3492 3482 3493 if (w2di.eq.1) then 3483 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)3484 entr0=entr0+ptimestep*(entr-entr0)/ float(tho)3494 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 3495 entr0=entr0+ptimestep*(entr-entr0)/REAL(tho) 3485 3496 else 3486 3497 fm0=fm … … 3848 3859 character*10 str10 3849 3860 3861 character (len=20) :: modname='thermcell' 3862 character (len=80) :: abort_message 3863 3850 3864 LOGICAL vtest(klon),down 3851 3865 … … 4394 4408 do ig=1,ngrid 4395 4409 if(fracd(ig,l).lt.0.1) then 4396 stop'fracd trop petit' 4410 abort_message = 'fracd trop petit' 4411 CALL abort_gcm (modname,abort_message,1) 4397 4412 else 4398 4413 c vitesse descendante "diagnostique" … … 4477 4492 cRC 4478 4493 if (w2di.eq.1) then 4479 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)4480 entr0=entr0+ptimestep*(entr-entr0)/ float(tho)4494 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 4495 entr0=entr0+ptimestep*(entr-entr0)/REAL(tho) 4481 4496 else 4482 4497 fm0=fm … … 5257 5272 character*10 str10 5258 5273 5274 character (len=20) :: modname='thermcell_sec' 5275 character (len=80) :: abort_message 5276 5259 5277 LOGICAL vtest(klon),down 5260 5278 … … 5822 5840 do ig=1,ngrid 5823 5841 if(fracd(ig,l).lt.0.1) then 5824 stop'fracd trop petit' 5842 abort_message = 'fracd trop petit' 5843 CALL abort_gcm (modname,abort_message,1) 5825 5844 else 5826 5845 c vitesse descendante "diagnostique" … … 5905 5924 cRC 5906 5925 if (w2di.eq.1) then 5907 fm0=fm0+ptimestep*(fm-fm0)/ float(tho)5908 entr0=entr0+ptimestep*(entr-entr0)/ float(tho)5926 fm0=fm0+ptimestep*(fm-fm0)/REAL(tho) 5927 entr0=entr0+ptimestep*(entr-entr0)/REAL(tho) 5909 5928 else 5910 5929 fm0=fm -
LMDZ4/trunk/libf/phylmd/thermcell_out3d.h
r1029 r1403 27 27 call wrgradsfi(1,nlay,q2(igout,1:klev),'q2 ','q2 ') 28 28 ! 29 ! 30 call wrgradsfi(1,nlay,wthl(igout,1:klev),'wthl ','wthl ') 31 call wrgradsfi(1,nlay,wthv(igout,1:klev),'wthv ','wthv ') 32 call wrgradsfi(1,nlay,wq(igout,1:klev),'wq ','wq ') 33 29 34 call wrgradsfi(1,nlay,ztva(igout,1:klev),'ztva ','ztva ') 30 35 call wrgradsfi(1,nlay,ztv(igout,1:klev),'ztv ','ztv ') … … 53 58 call wrgradsfi(1,1,f(igout),'f ','f ') 54 59 call wrgradsfi(1,1,alim_star_tot(igout),'a_s_t ','a_s_t ') 55 call wrgradsfi(1,1,alim_star2(igout),'a_2 ','a_2 ')56 60 call wrgradsfi(1,1,zmax(igout),'zmax ','zmax ') 57 61 call wrgradsfi(1,1,zmax_sec(igout),'z_sec ','z_sec ') -
LMDZ4/trunk/libf/phylmd/thermcell_plume.F90
r1057 r1403 1 ! 2 ! $Id$ 3 ! 1 4 SUBROUTINE thermcell_plume(itap,ngrid,klev,ptimestep,ztv,zthl,po,zl,rhobarz, & 2 & zlev,pplev,pphi,zpspsk, l_mix,r_aspect,alim_star,alim_star_tot, &3 & lalim, zmax_sec,f0,detr_star,entr_star,f_star,ztva, &4 & ztla,zqla,zqta,zha,zw2,w_est,z qsatth,lmix,lmix_bis,linter &5 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 6 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 7 & ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 5 8 & ,lev_out,lunout1,igout) 6 9 … … 31 34 REAL zpspsk(ngrid,klev) 32 35 REAL alim_star(ngrid,klev) 33 REAL zmax_sec(ngrid)34 36 REAL f0(ngrid) 35 REAL l_mix36 REAL r_aspect37 37 INTEGER lalim(ngrid) 38 38 integer lev_out ! niveau pour les print … … 44 44 REAL ztla(ngrid,klev) 45 45 REAL zqla(ngrid,klev) 46 REAL zqla0(ngrid,klev)47 46 REAL zqta(ngrid,klev) 48 47 REAL zha(ngrid,klev) … … 50 49 REAL detr_star(ngrid,klev) 51 50 REAL coefc 52 REAL detr_stara(ngrid,klev)53 REAL detr_starb(ngrid,klev)54 REAL detr_starc(ngrid,klev)55 REAL detr_star0(ngrid,klev)56 REAL detr_star1(ngrid,klev)57 REAL detr_star2(ngrid,klev)58 59 51 REAL entr_star(ngrid,klev) 60 REAL entr_star1(ngrid,klev)61 REAL entr_star2(ngrid,klev)62 52 REAL detr(ngrid,klev) 63 53 REAL entr(ngrid,klev) 54 55 REAL csc(ngrid,klev) 64 56 65 57 REAL zw2(ngrid,klev+1) … … 72 64 REAL zqsatth(ngrid,klev) 73 65 REAL zta_est(ngrid,klev) 66 REAL zdw2 67 REAL zw2modif 68 REAL zeps 74 69 75 70 REAL linter(ngrid) … … 80 75 INTEGER ig,l,k 81 76 77 real zdz,zfact,zbuoy,zalpha,zdrag 82 78 real zcor,zdelta,zcvm5,qlbef 83 79 real Tbef,qsatbef … … 86 82 PARAMETER (DDT0=.01) 87 83 logical Zsat 88 REAL fact_gamma,fact_epsilon 84 LOGICAL active(ngrid),activetmp(ngrid) 85 REAL fact_gamma,fact_epsilon,fact_gamma2 89 86 REAL c2(ngrid,klev) 90 87 REAL a1,m 88 89 REAL zw2fact,expa 91 90 Zsat=.false. 92 91 ! Initialisation 93 92 RLvCp = RLVTT/RCPD 94 93 95 if (iflag_thermals_ed==0) then 96 fact_gamma=1. 97 fact_epsilon=1. 98 else if (iflag_thermals_ed==1) then 99 fact_gamma=1. 100 fact_epsilon=1. 101 else if (iflag_thermals_ed==2) then 102 fact_gamma=1. 103 fact_epsilon=2. 104 endif 105 106 do l=1,klev 94 95 fact_epsilon=0.002 96 a1=2./3. 97 fact_gamma=0.9 98 zfact=fact_gamma/(1+fact_gamma) 99 fact_gamma2=zfact 100 expa=0. 101 102 103 ! Initialisations des variables reeles 104 if (1==1) then 105 ztva(:,:)=ztv(:,:) 106 ztva_est(:,:)=ztva(:,:) 107 ztla(:,:)=zthl(:,:) 108 zqta(:,:)=po(:,:) 109 zha(:,:) = ztva(:,:) 110 else 111 ztva(:,:)=0. 112 ztva_est(:,:)=0. 113 ztla(:,:)=0. 114 zqta(:,:)=0. 115 zha(:,:) =0. 116 endif 117 118 zqla_est(:,:)=0. 119 zqsatth(:,:)=0. 120 zqla(:,:)=0. 121 detr_star(:,:)=0. 122 entr_star(:,:)=0. 123 alim_star(:,:)=0. 124 alim_star_tot(:)=0. 125 csc(:,:)=0. 126 detr(:,:)=0. 127 entr(:,:)=0. 128 zw2(:,:)=0. 129 w_est(:,:)=0. 130 f_star(:,:)=0. 131 wa_moy(:,:)=0. 132 linter(:)=1. 133 linter(:)=1. 134 135 ! Initialisation des variables entieres 136 lmix(:)=1 137 lmix_bis(:)=2 138 wmaxa(:)=0. 139 lalim(:)=1 140 141 !------------------------------------------------------------------------- 142 ! On ne considere comme actif que les colonnes dont les deux premieres 143 ! couches sont instables. 144 !------------------------------------------------------------------------- 145 active(:)=ztv(:,1)>ztv(:,2) 146 147 !------------------------------------------------------------------------- 148 ! Definition de l'alimentation a l'origine dans thermcell_init 149 !------------------------------------------------------------------------- 150 do l=1,klev-1 107 151 do ig=1,ngrid 108 zqla_est(ig,l)=0. 109 ztva_est(ig,l)=ztva(ig,l) 110 zqsatth(ig,l)=0. 152 if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then 153 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 154 & *sqrt(zlev(ig,l+1)) 155 lalim(:)=l+1 156 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 157 endif 111 158 enddo 112 159 enddo 113 114 !CR: attention test couche alim 115 ! do l=2,klev 116 ! do ig=1,ngrid 117 ! alim_star(ig,l)=0. 118 ! enddo 119 ! enddo 120 !AM:initialisations du thermique 121 do k=1,klev 122 do ig=1,ngrid 123 ztva(ig,k)=ztv(ig,k) 124 ztla(ig,k)=zthl(ig,k) 125 zqla(ig,k)=0. 126 zqta(ig,k)=po(ig,k) 127 ! 128 ztva(ig,k) = ztla(ig,k)*zpspsk(ig,k)+RLvCp*zqla(ig,k) 129 ztva(ig,k) = ztva(ig,k)/zpspsk(ig,k) 130 zha(ig,k) = ztva(ig,k) 131 ! 132 enddo 133 enddo 134 do k=1,klev 135 do ig=1,ngrid 136 detr_star(ig,k)=0. 137 entr_star(ig,k)=0. 138 139 detr_stara(ig,k)=0. 140 detr_starb(ig,k)=0. 141 detr_starc(ig,k)=0. 142 detr_star0(ig,k)=0. 143 zqla0(ig,k)=0. 144 detr_star1(ig,k)=0. 145 detr_star2(ig,k)=0. 146 entr_star1(ig,k)=0. 147 entr_star2(ig,k)=0. 148 149 detr(ig,k)=0. 150 entr(ig,k)=0. 151 enddo 152 enddo 153 if (prt_level.ge.1) print*,'7 OK convect8' 154 do k=1,klev+1 155 do ig=1,ngrid 156 zw2(ig,k)=0. 157 w_est(ig,k)=0. 158 f_star(ig,k)=0. 159 wa_moy(ig,k)=0. 160 do l=1,klev 161 do ig=1,ngrid 162 if (alim_star_tot(ig) > 1.e-10 ) then 163 alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) 164 endif 160 165 enddo 161 166 enddo 162 163 if (prt_level.ge.1) print*,'8 OK convect8' 164 do ig=1,ngrid 165 linter(ig)=1. 166 lmix(ig)=1 167 lmix_bis(ig)=2 168 wmaxa(ig)=0. 169 enddo 170 171 !----------------------------------------------------------------------------------- 172 !boucle de calcul de la vitesse verticale dans le thermique 173 !----------------------------------------------------------------------------------- 174 do l=1,klev-1 175 do ig=1,ngrid 176 177 178 179 ! Calcul dans la premiere couche active du thermique (ce qu'on teste 180 ! en disant que la couche est instable et que w2 en bas de la couche 181 ! est nulle. 182 183 if (ztv(ig,l).gt.ztv(ig,l+1) & 184 & .and.alim_star(ig,l).gt.1.e-10 & 185 & .and.zw2(ig,l).lt.1e-10) then 186 187 167 alim_star_tot(:)=1. 168 169 170 !------------------------------------------------------------------------------ 171 ! Calcul dans la premiere couche 172 ! On decide dans cette version que le thermique n'est actif que si la premiere 173 ! couche est instable. 174 ! Pourrait etre change si on veut que le thermiques puisse se déclencher 175 ! dans une couche l>1 176 !------------------------------------------------------------------------------ 177 do ig=1,ngrid 188 178 ! Le panache va prendre au debut les caracteristiques de l'air contenu 189 179 ! dans cette couche. 190 ztla(ig,l)=zthl(ig,l) 191 zqta(ig,l)=po(ig,l) 192 zqla(ig,l)=zl(ig,l) 193 f_star(ig,l+1)=alim_star(ig,l) 194 195 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) & 196 & *(zlev(ig,l+1)-zlev(ig,l)) & 197 & *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) 198 w_est(ig,l+1)=zw2(ig,l+1) 180 if (active(ig)) then 181 ztla(ig,1)=zthl(ig,1) 182 zqta(ig,1)=po(ig,1) 183 zqla(ig,1)=zl(ig,1) 184 !cr: attention, prise en compte de f*(1)=1 185 f_star(ig,2)=alim_star(ig,1) 186 zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & 187 & *(zlev(ig,2)-zlev(ig,1)) & 188 & *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) 189 w_est(ig,2)=zw2(ig,2) 190 endif 191 enddo 199 192 ! 200 193 201 202 else if ((zw2(ig,l).ge.1e-10).and. & 203 & (f_star(ig,l)+alim_star(ig,l)).gt.1.e-10) then 204 !estimation du detrainement a partir de la geometrie du pas precedent 205 !tests sur la definition du detr 206 !calcul de detr_star et entr_star 207 208 209 210 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 211 ! FH le test miraculeux de Catherine ? Le bout du tunel ? 212 ! w_est(ig,3)=zw2(ig,2)* & 213 ! & ((f_star(ig,2))**2) & 214 ! & /(f_star(ig,2)+alim_star(ig,2))**2+ & 215 ! & 2.*RG*(ztva(ig,1)-ztv(ig,2))/ztv(ig,2) & 216 ! & *(zlev(ig,3)-zlev(ig,2)) 217 ! if (l.gt.2) then 218 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 194 !============================================================================== 195 !boucle de calcul de la vitesse verticale dans le thermique 196 !============================================================================== 197 do l=2,klev-1 198 !============================================================================== 199 200 201 ! On decide si le thermique est encore actif ou non 202 ! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test 203 do ig=1,ngrid 204 active(ig)=active(ig) & 205 & .and. zw2(ig,l)>1.e-10 & 206 & .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 207 enddo 219 208 220 209 … … 222 211 ! Premier calcul de la vitesse verticale a partir de la temperature 223 212 ! potentielle virtuelle 224 225 ! FH CESTQUOI CA ???? 226 #define int1d2 227 !#undef int1d2 228 #ifdef int1d2 229 if (l.ge.2) then 230 #else 231 if (l.gt.2) then 232 #endif 233 234 if (1.eq.1) then 235 w_est(ig,3)=zw2(ig,2)* & 236 & ((f_star(ig,2))**2) & 237 & /(f_star(ig,2)+alim_star(ig,2))**2+ & 238 & 2.*RG*(ztva(ig,2)-ztv(ig,2))/ztv(ig,2) & 239 ! & *1./3. & 240 & *(zlev(ig,3)-zlev(ig,2)) 241 endif 242 243 244 !--------------------------------------------------------------------------- 245 !calcul de l entrainement et du detrainement lateral 246 !--------------------------------------------------------------------------- 247 ! 248 !test:estimation de ztva_new_est sans entrainement 249 250 Tbef=ztla(ig,l-1)*zpspsk(ig,l) 251 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 252 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 253 qsatbef=MIN(0.5,qsatbef) 254 zcor=1./(1.-retv*qsatbef) 255 qsatbef=qsatbef*zcor 256 Zsat = (max(0.,zqta(ig,l-1)-qsatbef) .gt. 1.e-10) 257 if (Zsat) then 258 qlbef=max(0.,zqta(ig,l-1)-qsatbef) 259 DT = 0.5*RLvCp*qlbef 260 do while (abs(DT).gt.DDT0) 261 Tbef=Tbef+DT 262 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 263 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 264 qsatbef=MIN(0.5,qsatbef) 265 zcor=1./(1.-retv*qsatbef) 266 qsatbef=qsatbef*zcor 267 qlbef=zqta(ig,l-1)-qsatbef 268 269 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 270 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 271 zcor=1./(1.-retv*qsatbef) 272 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 273 num=-Tbef+ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*qlbef 274 denom=1.+RLvCp*dqsat_dT 275 DT=num/denom 276 enddo 277 zqla_est(ig,l) = max(0.,zqta(ig,l-1)-qsatbef) 278 endif 213 ! if (1.eq.1) then 214 ! w_est(ig,3)=zw2(ig,2)* & 215 ! & ((f_star(ig,2))**2) & 216 ! & /(f_star(ig,2)+alim_star(ig,2))**2+ & 217 ! & 2.*RG*(ztva(ig,2)-ztv(ig,2))/ztv(ig,2) & 218 ! & *(zlev(ig,3)-zlev(ig,2)) 219 ! endif 220 221 222 !--------------------------------------------------------------------------- 223 ! calcul des proprietes thermodynamiques et de la vitesse de la couche l 224 ! sans tenir compte du detrainement et de l'entrainement dans cette 225 ! couche 226 ! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer 227 ! avant) a l'alimentation pour avoir un calcul plus propre 228 !--------------------------------------------------------------------------- 229 230 call thermcell_condens(ngrid,active, & 231 & zpspsk(:,l),pplev(:,l),ztla(:,l-1),zqta(:,l-1),zqla_est(:,l)) 232 233 do ig=1,ngrid 234 if(active(ig)) then 279 235 ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) 236 zta_est(ig,l)=ztva_est(ig,l) 280 237 ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) 281 zta_est(ig,l)=ztva_est(ig,l)282 238 ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & 283 239 & -zqla_est(ig,l))-zqla_est(ig,l)) 284 240 241 if (1.eq.0) then 242 !calcul de w_est sans prendre en compte le drag 285 243 w_est(ig,l+1)=zw2(ig,l)* & 286 244 & ((f_star(ig,l))**2) & 287 245 & /(f_star(ig,l)+alim_star(ig,l))**2+ & 288 246 & 2.*RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 289 ! & *1./3. &290 247 & *(zlev(ig,l+1)-zlev(ig,l)) 248 else 249 250 zdz=zlev(ig,l+1)-zlev(ig,l) 251 zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l))/rhobarz(ig,l) 252 zbuoy=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) 253 zdrag=fact_epsilon/(zalpha**expa) 254 zw2fact=zbuoy/zdrag*a1 255 w_est(ig,l+1)=(w_est(ig,l)-zw2fact)*exp(-2.*zdrag/(1+fact_gamma)*zdz) & 256 & +zw2fact 257 258 endif 259 291 260 if (w_est(ig,l+1).lt.0.) then 292 261 w_est(ig,l+1)=zw2(ig,l) 293 262 endif 294 ! 295 !calcul du detrainement 296 !======================= 297 298 !CR:on vire les modifs 299 if (iflag_thermals_ed==0) then 300 301 ! Modifications du calcul du detrainement. 302 ! Dans la version de la these de Catherine, on passe brusquement 303 ! de la version seche a la version nuageuse pour le detrainement 304 ! ce qui peut occasioner des oscillations. 305 ! dans la nouvelle version, on commence par calculer un detrainement sec. 306 ! Puis un autre en cas de nuages. 307 ! Puis on combine les deux lineairement en fonction de la quantite d'eau. 308 309 #define int1d3 310 !#undef int1d3 311 #define RIO_TH 312 #ifdef RIO_TH 313 !1. Cas non nuageux 314 ! 1.1 on est sous le zmax_sec et w croit 315 if ((w_est(ig,l+1).gt.w_est(ig,l)).and. & 316 & (zlev(ig,l+1).lt.zmax_sec(ig)).and. & 317 #ifdef int1d3 318 & (zqla_est(ig,l).lt.1.e-10)) then 319 #else 320 & (zqla(ig,l-1).lt.1.e-10)) then 321 #endif 322 detr_star(ig,l)=MAX(0.,(rhobarz(ig,l+1) & 323 & *sqrt(w_est(ig,l+1))*sqrt(l_mix*zlev(ig,l+1)) & 324 & -rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(l_mix*zlev(ig,l))) & 325 & /(r_aspect*zmax_sec(ig))) 326 detr_stara(ig,l)=detr_star(ig,l) 327 328 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l',ig,l 329 330 ! 1.2 on est sous le zmax_sec et w decroit 331 else if ((zlev(ig,l+1).lt.zmax_sec(ig)).and. & 332 #ifdef int1d3 333 & (zqla_est(ig,l).lt.1.e-10)) then 334 #else 335 & (zqla(ig,l-1).lt.1.e-10)) then 336 #endif 337 detr_star(ig,l)=-f0(ig)*f_star(ig,lmix(ig)) & 338 & /(rhobarz(ig,lmix(ig))*wmaxa(ig))* & 339 & (rhobarz(ig,l+1)*sqrt(w_est(ig,l+1)) & 340 & *((zmax_sec(ig)-zlev(ig,l+1))/ & 341 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2. & 342 & -rhobarz(ig,l)*sqrt(w_est(ig,l)) & 343 & *((zmax_sec(ig)-zlev(ig,l))/ & 344 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2.) 345 detr_starb(ig,l)=detr_star(ig,l) 346 347 if (prt_level.ge.20) print*,'coucou calcul detr 2: ig, l',ig,l 348 349 else 350 351 ! 1.3 dans les autres cas 352 detr_star(ig,l)=0.002*f0(ig)*f_star(ig,l) & 353 & *(zlev(ig,l+1)-zlev(ig,l)) 354 detr_starc(ig,l)=detr_star(ig,l) 355 356 if (prt_level.ge.20) print*,'coucou calcul detr 3 n: ig, l',ig, l 357 358 endif 359 360 #else 361 362 ! 1.1 on est sous le zmax_sec et w croit 363 if ((w_est(ig,l+1).gt.w_est(ig,l)).and. & 364 & (zlev(ig,l+1).lt.zmax_sec(ig)) ) then 365 detr_star(ig,l)=MAX(0.,(rhobarz(ig,l+1) & 366 & *sqrt(w_est(ig,l+1))*sqrt(l_mix*zlev(ig,l+1)) & 367 & -rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(l_mix*zlev(ig,l))) & 368 & /(r_aspect*zmax_sec(ig))) 369 370 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l', ig, l 371 372 ! 1.2 on est sous le zmax_sec et w decroit 373 else if ((zlev(ig,l+1).lt.zmax_sec(ig)) ) then 374 detr_star(ig,l)=-f0(ig)*f_star(ig,lmix(ig)) & 375 & /(rhobarz(ig,lmix(ig))*wmaxa(ig))* & 376 & (rhobarz(ig,l+1)*sqrt(w_est(ig,l+1)) & 377 & *((zmax_sec(ig)-zlev(ig,l+1))/ & 378 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2. & 379 & -rhobarz(ig,l)*sqrt(w_est(ig,l)) & 380 & *((zmax_sec(ig)-zlev(ig,l))/ & 381 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2.) 382 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l', ig, l 383 384 else 385 detr_star=0. 386 endif 387 388 ! 1.3 dans les autres cas 389 detr_starc(ig,l)=0.002*f0(ig)*f_star(ig,l) & 390 & *(zlev(ig,l+1)-zlev(ig,l)) 391 392 coefc=min(zqla(ig,l-1)/1.e-3,1.) 393 if (zlev(ig,l+1).ge.zmax_sec(ig)) coefc=1. 394 coefc=1. 395 ! il semble qu'il soit important de baser le calcul sur 396 ! zqla_est(ig,l-1) plutot que sur zqla_est(ig,l) 397 detr_star(ig,l)=detr_starc(ig,l)*coefc+detr_star(ig,l)*(1.-coefc) 398 399 if (prt_level.ge.20) print*,'coucou calcul detr 2: ig, l', ig, l 400 401 #endif 402 403 404 if (prt_level.ge.20) print*,'coucou calcul detr 444: ig, l', ig, l 405 !IM 730508 beg 406 ! if(itap.GE.7200) THEN 407 ! print*,'th_plume ig,l,itap,zqla_est=',ig,l,itap,zqla_est(ig,l) 263 endif 264 enddo 265 266 !------------------------------------------------- 267 !calcul des taux d'entrainement et de detrainement 268 !------------------------------------------------- 269 270 do ig=1,ngrid 271 if (active(ig)) then 272 zdz=zlev(ig,l+1)-zlev(ig,l) 273 zbuoy=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) 274 275 ! estimation de la fraction couverte par les thermiques 276 zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l))/rhobarz(ig,l) 277 278 !calcul de la soumission papier 279 ! Calcul du taux d'entrainement entr_star (epsilon) 280 entr_star(ig,l)=f_star(ig,l)*zdz * ( zfact * MAX(0., & 281 & a1*zbuoy/w_est(ig,l+1) & 282 & - fact_epsilon/zalpha**expa ) & 283 & +0. ) 284 285 !calcul du taux de detrainment (delta) 286 ! detr_star(ig,l)=f_star(ig,l)*zdz * ( & 287 ! & MAX(1.e-3, & 288 ! & -fact_gamma2*a1*zbuoy/w_est(ig,l+1) & 289 ! & +0.01*(max(zqta(ig,l-1)-po(ig,l),0.)/(po(ig,l))/(w_est(ig,l+1)))**0.5 & 290 ! & +0. )) 291 292 m=0.5 293 294 detr_star(ig,l)=1.*f_star(ig,l)*zdz * & 295 & MAX(5.e-4,-fact_gamma2*a1*(1./w_est(ig,l+1))*((1.-(1.-m)/(1.+70*zqta(ig,l-1)))*zbuoy & 296 & -40*(1.-m)*(max(zqta(ig,l-1)-po(ig,l),0.))/(1.+70*zqta(ig,l-1)) ) ) 297 298 ! detr_star(ig,l)=f_star(ig,l)*zdz * ( & 299 ! & MAX(0.0, & 300 ! & -fact_gamma2*a1*zbuoy/w_est(ig,l+1) & 301 ! & +20*(max(zqta(ig,l-1)-po(ig,l),0.))**1*(zalpha/w_est(ig,l+1))**0.5 & 302 ! & +0. )) 303 304 305 ! En dessous de lalim, on prend le max de alim_star et entr_star pour 306 ! alim_star et 0 sinon 307 if (l.lt.lalim(ig)) then 308 alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) 309 entr_star(ig,l)=0. 310 endif 311 312 !attention test 313 ! if (detr_star(ig,l).gt.(f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l))) then 314 ! detr_star(ig,l)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) 408 315 ! endif 409 !IM 730508 end 410 411 zqla0(ig,l)=zqla_est(ig,l) 412 detr_star0(ig,l)=detr_star(ig,l) 413 !IM 060508 beg 414 ! if(detr_star(ig,l).GT.1.) THEN 415 ! print*,'th_plumeBEF ig l detr_star detr_starc coefc',ig,l,detr_star(ig,l) & 416 ! & ,detr_starc(ig,l),coefc 417 ! endif 418 !IM 060508 end 419 !IM 160508 beg 420 !IM 160508 IF (f0(ig).NE.0.) THEN 421 detr_star(ig,l)=detr_star(ig,l)/f0(ig) 422 !IM 160508 ELSE IF(detr_star(ig,l).EQ.0.) THEN 423 !IM 160508 print*,'WARNING1 : th_plume f0=0, detr_star=0: ig, l, itap',ig,l,itap 424 !IM 160508 ELSE 425 !IM 160508 print*,'WARNING2 : th_plume f0=0, ig, l, itap, detr_star',ig,l,itap,detr_star(ig,l) 426 !IM 160508 ENDIF 427 !IM 160508 end 428 !IM 060508 beg 429 ! if(detr_star(ig,l).GT.1.) THEN 430 ! print*,'th_plumeAFT ig l detr_star f0 1/f0',ig,l,detr_star(ig,l),f0(ig), & 431 ! & float(1)/f0(ig) 432 ! endif 433 !IM 060508 end 434 if (prt_level.ge.20) print*,'coucou calcul detr 445: ig, l', ig, l 435 ! 436 !calcul de entr_star 437 438 ! #undef test2 439 ! #ifdef test2 440 ! La version test2 destabilise beaucoup le modele. 441 ! Il semble donc que ca aide d'avoir un entrainement important sous 442 ! le nuage. 443 ! if (zqla_est(ig,l-1).ge.1.e-10.and.l.gt.lalim(ig)) then 444 ! entr_star(ig,l)=0.4*detr_star(ig,l) 445 ! else 446 ! entr_star(ig,l)=0. 447 ! endif 448 ! #else 449 ! 450 ! Deplacement du calcul de entr_star pour eviter d'avoir aussi 451 ! entr_star > fstar. 452 ! Redeplacer suite a la transformation du cas detr>f 453 ! FH 454 455 if (prt_level.ge.20) print*,'coucou calcul detr 446: ig, l', ig, l 456 #define int1d 457 !FH 070508 #define int1d4 458 !#undef int1d4 459 ! L'option int1d4 correspond au choix dans le cas ou le detrainement 460 ! devient trop grand. 461 462 #ifdef int1d 463 464 #ifdef int1d4 465 #else 466 detr_star(ig,l)=min(detr_star(ig,l),f_star(ig,l)) 467 !FH 070508 plus 468 detr_star(ig,l)=min(detr_star(ig,l),1.) 469 #endif 470 471 entr_star(ig,l)=max(0.4*detr_star(ig,l)-alim_star(ig,l),0.) 472 473 if (prt_level.ge.20) print*,'coucou calcul detr 447: ig, l', ig, l 474 #ifdef int1d4 475 ! Si le detrainement excede le flux en bas + l'entrainement, le thermique 476 ! doit disparaitre. 477 if (detr_star(ig,l)>f_star(ig,l)+entr_star(ig,l)) then 478 detr_star(ig,l)=f_star(ig,l)+entr_star(ig,l) 479 f_star(ig,l+1)=0. 480 linter(ig)=l+1 481 zw2(ig,l+1)=-1.e-10 482 endif 483 #endif 484 485 486 #else 487 488 if (prt_level.ge.20) print*,'coucou calcul detr 448: ig, l', ig, l 489 if(l.gt.lalim(ig)) then 490 entr_star(ig,l)=0.4*detr_star(ig,l) 491 else 492 493 ! FH : 494 ! Cette ligne doit permettre de garantir qu'on a toujours un flux = 1 495 ! en haut de la couche d'alimentation. 496 ! A remettre en questoin a la premiere occasion mais ca peut aider a 497 ! ecrire un code robuste. 498 ! Que ce soit avec ca ou avec l'ancienne facon de faire (e* = 0 mais 499 ! d* non nul) on a une discontinuité de e* ou d* en haut de la couche 500 ! d'alimentation, ce qui n'est pas forcement heureux. 501 502 if (prt_level.ge.20) print*,'coucou calcul detr 449: ig, l', ig, l 503 #undef pre_int1c 504 #ifdef pre_int1c 505 entr_star(ig,l)=max(detr_star(ig,l)-alim_star(ig,l),0.) 506 detr_star(ig,l)=entr_star(ig,l) 507 #else 508 entr_star(ig,l)=0. 509 #endif 510 511 endif 512 513 #endif 514 515 if (prt_level.ge.20) print*,'coucou calcul detr 440: ig, l', ig, l 516 entr_star1(ig,l)=entr_star(ig,l) 517 detr_star1(ig,l)=detr_star(ig,l) 518 ! 519 520 #ifdef int1d 521 #else 522 if (detr_star(ig,l).gt.f_star(ig,l)) then 523 524 ! Ce test est là entre autres parce qu'on passe par des valeurs 525 ! delirantes de detr_star. 526 ! ca vaut sans doute le coup de verifier pourquoi. 527 528 detr_star(ig,l)=f_star(ig,l) 529 #ifdef pre_int1c 530 if (l.gt.lalim(ig)+1) then 531 entr_star(ig,l)=0. 532 alim_star(ig,l)=0. 533 ! FH ajout pour forcer a stoper le thermique juste sous le sommet 534 ! de la couche (voir calcul de finter) 535 zw2(ig,l+1)=-1.e-10 536 linter(ig)=l+1 537 else 538 entr_star(ig,l)=0.4*detr_star(ig,l) 539 endif 540 #else 541 entr_star(ig,l)=0.4*detr_star(ig,l) 542 #endif 543 endif 544 #endif 545 546 else !l > 2 547 detr_star(ig,l)=0. 548 entr_star(ig,l)=0. 549 endif 550 551 entr_star2(ig,l)=entr_star(ig,l) 552 detr_star2(ig,l)=detr_star(ig,l) 553 if (prt_level.ge.20) print*,'coucou calcul detr 450: ig, l', ig, l 554 555 endif ! iflag_thermals_ed==0 556 557 !CR:nvlle def de entr_star et detr_star 558 if (iflag_thermals_ed>=1) then 559 ! if (l.lt.lalim(ig)) then 560 ! if (l.lt.2) then 561 ! entr_star(ig,l)=0. 562 ! detr_star(ig,l)=0. 563 ! else 564 ! if (0.001.gt.(RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l))/(2.*w_est(ig,l+1)))) then 565 ! entr_star(ig,l)=0.001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 566 ! else 567 ! entr_star(ig,l)= & 568 ! & f_star(ig,l)/(2.*w_est(ig,l+1)) & 569 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 570 ! & *(zlev(ig,l+1)-zlev(ig,l)) 571 572 573 entr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 574 & f_star(ig,l)/(2.*w_est(ig,l+1)) & 575 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 576 & *(zlev(ig,l+1)-zlev(ig,l))) & 577 & +0.0001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 578 579 if (((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10).and.(l.le.lmix_bis(ig))) then 580 alim_star_tot(ig)=alim_star_tot(ig)+entr_star(ig,l) 581 lalim(ig)=lmix_bis(ig) 582 if(prt_level.GE.10) print*,'alim_star_tot',alim_star_tot(ig),entr_star(ig,l) 583 endif 584 585 if (((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10).and.(l.le.lmix_bis(ig))) then 586 ! c2(ig,l)=2500000.*zqla_est(ig,l)/(1004.*zta_est(ig,l)) 587 c2(ig,l)=0.001 588 detr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 589 & c2(ig,l)*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) & 590 & -f_star(ig,l)/(2.*w_est(ig,l+1)) & 591 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 592 & *(zlev(ig,l+1)-zlev(ig,l))) & 593 & +0.0001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 594 595 else 596 ! c2(ig,l)=2500000.*zqla_est(ig,l)/(1004.*zta_est(ig,l)) 597 c2(ig,l)=0.003 598 599 detr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 600 & c2(ig,l)*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) & 601 & -f_star(ig,l)/(2.*w_est(ig,l+1)) & 602 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 603 & *(zlev(ig,l+1)-zlev(ig,l))) & 604 & +0.0002*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 605 endif 606 607 608 ! detr_star(ig,l)=detr_star(ig,l)*3. 609 ! if (l.lt.lalim(ig)) then 610 ! entr_star(ig,l)=0. 611 ! endif 612 ! if (l.lt.2) then 613 ! entr_star(ig,l)=0. 614 ! detr_star(ig,l)=0. 615 ! endif 616 617 618 ! endif 619 ! else if ((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10) then 620 ! entr_star(ig,l)=MAX(0.,0.8*f_star(ig,l)/(2.*w_est(ig,l+1)) & 621 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 622 ! & *(zlev(ig,l+1)-zlev(ig,l)) 623 ! detr_star(ig,l)=0.002*f_star(ig,l) & 624 ! & *(zlev(ig,l+1)-zlev(ig,l)) 625 ! else 626 ! entr_star(ig,l)=0.001*f_star(ig,l) & 627 ! & *(zlev(ig,l+1)-zlev(ig,l)) 628 ! detr_star(ig,l)=MAX(0.,-0.2*f_star(ig,l)/(2.*w_est(ig,l+1)) & 629 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 630 ! & *(zlev(ig,l+1)-zlev(ig,l)) & 631 ! & +0.002*f_star(ig,l) & 632 ! & *(zlev(ig,l+1)-zlev(ig,l)) 633 ! endif 634 635 endif ! iflag_thermals_ed==1 636 637 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 638 ! FH inutile si on conserve comme on l'a fait plus haut entr=detr 639 ! dans la couche d'alimentation 640 !pas d entrainement dans la couche alim 641 ! if ((l.le.lalim(ig))) then 642 ! entr_star(ig,l)=0. 643 ! endif 644 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 645 ! 646 !prise en compte du detrainement et de l entrainement dans le calcul du flux 647 316 ! Calcul du flux montant normalise 648 317 f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & 649 318 & -detr_star(ig,l) 650 319 651 !test sur le signe de f_star 652 if (prt_level.ge.20) print*,'coucou calcul detr 451: ig, l', ig, l653 if (f_star(ig,l+1).gt.1.e-10) then 320 endif 321 enddo 322 654 323 !---------------------------------------------------------------------------- 655 324 !calcul de la vitesse verticale en melangeant Tl et qt du thermique 656 325 !--------------------------------------------------------------------------- 657 ! 658 Zsat=.false. 659 ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & 326 activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 327 do ig=1,ngrid 328 if (activetmp(ig)) then 329 Zsat=.false. 330 ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & 660 331 & (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & 661 332 & /(f_star(ig,l+1)+detr_star(ig,l)) 662 ! 663 zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & 333 zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & 664 334 & (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & 665 335 & /(f_star(ig,l+1)+detr_star(ig,l)) 666 ! 667 Tbef=ztla(ig,l)*zpspsk(ig,l) 668 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 669 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 670 qsatbef=MIN(0.5,qsatbef) 671 zcor=1./(1.-retv*qsatbef) 672 qsatbef=qsatbef*zcor 673 Zsat = (max(0.,zqta(ig,l)-qsatbef) .gt. 1.e-10) 674 if (Zsat) then 675 qlbef=max(0.,zqta(ig,l)-qsatbef) 676 DT = 0.5*RLvCp*qlbef 677 do while (abs(DT).gt.DDT0) 678 Tbef=Tbef+DT 679 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 680 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 681 qsatbef=MIN(0.5,qsatbef) 682 zcor=1./(1.-retv*qsatbef) 683 qsatbef=qsatbef*zcor 684 qlbef=zqta(ig,l)-qsatbef 685 686 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 687 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 688 zcor=1./(1.-retv*qsatbef) 689 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 690 num=-Tbef+ztla(ig,l)*zpspsk(ig,l)+RLvCp*qlbef 691 denom=1.+RLvCp*dqsat_dT 692 DT=num/denom 693 enddo 694 zqla(ig,l) = max(0.,qlbef) 695 endif 696 ! 336 337 endif 338 enddo 339 340 call thermcell_condens(ngrid,activetmp,zpspsk(:,l),pplev(:,l),ztla(:,l),zqta(:,l),zqla(:,l)) 341 342 343 do ig=1,ngrid 344 if (activetmp(ig)) then 697 345 if (prt_level.ge.20) print*,'coucou calcul detr 4512: ig, l', ig, l 698 346 ! on ecrit de maniere conservative (sat ou non) … … 707 355 !on ecrit zqsat 708 356 zqsatth(ig,l)=qsatbef 709 !calcul de vitesse 710 zw2(ig,l+1)=zw2(ig,l)* & 711 & ((f_star(ig,l))**2) & 712 ! Tests de Catherine 713 ! & /(f_star(ig,l+1)+detr_star(ig,l))**2+ & 714 & /(f_star(ig,l+1)+detr_star(ig,l)-entr_star(ig,l)*(1.-fact_epsilon))**2+ & 715 & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 716 & *fact_gamma & 717 & *(zlev(ig,l+1)-zlev(ig,l)) 718 !prise en compte des forces de pression que qd flottabilité<0 719 ! zw2(ig,l+1)=zw2(ig,l)* & 720 ! & 1./(1.+2.*entr_star(ig,l)/f_star(ig,l)) + & 721 ! & (f_star(ig,l))**2 & 722 ! & /(f_star(ig,l)+entr_star(ig,l))**2+ & 723 ! & (f_star(ig,l)-2.*entr_star(ig,l))**2/(f_star(ig,l)+2.*entr_star(ig,l))**2+ & 724 ! & /(f_star(ig,l+1)+detr_star(ig,l)-entr_star(ig,l)*(1.-2.))**2+ & 725 ! & /(f_star(ig,l)**2+2.*2.*detr_star(ig,l)*f_star(ig,l)+2.*entr_star(ig,l)*f_star(ig,l))+ & 726 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 727 ! & *1./3. & 357 358 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 359 ! zw2(ig,l+1)=& 360 ! & zw2(ig,l)*(1-fact_epsilon/(1.+fact_gamma)*2.*(zlev(ig,l+1)-zlev(ig,l))) & 361 ! & +2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 362 ! & *1./(1.+fact_gamma) & 728 363 ! & *(zlev(ig,l+1)-zlev(ig,l)) 729 730 ! write(30,*),l+1,zw2(ig,l+1)-zw2(ig,l), & 731 ! & -2.*entr_star(ig,l)/f_star(ig,l)*zw2(ig,l), & 732 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 733 734 735 ! zw2(ig,l+1)=zw2(ig,l)* & 736 ! & (2.-2.*entr_star(ig,l)/f_star(ig,l)) & 737 ! & -zw2(ig,l-1)+ & 738 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 739 ! & *1./3. & 740 ! & *(zlev(ig,l+1)-zlev(ig,l)) 741 742 endif 743 endif 364 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 365 ! La meme en plus modulaire : 366 zbuoy=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) 367 zdz=zlev(ig,l+1)-zlev(ig,l) 368 369 370 zeps=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) 371 372 if (1==0) then 373 zw2modif=zw2(ig,l)*(1-fact_epsilon/(1.+fact_gamma)*2.*zdz) 374 zdw2=2.*zbuoy/(1.+fact_gamma)*zdz 375 zw2(ig,l+1)=zw2modif+zdw2 376 else 377 zdrag=fact_epsilon/(zalpha**expa) 378 zw2fact=zbuoy/zdrag*a1 379 zw2(ig,l+1)=(zw2(ig,l)-zw2fact)*exp(-2.*zdrag/(1+fact_gamma)*zdz) & 380 & +zw2fact 381 382 383 endif 384 385 endif 386 enddo 387 744 388 if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l 745 389 ! 390 !--------------------------------------------------------------------------- 746 391 !initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max 747 392 !--------------------------------------------------------------------------- 393 394 do ig=1,ngrid 748 395 if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then 749 396 ! stop'On tombe sur le cas particulier de thermcell_dry' … … 753 400 endif 754 401 755 ! if ((zw2(ig,l).gt.0.).and. (zw2(ig,l+1).le.0.)) then756 402 if (zw2(ig,l+1).lt.0.) then 757 403 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & … … 771 417 wmaxa(ig)=wa_moy(ig,l+1) 772 418 endif 773 enddo 419 enddo 420 421 !========================================================================= 422 ! FIN DE LA BOUCLE VERTICALE 774 423 enddo 775 776 !on remplace a* par e* ds premiere couche 777 ! if (iflag_thermals_ed.ge.1) then 778 ! do ig=1,ngrid 779 ! do l=2,klev 780 ! if (l.lt.lalim(ig)) then 781 ! alim_star(ig,l)=entr_star(ig,l) 782 ! endif 783 ! enddo 784 ! enddo 785 ! do ig=1,ngrid 786 ! lalim(ig)=lmix_bis(ig) 787 ! enddo 788 ! endif 789 if (iflag_thermals_ed.ge.1) then 790 do ig=1,ngrid 791 do l=2,lalim(ig) 792 alim_star(ig,l)=entr_star(ig,l) 793 entr_star(ig,l)=0. 794 enddo 795 enddo 796 endif 424 !========================================================================= 425 426 !on recalcule alim_star_tot 427 do ig=1,ngrid 428 alim_star_tot(ig)=0. 429 enddo 430 do ig=1,ngrid 431 do l=1,lalim(ig)-1 432 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 433 enddo 434 enddo 435 436 797 437 if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l 798 438 799 ! print*,'thermcell_plume OK'800 439 801 440 return 802 441 end 442 443 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 444 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 445 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 446 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 447 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 448 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 449 SUBROUTINE thermcellV1_plume(itap,ngrid,klev,ptimestep,ztv,zthl,po,zl,rhobarz, & 450 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 451 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 452 & ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 453 & ,lev_out,lunout1,igout) 454 455 !-------------------------------------------------------------------------- 456 !thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance 457 ! Version conforme a l'article de Rio et al. 2010. 458 ! Code ecrit par Catherine Rio, Arnaud Jam et Frederic Hourdin 459 !-------------------------------------------------------------------------- 460 461 IMPLICIT NONE 462 463 #include "YOMCST.h" 464 #include "YOETHF.h" 465 #include "FCTTRE.h" 466 #include "iniprint.h" 467 #include "thermcell.h" 468 469 INTEGER itap 470 INTEGER lunout1,igout 471 INTEGER ngrid,klev 472 REAL ptimestep 473 REAL ztv(ngrid,klev) 474 REAL zthl(ngrid,klev) 475 REAL po(ngrid,klev) 476 REAL zl(ngrid,klev) 477 REAL rhobarz(ngrid,klev) 478 REAL zlev(ngrid,klev+1) 479 REAL pplev(ngrid,klev+1) 480 REAL pphi(ngrid,klev) 481 REAL zpspsk(ngrid,klev) 482 REAL alim_star(ngrid,klev) 483 REAL f0(ngrid) 484 INTEGER lalim(ngrid) 485 integer lev_out ! niveau pour les print 486 487 real alim_star_tot(ngrid) 488 489 REAL ztva(ngrid,klev) 490 REAL ztla(ngrid,klev) 491 REAL zqla(ngrid,klev) 492 REAL zqta(ngrid,klev) 493 REAL zha(ngrid,klev) 494 495 REAL detr_star(ngrid,klev) 496 REAL coefc 497 REAL entr_star(ngrid,klev) 498 REAL detr(ngrid,klev) 499 REAL entr(ngrid,klev) 500 501 REAL csc(ngrid,klev) 502 503 REAL zw2(ngrid,klev+1) 504 REAL w_est(ngrid,klev+1) 505 REAL f_star(ngrid,klev+1) 506 REAL wa_moy(ngrid,klev+1) 507 508 REAL ztva_est(ngrid,klev) 509 REAL zqla_est(ngrid,klev) 510 REAL zqsatth(ngrid,klev) 511 REAL zta_est(ngrid,klev) 512 REAL ztemp(ngrid),zqsat(ngrid) 513 REAL zdw2 514 REAL zw2modif 515 REAL zw2fact 516 REAL zeps(ngrid,klev) 517 518 REAL linter(ngrid) 519 INTEGER lmix(ngrid) 520 INTEGER lmix_bis(ngrid) 521 REAL wmaxa(ngrid) 522 523 INTEGER ig,l,k 524 525 real zdz,zbuoy(ngrid,klev),zalpha,gamma(ngrid,klev),zdqt(ngrid,klev),zw2m 526 real zbuoybis 527 real zcor,zdelta,zcvm5,qlbef,zdz2 528 real betalpha,zbetalpha 529 real eps, afact 530 REAL REPS,RLvCp,DDT0 531 PARAMETER (DDT0=.01) 532 logical Zsat 533 LOGICAL active(ngrid),activetmp(ngrid) 534 REAL fact_gamma,fact_epsilon,fact_gamma2,fact_epsilon2 535 REAL c2(ngrid,klev) 536 Zsat=.false. 537 ! Initialisation 538 539 RLvCp = RLVTT/RCPD 540 fact_epsilon=0.002 541 betalpha=0.9 542 afact=2./3. 543 544 zbetalpha=betalpha/(1.+betalpha) 545 546 547 ! Initialisations des variables reeles 548 if (1==0) then 549 ztva(:,:)=ztv(:,:) 550 ztva_est(:,:)=ztva(:,:) 551 ztla(:,:)=zthl(:,:) 552 zqta(:,:)=po(:,:) 553 zha(:,:) = ztva(:,:) 554 else 555 ztva(:,:)=0. 556 ztva_est(:,:)=0. 557 ztla(:,:)=0. 558 zqta(:,:)=0. 559 zha(:,:) =0. 560 endif 561 562 zqla_est(:,:)=0. 563 zqsatth(:,:)=0. 564 zqla(:,:)=0. 565 detr_star(:,:)=0. 566 entr_star(:,:)=0. 567 alim_star(:,:)=0. 568 alim_star_tot(:)=0. 569 csc(:,:)=0. 570 detr(:,:)=0. 571 entr(:,:)=0. 572 zw2(:,:)=0. 573 zbuoy(:,:)=0. 574 gamma(:,:)=0. 575 zeps(:,:)=0. 576 w_est(:,:)=0. 577 f_star(:,:)=0. 578 wa_moy(:,:)=0. 579 linter(:)=1. 580 ! linter(:)=1. 581 ! Initialisation des variables entieres 582 lmix(:)=1 583 lmix_bis(:)=2 584 wmaxa(:)=0. 585 lalim(:)=1 586 587 588 !------------------------------------------------------------------------- 589 ! On ne considere comme actif que les colonnes dont les deux premieres 590 ! couches sont instables. 591 !------------------------------------------------------------------------- 592 active(:)=ztv(:,1)>ztv(:,2) 593 594 !------------------------------------------------------------------------- 595 ! Definition de l'alimentation a l'origine dans thermcell_init 596 !------------------------------------------------------------------------- 597 do l=1,klev-1 598 do ig=1,ngrid 599 if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then 600 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 601 & *sqrt(zlev(ig,l+1)) 602 lalim(ig)=l+1 603 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 604 endif 605 enddo 606 enddo 607 do l=1,klev 608 do ig=1,ngrid 609 if (alim_star_tot(ig) > 1.e-10 ) then 610 alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) 611 endif 612 enddo 613 enddo 614 alim_star_tot(:)=1. 615 616 617 618 !------------------------------------------------------------------------------ 619 ! Calcul dans la premiere couche 620 ! On decide dans cette version que le thermique n'est actif que si la premiere 621 ! couche est instable. 622 ! Pourrait etre change si on veut que le thermiques puisse se déclencher 623 ! dans une couche l>1 624 !------------------------------------------------------------------------------ 625 do ig=1,ngrid 626 ! Le panache va prendre au debut les caracteristiques de l'air contenu 627 ! dans cette couche. 628 if (active(ig)) then 629 ztla(ig,1)=zthl(ig,1) 630 zqta(ig,1)=po(ig,1) 631 zqla(ig,1)=zl(ig,1) 632 !cr: attention, prise en compte de f*(1)=1 633 f_star(ig,2)=alim_star(ig,1) 634 zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & 635 & *(zlev(ig,2)-zlev(ig,1)) & 636 & *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) 637 w_est(ig,2)=zw2(ig,2) 638 endif 639 enddo 640 ! 641 642 !============================================================================== 643 !boucle de calcul de la vitesse verticale dans le thermique 644 !============================================================================== 645 do l=2,klev-1 646 !============================================================================== 647 648 649 ! On decide si le thermique est encore actif ou non 650 ! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test 651 do ig=1,ngrid 652 active(ig)=active(ig) & 653 & .and. zw2(ig,l)>1.e-10 & 654 & .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 655 enddo 656 657 658 659 !--------------------------------------------------------------------------- 660 ! calcul des proprietes thermodynamiques et de la vitesse de la couche l 661 ! sans tenir compte du detrainement et de l'entrainement dans cette 662 ! couche 663 ! C'est a dire qu'on suppose 664 ! ztla(l)=ztla(l-1) et zqta(l)=zqta(l-1) 665 ! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer 666 ! avant) a l'alimentation pour avoir un calcul plus propre 667 !--------------------------------------------------------------------------- 668 669 ztemp(:)=zpspsk(:,l)*ztla(:,l-1) 670 call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:)) 671 672 do ig=1,ngrid 673 ! print*,'active',active(ig),ig,l 674 if(active(ig)) then 675 zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig)) 676 ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) 677 zta_est(ig,l)=ztva_est(ig,l) 678 ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) 679 ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & 680 & -zqla_est(ig,l))-zqla_est(ig,l)) 681 682 !------------------------------------------------ 683 !AJAM:nouveau calcul de w² 684 !------------------------------------------------ 685 zdz=zlev(ig,l+1)-zlev(ig,l) 686 zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) 687 688 zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) 689 zdw2=(afact)*zbuoy(ig,l)/(fact_epsilon) 690 w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) 691 692 693 if (w_est(ig,l+1).lt.0.) then 694 w_est(ig,l+1)=zw2(ig,l) 695 endif 696 endif 697 enddo 698 699 700 !------------------------------------------------- 701 !calcul des taux d'entrainement et de detrainement 702 !------------------------------------------------- 703 704 do ig=1,ngrid 705 if (active(ig)) then 706 707 zw2m=max(0.5*(w_est(ig,l)+w_est(ig,l+1)),0.1) 708 zw2m=w_est(ig,l+1) 709 zdz=zlev(ig,l+1)-zlev(ig,l) 710 zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) 711 ! zbuoybis=zbuoy(ig,l)+RG*0.1/300. 712 zbuoybis=zbuoy(ig,l) 713 zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) 714 zdqt(ig,l)=max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l) 715 716 717 entr_star(ig,l)=f_star(ig,l)*zdz* zbetalpha*MAX(0., & 718 & afact*zbuoybis/zw2m - fact_epsilon ) 719 720 721 detr_star(ig,l)=f_star(ig,l)*zdz & 722 & *MAX(1.e-3, -afact*zbetalpha*zbuoy(ig,l)/zw2m & 723 & + 0.012*(zdqt(ig,l)/zw2m)**0.5 ) 724 725 ! En dessous de lalim, on prend le max de alim_star et entr_star pour 726 ! alim_star et 0 sinon 727 if (l.lt.lalim(ig)) then 728 alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) 729 entr_star(ig,l)=0. 730 endif 731 732 ! Calcul du flux montant normalise 733 f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & 734 & -detr_star(ig,l) 735 736 endif 737 enddo 738 739 740 !---------------------------------------------------------------------------- 741 !calcul de la vitesse verticale en melangeant Tl et qt du thermique 742 !--------------------------------------------------------------------------- 743 activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 744 do ig=1,ngrid 745 if (activetmp(ig)) then 746 Zsat=.false. 747 ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & 748 & (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & 749 & /(f_star(ig,l+1)+detr_star(ig,l)) 750 zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & 751 & (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & 752 & /(f_star(ig,l+1)+detr_star(ig,l)) 753 754 endif 755 enddo 756 757 ztemp(:)=zpspsk(:,l)*ztla(:,l) 758 call thermcell_qsat(ngrid,activetmp,pplev(:,l),ztemp,zqta(:,l),zqsatth(:,l)) 759 760 do ig=1,ngrid 761 if (activetmp(ig)) then 762 if (prt_level.ge.20) print*,'coucou calcul detr 4512: ig, l', ig, l 763 ! on ecrit de maniere conservative (sat ou non) 764 ! T = Tl +Lv/Cp ql 765 zqla(ig,l)=max(0.,zqta(ig,l)-zqsatth(ig,l)) 766 ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) 767 ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) 768 !on rajoute le calcul de zha pour diagnostiques (temp potentielle) 769 zha(ig,l) = ztva(ig,l) 770 ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) & 771 & -zqla(ig,l))-zqla(ig,l)) 772 zbuoy(ig,l)=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) 773 zdz=zlev(ig,l+1)-zlev(ig,l) 774 zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) 775 776 zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) 777 zdw2=afact*zbuoy(ig,l)/(fact_epsilon) 778 zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2)+zdw2) 779 endif 780 enddo 781 782 if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l 783 ! 784 !--------------------------------------------------------------------------- 785 !initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max 786 !--------------------------------------------------------------------------- 787 788 do ig=1,ngrid 789 if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then 790 ! stop'On tombe sur le cas particulier de thermcell_dry' 791 print*,'On tombe sur le cas particulier de thermcell_plume' 792 zw2(ig,l+1)=0. 793 linter(ig)=l+1 794 endif 795 796 if (zw2(ig,l+1).lt.0.) then 797 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & 798 & -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) 799 zw2(ig,l+1)=0. 800 endif 801 802 wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) 803 804 if (wa_moy(ig,l+1).gt.wmaxa(ig)) then 805 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 806 !on rajoute le calcul de lmix_bis 807 if (zqla(ig,l).lt.1.e-10) then 808 lmix_bis(ig)=l+1 809 endif 810 lmix(ig)=l+1 811 wmaxa(ig)=wa_moy(ig,l+1) 812 endif 813 enddo 814 815 !========================================================================= 816 ! FIN DE LA BOUCLE VERTICALE 817 enddo 818 !========================================================================= 819 820 !on recalcule alim_star_tot 821 do ig=1,ngrid 822 alim_star_tot(ig)=0. 823 enddo 824 do ig=1,ngrid 825 do l=1,lalim(ig)-1 826 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 827 enddo 828 enddo 829 830 831 if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l 832 833 #undef wrgrads_thermcell 834 #ifdef wrgrads_thermcell 835 call wrgradsfi(1,klev,entr_star(igout,1:klev),'esta ','esta ') 836 call wrgradsfi(1,klev,detr_star(igout,1:klev),'dsta ','dsta ') 837 call wrgradsfi(1,klev,zbuoy(igout,1:klev),'buoy ','buoy ') 838 call wrgradsfi(1,klev,zdqt(igout,1:klev),'dqt ','dqt ') 839 call wrgradsfi(1,klev,w_est(igout,1:klev),'w_est ','w_est ') 840 call wrgradsfi(1,klev,w_est(igout,2:klev+1),'w_es2 ','w_es2 ') 841 call wrgradsfi(1,klev,zw2(igout,1:klev),'zw2A ','zw2A ') 842 #endif 843 844 845 return 846 end 847 -
LMDZ4/trunk/libf/phylmd/tracinca_mod.F90
r1279 r1403 45 45 USE vampir 46 46 USE comgeomphy 47 USE control_mod 48 47 49 48 50 IMPLICIT NONE 49 51 50 52 INCLUDE "indicesol.h" 51 INCLUDE "control.h"52 53 INCLUDE "dimensions.h" 53 54 INCLUDE "paramet.h" … … 125 126 CALL VTb(VTinca) 126 127 127 calday = FLOAT(julien) + gmtime128 calday = REAL(julien) + gmtime 128 129 ncsec = NINT (86400.*gmtime) 129 130 -
LMDZ4/trunk/libf/phylmd/traclmdz_mod.F90
r1279 r1403 6 6 ! only if running without any other chemestry model as INCA or REPROBUS. 7 7 ! 8 9 IMPLICIT NONE 8 10 9 11 REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: masktr ! Masque reservoir de sol traceur … … 35 37 !$OMP THREADPRIVATE(id_be) 36 38 39 !IM ajout traceurs RR 40 INTEGER,SAVE :: id_dry !traceur dry intrusions 41 !$OMP THREADPRIVATE(id_dry) 42 INTEGER,SAVE :: id_pcsat, id_pcocsat, id_pcq ! traceurs pseudo-vapeur CL qsat, qsat_oc, q 43 !$OMP THREADPRIVATE(id_pcsat, id_pcocsat, id_pcq) 44 INTEGER,SAVE :: id_pcs0, id_pcos0, id_pcq0 ! traceurs pseudo-vapeur CL qsat, qsat_oc, q 45 ! ! qui ne sont pas transportes par la convection 46 !$OMP THREADPRIVATE(id_pcs0, id_pcos0, id_pcq0) 47 48 INTEGER, SAVE:: id_o3 49 !$OMP THREADPRIVATE(id_o3) 50 ! index of ozone tracer with Cariolle parameterization 51 ! 0 means no ozone tracer 52 37 53 LOGICAL,SAVE :: rnpb=.TRUE. ! Presence du couple Rn222, Pb210 38 54 !$OMP THREADPRIVATE(rnpb) … … 47 63 USE dimphy 48 64 USE infotrac 49 IMPLICIT NONE50 65 51 66 ! Input argument … … 65 80 66 81 67 SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)82 SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage) 68 83 ! This subroutine allocates and initialize module variables and control variables. 69 84 USE dimphy 70 85 USE infotrac 86 USE regr_pr_comb_coefoz_m, ONLY: alloc_coefoz 87 USE press_coefoz_m, ONLY: press_coefoz 71 88 USE carbon_cycle_mod, ONLY : carbon_cycle_init, carbon_cycle_tr, carbon_cycle_cpl 72 73 IMPLICIT NONE74 89 75 90 INCLUDE "indicesol.h" … … 78 93 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol f(nature du sol) 79 94 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol ! Temperature du sol (surf)(Kelvin) 80 REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 95 !IM traceurs RR REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 96 REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri! Concentration Traceur [U/KgA] 97 REAL,DIMENSION(klon,klev),INTENT(IN) :: t_seri ! Temperature 98 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) 99 REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! humidite specifique 81 100 82 101 ! Output variables … … 85 104 86 105 ! Local variables 87 INTEGER :: ierr, it, iiq 106 INTEGER :: ierr, it, iiq, i, k 107 REAL,DIMENSION(klon,klev) :: qsat ! pression de la vapeur a saturation 88 108 89 109 ! -------------------------------------------- … … 121 141 122 142 ! 123 ! Recherche des traceurs connus : Be7, CO2,...143 ! Recherche des traceurs connus : Be7, O3, CO2,... 124 144 ! -------------------------------------------- 125 145 id_be=0 146 id_o3=0 126 147 DO it=1,nbtr 127 148 iiq=niadv(it+2) … … 135 156 CALL init_be(pctsrf,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe) 136 157 WRITE(*,*) 'Initialisation srcBe: OK' 158 ELSE IF (tname(iiq)=="O3" .OR. tname(iiq)=="o3") THEN 159 ! Recherche de l'ozone : parametrization de la chimie par Cariolle 160 id_o3=it 161 CALL alloc_coefoz ! allocate ozone coefficients 162 CALL press_coefoz ! read input pressure levels 137 163 END IF 138 164 END DO 165 166 id_dry=0 167 168 DO it=1,nbtr 169 iiq=niadv(it+2) 170 IF ( tname(iiq) == "dry" .OR. tname(iiq) == "Dry" ) THEN 171 id_dry=it 172 END IF 173 END DO 174 175 id_pcsat=0 176 DO it=1,nbtr 177 iiq=niadv(it+2) 178 IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN 179 id_pcsat=it 180 END IF 181 END DO 182 183 id_pcocsat=0 184 DO it=1,nbtr 185 iiq=niadv(it+2) 186 IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN 187 id_pcocsat=it 188 END IF 189 END DO 190 191 id_pcq=0 192 DO it=1,nbtr 193 iiq=niadv(it+2) 194 IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN 195 id_pcq=it 196 END IF 197 END DO 198 199 id_pcs0=0 200 DO it=1,nbtr 201 iiq=niadv(it+2) 202 IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN 203 id_pcs0=it 204 END IF 205 END DO 206 207 id_pcos0=0 208 DO it=1,nbtr 209 iiq=niadv(it+2) 210 IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN 211 id_pcos0=it 212 END IF 213 END DO 214 215 id_pcq0=0 216 DO it=1,nbtr 217 iiq=niadv(it+2) 218 IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN 219 id_pcq0=it 220 END IF 221 END DO 222 139 223 ! 140 224 ! Valeurs specifiques pour les traceurs Rn222 et Pb210 … … 159 243 END IF 160 244 245 !IM initialisation traceurs pseudo-vapeurs 246 call q_sat(klon*klev,t_seri,pplay,qsat) 247 IF ( id_pcsat /= 0 ) THEN 248 DO k = 1, klev 249 DO i = 1, klon 250 IF ( pplay(i,k).GE.85000.) THEN 251 tr_seri(i,k,id_pcsat) = qsat(i,k) 252 ELSE 253 tr_seri(i,k,id_pcsat) = 100. 254 END IF 255 END DO 256 END DO 257 END IF 258 259 IF ( id_pcocsat /= 0 ) THEN 260 DO k = 1, klev 261 DO i = 1, klon 262 IF ( pplay(i,k).GE.85000.) THEN 263 IF ( pctsrf (i, is_oce) > 0. ) THEN 264 tr_seri(i,k,id_pcocsat) = qsat(i,k) 265 ELSE 266 tr_seri(i,k,id_pcocsat) = 100. 267 END IF 268 END IF 269 END DO 270 END DO 271 END IF 272 273 IF ( id_pcq /= 0 ) THEN 274 DO k = 1, klev 275 DO i = 1, klon 276 IF ( pplay(i,k).GE.85000.) THEN 277 tr_seri(i,k,id_pcq) = sh(i,k) 278 ELSE 279 tr_seri(i,k,id_pcq) = 100. 280 END IF 281 END DO 282 END DO 283 END IF 284 285 IF ( id_pcs0 /= 0 ) THEN 286 DO k = 1, klev 287 DO i = 1, klon 288 IF ( pplay(i,k).GE.85000.) THEN 289 tr_seri(i,k,id_pcs0) = qsat(i,k) 290 ELSE 291 tr_seri(i,k,id_pcs0) = 100. 292 END IF 293 END DO 294 END DO 295 END IF 296 297 IF ( id_pcos0 /= 0 ) THEN 298 DO k = 1, klev 299 DO i = 1, klon 300 IF ( pplay(i,k).GE.85000.) THEN 301 IF ( pctsrf (i, is_oce) > 0. ) THEN 302 tr_seri(i,k,id_pcos0) = qsat(i,k) 303 ELSE 304 tr_seri(i,k,id_pcos0) = 100. 305 END IF 306 END IF 307 END DO 308 END DO 309 END IF 310 311 IF ( id_pcq0 /= 0 ) THEN 312 DO k = 1, klev 313 DO i = 1, klon 314 IF ( pplay(i,k).GE.85000.) THEN 315 tr_seri(i,k,id_pcq0) = sh(i,k) 316 ELSE 317 tr_seri(i,k,id_pcq0) = 100. 318 END IF 319 END DO 320 END DO 321 END IF 322 161 323 END SUBROUTINE traclmdz_init 162 324 163 SUBROUTINE traclmdz( & 164 nstep, pdtphys, t_seri, & 165 paprs, pplay, cdragh, coefh, & 166 yu1, yv1, ftsol, pctsrf, & 167 xlat, couchelimite, & 168 tr_seri, source, solsym, d_tr_cl) 325 SUBROUTINE traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, & 326 cdragh, coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, sh, & 327 tr_seri, source, solsym, d_tr_cl, zmasse) 169 328 170 329 USE dimphy 171 330 USE infotrac 331 USE regr_pr_comb_coefoz_m, ONLY: regr_pr_comb_coefoz 332 USE o3_chem_m, ONLY: o3_chem 172 333 USE carbon_cycle_mod, ONLY : carbon_cycle, carbon_cycle_tr, carbon_cycle_cpl 173 174 IMPLICIT NONE175 176 334 INCLUDE "YOMCST.h" 177 335 INCLUDE "indicesol.h" … … 185 343 !Configuration grille,temps: 186 344 INTEGER,INTENT(IN) :: nstep ! nombre d'appels de la physiq 345 INTEGER,INTENT(IN) :: julien ! Jour julien 346 REAL,INTENT(IN) :: gmtime 187 347 REAL,INTENT(IN) :: pdtphys ! Pas d'integration pour la physique (seconde) 188 348 REAL,DIMENSION(klon),INTENT(IN) :: xlat ! latitudes pour chaque point 349 REAL, INTENT(IN):: xlon(:) ! dim(klon) longitude 189 350 190 351 ! … … 194 355 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression pour chaque inter-couche (en Pa) 195 356 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) 357 REAL,intent(in):: zmasse (:, :) ! dim(klon,klev) density of air, in kg/m2 196 358 197 359 … … 204 366 REAL,DIMENSION(klon),INTENT(IN) :: yv1 ! vents au premier niveau 205 367 LOGICAL,INTENT(IN) :: couchelimite 368 !IM traceurs RR 369 REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! humidite specifique 206 370 207 371 ! Arguments necessaires pour les sources et puits de traceur: … … 223 387 224 388 INTEGER :: i, k, it 389 INTEGER lmt_pas ! number of time steps of "physics" per day 225 390 226 391 REAL,DIMENSION(klon) :: d_trs ! Td dans le reservoir 227 REAL,DIMENSION(klon,klev) :: delp ! epaisseur de couche (Pa)228 229 392 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_dec ! Td radioactive 230 393 REAL :: zrho ! Masse Volumique de l'air KgA/m3 231 394 232 ! 395 !IM traceurs RR 396 REAL,DIMENSION(klon,klev) :: qsat ! pression de la vapeur a saturation 397 REAL :: amn, amx 233 398 ! 234 399 !================================================================= … … 245 410 END IF 246 411 412 !IM ajout traceurs RR 413 call q_sat(klon*klev,t_seri,pplay,qsat) 414 415 IF ( id_pcsat /= 0 ) THEN 416 DO k = 1, klev 417 DO i = 1, klon 418 IF ( pplay(i,k).GE.85000.) THEN 419 tr_seri(i,k,id_pcsat) = qsat(i,k) 420 END IF 421 END DO 422 END DO 423 END IF 424 425 IF ( id_pcocsat /= 0 ) THEN 426 DO k = 1, klev 427 DO i = 1, klon 428 IF ( pplay(i,k).GE.85000.) THEN 429 IF ( pctsrf (i, is_oce) > 0. ) THEN 430 tr_seri(i,k,id_pcocsat) = qsat(i,k) 431 END IF 432 END IF 433 END DO 434 END DO 435 END IF 436 437 IF ( id_pcq /= 0 ) THEN 438 DO k = 1, klev 439 DO i = 1, klon 440 IF ( pplay(i,k).GE.85000.) THEN 441 tr_seri(i,k,id_pcq) = sh(i,k) 442 END IF 443 END DO 444 END DO 445 END IF 446 447 IF ( id_pcs0 /= 0 ) THEN 448 DO k = 1, klev 449 DO i = 1, klon 450 IF ( pplay(i,k).GE.85000.) THEN 451 tr_seri(i,k,id_pcs0) = qsat(i,k) 452 END IF 453 END DO 454 END DO 455 END IF 456 457 IF ( id_pcos0 /= 0 ) THEN 458 DO k = 1, klev 459 DO i = 1, klon 460 IF ( pplay(i,k).GE.85000.) THEN 461 IF ( pctsrf (i, is_oce) > 0. ) THEN 462 tr_seri(i,k,id_pcos0) = qsat(i,k) 463 END IF 464 END IF 465 END DO 466 END DO 467 END IF 468 469 IF ( id_pcq0 /= 0 ) THEN 470 DO k = 1, klev 471 DO i = 1, klon 472 IF ( pplay(i,k).GE.85000.) THEN 473 tr_seri(i,k,id_pcq0) = sh(i,k) 474 END IF 475 END DO 476 END DO 477 END IF 247 478 248 479 DO it=1,nbtr … … 265 496 END IF 266 497 267 268 DO k = 1, klev269 DO i = 1, klon270 delp(i,k) = paprs(i,k)-paprs(i,k+1)271 END DO272 END DO273 274 498 DO it=1, nbtr 275 499 IF (couchelimite .AND. pbl_flg(it) == 0 ) THEN ! couche limite avec quantite dans le sol calculee … … 277 501 cdragh, coefh,t_seri,ftsol,pctsrf, & 278 502 tr_seri(:,:,it),trs(:,it), & 279 paprs, pplay, delp,&503 paprs, pplay, zmasse * rg, & 280 504 masktr(:,it),fshtr(:,it),hsoltr(it),& 281 505 tautr(it),vdeptr(it), & … … 294 518 END IF 295 519 END DO 296 520 521 !IM traceurs RR 522 IF ( id_pcsat /= 0 ) THEN 523 DO k = 1, klev 524 DO i = 1, klon 525 IF ( pplay(i,k).LT.85000.) THEN 526 tr_seri(i,k,id_pcsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcsat)) 527 END IF 528 END DO 529 END DO 530 END IF 531 532 IF ( id_pcocsat /= 0 ) THEN 533 DO k = 1, klev 534 DO i = 1, klon 535 IF ( pplay(i,k).LT.85000.) THEN 536 tr_seri(i,k,id_pcocsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcocsat)) 537 END IF 538 END DO 539 END DO 540 END IF 541 542 IF ( id_pcq /= 0 ) THEN 543 DO k = 1, klev 544 DO i = 1, klon 545 IF ( pplay(i,k).LT.85000.) THEN 546 tr_seri(i,k,id_pcq) = MIN (qsat(i,k), tr_seri(i,k,id_pcq)) 547 END IF 548 END DO 549 END DO 550 END IF 551 552 IF ( id_pcs0 /= 0 ) THEN 553 DO k = 1, klev 554 DO i = 1, klon 555 IF ( pplay(i,k).LT.85000.) THEN 556 tr_seri(i,k,id_pcs0) = MIN (qsat(i,k), tr_seri(i,k,id_pcs0)) 557 END IF 558 END DO 559 END DO 560 END IF 561 562 IF ( id_pcos0 /= 0 ) THEN 563 DO k = 1, klev 564 DO i = 1, klon 565 IF ( pplay(i,k).LT.85000.) THEN 566 tr_seri(i,k,id_pcos0) = MIN (qsat(i,k), tr_seri(i,k,id_pcos0)) 567 END IF 568 END DO 569 END DO 570 END IF 571 572 IF ( id_pcq0 /= 0 ) THEN 573 DO k = 1, klev 574 DO i = 1, klon 575 IF ( pplay(i,k).LT.85000.) THEN 576 tr_seri(i,k,id_pcq0) = MIN (qsat(i,k), tr_seri(i,k,id_pcq0)) 577 END IF 578 END DO 579 END DO 580 END IF 297 581 !====================================================================== 298 582 ! Calcul de l'effet du puits radioactif … … 312 596 313 597 !====================================================================== 598 ! Parameterization of ozone chemistry 599 !====================================================================== 600 601 IF (id_o3 /= 0) then 602 lmt_pas = NINT(86400./pdtphys) 603 IF (MOD(nstep - 1, lmt_pas) == 0) THEN 604 ! Once per day, update the coefficients for ozone chemistry: 605 CALL regr_pr_comb_coefoz(julien, xlat, paprs, pplay) 606 END IF 607 CALL o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, xlat, & 608 xlon, tr_seri(:, :, id_o3)) 609 END IF 610 611 !====================================================================== 314 612 ! Calcul de cycle de carbon 315 613 !====================================================================== … … 327 625 USE infotrac 328 626 329 IMPLICIT NONE330 331 627 REAL,DIMENSION(klon,nbtr), INTENT(OUT) :: trs_out 332 628 INTEGER :: ierr -
LMDZ4/trunk/libf/phylmd/undefSTD.F
r1398 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 SUBROUTINE undefSTD(itap,freq_calNMC) -
LMDZ4/trunk/libf/phylmd/wake.F
r1277 r1403 1 Subroutine WAKE (p,ph,ppi,dtime,sigd_con 1 ! 2 ! $Id$ 3 ! 4 Subroutine WAKE (p,ph,pi,dtime,sigd_con 2 5 : ,te0,qe0,omgb 3 6 : ,dtdwn,dqdwn,amdwn,amup,dta,dqa … … 24 27 c 25 28 use dimphy 29 IMPLICIT none 30 c============================================================================ 31 C 32 C 33 C But : Decrire le comportement des poches froides apparaissant dans les 34 C grands systemes convectifs, et fournir l'energie disponible pour 35 C le declenchement de nouvelles colonnes convectives. 36 C 37 C Variables d'etat : deltatw : ecart de temperature wake-undisturbed area 38 C deltaqw : ecart d'humidite wake-undisturbed area 39 C sigmaw : fraction d'aire occupee par la poche. 40 C 41 C Variable de sortie : 42 c 43 c wape : WAke Potential Energy 44 c fip : Front Incident Power (W/m2) - ALP 45 c gfl : Gust Front Length per unit area (m-1) 46 C dtls : large scale temperature tendency due to wake 47 C dqls : large scale humidity tendency due to wake 48 C hw : hauteur de la poche 49 C dp_omgb : vertical gradient of large scale omega 50 C wdens : densite de poches 51 C omgbdth: flux of Delta_Theta transported by LS omega 52 C dtKE : differential heating (wake - unpertubed) 53 C dqKE : differential moistening (wake - unpertubed) 54 C omg : Delta_omg =vertical velocity diff. wake-undist. (Pa/s) 55 C dp_deltomg : vertical gradient of omg (s-1) 56 C spread : spreading term in dt_wake and dq_wake 57 C deltatw : updated temperature difference (T_w-T_u). 58 C deltaqw : updated humidity difference (q_w-q_u). 59 C sigmaw : updated wake fractional area. 60 C d_deltat_gw : delta T tendency due to GW 61 c 62 C Variables d'entree : 63 c 64 c aire : aire de la maille 65 c te0 : temperature dans l'environnement (K) 66 C qe0 : humidite dans l'environnement (kg/kg) 67 C omgb : vitesse verticale moyenne sur la maille (Pa/s) 68 C dtdwn: source de chaleur due aux descentes (K/s) 69 C dqdwn: source d'humidite due aux descentes (kg/kg/s) 70 C dta : source de chaleur due courants satures et detrain (K/s) 71 C dqa : source d'humidite due aux courants satures et detra (kg/kg/s) 72 C amdwn: flux de masse total des descentes, par unite de 73 C surface de la maille (kg/m2/s) 74 C amup : flux de masse total des ascendances, par unite de 75 C surface de la maille (kg/m2/s) 76 C p : pressions aux milieux des couches (Pa) 77 C ph : pressions aux interfaces (Pa) 78 C pi : (p/p_0)**kapa (adim) 79 C dtime: increment temporel (s) 80 c 81 C Variables internes : 82 c 83 c rhow : masse volumique de la poche froide 84 C rho : environment density at P levels 85 C rhoh : environment density at Ph levels 86 C te : environment temperature | may change within 87 C qe : environment humidity | sub-time-stepping 88 C the : environment potential temperature 89 C thu : potential temperature in undisturbed area 90 C tu : temperature in undisturbed area 91 C qu : humidity in undisturbed area 92 C dp_omgb: vertical gradient og LS omega 93 C omgbw : wake average vertical omega 94 C dp_omgbw: vertical gradient of omgbw 95 C omgbdq : flux of Delta_q transported by LS omega 96 C dth : potential temperature diff. wake-undist. 97 C th1 : first pot. temp. for vertical advection (=thu) 98 C th2 : second pot. temp. for vertical advection (=thw) 99 C q1 : first humidity for vertical advection 100 C q2 : second humidity for vertical advection 101 C d_deltatw : terme de redistribution pour deltatw 102 C d_deltaqw : terme de redistribution pour deltaqw 103 C deltatw0 : deltatw initial 104 C deltaqw0 : deltaqw initial 105 C hw0 : hw initial 106 C sigmaw0: sigmaw initial 107 C amflux : horizontal mass flux through wake boundary 108 C wdens_ref: initial number of wakes per unit area (3D) or per 109 C unit length (2D), at the beginning of each time step 110 C Tgw : 1 sur la période de onde de gravité 111 c Cgw : vitesse de propagation de onde de gravité 112 c LL : distance entre 2 poches 113 114 c------------------------------------------------------------------------- 115 c Déclaration de variables 116 c------------------------------------------------------------------------- 117 118 #include "dimensions.h" 119 #include "YOMCST.h" 120 #include "cvthermo.h" 121 #include "iniprint.h" 122 123 c Arguments en entree 124 c-------------------- 125 126 REAL, dimension(klon,klev) :: p, pi 127 REAL, dimension(klon,klev+1) :: ph, omgb 128 REAL dtime 129 REAL, dimension(klon,klev) :: te0,qe0 130 REAL, dimension(klon,klev) :: dtdwn, dqdwn 131 REAL, dimension(klon,klev) :: wdtPBL,wdqPBL 132 REAL, dimension(klon,klev) :: udtPBL,udqPBL 133 REAL, dimension(klon,klev) :: amdwn, amup 134 REAL, dimension(klon,klev) :: dta, dqa 135 REAL, dimension(klon) :: sigd_con 136 137 c Sorties 138 c-------- 139 140 REAL, dimension(klon,klev) :: deltatw, deltaqw, dth 141 REAL, dimension(klon,klev) :: tu, qu 142 REAL, dimension(klon,klev) :: dtls, dqls 143 REAL, dimension(klon,klev) :: dtKE, dqKE 144 REAL, dimension(klon,klev) :: dtPBL, dqPBL 145 REAL, dimension(klon,klev) :: spread 146 REAL, dimension(klon,klev) :: d_deltatgw 147 REAL, dimension(klon,klev) :: d_deltatw2, d_deltaqw2 148 REAL, dimension(klon,klev+1) :: omgbdth, omg 149 REAL, dimension(klon,klev) :: dp_omgb, dp_deltomg 150 REAL, dimension(klon,klev) :: d_deltat_gw 151 REAL, dimension(klon) :: hw, sigmaw, wape, fip, gfl, Cstar 152 REAL, dimension(klon) :: wdens 153 INTEGER, dimension(klon) :: ktopw 154 155 c Variables internes 156 c------------------- 157 158 c Variables à fixer 159 REAL ALON 160 REAL coefgw 161 REAL :: wdens_ref 162 REAL stark 163 REAL alpk 164 REAL delta_t_min 165 INTEGER nsub 166 REAL dtimesub 167 REAL sigmad, hwmin,wapecut 168 REAL :: sigmaw_max 169 REAL :: dens_rate 170 REAL wdens0 171 cIM 080208 172 LOGICAL, dimension(klon) :: gwake 173 174 c Variables de sauvegarde 175 REAL, dimension(klon,klev) :: deltatw0 176 REAL, dimension(klon,klev) :: deltaqw0 177 REAL, dimension(klon,klev) :: te, qe 178 REAL, dimension(klon) :: sigmaw0, sigmaw1 179 180 c Variables pour les GW 181 REAL, DIMENSION(klon) :: LL 182 REAL, dimension(klon,klev) :: N2 183 REAL, dimension(klon,klev) :: Cgw 184 REAL, dimension(klon,klev) :: Tgw 185 186 c Variables liées au calcul de hw 187 REAL, DIMENSION(klon) :: ptop_provis, ptop, ptop_new 188 REAL, DIMENSION(klon) :: sum_dth 189 REAL, DIMENSION(klon) :: dthmin 190 REAL, DIMENSION(klon) :: z, dz, hw0 191 INTEGER, DIMENSION(klon) :: ktop, kupper 192 193 c Sub-timestep tendencies and related variables 194 REAL d_deltatw(klon,klev),d_deltaqw(klon,klev) 195 REAL d_te(klon,klev),d_qe(klon,klev) 196 REAL d_sigmaw(klon),alpha(klon) 197 REAL q0_min(klon),q1_min(klon) 198 LOGICAL wk_adv(klon), OK_qx_qw(klon) 199 REAL epsilon 200 DATA epsilon/1.e-15/ 201 202 c Autres variables internes 203 INTEGER isubstep, k, i 204 205 REAL, DIMENSION(klon) :: sum_thu, sum_tu, sum_qu,sum_thvu 206 REAL, DIMENSION(klon) :: sum_dq, sum_rho 207 REAL, DIMENSION(klon) :: sum_dtdwn, sum_dqdwn 208 REAL, DIMENSION(klon) :: av_thu, av_tu, av_qu, av_thvu 209 REAL, DIMENSION(klon) :: av_dth, av_dq, av_rho 210 REAL, DIMENSION(klon) :: av_dtdwn, av_dqdwn 211 212 REAL, DIMENSION(klon,klev) :: rho, rhow 213 REAL, DIMENSION(klon,klev+1) :: rhoh 214 REAL, DIMENSION(klon,klev) :: rhow_moyen 215 REAL, DIMENSION(klon,klev) :: zh 216 REAL, DIMENSION(klon,klev+1) :: zhh 217 REAL, DIMENSION(klon,klev) :: epaisseur1, epaisseur2 218 219 REAL, DIMENSION(klon,klev) :: the, thu 220 221 ! REAL, DIMENSION(klon,klev) :: d_deltatw, d_deltaqw 222 223 REAL, DIMENSION(klon,klev+1) :: omgbw 224 REAL, DIMENSION(klon) :: pupper 225 REAL, DIMENSION(klon) :: omgtop 226 REAL, DIMENSION(klon,klev) :: dp_omgbw 227 REAL, DIMENSION(klon) :: ztop, dztop 228 REAL, DIMENSION(klon,klev) :: alpha_up 229 230 REAL, dimension(klon) :: RRe1, RRe2 231 REAL :: RRd1, RRd2 232 REAL, DIMENSION(klon,klev) :: Th1, Th2, q1, q2 233 REAL, DIMENSION(klon,klev) :: D_Th1, D_Th2, D_dth 234 REAL, DIMENSION(klon,klev) :: D_q1, D_q2, D_dq 235 REAL, DIMENSION(klon,klev) :: omgbdq 236 237 REAL, dimension(klon) :: ff, gg 238 REAL, dimension(klon) :: wape2, Cstar2, heff 239 240 REAL, DIMENSION(klon,klev) :: Crep 241 REAL Crep_upper, Crep_sol 242 243 REAL, DIMENSION(klon,klev) :: ppi 244 245 ccc nrlmd 246 real, dimension(klon) :: death_rate,nat_rate 247 real, dimension(klon,klev) :: entr 248 real, dimension(klon,klev) :: detr 249 250 C------------------------------------------------------------------------- 251 c Initialisations 252 c------------------------------------------------------------------------- 253 254 c print*, 'wake initialisations' 255 256 c Essais d'initialisation avec sigmaw = 0.02 et hw = 10. 257 c------------------------------------------------------------------------- 258 259 DATA wapecut,sigmad, hwmin /5.,.02,10./ 260 ccc nrlmd 261 DATA sigmaw_max /0.4/ 262 DATA dens_rate /0.1/ 263 ccc 264 C Longueur de maille (en m) 265 c------------------------------------------------------------------------- 266 267 c ALON = 3.e5 268 ALON = 1.e6 269 270 271 C Configuration de coefgw,stark,wdens (22/02/06 by YU Jingmei) 272 c 273 c coefgw : Coefficient pour les ondes de gravité 274 c stark : Coefficient k dans Cstar=k*sqrt(2*WAPE) 275 c wdens : Densité de poche froide par maille 276 c------------------------------------------------------------------------- 277 278 ccc nrlmd coefgw=10 279 c coefgw=1 280 c wdens0 = 1.0/(alon**2) 281 ccc nrlmd wdens = 1.0/(alon**2) 282 ccc nrlmd stark = 0.50 283 cCRtest 284 ccc nrlmd alpk=0.1 285 c alpk = 1.0 286 c alpk = 0.5 287 c alpk = 0.05 288 c 289 stark = 0.33 290 Alpk = 0.25 291 wdens_ref = 8.e-12 292 coefgw = 4. 293 Crep_upper=0.9 294 Crep_sol=1.0 295 296 ccc nrlmd Lecture du fichier wake_param.data 297 OPEN(99,file='wake_param.data',status='old', 298 $ form='formatted',err=9999) 299 READ(99,*,end=9998) stark 300 READ(99,*,end=9998) Alpk 301 READ(99,*,end=9998) wdens_ref 302 READ(99,*,end=9998) coefgw 303 9998 Continue 304 CLOSE(99) 305 9999 Continue 306 c 307 c Initialisation de toutes des densites a wdens_ref. 308 c Les densites peuvent evoluer si les poches debordent 309 c (voir au tout debut de la boucle sur les substeps) 310 wdens = wdens_ref 311 c 312 c print*,'stark',stark 313 c print*,'alpk',alpk 314 c print*,'wdens',wdens 315 c print*,'coefgw',coefgw 316 ccc 317 C Minimum value for |T_wake - T_undist|. Used for wake top definition 318 c------------------------------------------------------------------------- 319 320 delta_t_min = 0.2 321 322 C 1. - Save initial values and initialize tendencies 323 C -------------------------------------------------- 324 325 DO k=1,klev 326 DO i=1, klon 327 ppi(i,k)=pi(i,k) 328 deltatw0(i,k) = deltatw(i,k) 329 deltaqw0(i,k)= deltaqw(i,k) 330 te(i,k) = te0(i,k) 331 qe(i,k) = qe0(i,k) 332 dtls(i,k) = 0. 333 dqls(i,k) = 0. 334 d_deltat_gw(i,k)=0. 335 d_te(i,k) = 0. 336 d_qe(i,k) = 0. 337 d_deltatw(i,k) = 0. 338 d_deltaqw(i,k) = 0. 339 !IM 060508 beg 340 d_deltatw2(i,k)=0. 341 d_deltaqw2(i,k)=0. 342 !IM 060508 end 343 ENDDO 344 ENDDO 345 c sigmaw1=sigmaw 346 c IF (sigd_con.GT.sigmaw1) THEN 347 c print*, 'sigmaw,sigd_con', sigmaw, sigd_con 348 c ENDIF 349 DO i=1, klon 350 cc sigmaw(i) = amax1(sigmaw(i),sigd_con(i)) 351 sigmaw(i) = amax1(sigmaw(i),sigmad) 352 sigmaw(i) = amin1(sigmaw(i),0.99) 353 sigmaw0(i) = sigmaw(i) 354 wape(i) = 0. 355 wape2(i) = 0. 356 d_sigmaw(i) = 0. 357 ktopw(i) = 0 358 ENDDO 359 C 360 C 361 C 2. - Prognostic part 362 C -------------------- 363 C 364 C 365 C 2.1 - Undisturbed area and Wake integrals 366 C --------------------------------------------------------- 367 368 DO i=1, klon 369 z(i) = 0. 370 ktop(i)=0 371 kupper(i) = 0 372 sum_thu(i) = 0. 373 sum_tu(i) = 0. 374 sum_qu(i) = 0. 375 sum_thvu(i) = 0. 376 sum_dth(i) = 0. 377 sum_dq(i) = 0. 378 sum_rho(i) = 0. 379 sum_dtdwn(i) = 0. 380 sum_dqdwn(i) = 0. 381 382 av_thu(i) = 0. 383 av_tu(i) =0. 384 av_qu(i) =0. 385 av_thvu(i) = 0. 386 av_dth(i) = 0. 387 av_dq(i) = 0. 388 av_rho(i) =0. 389 av_dtdwn(i) =0. 390 av_dqdwn(i) = 0. 391 ENDDO 392 c 393 c Distance between wakes 394 DO i = 1,klon 395 LL(i) = (1-sqrt(sigmaw(i)))/sqrt(wdens(i)) 396 ENDDO 397 C Potential temperatures and humidity 398 c---------------------------------------------------------- 399 DO k =1,klev 400 DO i=1, klon 401 ! write(*,*)'wake 1',i,k,rd,te(i,k) 402 rho(i,k) = p(i,k)/(rd*te(i,k)) 403 ! write(*,*)'wake 2',rho(i,k) 404 IF(k .eq. 1) THEN 405 ! write(*,*)'wake 3',i,k,rd,te(i,k) 406 rhoh(i,k) = ph(i,k)/(rd*te(i,k)) 407 ! write(*,*)'wake 4',i,k,rd,te(i,k) 408 zhh(i,k)=0 409 ELSE 410 ! write(*,*)'wake 5',rd,(te(i,k)+te(i,k-1)) 411 rhoh(i,k) = ph(i,k)*2./(rd*(te(i,k)+te(i,k-1))) 412 ! write(*,*)'wake 6',(-rhoh(i,k)*RG)+zhh(i,k-1) 413 zhh(i,k)=(ph(i,k)-ph(i,k-1))/(-rhoh(i,k)*RG)+zhh(i,k-1) 414 ENDIF 415 ! write(*,*)'wake 7',ppi(i,k) 416 the(i,k) = te(i,k)/ppi(i,k) 417 thu(i,k) = (te(i,k) - deltatw(i,k)*sigmaw(i))/ppi(i,k) 418 tu(i,k) = te(i,k) - deltatw(i,k)*sigmaw(i) 419 qu(i,k) = qe(i,k) - deltaqw(i,k)*sigmaw(i) 420 ! write(*,*)'wake 8',(rd*(te(i,k)+deltatw(i,k))) 421 rhow(i,k) = p(i,k)/(rd*(te(i,k)+deltatw(i,k))) 422 dth(i,k) = deltatw(i,k)/ppi(i,k) 423 ENDDO 424 ENDDO 425 426 DO k = 1, klev-1 427 DO i=1, klon 428 IF(k.eq.1) THEN 429 N2(i,k)=0 430 ELSE 431 N2(i,k)=amax1(0.,-RG**2/the(i,k)*rho(i,k)*(the(i,k+1)- 432 $ the(i,k-1))/(p(i,k+1)-p(i,k-1))) 433 ENDIF 434 ZH(i,k)=(zhh(i,k)+zhh(i,k+1))/2 435 436 Cgw(i,k)=sqrt(N2(i,k))*ZH(i,k) 437 Tgw(i,k)=coefgw*Cgw(i,k)/LL(i) 438 ENDDO 439 ENDDO 440 441 DO i=1, klon 442 N2(i,klev)=0 443 ZH(i,klev)=0 444 Cgw(i,klev)=0 445 Tgw(i,klev)=0 446 ENDDO 447 448 c Calcul de la masse volumique moyenne de la colonne (bdlmd) 449 c----------------------------------------------------------------- 450 451 DO k=1,klev 452 DO i=1, klon 453 epaisseur1(i,k)=0. 454 epaisseur2(i,k)=0. 455 ENDDO 456 ENDDO 457 458 DO i=1, klon 459 epaisseur1(i,1)= -(ph(i,2)-ph(i,1))/(rho(i,1)*rg)+1. 460 epaisseur2(i,1)= -(ph(i,2)-ph(i,1))/(rho(i,1)*rg)+1. 461 rhow_moyen(i,1) = rhow(i,1) 462 ENDDO 463 464 DO k = 2, klev 465 DO i=1, klon 466 epaisseur1(i,k)= -(ph(i,k+1)-ph(i,k))/(rho(i,k)*rg) +1. 467 epaisseur2(i,k)=epaisseur2(i,k-1)+epaisseur1(i,k) 468 rhow_moyen(i,k) = (rhow_moyen(i,k-1)*epaisseur2(i,k-1)+ 469 $ rhow(i,k)*epaisseur1(i,k))/epaisseur2(i,k) 470 ENDDO 471 ENDDO 472 473 C 474 C Choose an integration bound well above wake top 475 c----------------------------------------------------------------- 476 c 477 C Pupper = 50000. ! melting level 478 c Pupper = 60000. 479 c Pupper = 80000. ! essais pour case_e 480 DO i = 1,klon 481 Pupper(i) = 0.6*ph(i,1) 482 Pupper(i) = max(Pupper(i), 45000.) 483 ccc Pupper(i) = 60000. 484 ENDDO 485 486 C 487 C Determine Wake top pressure (Ptop) from buoyancy integral 488 C -------------------------------------------------------- 489 c 490 c-1/ Pressure of the level where dth becomes less than delta_t_min. 491 492 DO i=1,klon 493 ptop_provis(i)=ph(i,1) 494 ENDDO 495 DO k= 2,klev 496 DO i=1,klon 497 c 498 cIM v3JYG; ptop_provis(i).LT. ph(i,1) 499 c 500 IF (dth(i,k) .GT. -delta_t_min .and. 501 $ dth(i,k-1).LT. -delta_t_min .and. 502 $ ptop_provis(i).EQ. ph(i,1)) THEN 503 ptop_provis(i) = ((dth(i,k)+delta_t_min)*p(i,k-1) 504 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) / 505 $ (dth(i,k) - dth(i,k-1)) 506 ENDIF 507 ENDDO 508 ENDDO 509 510 c-2/ dth integral 511 512 DO i=1,klon 513 sum_dth(i) = 0. 514 dthmin(i) = -delta_t_min 515 z(i) = 0. 516 ENDDO 517 518 DO k = 1,klev 519 DO i=1,klon 520 dz(i) = -(amax1(ph(i,k+1),ptop_provis(i))-Ph(i,k))/(rho(i,k)*rg) 521 IF (dz(i) .gt. 0) THEN 522 z(i) = z(i)+dz(i) 523 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i) 524 dthmin(i) = amin1(dthmin(i),dth(i,k)) 525 ENDIF 526 ENDDO 527 ENDDO 528 529 c-3/ height of triangle with area= sum_dth and base = dthmin 530 531 DO i=1,klon 532 hw0(i) = 2.*sum_dth(i)/amin1(dthmin(i),-0.5) 533 hw0(i) = amax1(hwmin,hw0(i)) 534 ENDDO 535 536 c-4/ now, get Ptop 537 538 DO i=1,klon 539 z(i) = 0. 540 ptop(i) = ph(i,1) 541 ENDDO 542 543 DO k = 1,klev 544 DO i=1,klon 545 dz(i) = amin1(-(ph(i,k+1)-ph(i,k))/(rho(i,k)*rg),hw0(i)-z(i)) 546 IF (dz(i) .gt. 0) THEN 547 z(i) = z(i)+dz(i) 548 ptop(i) = ph(i,k)-rho(i,k)*rg*dz(i) 549 ENDIF 550 ENDDO 551 ENDDO 552 553 554 C-5/ Determination de ktop et kupper 555 556 DO k=klev,1,-1 557 DO i=1,klon 558 IF (ph(i,k+1) .lt. ptop(i)) ktop(i)=k 559 IF (ph(i,k+1) .lt. pupper(i)) kupper(i)=k 560 ENDDO 561 ENDDO 562 563 c On evite kupper = 1 564 DO i=1,klon 565 kupper(i) = max(kupper(i),2) 566 ENDDO 567 568 569 c-6/ Correct ktop and ptop 570 571 DO i = 1,klon 572 ptop_new(i)=ptop(i) 573 ENDDO 574 DO k= klev,2,-1 575 DO i=1,klon 576 IF (k .LE. ktop(i) .and. 577 $ ptop_new(i) .EQ. ptop(i) .and. 578 $ dth(i,k) .GT. -delta_t_min .and. 579 $ dth(i,k-1).LT. -delta_t_min) THEN 580 ptop_new(i) = ((dth(i,k)+delta_t_min)*p(i,k-1) 581 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) / 582 $ (dth(i,k) - dth(i,k-1)) 583 ENDIF 584 ENDDO 585 ENDDO 586 587 DO i=1,klon 588 ptop(i) = ptop_new(i) 589 ENDDO 590 591 DO k=klev,1,-1 592 DO i=1,klon 593 IF (ph(i,k+1) .lt. ptop(i)) ktop(i)=k 594 ENDDO 595 ENDDO 596 c 597 c-5/ Set deltatw & deltaqw to 0 above kupper 598 c 599 DO k = 1,klev 600 DO i=1,klon 601 IF (k.GE. kupper(i)) THEN 602 deltatw(i,k) = 0. 603 deltaqw(i,k) = 0. 604 ENDIF 605 ENDDO 606 ENDDO 607 c 608 C 609 C Vertical gradient of LS omega 610 C 611 DO k = 1,klev 612 DO i=1,klon 613 IF (k.LE. kupper(i)) THEN 614 dp_omgb(i,k) = (omgb(i,k+1) - omgb(i,k))/(ph(i,k+1)-ph(i,k)) 615 ENDIF 616 ENDDO 617 ENDDO 618 C 619 C Integrals (and wake top level number) 620 C -------------------------------------- 621 C 622 C Initialize sum_thvu to 1st level virt. pot. temp. 623 624 DO i=1,klon 625 z(i) = 1. 626 dz(i) = 1. 627 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i) 628 sum_dth(i) = 0. 629 ENDDO 630 631 DO k = 1,klev 632 DO i=1,klon 633 dz(i) = -(amax1(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg) 634 IF (dz(i) .GT. 0) THEN 635 z(i) = z(i)+dz(i) 636 sum_thu(i) = sum_thu(i) + thu(i,k)*dz(i) 637 sum_tu(i) = sum_tu(i) + tu(i,k)*dz(i) 638 sum_qu(i) = sum_qu(i) + qu(i,k)*dz(i) 639 sum_thvu(i) = sum_thvu(i) + thu(i,k)*(1.+eps*qu(i,k))*dz(i) 640 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i) 641 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i) 642 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i) 643 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i) 644 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i) 645 ENDIF 646 ENDDO 647 ENDDO 648 c 649 DO i=1,klon 650 hw0(i) = z(i) 651 ENDDO 652 c 653 C 654 C 2.1 - WAPE and mean forcing computation 655 C --------------------------------------- 656 C 657 C --------------------------------------- 658 C 659 C Means 660 661 DO i=1,klon 662 av_thu(i) = sum_thu(i)/hw0(i) 663 av_tu(i) = sum_tu(i)/hw0(i) 664 av_qu(i) = sum_qu(i)/hw0(i) 665 av_thvu(i) = sum_thvu(i)/hw0(i) 666 c av_thve = sum_thve/hw0 667 av_dth(i) = sum_dth(i)/hw0(i) 668 av_dq(i) = sum_dq(i)/hw0(i) 669 av_rho(i) = sum_rho(i)/hw0(i) 670 av_dtdwn(i) = sum_dtdwn(i)/hw0(i) 671 av_dqdwn(i) = sum_dqdwn(i)/hw0(i) 672 673 wape(i) = - rg*hw0(i)*(av_dth(i) 674 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i)+av_dth(i)* 675 $ av_dq(i) ))/av_thvu(i) 676 ENDDO 677 C 678 C 2.2 Prognostic variable update 679 C ------------------------------ 680 C 681 C Filter out bad wakes 682 683 DO k = 1,klev 684 DO i=1,klon 685 IF ( wape(i) .LT. 0.) THEN 686 deltatw(i,k) = 0. 687 deltaqw(i,k) = 0. 688 dth(i,k) = 0. 689 ENDIF 690 ENDDO 691 ENDDO 692 c 693 DO i=1,klon 694 IF ( wape(i) .LT. 0.) THEN 695 wape(i) = 0. 696 Cstar(i) = 0. 697 hw(i) = hwmin 698 sigmaw(i) = amax1(sigmad,sigd_con(i)) 699 fip(i) = 0. 700 gwake(i) = .FALSE. 701 ELSE 702 Cstar(i) = stark*sqrt(2.*wape(i)) 703 gwake(i) = .TRUE. 704 ENDIF 705 ENDDO 706 707 c 708 c Check qx and qw positivity 709 c -------------------------- 710 DO i = 1,klon 711 q0_min(i)=min( (qe(i,1)-sigmaw(i)*deltaqw(i,1)), 712 $ (qe(i,1)+(1.-sigmaw(i))*deltaqw(i,1)) ) 713 ENDDO 714 DO k = 2,klev 715 DO i = 1,klon 716 q1_min(i)=min( (qe(i,k)-sigmaw(i)*deltaqw(i,k)), 717 $ (qe(i,k)+(1.-sigmaw(i))*deltaqw(i,k)) ) 718 IF (q1_min(i).le.q0_min(i)) THEN 719 q0_min(i)=q1_min(i) 720 ENDIF 721 ENDDO 722 ENDDO 723 c 724 DO i = 1,klon 725 OK_qx_qw(i) = q0_min(i) .GE. 0. 726 alpha(i) = 1. 727 ENDDO 728 c 729 CC ----------------------------------------------------------------- 730 C Sub-time-stepping 731 C ----------------- 732 C 733 nsub=10 734 dtimesub=dtime/nsub 735 c 736 c------------------------------------------------------------ 737 DO isubstep = 1,nsub 738 c------------------------------------------------------------ 739 c 740 c wk_adv is the logical flag enabling wake evolution in the time advance loop 741 DO i = 1,klon 742 wk_adv(i) = OK_qx_qw(i) .AND. alpha(i) .GE. 1. 743 ENDDO 744 c 745 ccc nrlmd Ajout d'un recalcul de wdens dans le cas d'un entrainement négatif de ktop à kupper -------- 746 ccc On calcule pour cela une densité wdens0 pour laquelle on aurait un entrainement nul --- 747 DO i=1,klon 748 cc print *,' isubstep,wk_adv(i),cstar(i),wape(i) ', 749 cc $ isubstep,wk_adv(i),cstar(i),wape(i) 750 IF (wk_adv(i) .AND. cstar(i).GT.0.01) THEN 751 omg(i,kupper(i)+1) = - Rg*amdwn(i,kupper(i)+1)/sigmaw(i) 752 $ + Rg*amup(i,kupper(i)+1)/(1.-sigmaw(i)) 753 wdens0 = ( sigmaw(i) / (4.*3.14) ) * 754 $ ( (1.-sigmaw(i)) * omg(i,kupper(i)+1) / 755 $ ( (ph(i,1)-pupper(i)) * cstar(i) ) ) **(2) 756 IF ( wdens(i) .LE. wdens0*1.1 ) THEN 757 wdens(i) = wdens0 758 ENDIF 759 cc print*,'omg(i,kupper(i)+1),wdens0,wdens(i),cstar(i) 760 cc $ ,ph(i,1)-pupper(i)', 761 cc $ omg(i,kupper(i)+1),wdens0,wdens(i),cstar(i) 762 cc $ ,ph(i,1)-pupper(i) 763 ENDIF 764 ENDDO 765 766 ccc nrlmd 767 768 DO i=1,klon 769 IF (wk_adv(i)) THEN 770 gfl(i) = 2.*sqrt(3.14*wdens(i)*sigmaw(i)) 771 sigmaw(i)=amin1(sigmaw(i),sigmaw_max) 772 ENDIF 773 ENDDO 774 DO i=1,klon 775 IF (wk_adv(i)) THEN 776 ccc nrlmd Introduction du taux de mortalité des poches et test sur sigmaw_max=0.4 777 ccc d_sigmaw(i) = gfl(i)*Cstar(i)*dtimesub 778 IF (sigmaw(i).ge.sigmaw_max) THEN 779 death_rate(i)=gfl(i)*Cstar(i)/sigmaw(i) 780 ELSE 781 death_rate(i)=0. 782 END IF 783 d_sigmaw(i) = gfl(i)*Cstar(i)*dtimesub 784 $ - death_rate(i)*sigmaw(i)*dtimesub 785 c $ - nat_rate(i)*sigmaw(i)*dtimesub 786 cc print*, 'd_sigmaw(i),sigmaw(i),gfl(i),Cstar(i),wape(i), 787 cc $ death_rate(i),ktop(i),kupper(i)', 788 cc $ d_sigmaw(i),sigmaw(i),gfl(i),Cstar(i),wape(i), 789 cc $ death_rate(i),ktop(i),kupper(i) 790 791 c sigmaw(i) =sigmaw(i) + gfl(i)*Cstar(i)*dtimesub 792 c sigmaw(i) =min(sigmaw(i),0.99) !!!!!!!! 793 c wdens = wdens0/(10.*sigmaw) 794 c sigmaw =max(sigmaw,sigd_con) 795 c sigmaw =max(sigmaw,sigmad) 796 ENDIF 797 ENDDO 798 C 799 C 800 c calcul de la difference de vitesse verticale poche - zone non perturbee 801 cIM 060208 differences par rapport au code initial; init. a 0 dp_deltomg 802 cIM 060208 et omg sur les niveaux de 1 a klev+1, alors que avant l'on definit 803 cIM 060208 au niveau k=1..? 804 DO k= 1,klev 805 DO i = 1,klon 806 if (wk_adv(i)) THEN !!! nrlmd 807 dp_deltomg(i,k)=0. 808 end if 809 ENDDO 810 ENDDO 811 DO k= 1,klev+1 812 DO i = 1,klon 813 if (wk_adv(i)) THEN !!! nrlmd 814 omg(i,k)=0. 815 end if 816 ENDDO 817 ENDDO 818 c 819 DO i=1,klon 820 IF (wk_adv(i)) THEN 821 z(i)= 0. 822 omg(i,1) = 0. 823 dp_deltomg(i,1) = -(gfl(i)*Cstar(i))/(sigmaw(i) * (1-sigmaw(i))) 824 ENDIF 825 ENDDO 826 c 827 DO k= 2,klev 828 DO i = 1,klon 829 IF( wk_adv(i) .AND. k .LE. ktop(i)) THEN 830 dz(i) = -(ph(i,k)-ph(i,k-1))/(rho(i,k-1)*rg) 831 z(i) = z(i)+dz(i) 832 dp_deltomg(i,k)= dp_deltomg(i,1) 833 omg(i,k)= dp_deltomg(i,1)*z(i) 834 ENDIF 835 ENDDO 836 ENDDO 837 c 838 DO i = 1,klon 839 IF (wk_adv(i)) THEN 840 dztop(i)=-(ptop(i)-ph(i,ktop(i)))/(rho(i,ktop(i))*rg) 841 ztop(i) = z(i)+dztop(i) 842 omgtop(i)=dp_deltomg(i,1)*ztop(i) 843 ENDIF 844 ENDDO 845 c 846 c ----------------- 847 c From m/s to Pa/s 848 c ----------------- 849 c 850 DO i=1,klon 851 IF (wk_adv(i)) THEN 852 omgtop(i) = -rho(i,ktop(i))*rg*omgtop(i) 853 dp_deltomg(i,1) = omgtop(i)/(ptop(i)-ph(i,1)) 854 ENDIF 855 ENDDO 856 c 857 DO k= 1,klev 858 DO i = 1,klon 859 IF( wk_adv(i) .AND. k .LE. ktop(i)) THEN 860 omg(i,k) = - rho(i,k)*rg*omg(i,k) 861 dp_deltomg(i,k) = dp_deltomg(i,1) 862 ENDIF 863 ENDDO 864 ENDDO 865 c 866 c raccordement lineaire de omg de ptop a pupper 867 868 DO i=1,klon 869 IF ( wk_adv(i) .AND. kupper(i) .GT. ktop(i)) THEN 870 omg(i,kupper(i)+1) = - Rg*amdwn(i,kupper(i)+1)/sigmaw(i) 871 $ + Rg*amup(i,kupper(i)+1)/(1.-sigmaw(i)) 872 dp_deltomg(i,kupper(i)) = (omgtop(i)-omg(i,kupper(i)+1))/ 873 $ (ptop(i)-pupper(i)) 874 ENDIF 875 ENDDO 876 c 877 cc DO i=1,klon 878 cc print*,'Pente entre 0 et kupper (référence)' 879 cc $ ,omg(i,kupper(i)+1)/(pupper(i)-ph(i,1)) 880 cc print*,'Pente entre ktop et kupper' 881 cc $ ,(omg(i,kupper(i)+1)-omgtop(i))/(pupper(i)-ptop(i)) 882 cc ENDDO 883 cc 884 DO k= 1,klev 885 DO i = 1,klon 886 IF( wk_adv(i) .AND. k .GT. ktop(i) .AND. k .LE. kupper(i)) THEN 887 dp_deltomg(i,k) = dp_deltomg(i,kupper(i)) 888 omg(i,k) = omgtop(i)+(ph(i,k)-ptop(i))*dp_deltomg(i,kupper(i)) 889 ENDIF 890 ENDDO 891 ENDDO 892 ccc nrlmd 893 cc DO i=1,klon 894 cc print*,'deltaw_ktop,deltaw_conv',omgtop(i),omg(i,kupper(i)+1) 895 cc END DO 896 ccc 897 c 898 c 899 c-- Compute wake average vertical velocity omgbw 900 c 901 c 902 DO k = 1,klev+1 903 DO i=1,klon 904 IF ( wk_adv(i)) THEN 905 omgbw(i,k) = omgb(i,k)+(1.-sigmaw(i))*omg(i,k) 906 ENDIF 907 ENDDO 908 ENDDO 909 c-- and its vertical gradient dp_omgbw 910 c 911 DO k = 1,klev 912 DO i=1,klon 913 IF ( wk_adv(i)) THEN 914 dp_omgbw(i,k) = (omgbw(i,k+1)-omgbw(i,k))/(ph(i,k+1)-ph(i,k)) 915 ENDIF 916 ENDDO 917 ENDDO 918 C 919 c-- Upstream coefficients for omgb velocity 920 c-- (alpha_up(k) is the coefficient of the value at level k) 921 c-- (1-alpha_up(k) is the coefficient of the value at level k-1) 922 DO k = 1,klev 923 DO i=1,klon 924 IF ( wk_adv(i)) THEN 925 alpha_up(i,k) = 0. 926 IF (omgb(i,k) .GT. 0.) alpha_up(i,k) = 1. 927 ENDIF 928 ENDDO 929 ENDDO 930 931 c Matrix expressing [The,deltatw] from [Th1,Th2] 932 933 DO i=1,klon 934 IF ( wk_adv(i)) THEN 935 RRe1(i) = 1.-sigmaw(i) 936 RRe2(i) = sigmaw(i) 937 ENDIF 938 ENDDO 939 RRd1 = -1. 940 RRd2 = 1. 941 c 942 c-- Get [Th1,Th2], dth and [q1,q2] 943 c 944 DO k= 1,klev 945 DO i = 1,klon 946 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN 947 dth(i,k) = deltatw(i,k)/ppi(i,k) 948 Th1(i,k) = the(i,k) - sigmaw(i) *dth(i,k) ! undisturbed area 949 Th2(i,k) = the(i,k) + (1.-sigmaw(i))*dth(i,k) ! wake 950 q1(i,k) = qe(i,k) - sigmaw(i) *deltaqw(i,k) ! undisturbed area 951 q2(i,k) = qe(i,k) + (1.-sigmaw(i))*deltaqw(i,k) ! wake 952 ENDIF 953 ENDDO 954 ENDDO 955 956 DO i=1,klon 957 if (wk_adv(i)) then !!! nrlmd 958 D_Th1(i,1) = 0. 959 D_Th2(i,1) = 0. 960 D_dth(i,1) = 0. 961 D_q1(i,1) = 0. 962 D_q2(i,1) = 0. 963 D_dq(i,1) = 0. 964 end if 965 ENDDO 966 967 DO k= 2,klev 968 DO i = 1,klon 969 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN 970 D_Th1(i,k) = Th1(i,k-1)-Th1(i,k) 971 D_Th2(i,k) = Th2(i,k-1)-Th2(i,k) 972 D_dth(i,k) = dth(i,k-1)-dth(i,k) 973 D_q1(i,k) = q1(i,k-1)-q1(i,k) 974 D_q2(i,k) = q2(i,k-1)-q2(i,k) 975 D_dq(i,k) = deltaqw(i,k-1)-deltaqw(i,k) 976 ENDIF 977 ENDDO 978 ENDDO 979 980 DO i=1,klon 981 IF( wk_adv(i)) THEN 982 omgbdth(i,1) = 0. 983 omgbdq(i,1) = 0. 984 ENDIF 985 ENDDO 986 987 DO k= 2,klev 988 DO i = 1,klon 989 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN ! loop on interfaces 990 omgbdth(i,k) = omgb(i,k)*( dth(i,k-1) - dth(i,k)) 991 omgbdq(i,k) = omgb(i,k)*(deltaqw(i,k-1) - deltaqw(i,k)) 992 ENDIF 993 ENDDO 994 ENDDO 995 c 996 c----------------------------------------------------------------- 997 DO k= 1,klev 998 DO i = 1,klon 999 IF( wk_adv(i) .AND. k .LE. kupper(i)-1) THEN 1000 c----------------------------------------------------------------- 1001 c 1002 c Compute redistribution (advective) term 1003 c 1004 d_deltatw(i,k) = 1005 $ dtimesub/(Ph(i,k)-Ph(i,k+1))*( 1006 $ RRd1*omg(i,k )*sigmaw(i) *D_Th1(i,k) 1007 $ -RRd2*omg(i,k+1)*(1.-sigmaw(i))*D_Th2(i,k+1) 1008 $ -(1.-alpha_up(i,k))*omgbdth(i,k) - alpha_up(i,k+1)* 1009 $ omgbdth(i,k+1))*ppi(i,k) 1010 c print*,'d_deltatw=',d_deltatw(i,k) 1011 c 1012 d_deltaqw(i,k) = 1013 $ dtimesub/(Ph(i,k)-Ph(i,k+1))*( 1014 $ RRd1*omg(i,k )*sigmaw(i) *D_q1(i,k) 1015 $ -RRd2*omg(i,k+1)*(1.-sigmaw(i))*D_q2(i,k+1) 1016 $ -(1.-alpha_up(i,k))*omgbdq(i,k) - alpha_up(i,k+1)* 1017 $ omgbdq(i,k+1)) 1018 c print*,'d_deltaqw=',d_deltaqw(i,k) 1019 c 1020 c and increment large scale tendencies 1021 c 1022 1023 c 1024 C 1025 CC ----------------------------------------------------------------- 1026 d_te(i,k) = dtimesub*( 1027 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_Th1(i,k) 1028 $ -RRe2(i)*omg(i,k+1)*(1.-sigmaw(i))*D_Th2(i,k+1) ) 1029 $ /(Ph(i,k)-Ph(i,k+1)) 1030 ccc nrlmd $ -sigmaw(i)*(1.-sigmaw(i))*dth(i,k)*dp_deltomg(i,k) 1031 $ -sigmaw(i)*(1.-sigmaw(i))*dth(i,k) 1032 $ *(omg(i,k)-omg(i,k+1))/(Ph(i,k)-Ph(i,k+1)) 1033 ccc 1034 $ )*ppi(i,k) 1035 c 1036 d_qe(i,k) = dtimesub*( 1037 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_q1(i,k) 1038 $ -RRe2(i)*omg(i,k+1)*(1.-sigmaw(i))*D_q2(i,k+1) ) 1039 $ /(Ph(i,k)-Ph(i,k+1)) 1040 ccc nrlmd $ -sigmaw(i)*(1.-sigmaw(i))*deltaqw(i,k)*dp_deltomg(i,k) 1041 $ -sigmaw(i)*(1.-sigmaw(i))*deltaqw(i,k) 1042 $ *(omg(i,k)-omg(i,k+1))/(Ph(i,k)-Ph(i,k+1)) 1043 ccc 1044 $ ) 1045 ccc nrlmd 1046 ELSE IF(wk_adv(i) .AND. k .EQ. kupper(i)) THEN 1047 d_te(i,k) = dtimesub*( 1048 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_Th1(i,k) 1049 $ /(Ph(i,k)-Ph(i,k+1))) 1050 $ )*ppi(i,k) 1051 1052 d_qe(i,k) = dtimesub*( 1053 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_q1(i,k) 1054 $ /(Ph(i,k)-Ph(i,k+1))) 1055 $ ) 1056 1057 ENDIF 1058 ccc 1059 ENDDO 1060 ENDDO 1061 c------------------------------------------------------------------ 1062 C 1063 C Increment state variables 1064 1065 DO k= 1,klev 1066 DO i = 1,klon 1067 ccc nrlmd IF( wk_adv(i) .AND. k .LE. kupper(i)-1) THEN 1068 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN 1069 ccc 1070 1071 1072 c 1073 c Coefficient de répartition 1074 1075 Crep(i,k)=Crep_sol*(ph(i,kupper(i))-ph(i,k))/(ph(i,kupper(i)) 1076 $ -ph(i,1)) 1077 Crep(i,k)=Crep(i,k)+Crep_upper*(ph(i,1)-ph(i,k))/(p(i,1)- 1078 $ ph(i,kupper(i))) 1079 1080 1081 c Reintroduce compensating subsidence term. 1082 1083 c dtKE(k)=(dtdwn(k)*Crep(k))/sigmaw 1084 c dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k)) 1085 c . /(1-sigmaw) 1086 c dqKE(k)=(dqdwn(k)*Crep(k))/sigmaw 1087 c dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k)) 1088 c . /(1-sigmaw) 1089 c 1090 c dtKE(k)=(dtdwn(k)*Crep(k)+(1-Crep(k))*dta(k))/sigmaw 1091 c dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k)*Crep(k)) 1092 c . /(1-sigmaw) 1093 c dqKE(k)=(dqdwn(k)*Crep(k)+(1-Crep(k))*dqa(k))/sigmaw 1094 c dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k)*Crep(k)) 1095 c . /(1-sigmaw) 1096 1097 dtKE(i,k)=(dtdwn(i,k)/sigmaw(i) - dta(i,k)/(1.-sigmaw(i))) 1098 dqKE(i,k)=(dqdwn(i,k)/sigmaw(i) - dqa(i,k)/(1.-sigmaw(i))) 1099 c print*,'dtKE= ',dtKE(i,k),' dqKE= ',dqKE(i,k) 1100 c 1101 dtPBL(i,k)=(wdtPBL(i,k)/sigmaw(i) - udtPBL(i,k)/(1.-sigmaw(i))) 1102 dqPBL(i,k)=(wdqPBL(i,k)/sigmaw(i) - udqPBL(i,k)/(1.-sigmaw(i))) 1103 c print*,'dtPBL= ',dtPBL(i,k),' dqPBL= ',dqPBL(i,k) 1104 c 1105 ccc nrlmd Prise en compte du taux de mortalité 1106 ccc Définitions de entr, detr 1107 detr(i,k)=0. 1108 1109 entr(i,k)=detr(i,k)+gfl(i)*cstar(i)+ 1110 $ sigmaw(i)*(1.-sigmaw(i))*dp_deltomg(i,k) 1111 1112 spread(i,k) = (entr(i,k)-detr(i,k))/sigmaw(i) 1113 ccc spread(i,k) = (1.-sigmaw(i))*dp_deltomg(i,k)+gfl(i)*Cstar(i)/ 1114 ccc $ sigmaw(i) 1115 1116 1117 c ajout d'un effet onde de gravité -Tgw(k)*deltatw(k) 03/02/06 YU Jingmei 1118 1119 ! write(lunout,*)'wake.F ',i,k, dtimesub,d_deltat_gw(i,k), 1120 ! & Tgw(i,k),deltatw(i,k) 1121 d_deltat_gw(i,k)=d_deltat_gw(i,k)-Tgw(i,k)*deltatw(i,k)* 1122 $ dtimesub 1123 ! write(lunout,*)'wake.F ',i,k, dtimesub,d_deltatw(i,k) 1124 ff(i)=d_deltatw(i,k)/dtimesub 1125 1126 c Sans GW 1127 c 1128 c deltatw(k)=deltatw(k)+dtimesub*(ff+dtKE(k)-spread(k)*deltatw(k)) 1129 c 1130 c GW formule 1 1131 c 1132 c deltatw(k) = deltatw(k)+dtimesub* 1133 c $ (ff+dtKE(k) - spread(k)*deltatw(k)-Tgw(k)*deltatw(k)) 1134 c 1135 c GW formule 2 1136 1137 IF (dtimesub*Tgw(i,k).lt.1.e-10) THEN 1138 d_deltatw(i,k) = dtimesub* 1139 $ (ff(i)+dtKE(i,k)+dtPBL(i,k) 1140 ccc $ -spread(i,k)*deltatw(i,k) 1141 $ - entr(i,k)*deltatw(i,k)/sigmaw(i) 1142 $ - (death_rate(i)*sigmaw(i)+detr(i,k))*deltatw(i,k) 1143 $ / (1.-sigmaw(i)) 1144 ccc 1145 $ -Tgw(i,k)*deltatw(i,k)) 1146 ELSE 1147 d_deltatw(i,k) = 1/Tgw(i,k)*(1-exp(-dtimesub* 1148 $ Tgw(i,k)))* 1149 $ (ff(i)+dtKE(i,k)+dtPBL(i,k) 1150 ccc $ -spread(i,k)*deltatw(i,k) 1151 $ - entr(i,k)*deltatw(i,k)/sigmaw(i) 1152 $ - (death_rate(i)*sigmaw(i)+detr(i,k))*deltatw(i,k) 1153 $ / (1.-sigmaw(i)) 1154 ccc 1155 $ -Tgw(i,k)*deltatw(i,k)) 1156 ENDIF 1157 1158 dth(i,k) = deltatw(i,k)/ppi(i,k) 1159 1160 gg(i)=d_deltaqw(i,k)/dtimesub 1161 1162 d_deltaqw(i,k) = dtimesub*(gg(i)+ dqKE(i,k)+dqPBL(i,k) 1163 ccc $ -spread(i,k)*deltaqw(i,k)) 1164 $ - entr(i,k)*deltaqw(i,k)/sigmaw(i) 1165 $ - (death_rate(i)*sigmaw(i)+detr(i,k))*deltaqw(i,k) 1166 $ /(1.-sigmaw(i))) 1167 ccc 1168 1169 ccc nrlmd 1170 ccc d_deltatw2(i,k)=d_deltatw2(i,k)+d_deltatw(i,k) 1171 ccc d_deltaqw2(i,k)=d_deltaqw2(i,k)+d_deltaqw(i,k) 1172 ccc 1173 ENDIF 1174 ENDDO 1175 ENDDO 1176 1177 C 1178 C Scale tendencies so that water vapour remains positive in w and x. 1179 C 1180 call wake_vec_modulation(klon,klev,wk_adv,epsilon,qe,d_qe,deltaqw, 1181 $ d_deltaqw,sigmaw,d_sigmaw,alpha) 1182 c 1183 ccc nrlmd 1184 cc print*,'alpha' 1185 cc do i=1,klon 1186 cc print*,alpha(i) 1187 cc end do 1188 ccc 1189 DO k = 1,klev 1190 DO i = 1,klon 1191 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN 1192 d_te(i,k)=alpha(i)*d_te(i,k) 1193 d_qe(i,k)=alpha(i)*d_qe(i,k) 1194 d_deltatw(i,k)=alpha(i)*d_deltatw(i,k) 1195 d_deltaqw(i,k)=alpha(i)*d_deltaqw(i,k) 1196 d_deltat_gw(i,k)=alpha(i)*d_deltat_gw(i,k) 1197 ENDIF 1198 ENDDO 1199 ENDDO 1200 DO i = 1,klon 1201 IF( wk_adv(i)) THEN 1202 d_sigmaw(i)=alpha(i)*d_sigmaw(i) 1203 ENDIF 1204 ENDDO 1205 1206 C Update large scale variables and wake variables 1207 cIM 060208 manque DO i + remplace DO k=1,kupper(i) 1208 cIM 060208 DO k = 1,kupper(i) 1209 DO k= 1,klev 1210 DO i = 1,klon 1211 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN 1212 dtls(i,k)=dtls(i,k)+d_te(i,k) 1213 dqls(i,k)=dqls(i,k)+d_qe(i,k) 1214 ccc nrlmd 1215 d_deltatw2(i,k)=d_deltatw2(i,k)+d_deltatw(i,k) 1216 d_deltaqw2(i,k)=d_deltaqw2(i,k)+d_deltaqw(i,k) 1217 ccc 1218 ENDIF 1219 ENDDO 1220 ENDDO 1221 DO k= 1,klev 1222 DO i = 1,klon 1223 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN 1224 te(i,k) = te0(i,k) + dtls(i,k) 1225 qe(i,k) = qe0(i,k) + dqls(i,k) 1226 the(i,k) = te(i,k)/ppi(i,k) 1227 deltatw(i,k) = deltatw(i,k)+d_deltatw(i,k) 1228 deltaqw(i,k) = deltaqw(i,k)+d_deltaqw(i,k) 1229 dth(i,k) = deltatw(i,k)/ppi(i,k) 1230 cc print*,'k,qx,qw',k,qe(i,k)-sigmaw(i)*deltaqw(i,k) 1231 cc $ ,qe(i,k)+(1-sigmaw(i))*deltaqw(i,k) 1232 ENDIF 1233 ENDDO 1234 ENDDO 1235 DO i = 1,klon 1236 IF( wk_adv(i)) THEN 1237 sigmaw(i) = sigmaw(i)+d_sigmaw(i) 1238 ENDIF 1239 ENDDO 1240 c 1241 C 1242 c Determine Ptop from buoyancy integral 1243 c --------------------------------------- 1244 c 1245 c- 1/ Pressure of the level where dth changes sign. 1246 c 1247 DO i=1,klon 1248 IF ( wk_adv(i)) THEN 1249 Ptop_provis(i)=ph(i,1) 1250 ENDIF 1251 ENDDO 1252 c 1253 DO k= 2,klev 1254 DO i=1,klon 1255 IF ( wk_adv(i) .AND. 1256 $ Ptop_provis(i) .EQ. ph(i,1) .AND. 1257 $ dth(i,k) .GT. -delta_t_min .and. 1258 $ dth(i,k-1).LT. -delta_t_min) THEN 1259 Ptop_provis(i) = ((dth(i,k)+delta_t_min)*p(i,k-1) 1260 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /(dth(i,k) 1261 $ - dth(i,k-1)) 1262 ENDIF 1263 ENDDO 1264 ENDDO 1265 c 1266 c- 2/ dth integral 1267 c 1268 DO i=1,klon 1269 if (wk_adv(i)) then !!! nrlmd 1270 sum_dth(i) = 0. 1271 dthmin(i) = -delta_t_min 1272 z(i) = 0. 1273 end if 1274 ENDDO 1275 1276 DO k = 1,klev 1277 DO i=1,klon 1278 IF ( wk_adv(i)) THEN 1279 dz(i) = -(amax1(ph(i,k+1),Ptop_provis(i))-Ph(i,k))/(rho(i,k)*rg) 1280 IF (dz(i) .gt. 0) THEN 1281 z(i) = z(i)+dz(i) 1282 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i) 1283 dthmin(i) = amin1(dthmin(i),dth(i,k)) 1284 ENDIF 1285 ENDIF 1286 ENDDO 1287 ENDDO 1288 c 1289 c- 3/ height of triangle with area= sum_dth and base = dthmin 1290 1291 DO i=1,klon 1292 IF ( wk_adv(i)) THEN 1293 hw(i) = 2.*sum_dth(i)/amin1(dthmin(i),-0.5) 1294 hw(i) = amax1(hwmin,hw(i)) 1295 ENDIF 1296 ENDDO 1297 c 1298 c- 4/ now, get Ptop 1299 c 1300 DO i=1,klon 1301 if (wk_adv(i)) then !!! nrlmd 1302 ktop(i) = 0 1303 z(i)=0. 1304 end if 1305 ENDDO 1306 c 1307 DO k = 1,klev 1308 DO i=1,klon 1309 IF ( wk_adv(i)) THEN 1310 dz(i) = amin1(-(ph(i,k+1)-Ph(i,k))/(rho(i,k)*rg),hw(i)-z(i)) 1311 IF (dz(i) .gt. 0) THEN 1312 z(i) = z(i)+dz(i) 1313 Ptop(i) = Ph(i,k)-rho(i,k)*rg*dz(i) 1314 ktop(i) = k 1315 ENDIF 1316 ENDIF 1317 ENDDO 1318 ENDDO 1319 c 1320 c 4.5/Correct ktop and ptop 1321 c 1322 DO i=1,klon 1323 IF ( wk_adv(i)) THEN 1324 Ptop_new(i)=ptop(i) 1325 ENDIF 1326 ENDDO 1327 c 1328 DO k= klev,2,-1 1329 DO i=1,klon 1330 cIM v3JYG; IF (k .GE. ktop(i) 1331 IF ( wk_adv(i) .AND. 1332 $ k .LE. ktop(i) .AND. 1333 $ ptop_new(i) .EQ. ptop(i) .AND. 1334 $ dth(i,k) .GT. -delta_t_min .and. 1335 $ dth(i,k-1).LT. -delta_t_min) THEN 1336 Ptop_new(i) = ((dth(i,k)+delta_t_min)*p(i,k-1) 1337 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /(dth(i,k) 1338 $ - dth(i,k-1)) 1339 ENDIF 1340 ENDDO 1341 ENDDO 1342 c 1343 c 1344 DO i=1,klon 1345 IF ( wk_adv(i)) THEN 1346 ptop(i) = ptop_new(i) 1347 ENDIF 1348 ENDDO 1349 1350 DO k=klev,1,-1 1351 DO i=1,klon 1352 if (wk_adv(i)) then !!! nrlmd 1353 IF (ph(i,k+1) .LT. ptop(i)) ktop(i)=k 1354 end if 1355 ENDDO 1356 ENDDO 1357 c 1358 c 5/ Set deltatw & deltaqw to 0 above kupper 1359 c 1360 DO k = 1,klev 1361 DO i=1,klon 1362 IF ( wk_adv(i) .AND. k .GE. kupper(i)) THEN 1363 deltatw(i,k) = 0. 1364 deltaqw(i,k) = 0. 1365 ENDIF 1366 ENDDO 1367 ENDDO 1368 c 1369 C 1370 c-------------Cstar computation--------------------------------- 1371 DO i=1, klon 1372 if (wk_adv(i)) then !!! nrlmd 1373 sum_thu(i) = 0. 1374 sum_tu(i) = 0. 1375 sum_qu(i) = 0. 1376 sum_thvu(i) = 0. 1377 sum_dth(i) = 0. 1378 sum_dq(i) = 0. 1379 sum_rho(i) = 0. 1380 sum_dtdwn(i) = 0. 1381 sum_dqdwn(i) = 0. 1382 1383 av_thu(i) = 0. 1384 av_tu(i) =0. 1385 av_qu(i) =0. 1386 av_thvu(i) = 0. 1387 av_dth(i) = 0. 1388 av_dq(i) = 0. 1389 av_rho(i) =0. 1390 av_dtdwn(i) =0. 1391 av_dqdwn(i) = 0. 1392 end if 1393 ENDDO 1394 C 1395 C Integrals (and wake top level number) 1396 C -------------------------------------- 1397 C 1398 C Initialize sum_thvu to 1st level virt. pot. temp. 1399 1400 DO i=1,klon 1401 if (wk_adv(i)) then !!! nrlmd 1402 z(i) = 1. 1403 dz(i) = 1. 1404 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i) 1405 sum_dth(i) = 0. 1406 end if 1407 ENDDO 1408 1409 DO k = 1,klev 1410 DO i=1,klon 1411 if (wk_adv(i)) then !!! nrlmd 1412 dz(i) = -(max(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg) 1413 IF (dz(i) .GT. 0) THEN 1414 z(i) = z(i)+dz(i) 1415 sum_thu(i) = sum_thu(i) + thu(i,k)*dz(i) 1416 sum_tu(i) = sum_tu(i) + tu(i,k)*dz(i) 1417 sum_qu(i) = sum_qu(i) + qu(i,k)*dz(i) 1418 sum_thvu(i) = sum_thvu(i) + thu(i,k)*(1.+eps*qu(i,k))*dz(i) 1419 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i) 1420 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i) 1421 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i) 1422 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i) 1423 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i) 1424 ENDIF 1425 end if 1426 ENDDO 1427 ENDDO 1428 c 1429 DO i=1,klon 1430 if (wk_adv(i)) then !!! nrlmd 1431 hw0(i) = z(i) 1432 end if 1433 ENDDO 1434 c 1435 C 1436 C - WAPE and mean forcing computation 1437 C --------------------------------------- 1438 C 1439 C --------------------------------------- 1440 C 1441 C Means 1442 1443 DO i=1,klon 1444 if (wk_adv(i)) then !!! nrlmd 1445 av_thu(i) = sum_thu(i)/hw0(i) 1446 av_tu(i) = sum_tu(i)/hw0(i) 1447 av_qu(i) = sum_qu(i)/hw0(i) 1448 av_thvu(i) = sum_thvu(i)/hw0(i) 1449 av_dth(i) = sum_dth(i)/hw0(i) 1450 av_dq(i) = sum_dq(i)/hw0(i) 1451 av_rho(i) = sum_rho(i)/hw0(i) 1452 av_dtdwn(i) = sum_dtdwn(i)/hw0(i) 1453 av_dqdwn(i) = sum_dqdwn(i)/hw0(i) 1454 c 1455 wape(i) = - rg*hw0(i)*(av_dth(i) 1456 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i)+av_dth(i)* 1457 $ av_dq(i) ))/av_thvu(i) 1458 end if 1459 ENDDO 1460 C 1461 C Filter out bad wakes 1462 1463 DO k = 1,klev 1464 DO i=1,klon 1465 if (wk_adv(i)) then !!! nrlmd 1466 IF ( wape(i) .LT. 0.) THEN 1467 deltatw(i,k) = 0. 1468 deltaqw(i,k) = 0. 1469 dth(i,k) = 0. 1470 ENDIF 1471 end if 1472 ENDDO 1473 ENDDO 1474 c 1475 DO i=1,klon 1476 if (wk_adv(i)) then !!! nrlmd 1477 IF ( wape(i) .LT. 0.) THEN 1478 wape(i) = 0. 1479 Cstar(i) = 0. 1480 hw(i) = hwmin 1481 sigmaw(i) = max(sigmad,sigd_con(i)) 1482 fip(i) = 0. 1483 gwake(i) = .FALSE. 1484 ELSE 1485 Cstar(i) = stark*sqrt(2.*wape(i)) 1486 gwake(i) = .TRUE. 1487 ENDIF 1488 end if 1489 ENDDO 1490 1491 ENDDO ! end sub-timestep loop 1492 C 1493 C ----------------------------------------------------------------- 1494 c Get back to tendencies per second 1495 c 1496 DO k = 1,klev 1497 DO i=1,klon 1498 1499 ccc nrlmd IF ( wk_adv(i) .AND. k .LE. kupper(i)) THEN 1500 IF ( OK_qx_qw(i) .AND. k .LE. kupper(i)) THEN 1501 ccc 1502 dtls(i,k) = dtls(i,k)/dtime 1503 dqls(i,k) = dqls(i,k)/dtime 1504 d_deltatw2(i,k)=d_deltatw2(i,k)/dtime 1505 d_deltaqw2(i,k)=d_deltaqw2(i,k)/dtime 1506 d_deltat_gw(i,k) = d_deltat_gw(i,k)/dtime 1507 cc print*,'k,dqls,omg,entr,detr',k,dqls(i,k),omg(i,k),entr(i,k) 1508 cc $ ,death_rate(i)*sigmaw(i) 1509 ENDIF 1510 ENDDO 1511 ENDDO 1512 1513 c 1514 c---------------------------------------------------------- 1515 c Determine wake final state; recompute wape, cstar, ktop; 1516 c filter out bad wakes. 1517 c---------------------------------------------------------- 1518 c 1519 C 2.1 - Undisturbed area and Wake integrals 1520 C --------------------------------------------------------- 1521 1522 DO i=1,klon 1523 ccc nrlmd if (wk_adv(i)) then !!! nrlmd 1524 if (OK_qx_qw(i)) then 1525 ccc 1526 z(i) = 0. 1527 sum_thu(i) = 0. 1528 sum_tu(i) = 0. 1529 sum_qu(i) = 0. 1530 sum_thvu(i) = 0. 1531 sum_dth(i) = 0. 1532 sum_dq(i) = 0. 1533 sum_rho(i) = 0. 1534 sum_dtdwn(i) = 0. 1535 sum_dqdwn(i) = 0. 1536 1537 av_thu(i) = 0. 1538 av_tu(i) =0. 1539 av_qu(i) =0. 1540 av_thvu(i) = 0. 1541 av_dth(i) = 0. 1542 av_dq(i) = 0. 1543 av_rho(i) =0. 1544 av_dtdwn(i) =0. 1545 av_dqdwn(i) = 0. 1546 end if 1547 ENDDO 1548 C Potential temperatures and humidity 1549 c---------------------------------------------------------- 1550 1551 DO k =1,klev 1552 DO i=1,klon 1553 ccc nrlmd IF ( wk_adv(i)) THEN 1554 if (OK_qx_qw(i)) then 1555 ccc 1556 rho(i,k) = p(i,k)/(rd*te(i,k)) 1557 IF(k .eq. 1) THEN 1558 rhoh(i,k) = ph(i,k)/(rd*te(i,k)) 1559 zhh(i,k)=0 1560 ELSE 1561 rhoh(i,k) = ph(i,k)*2./(rd*(te(i,k)+te(i,k-1))) 1562 zhh(i,k)=(ph(i,k)-ph(i,k-1))/(-rhoh(i,k)*RG)+zhh(i,k-1) 1563 ENDIF 1564 the(i,k) = te(i,k)/ppi(i,k) 1565 thu(i,k) = (te(i,k) - deltatw(i,k)*sigmaw(i))/ppi(i,k) 1566 tu(i,k) = te(i,k) - deltatw(i,k)*sigmaw(i) 1567 qu(i,k) = qe(i,k) - deltaqw(i,k)*sigmaw(i) 1568 rhow(i,k) = p(i,k)/(rd*(te(i,k)+deltatw(i,k))) 1569 dth(i,k) = deltatw(i,k)/ppi(i,k) 1570 ENDIF 1571 ENDDO 1572 ENDDO 1573 1574 C Integrals (and wake top level number) 1575 C ----------------------------------------------------------- 1576 1577 C Initialize sum_thvu to 1st level virt. pot. temp. 1578 1579 DO i=1,klon 1580 ccc nrlmd IF ( wk_adv(i)) THEN 1581 if (OK_qx_qw(i)) then 1582 ccc 1583 z(i) = 1. 1584 dz(i) = 1. 1585 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i) 1586 sum_dth(i) = 0. 1587 ENDIF 1588 ENDDO 1589 1590 DO k = 1,klev 1591 DO i=1,klon 1592 ccc nrlmd IF ( wk_adv(i)) THEN 1593 if (OK_qx_qw(i)) then 1594 ccc 1595 dz(i) = -(amax1(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg) 1596 IF (dz(i) .GT. 0) THEN 1597 z(i) = z(i)+dz(i) 1598 sum_thu(i) = sum_thu(i) + thu(i,k)*dz(i) 1599 sum_tu(i) = sum_tu(i) + tu(i,k)*dz(i) 1600 sum_qu(i) = sum_qu(i) + qu(i,k)*dz(i) 1601 sum_thvu(i) = sum_thvu(i) + thu(i,k)*(1.+eps*qu(i,k))*dz(i) 1602 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i) 1603 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i) 1604 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i) 1605 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i) 1606 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i) 1607 ENDIF 1608 ENDIF 1609 ENDDO 1610 ENDDO 1611 c 1612 DO i=1,klon 1613 ccc nrlmd IF ( wk_adv(i)) THEN 1614 if (OK_qx_qw(i)) then 1615 ccc 1616 hw0(i) = z(i) 1617 ENDIF 1618 ENDDO 1619 c 1620 C - WAPE and mean forcing computation 1621 C------------------------------------------------------------- 1622 1623 C Means 1624 1625 DO i=1, klon 1626 ccc nrlmd IF ( wk_adv(i)) THEN 1627 if (OK_qx_qw(i)) then 1628 ccc 1629 av_thu(i) = sum_thu(i)/hw0(i) 1630 av_tu(i) = sum_tu(i)/hw0(i) 1631 av_qu(i) = sum_qu(i)/hw0(i) 1632 av_thvu(i) = sum_thvu(i)/hw0(i) 1633 av_dth(i) = sum_dth(i)/hw0(i) 1634 av_dq(i) = sum_dq(i)/hw0(i) 1635 av_rho(i) = sum_rho(i)/hw0(i) 1636 av_dtdwn(i) = sum_dtdwn(i)/hw0(i) 1637 av_dqdwn(i) = sum_dqdwn(i)/hw0(i) 1638 1639 wape2(i) = - rg*hw0(i)*(av_dth(i) 1640 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i) 1641 $ + av_dth(i)*av_dq(i) ))/av_thvu(i) 1642 ENDIF 1643 ENDDO 1644 1645 C Prognostic variable update 1646 C ------------------------------------------------------------ 1647 1648 C Filter out bad wakes 1649 c 1650 DO k = 1,klev 1651 DO i=1,klon 1652 ccc nrlmd IF ( wk_adv(i) .AND. wape2(i) .LT. 0.) THEN 1653 if (OK_qx_qw(i) .AND. wape2(i) .LT. 0.) then 1654 ccc 1655 deltatw(i,k) = 0. 1656 deltaqw(i,k) = 0. 1657 dth(i,k) = 0. 1658 ENDIF 1659 ENDDO 1660 ENDDO 1661 c 1662 1663 DO i=1, klon 1664 ccc nrlmd IF ( wk_adv(i)) THEN 1665 if (OK_qx_qw(i)) then 1666 ccc 1667 IF ( wape2(i) .LT. 0.) THEN 1668 wape2(i) = 0. 1669 Cstar2(i) = 0. 1670 hw(i) = hwmin 1671 sigmaw(i) = amax1(sigmad,sigd_con(i)) 1672 fip(i) = 0. 1673 gwake(i) = .FALSE. 1674 ELSE 1675 if(prt_level.ge.10) print*,'wape2>0' 1676 Cstar2(i) = stark*sqrt(2.*wape2(i)) 1677 gwake(i) = .TRUE. 1678 ENDIF 1679 ENDIF 1680 ENDDO 1681 c 1682 DO i=1, klon 1683 ccc nrlmd IF ( wk_adv(i)) THEN 1684 if (OK_qx_qw(i)) then 1685 ccc 1686 ktopw(i) = ktop(i) 1687 ENDIF 1688 ENDDO 1689 c 1690 DO i=1, klon 1691 ccc nrlmd IF ( wk_adv(i)) THEN 1692 if (OK_qx_qw(i)) then 1693 ccc 1694 IF (ktopw(i) .gt. 0 .and. gwake(i)) then 1695 1696 Cjyg1 Utilisation d'un h_efficace constant ( ~ feeding layer) 1697 ccc heff = 600. 1698 C Utilisation de la hauteur hw 1699 cc heff = 0.7*hw 1700 heff(i) = hw(i) 1701 1702 FIP(i) = 0.5*rho(i,ktopw(i))*Cstar2(i)**3*heff(i)*2* 1703 $ sqrt(sigmaw(i)*wdens(i)*3.14) 1704 FIP(i) = alpk * FIP(i) 1705 Cjyg2 1706 ELSE 1707 FIP(i) = 0. 1708 ENDIF 1709 ENDIF 1710 ENDDO 1711 c 1712 C Limitation de sigmaw 1713 1714 ccc nrlmd 1715 c DO i=1,klon 1716 c IF (OK_qx_qw(i)) THEN 1717 c IF (sigmaw(i).GE.sigmaw_max) sigmaw(i)=sigmaw_max 1718 c ENDIF 1719 c ENDDO 1720 ccc 1721 DO k = 1,klev 1722 DO i=1, klon 1723 1724 ccc nrlmd On maintient désormais constant sigmaw en régime permanent 1725 ccc IF ((sigmaw(i).GT.sigmaw_max).or. 1726 IF ( ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0)).or. 1727 $ (ktopw(i).le.2) .OR. 1728 $ .not. OK_qx_qw(i) ) THEN 1729 ccc 1730 dtls(i,k) = 0. 1731 dqls(i,k) = 0. 1732 deltatw(i,k) = 0. 1733 deltaqw(i,k) = 0. 1734 ENDIF 1735 ENDDO 1736 ENDDO 1737 c 1738 ccc nrlmd On maintient désormais constant sigmaw en régime permanent 1739 DO i=1, klon 1740 IF ( ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0)).or. 1741 $ (ktopw(i).le.2) .OR. 1742 $ .not. OK_qx_qw(i) ) THEN 1743 wape(i) = 0. 1744 cstar(i)=0. 1745 hw(i) = hwmin 1746 sigmaw(i) = sigmad 1747 fip(i) = 0. 1748 ELSE 1749 wape(i) = wape2(i) 1750 cstar(i)=cstar2(i) 1751 ENDIF 1752 cc print*,'wape wape2 ktopw OK_qx_qw =', 1753 cc $ wape(i),wape2(i),ktopw(i),OK_qx_qw(i) 1754 ENDDO 1755 c 1756 c 1757 RETURN 1758 END 1759 1760 SUBROUTINE wake_vec_modulation(nlon,nl,wk_adv,epsilon,qe,d_qe, 1761 $ deltaqw,d_deltaqw,sigmaw,d_sigmaw,alpha) 1762 c------------------------------------------------------ 1763 cDtermination du coefficient alpha tel que les tendances 1764 c corriges alpha*d_G, pour toutes les grandeurs G, correspondent 1765 c a une humidite positive dans la zone (x) et dans la zone (w). 1766 c------------------------------------------------------ 1767 c 1768 1769 c Input 1770 REAL qe(nlon,nl),d_qe(nlon,nl) 1771 REAL deltaqw(nlon,nl),d_deltaqw(nlon,nl) 1772 REAL sigmaw(nlon),d_sigmaw(nlon) 1773 LOGICAL wk_adv(nlon) 1774 INTEGER nl,nlon 1775 c Output 1776 REAL alpha(nlon) 1777 c Internal variables 1778 REAL zeta(nlon,nl) 1779 REAL alpha1(nlon) 1780 REAL x,a,b,c,discrim 1781 REAL epsilon 1782 ! DATA epsilon/1.e-15/ 1783 c 1784 DO k=1,nl 1785 DO i = 1,nlon 1786 IF (wk_adv(i)) THEN 1787 IF ((deltaqw(i,k)+d_deltaqw(i,k)).ge.0.) then 1788 zeta(i,k)=0. 1789 ELSE 1790 zeta(i,k)=1. 1791 END IF 1792 ENDIF 1793 ENDDO 1794 DO i = 1,nlon 1795 IF (wk_adv(i)) THEN 1796 x = qe(i,k)+(zeta(i,k)-sigmaw(i))*deltaqw(i,k) 1797 $ + d_qe(i,k)+(zeta(i,k)-sigmaw(i))*d_deltaqw(i,k) 1798 $ - d_sigmaw(i)*(deltaqw(i,k)+d_deltaqw(i,k)) 1799 a = -d_sigmaw(i)*d_deltaqw(i,k) 1800 b = d_qe(i,k)+(zeta(i,k)-sigmaw(i))*d_deltaqw(i,k) 1801 $ - deltaqw(i,k)*d_sigmaw(i) 1802 c = qe(i,k)+(zeta(i,k)-sigmaw(i))*deltaqw(i,k)+epsilon 1803 discrim = b*b-4.*a*c 1804 c print*, 'x, a, b, c, discrim', x, a, b, c, discrim 1805 IF (a+b .GE. 0.) THEN !! Condition suffisante pour la positivité de ovap 1806 alpha1(i)=1. 1807 ELSE 1808 IF (x .GE. 0.) THEN 1809 alpha1(i)=1. 1810 ELSE 1811 IF (a .GT. 0.) THEN 1812 alpha1(i)=0.9*min( (2.*c)/(-b+sqrt(discrim)), 1813 $ (-b+sqrt(discrim))/(2.*a) ) 1814 ELSE IF (a .eq. 0.) then 1815 alpha1(i)=0.9*(-c/b) 1816 ELSE 1817 c print*,'a,b,c discrim',a,b,c discrim 1818 alpha1(i)=0.9*max( (2.*c)/(-b+sqrt(discrim)), 1819 $ (-b+sqrt(discrim))/(2.*a) ) 1820 ENDIF 1821 ENDIF 1822 ENDIF 1823 alpha(i) = min(alpha(i),alpha1(i)) 1824 ENDIF 1825 ENDDO 1826 ENDDO 1827 ! 1828 return 1829 end 1830 1831 Subroutine WAKE_scal (p,ph,ppi,dtime,sigd_con 1832 : ,te0,qe0,omgb 1833 : ,dtdwn,dqdwn,amdwn,amup,dta,dqa 1834 : ,wdtPBL,wdqPBL,udtPBL,udqPBL 1835 o ,deltatw,deltaqw,dth,hw,sigmaw,wape,fip,gfl 1836 o ,dtls,dqls 1837 o ,ktopw,omgbdth,dp_omgb,wdens 1838 o ,tu,qu 1839 o ,dtKE,dqKE 1840 o ,dtPBL,dqPBL 1841 o ,omg,dp_deltomg,spread 1842 o ,Cstar,d_deltat_gw 1843 o ,d_deltatw2,d_deltaqw2) 1844 1845 *************************************************************** 1846 * * 1847 * WAKE * 1848 * retour a un Pupper fixe * 1849 * * 1850 * written by : GRANDPEIX Jean-Yves 09/03/2000 * 1851 * modified by : ROEHRIG Romain 01/29/2007 * 1852 *************************************************************** 1853 c 1854 USE dimphy 26 1855 IMPLICIT none 27 1856 c============================================================================ … … 113 1942 114 1943 #include "dimensions.h" 115 #include "YOMCST.h"116 #include "cvthermo.h"117 #include "iniprint.h"118 119 c Arguments en entree120 c--------------------121 122 REAL, dimension(klon,klev) :: p, ppi123 REAL, dimension(klon,klev+1) :: ph, omgb124 REAL dtime125 REAL, dimension(klon,klev) :: te0,qe0126 REAL, dimension(klon,klev) :: dtdwn, dqdwn127 REAL, dimension(klon,klev) :: wdtPBL,wdqPBL128 REAL, dimension(klon,klev) :: udtPBL,udqPBL129 REAL, dimension(klon,klev) :: amdwn, amup130 REAL, dimension(klon,klev) :: dta, dqa131 REAL, dimension(klon) :: sigd_con132 133 c Sorties134 c--------135 136 REAL, dimension(klon,klev) :: deltatw, deltaqw, dth137 REAL, dimension(klon,klev) :: tu, qu138 REAL, dimension(klon,klev) :: dtls, dqls139 REAL, dimension(klon,klev) :: dtKE, dqKE140 REAL, dimension(klon,klev) :: dtPBL, dqPBL141 REAL, dimension(klon,klev) :: spread142 REAL, dimension(klon,klev) :: d_deltatgw143 REAL, dimension(klon,klev) :: d_deltatw2, d_deltaqw2144 REAL, dimension(klon,klev+1) :: omgbdth, omg145 REAL, dimension(klon,klev) :: dp_omgb, dp_deltomg146 REAL, dimension(klon,klev) :: d_deltat_gw147 REAL, dimension(klon) :: hw, sigmaw, wape, fip, gfl, Cstar148 INTEGER, dimension(klon) :: ktopw149 150 c Variables internes151 c-------------------152 153 c Variables à fixer154 REAL ALON155 REAL coefgw156 REAL :: wdens0, wdens157 REAL stark158 REAL alpk159 REAL delta_t_min160 INTEGER nsub161 REAL dtimesub162 REAL sigmad, hwmin163 REAL :: sigmaw_max164 cIM 080208165 LOGICAL, dimension(klon) :: gwake166 167 c Variables de sauvegarde168 REAL, dimension(klon,klev) :: deltatw0169 REAL, dimension(klon,klev) :: deltaqw0170 REAL, dimension(klon,klev) :: te, qe171 REAL, dimension(klon) :: sigmaw0, sigmaw1172 173 c Variables pour les GW174 REAL, DIMENSION(klon) :: LL175 REAL, dimension(klon,klev) :: N2176 REAL, dimension(klon,klev) :: Cgw177 REAL, dimension(klon,klev) :: Tgw178 179 c Variables liées au calcul de hw180 REAL, DIMENSION(klon) :: ptop_provis, ptop, ptop_new181 REAL, DIMENSION(klon) :: sum_dth182 REAL, DIMENSION(klon) :: dthmin183 REAL, DIMENSION(klon) :: z, dz, hw0184 INTEGER, DIMENSION(klon) :: ktop, kupper185 186 c Sub-timestep tendencies and related variables187 REAL d_deltatw(klon,klev),d_deltaqw(klon,klev)188 REAL d_te(klon,klev),d_qe(klon,klev)189 REAL d_sigmaw(klon),alpha(klon)190 REAL q0_min(klon),q1_min(klon)191 LOGICAL wk_adv(klon), OK_qx_qw(klon)192 193 c Autres variables internes194 INTEGER isubstep, k, i195 196 REAL, DIMENSION(klon) :: sum_thu, sum_tu, sum_qu,sum_thvu197 REAL, DIMENSION(klon) :: sum_dq, sum_rho198 REAL, DIMENSION(klon) :: sum_dtdwn, sum_dqdwn199 REAL, DIMENSION(klon) :: av_thu, av_tu, av_qu, av_thvu200 REAL, DIMENSION(klon) :: av_dth, av_dq, av_rho201 REAL, DIMENSION(klon) :: av_dtdwn, av_dqdwn202 203 REAL, DIMENSION(klon,klev) :: rho, rhow204 REAL, DIMENSION(klon,klev+1) :: rhoh205 REAL, DIMENSION(klon,klev) :: rhow_moyen206 REAL, DIMENSION(klon,klev) :: zh207 REAL, DIMENSION(klon,klev+1) :: zhh208 REAL, DIMENSION(klon,klev) :: epaisseur1, epaisseur2209 210 REAL, DIMENSION(klon,klev) :: the, thu211 212 ! REAL, DIMENSION(klon,klev) :: d_deltatw, d_deltaqw213 214 REAL, DIMENSION(klon,klev+1) :: omgbw215 REAL, DIMENSION(klon) :: pupper216 REAL, DIMENSION(klon) :: omgtop217 REAL, DIMENSION(klon,klev) :: dp_omgbw218 REAL, DIMENSION(klon) :: ztop, dztop219 REAL, DIMENSION(klon,klev) :: alpha_up220 221 REAL, dimension(klon) :: RRe1, RRe2222 REAL :: RRd1, RRd2223 REAL, DIMENSION(klon,klev) :: Th1, Th2, q1, q2, T1224 REAL, DIMENSION(klon,klev) :: D_Th1, D_Th2, D_dth225 REAL, DIMENSION(klon,klev) :: D_q1, D_q2, D_dq226 REAL, DIMENSION(klon,klev) :: omgbdq227 228 REAL, dimension(klon) :: ff, gg229 REAL, dimension(klon) :: wape2, Cstar2, heff230 231 REAL, DIMENSION(klon,klev) :: Crep232 REAL Crep_upper, Crep_sol233 234 C-------------------------------------------------------------------------235 c Initialisations236 c-------------------------------------------------------------------------237 238 c print*, 'wake initialisations'239 240 c Essais d'initialisation avec sigmaw = 0.02 et hw = 10.241 c-------------------------------------------------------------------------242 243 DATA sigmad, hwmin /.02,10./244 245 C Longueur de maille (en m)246 c-------------------------------------------------------------------------247 248 c ALON = 3.e5249 ALON = 1.e6250 251 252 C Configuration de coefgw,stark,wdens (22/02/06 by YU Jingmei)253 c254 c coefgw : Coefficient pour les ondes de gravité255 c stark : Coefficient k dans Cstar=k*sqrt(2*WAPE)256 c wdens : Densité de poche froide par maille257 c-------------------------------------------------------------------------258 259 coefgw=10260 c coefgw=1261 c wdens0 = 1.0/(alon**2)262 wdens = 1.0/(alon**2)263 stark = 0.50264 cCRtest265 alpk=0.1266 c alpk = 1.0267 c alpk = 0.5268 c alpk = 0.05269 Crep_upper=0.9270 Crep_sol=1.0271 272 C Minimum value for |T_wake - T_undist|. Used for wake top definition273 c-------------------------------------------------------------------------274 275 delta_t_min = 0.2276 277 C 1. - Save initial values and initialize tendencies278 C --------------------------------------------------279 280 DO k=1,klev281 DO i=1, klon282 deltatw0(i,k) = deltatw(i,k)283 deltaqw0(i,k)= deltaqw(i,k)284 te(i,k) = te0(i,k)285 qe(i,k) = qe0(i,k)286 dtls(i,k) = 0.287 dqls(i,k) = 0.288 d_deltat_gw(i,k)=0.289 d_te(i,k) = 0.290 d_qe(i,k) = 0.291 d_deltatw(i,k) = 0.292 d_deltaqw(i,k) = 0.293 !IM 060508 beg294 d_deltatw2(i,k)=0.295 d_deltaqw2(i,k)=0.296 !IM 060508 end297 ENDDO298 ENDDO299 c sigmaw1=sigmaw300 c IF (sigd_con.GT.sigmaw1) THEN301 c print*, 'sigmaw,sigd_con', sigmaw, sigd_con302 c ENDIF303 DO i=1, klon304 cc sigmaw(i) = amax1(sigmaw(i),sigd_con(i))305 sigmaw(i) = amax1(sigmaw(i),sigmad)306 sigmaw(i) = amin1(sigmaw(i),0.99)307 sigmaw0(i) = sigmaw(i)308 wape(i) = 0.309 wape2(i) = 0.310 d_sigmaw(i) = 0.311 ktopw(i) = 0312 ENDDO313 C314 C315 C 2. - Prognostic part316 C --------------------317 C318 C319 C 2.1 - Undisturbed area and Wake integrals320 C ---------------------------------------------------------321 322 DO i=1, klon323 z(i) = 0.324 ktop(i)=0325 kupper(i) = 0326 sum_thu(i) = 0.327 sum_tu(i) = 0.328 sum_qu(i) = 0.329 sum_thvu(i) = 0.330 sum_dth(i) = 0.331 sum_dq(i) = 0.332 sum_rho(i) = 0.333 sum_dtdwn(i) = 0.334 sum_dqdwn(i) = 0.335 336 av_thu(i) = 0.337 av_tu(i) =0.338 av_qu(i) =0.339 av_thvu(i) = 0.340 av_dth(i) = 0.341 av_dq(i) = 0.342 av_rho(i) =0.343 av_dtdwn(i) =0.344 av_dqdwn(i) = 0.345 ENDDO346 c347 c Distance between wakes348 DO i = 1,klon349 LL(i) = (1-sqrt(sigmaw(i)))/sqrt(wdens)350 ENDDO351 C Potential temperatures and humidity352 c----------------------------------------------------------353 DO k =1,klev354 DO i=1, klon355 rho(i,k) = p(i,k)/(rd*te(i,k))356 IF(k .eq. 1) THEN357 rhoh(i,k) = ph(i,k)/(rd*te(i,k))358 zhh(i,k)=0359 ELSE360 rhoh(i,k) = ph(i,k)*2./(rd*(te(i,k)+te(i,k-1)))361 zhh(i,k)=(ph(i,k)-ph(i,k-1))/(-rhoh(i,k)*RG)+zhh(i,k-1)362 ENDIF363 the(i,k) = te(i,k)/ppi(i,k)364 thu(i,k) = (te(i,k) - deltatw(i,k)*sigmaw(i))/ppi(i,k)365 tu(i,k) = te(i,k) - deltatw(i,k)*sigmaw(i)366 qu(i,k) = qe(i,k) - deltaqw(i,k)*sigmaw(i)367 rhow(i,k) = p(i,k)/(rd*(tu(i,k)+deltatw(i,k)))368 dth(i,k) = deltatw(i,k)/ppi(i,k)369 ENDDO370 ENDDO371 372 DO k = 1, klev-1373 DO i=1, klon374 IF(k.eq.1) THEN375 N2(i,k)=0376 ELSE377 N2(i,k)=amax1(0.,-RG**2/the(i,k)*rho(i,k)*(the(i,k+1)-378 $ the(i,k-1))/(p(i,k+1)-p(i,k-1)))379 ENDIF380 ZH(i,k)=(zhh(i,k)+zhh(i,k+1))/2381 382 Cgw(i,k)=sqrt(N2(i,k))*ZH(i,k)383 Tgw(i,k)=coefgw*Cgw(i,k)/LL(i)384 ENDDO385 ENDDO386 387 DO i=1, klon388 N2(i,klev)=0389 ZH(i,klev)=0390 Cgw(i,klev)=0391 Tgw(i,klev)=0392 ENDDO393 394 c Calcul de la masse volumique moyenne de la colonne (bdlmd)395 c-----------------------------------------------------------------396 397 DO k=1,klev398 DO i=1, klon399 epaisseur1(i,k)=0.400 epaisseur2(i,k)=0.401 ENDDO402 ENDDO403 404 DO i=1, klon405 epaisseur1(i,1)= -(ph(i,2)-ph(i,1))/(rho(i,1)*rg)+1.406 epaisseur2(i,1)= -(ph(i,2)-ph(i,1))/(rho(i,1)*rg)+1.407 rhow_moyen(i,1) = rhow(i,1)408 ENDDO409 410 DO k = 2, klev411 DO i=1, klon412 epaisseur1(i,k)= -(ph(i,k+1)-ph(i,k))/(rho(i,k)*rg) +1.413 epaisseur2(i,k)=epaisseur2(i,k-1)+epaisseur1(i,k)414 rhow_moyen(i,k) = (rhow_moyen(i,k-1)*epaisseur2(i,k-1)+415 $ rhow(i,k)*epaisseur1(i,k))/epaisseur2(i,k)416 ENDDO417 ENDDO418 419 C420 C Choose an integration bound well above wake top421 c-----------------------------------------------------------------422 c423 C Pupper = 50000. ! melting level424 c Pupper = 60000.425 c Pupper = 80000. ! essais pour case_e426 DO i = 1,klon427 ccc Pupper(i) = 0.6*ph(i,1)428 Pupper(i) = 60000.429 ENDDO430 431 C432 C Determine Wake top pressure (Ptop) from buoyancy integral433 C --------------------------------------------------------434 c435 c-1/ Pressure of the level where dth becomes less than delta_t_min.436 437 DO i=1,klon438 ptop_provis(i)=ph(i,1)439 ENDDO440 DO k= 2,klev441 DO i=1,klon442 c443 cIM v3JYG; ptop_provis(i).LT. ph(i,1)444 c445 IF (dth(i,k) .GT. -delta_t_min .and.446 $ dth(i,k-1).LT. -delta_t_min .and.447 $ ptop_provis(i).EQ. ph(i,1)) THEN448 ptop_provis(i) = ((dth(i,k)+delta_t_min)*p(i,k-1)449 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /450 $ (dth(i,k) - dth(i,k-1))451 ENDIF452 ENDDO453 ENDDO454 455 c-2/ dth integral456 457 DO i=1,klon458 sum_dth(i) = 0.459 dthmin(i) = -delta_t_min460 z(i) = 0.461 ENDDO462 463 DO k = 1,klev464 DO i=1,klon465 dz(i) = -(amax1(ph(i,k+1),ptop_provis(i))-Ph(i,k))/(rho(i,k)*rg)466 IF (dz(i) .gt. 0) THEN467 z(i) = z(i)+dz(i)468 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i)469 dthmin(i) = amin1(dthmin(i),dth(i,k))470 ENDIF471 ENDDO472 ENDDO473 474 c-3/ height of triangle with area= sum_dth and base = dthmin475 476 DO i=1,klon477 hw0(i) = 2.*sum_dth(i)/amin1(dthmin(i),-0.5)478 hw0(i) = amax1(hwmin,hw0(i))479 ENDDO480 481 c-4/ now, get Ptop482 483 DO i=1,klon484 z(i) = 0.485 ptop(i) = ph(i,1)486 ENDDO487 488 DO k = 1,klev489 DO i=1,klon490 dz(i) = amin1(-(ph(i,k+1)-ph(i,k))/(rho(i,k)*rg),hw0(i)-z(i))491 IF (dz(i) .gt. 0) THEN492 z(i) = z(i)+dz(i)493 ptop(i) = ph(i,k)-rho(i,k)*rg*dz(i)494 ENDIF495 ENDDO496 ENDDO497 498 499 C-5/ Determination de ktop et kupper500 501 DO k=klev,1,-1502 DO i=1,klon503 IF (ph(i,k+1) .lt. ptop(i)) ktop(i)=k504 IF (ph(i,k+1) .lt. pupper(i)) kupper(i)=k505 ENDDO506 ENDDO507 508 c-6/ Correct ktop and ptop509 510 DO i = 1,klon511 ptop_new(i)=ptop(i)512 ENDDO513 DO k= klev,2,-1514 DO i=1,klon515 IF (k .LE. ktop(i) .and.516 $ ptop_new(i) .EQ. ptop(i) .and.517 $ dth(i,k) .GT. -delta_t_min .and.518 $ dth(i,k-1).LT. -delta_t_min) THEN519 ptop_new(i) = ((dth(i,k)+delta_t_min)*p(i,k-1)520 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /521 $ (dth(i,k) - dth(i,k-1))522 ENDIF523 ENDDO524 ENDDO525 526 DO i=1,klon527 ptop(i) = ptop_new(i)528 ENDDO529 530 DO k=klev,1,-1531 DO i=1,klon532 IF (ph(i,k+1) .lt. ptop(i)) ktop(i)=k533 ENDDO534 ENDDO535 c536 c-5/ Set deltatw & deltaqw to 0 above kupper537 c538 DO k = 1,klev539 DO i=1,klon540 IF (k.GE. kupper(i)) THEN541 deltatw(i,k) = 0.542 deltaqw(i,k) = 0.543 ENDIF544 ENDDO545 ENDDO546 c547 C548 C Vertical gradient of LS omega549 C550 DO k = 1,klev551 DO i=1,klon552 IF (k.LE. kupper(i)) THEN553 dp_omgb(i,k) = (omgb(i,k+1) - omgb(i,k))/(ph(i,k+1)-ph(i,k))554 ENDIF555 ENDDO556 ENDDO557 C558 C Integrals (and wake top level number)559 C --------------------------------------560 C561 C Initialize sum_thvu to 1st level virt. pot. temp.562 563 DO i=1,klon564 z(i) = 1.565 dz(i) = 1.566 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i)567 sum_dth(i) = 0.568 ENDDO569 570 DO k = 1,klev571 DO i=1,klon572 dz(i) = -(amax1(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg)573 IF (dz(i) .GT. 0) THEN574 z(i) = z(i)+dz(i)575 sum_thu(i) = sum_thu(i) + thu(i,k)*dz(i)576 sum_tu(i) = sum_tu(i) + tu(i,k)*dz(i)577 sum_qu(i) = sum_qu(i) + qu(i,k)*dz(i)578 sum_thvu(i) = sum_thvu(i) + thu(i,k)*(1.+eps*qu(i,k))*dz(i)579 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i)580 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i)581 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i)582 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i)583 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i)584 ENDIF585 ENDDO586 ENDDO587 c588 DO i=1,klon589 hw0(i) = z(i)590 ENDDO591 c592 C593 C 2.1 - WAPE and mean forcing computation594 C ---------------------------------------595 C596 C ---------------------------------------597 C598 C Means599 600 DO i=1,klon601 av_thu(i) = sum_thu(i)/hw0(i)602 av_tu(i) = sum_tu(i)/hw0(i)603 av_qu(i) = sum_qu(i)/hw0(i)604 av_thvu(i) = sum_thvu(i)/hw0(i)605 c av_thve = sum_thve/hw0606 av_dth(i) = sum_dth(i)/hw0(i)607 av_dq(i) = sum_dq(i)/hw0(i)608 av_rho(i) = sum_rho(i)/hw0(i)609 av_dtdwn(i) = sum_dtdwn(i)/hw0(i)610 av_dqdwn(i) = sum_dqdwn(i)/hw0(i)611 612 wape(i) = - rg*hw0(i)*(av_dth(i)613 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i)+av_dth(i)*614 $ av_dq(i) ))/av_thvu(i)615 ENDDO616 C617 C 2.2 Prognostic variable update618 C ------------------------------619 C620 C Filter out bad wakes621 622 DO k = 1,klev623 DO i=1,klon624 IF ( wape(i) .LT. 0.) THEN625 deltatw(i,k) = 0.626 deltaqw(i,k) = 0.627 dth(i,k) = 0.628 ENDIF629 ENDDO630 ENDDO631 c632 DO i=1,klon633 IF ( wape(i) .LT. 0.) THEN634 wape(i) = 0.635 Cstar(i) = 0.636 hw(i) = hwmin637 sigmaw(i) = amax1(sigmad,sigd_con(i))638 fip(i) = 0.639 gwake(i) = .FALSE.640 ELSE641 Cstar(i) = stark*sqrt(2.*wape(i))642 gwake(i) = .TRUE.643 ENDIF644 ENDDO645 646 c647 c Check qx and qw positivity648 c --------------------------649 DO i = 1,klon650 q0_min(i)=min( (qe(i,1)-sigmaw(i)*deltaqw(i,1)),651 $ (qe(i,1)+(1.-sigmaw(i))*deltaqw(i,1)) )652 ENDDO653 DO k = 2,klev654 DO i = 1,klon655 q1_min(i)=min( (qe(i,k)-sigmaw(i)*deltaqw(i,k)),656 $ (qe(i,k)+(1.-sigmaw(i))*deltaqw(i,k)) )657 IF (q1_min(i).le.q0_min(i)) THEN658 q0_min(i)=q1_min(i)659 ENDIF660 ENDDO661 ENDDO662 c663 DO i = 1,klon664 OK_qx_qw(i) = q0_min(i) .GE. 0.665 alpha(i) = 1.666 ENDDO667 c668 CC -----------------------------------------------------------------669 C Sub-time-stepping670 C -----------------671 C672 nsub=10673 dtimesub=dtime/nsub674 c675 c------------------------------------------------------------676 DO isubstep = 1,nsub677 c------------------------------------------------------------678 c679 c wk_adv is the logical flag enabling wake evolution in the time advance loop680 DO i = 1,klon681 wk_adv(i) = OK_qx_qw(i) .AND. alpha(i) .GE. 1.682 ENDDO683 c684 DO i=1,klon685 IF (wk_adv(i)) THEN686 gfl(i) = 2.*sqrt(3.14*wdens*sigmaw(i))687 ENDIF688 ENDDO689 DO i=1,klon690 IF (wk_adv(i)) THEN691 d_sigmaw(i) = gfl(i)*Cstar(i)*dtimesub692 c sigmaw(i) =sigmaw(i) + gfl(i)*Cstar(i)*dtimesub693 c sigmaw(i) =min(sigmaw(i),0.99) !!!!!!!!694 c wdens = wdens0/(10.*sigmaw)695 c sigmaw =max(sigmaw,sigd_con)696 c sigmaw =max(sigmaw,sigmad)697 ENDIF698 ENDDO699 C700 C701 c calcul de la difference de vitesse verticale poche - zone non perturbee702 cIM 060208 differences par rapport au code initial; init. a 0 dp_deltomg703 cIM 060208 et omg sur les niveaux de 1 a klev+1, alors que avant l'on definit704 cIM 060208 au niveau k=1..?705 DO k= 1,klev706 DO i = 1,klon707 dp_deltomg(i,k)=0.708 ENDDO709 ENDDO710 DO k= 1,klev+1711 DO i = 1,klon712 omg(i,k)=0.713 ENDDO714 ENDDO715 c716 DO i=1,klon717 IF (wk_adv(i)) THEN718 z(i)= 0.719 omg(i,1) = 0.720 dp_deltomg(i,1) = -(gfl(i)*Cstar(i))/(sigmaw(i) * (1-sigmaw(i)))721 ENDIF722 ENDDO723 c724 DO k= 2,klev725 DO i = 1,klon726 IF( wk_adv(i) .AND. k .LE. ktop(i)) THEN727 dz(i) = -(ph(i,k)-ph(i,k-1))/(rho(i,k-1)*rg)728 z(i) = z(i)+dz(i)729 dp_deltomg(i,k)= dp_deltomg(i,1)730 omg(i,k)= dp_deltomg(i,1)*z(i)731 ENDIF732 ENDDO733 ENDDO734 c735 DO i = 1,klon736 IF (wk_adv(i)) THEN737 dztop(i)=-(ptop(i)-ph(i,ktop(i)))/(rho(i,ktop(i))*rg)738 ztop(i) = z(i)+dztop(i)739 omgtop(i)=dp_deltomg(i,1)*ztop(i)740 ENDIF741 ENDDO742 c743 c -----------------744 c From m/s to Pa/s745 c -----------------746 c747 DO i=1,klon748 IF (wk_adv(i)) THEN749 omgtop(i) = -rho(i,ktop(i))*rg*omgtop(i)750 dp_deltomg(i,1) = omgtop(i)/(ptop(i)-ph(i,1))751 ENDIF752 ENDDO753 c754 DO k= 1,klev755 DO i = 1,klon756 IF( wk_adv(i) .AND. k .LE. ktop(i)) THEN757 omg(i,k) = - rho(i,k)*rg*omg(i,k)758 dp_deltomg(i,k) = dp_deltomg(i,1)759 ENDIF760 ENDDO761 ENDDO762 c763 c raccordement lineaire de omg de ptop a pupper764 765 DO i=1,klon766 IF ( wk_adv(i) .AND. kupper(i) .GT. ktop(i)) THEN767 omg(i,kupper(i)+1) = - Rg*amdwn(i,kupper(i)+1)/sigmaw(i)768 $ + Rg*amup(i,kupper(i)+1)/(1.-sigmaw(i))769 dp_deltomg(i,kupper(i)) = (omgtop(i)-omg(i,kupper(i)+1))/770 $ (ptop(i)-pupper(i))771 ENDIF772 ENDDO773 c774 DO k= 1,klev775 DO i = 1,klon776 IF( wk_adv(i) .AND. k .GT. ktop(i) .AND. k .LE. kupper(i)) THEN777 dp_deltomg(i,k) = dp_deltomg(i,kupper(i))778 omg(i,k) = omgtop(i)+(ph(i,k)-ptop(i))*dp_deltomg(i,kupper(i))779 ENDIF780 ENDDO781 ENDDO782 c783 c784 c-- Compute wake average vertical velocity omgbw785 c786 c787 DO k = 1,klev+1788 DO i=1,klon789 IF ( wk_adv(i)) THEN790 omgbw(i,k) = omgb(i,k)+(1.-sigmaw(i))*omg(i,k)791 ENDIF792 ENDDO793 ENDDO794 c-- and its vertical gradient dp_omgbw795 c796 DO k = 1,klev797 DO i=1,klon798 IF ( wk_adv(i)) THEN799 dp_omgbw(i,k) = (omgbw(i,k+1)-omgbw(i,k))/(ph(i,k+1)-ph(i,k))800 ENDIF801 ENDDO802 ENDDO803 C804 c-- Upstream coefficients for omgb velocity805 c-- (alpha_up(k) is the coefficient of the value at level k)806 c-- (1-alpha_up(k) is the coefficient of the value at level k-1)807 DO k = 1,klev808 DO i=1,klon809 IF ( wk_adv(i)) THEN810 alpha_up(i,k) = 0.811 IF (omgb(i,k) .GT. 0.) alpha_up(i,k) = 1.812 ENDIF813 ENDDO814 ENDDO815 816 c Matrix expressing [The,deltatw] from [Th1,Th2]817 818 DO i=1,klon819 IF ( wk_adv(i)) THEN820 RRe1(i) = 1.-sigmaw(i)821 RRe2(i) = sigmaw(i)822 ENDIF823 ENDDO824 RRd1 = -1.825 RRd2 = 1.826 c827 c-- Get [Th1,Th2], dth and [q1,q2]828 c829 DO k= 1,klev830 DO i = 1,klon831 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN832 dth(i,k) = deltatw(i,k)/ppi(i,k)833 Th1(i,k) = the(i,k) - sigmaw(i) *dth(i,k) ! undisturbed area834 Th2(i,k) = the(i,k) + (1.-sigmaw(i))*dth(i,k) ! wake835 q1(i,k) = qe(i,k) - sigmaw(i) *deltaqw(i,k) ! undisturbed area836 q2(i,k) = qe(i,k) + (1.-sigmaw(i))*deltaqw(i,k) ! wake837 T1(i,k) = te(i,k) - sigmaw(i)*deltatw(i,k)! undisturb itlmd838 ENDIF839 ENDDO840 ENDDO841 842 DO i=1,klon843 D_Th1(i,1) = 0. !!!itlmd : ne pas mettre if wk_adv cf nrlmd?844 D_Th2(i,1) = 0.845 D_dth(i,1) = 0.846 D_q1(i,1) = 0.847 D_q2(i,1) = 0.848 D_dq(i,1) = 0.849 ENDDO850 851 DO k= 2,klev852 DO i = 1,klon853 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN854 D_Th1(i,k) = Th1(i,k-1)-Th1(i,k)855 D_Th2(i,k) = Th2(i,k-1)-Th2(i,k)856 D_dth(i,k) = dth(i,k-1)-dth(i,k)857 D_q1(i,k) = q1(i,k-1)-q1(i,k)858 D_q2(i,k) = q2(i,k-1)-q2(i,k)859 D_dq(i,k) = deltaqw(i,k-1)-deltaqw(i,k)860 ENDIF861 ENDDO862 ENDDO863 864 DO i=1,klon865 IF( wk_adv(i)) THEN866 omgbdth(i,1) = 0.867 omgbdq(i,1) = 0.868 ENDIF869 ENDDO870 871 DO k= 2,klev872 DO i = 1,klon873 IF( wk_adv(i) .AND. k .LE. kupper(i)+1) THEN ! loop on interfaces874 omgbdth(i,k) = omgb(i,k)*( dth(i,k-1) - dth(i,k))875 omgbdq(i,k) = omgb(i,k)*(deltaqw(i,k-1) - deltaqw(i,k))876 ENDIF877 ENDDO878 ENDDO879 c880 c-----------------------------------------------------------------881 DO k= 1,klev882 DO i = 1,klon883 IF( wk_adv(i) .AND. k .LE. kupper(i)-1) THEN884 c-----------------------------------------------------------------885 c886 c Compute redistribution (advective) term887 c888 d_deltatw(i,k) =889 $ dtimesub/(Ph(i,k)-Ph(i,k+1))*(890 $ RRd1*omg(i,k )*sigmaw(i) *D_Th1(i,k)891 $ -RRd2*omg(i,k+1)*(1.-sigmaw(i))*D_Th2(i,k+1)892 $ -(1.-alpha_up(i,k))*omgbdth(i,k) - alpha_up(i,k+1)*893 $ omgbdth(i,k+1))*ppi(i,k)894 c print*,'d_deltatw=',d_deltatw(i,k)895 c896 d_deltaqw(i,k) =897 $ dtimesub/(Ph(i,k)-Ph(i,k+1))*(898 $ RRd1*omg(i,k )*sigmaw(i) *D_q1(i,k)899 $ -RRd2*omg(i,k+1)*(1.-sigmaw(i))*D_q2(i,k+1)900 $ -(1.-alpha_up(i,k))*omgbdq(i,k) - alpha_up(i,k+1)*901 $ omgbdq(i,k+1))902 c print*,'d_deltaqw=',d_deltaqw(i,k)903 c904 c and increment large scale tendencies905 c906 907 c908 C909 CC -----------------------------------------------------------------910 d_te(i,k) = dtimesub*(911 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_Th1(i,k)912 $ -RRe2(i)*omg(i,k+1)*(1.-sigmaw(i))*D_Th2(i,k+1) )913 $ /(Ph(i,k)-Ph(i,k+1))914 $ -sigmaw(i)*(1.-sigmaw(i))*dth(i,k)*915 $ (omg(i,k)-omg(i,k+1))/(Ph(i,k)-Ph(i,k+1)) !instead of dp_deltomg(i,k)916 $ )*ppi(i,k)917 c918 d_qe(i,k) = dtimesub*(919 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_q1(i,k)920 $ -RRe2(i)*omg(i,k+1)*(1.-sigmaw(i))*D_q2(i,k+1) )921 $ /(Ph(i,k)-Ph(i,k+1))922 $ -sigmaw(i)*(1.-sigmaw(i))*deltaqw(i,k)*923 $ (omg(i,k)-omg(i,k+1))/(Ph(i,k)-Ph(i,k+1))!instead of dp_deltomg(i,k)924 $ )925 ELSE IF(wk_adv(i) .AND. k .EQ. kupper(i)) THEN ! corr pour conserver l'eau926 927 d_te(i,k) = dtimesub*(928 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_Th1(i,k))929 $ /(Ph(i,k)-Ph(i,k+1))930 $ )*ppi(i,k)931 932 d_qe(i,k) = dtimesub*(933 $ ( RRe1(i)*omg(i,k )*sigmaw(i) *D_q1(i,k))934 $ /(Ph(i,k)-Ph(i,k+1))935 $ )936 ENDIF937 938 c-------------------------------------------------------------------939 ENDDO940 ENDDO941 c------------------------------------------------------------------942 C943 C Increment state variables944 945 DO k= 1,klev946 DO i = 1,klon947 IF( wk_adv(i) .AND. k .LE. kupper(i)-1) THEN948 c949 c Coefficient de répartition950 951 Crep(i,k)=Crep_sol*(ph(i,kupper(i))-ph(i,k))/(ph(i,kupper(i))952 $ -ph(i,1))953 Crep(i,k)=Crep(i,k)+Crep_upper*(ph(i,1)-ph(i,k))/(p(i,1)-954 $ ph(i,kupper(i)))955 956 957 c Reintroduce compensating subsidence term.958 959 c dtKE(k)=(dtdwn(k)*Crep(k))/sigmaw960 c dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k))961 c . /(1-sigmaw)962 c dqKE(k)=(dqdwn(k)*Crep(k))/sigmaw963 c dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k))964 c . /(1-sigmaw)965 c966 c dtKE(k)=(dtdwn(k)*Crep(k)+(1-Crep(k))*dta(k))/sigmaw967 c dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k)*Crep(k))968 c . /(1-sigmaw)969 c dqKE(k)=(dqdwn(k)*Crep(k)+(1-Crep(k))*dqa(k))/sigmaw970 c dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k)*Crep(k))971 c . /(1-sigmaw)972 973 dtKE(i,k)=(dtdwn(i,k)/sigmaw(i) - dta(i,k)/(1.-sigmaw(i)))974 dqKE(i,k)=(dqdwn(i,k)/sigmaw(i) - dqa(i,k)/(1.-sigmaw(i)))975 c print*,'dtKE=',dtKE(k)976 c print*,'dqKE=',dqKE(k)977 c978 dtPBL(i,k)=(wdtPBL(i,k)/sigmaw(i) - udtPBL(i,k)/(1.-sigmaw(i)))979 dqPBL(i,k)=(wdqPBL(i,k)/sigmaw(i) - udqPBL(i,k)/(1.-sigmaw(i)))980 c981 spread(i,k) = (1.-sigmaw(i))*dp_deltomg(i,k)+gfl(i)*Cstar(i)/982 $ sigmaw(i)983 984 985 c ajout d'un effet onde de gravité -Tgw(k)*deltatw(k) 03/02/06 YU Jingmei986 987 d_deltat_gw(i,k)=d_deltat_gw(i,k)-Tgw(i,k)*deltatw(i,k)*988 $ dtimesub989 ff(i)=d_deltatw(i,k)/dtimesub990 991 c Sans GW992 c993 c deltatw(k)=deltatw(k)+dtimesub*(ff+dtKE(k)-spread(k)*deltatw(k))994 c995 c GW formule 1996 c997 c deltatw(k) = deltatw(k)+dtimesub*998 c $ (ff+dtKE(k) - spread(k)*deltatw(k)-Tgw(k)*deltatw(k))999 c1000 c GW formule 21001 1002 IF (dtimesub*Tgw(i,k).lt.1.e-10) THEN1003 d_deltatw(i,k) = dtimesub*1004 $ (ff(i)+dtKE(i,k)+dtPBL(i,k)1005 $ - spread(i,k)*deltatw(i,k)-Tgw(i,k)*deltatw(i,k))1006 ELSE1007 d_deltatw(i,k) = 1/Tgw(i,k)*(1-exp(-dtimesub*1008 $ Tgw(i,k)))*1009 $ (ff(i)+dtKE(i,k)+dtPBL(i,k)1010 $ - spread(i,k)*deltatw(i,k)-Tgw(i,k)*deltatw(i,k))1011 ENDIF1012 1013 dth(i,k) = deltatw(i,k)/ppi(i,k)1014 1015 gg(i)=d_deltaqw(i,k)/dtimesub1016 1017 d_deltaqw(i,k) = dtimesub*(gg(i)+ dqKE(i,k)+dqPBL(i,k)1018 $ - spread(i,k)*deltaqw(i,k))1019 1020 d_deltatw2(i,k)=d_deltatw2(i,k)+d_deltatw(i,k)1021 d_deltaqw2(i,k)=d_deltaqw2(i,k)+d_deltaqw(i,k)1022 ENDIF1023 ENDDO1024 ENDDO1025 1026 C1027 C Scale tendencies so that water vapour remains positive in w and x.1028 C1029 call wake_vec_modulation(klon,klev,wk_adv,qe,d_qe,deltaqw,1030 $ d_deltaqw,sigmaw,d_sigmaw,alpha)1031 c1032 DO k = 1,klev1033 DO i = 1,klon1034 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN1035 d_te(i,k)=alpha(i)*d_te(i,k)1036 d_qe(i,k)=alpha(i)*d_qe(i,k)1037 d_deltatw(i,k)=alpha(i)*d_deltatw(i,k)1038 d_deltaqw(i,k)=alpha(i)*d_deltaqw(i,k)1039 d_deltat_gw(i,k)=alpha(i)*d_deltat_gw(i,k)1040 ENDIF1041 ENDDO1042 ENDDO1043 DO i = 1,klon1044 IF( wk_adv(i)) THEN1045 d_sigmaw(i)=alpha(i)*d_sigmaw(i)1046 ENDIF1047 ENDDO1048 1049 C Update large scale variables and wake variables1050 cIM 060208 manque DO i + remplace DO k=1,kupper(i)1051 cIM 060208 DO k = 1,kupper(i)1052 DO k= 1,klev1053 DO i = 1,klon1054 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN1055 dtls(i,k)=dtls(i,k)+d_te(i,k)1056 dqls(i,k)=dqls(i,k)+d_qe(i,k)1057 ENDIF1058 ENDDO1059 ENDDO1060 DO k= 1,klev1061 DO i = 1,klon1062 IF( wk_adv(i) .AND. k .LE. kupper(i)) THEN1063 te(i,k) = te0(i,k) + dtls(i,k)1064 qe(i,k) = qe0(i,k) + dqls(i,k)1065 the(i,k) = te(i,k)/ppi(i,k)1066 deltatw(i,k) = deltatw(i,k)+d_deltatw(i,k)1067 deltaqw(i,k) = deltaqw(i,k)+d_deltaqw(i,k)1068 dth(i,k) = deltatw(i,k)/ppi(i,k)1069 ENDIF1070 ENDDO1071 ENDDO1072 DO i = 1,klon1073 IF( wk_adv(i)) THEN1074 sigmaw(i) = sigmaw(i)+d_sigmaw(i)1075 ENDIF1076 ENDDO1077 c1078 C1079 c Determine Ptop from buoyancy integral1080 c ---------------------------------------1081 c1082 c- 1/ Pressure of the level where dth changes sign.1083 c1084 DO i=1,klon1085 IF ( wk_adv(i)) THEN1086 Ptop_provis(i)=ph(i,1)1087 ENDIF1088 ENDDO1089 c1090 DO k= 2,klev1091 DO i=1,klon1092 IF ( wk_adv(i) .AND.1093 $ Ptop_provis(i) .EQ. ph(i,1) .AND.1094 $ dth(i,k) .GT. -delta_t_min .and.1095 $ dth(i,k-1).LT. -delta_t_min) THEN1096 Ptop_provis(i) = ((dth(i,k)+delta_t_min)*p(i,k-1)1097 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /(dth(i,k)1098 $ - dth(i,k-1))1099 ENDIF1100 ENDDO1101 ENDDO1102 c1103 c- 2/ dth integral1104 c1105 DO i=1,klon1106 sum_dth(i) = 0.1107 dthmin(i) = -delta_t_min1108 z(i) = 0.1109 ENDDO1110 1111 DO k = 1,klev1112 DO i=1,klon1113 IF ( wk_adv(i)) THEN1114 dz(i) = -(amax1(ph(i,k+1),Ptop_provis(i))-Ph(i,k))/(rho(i,k)*rg)1115 IF (dz(i) .gt. 0) THEN1116 z(i) = z(i)+dz(i)1117 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i)1118 dthmin(i) = amin1(dthmin(i),dth(i,k))1119 ENDIF1120 ENDIF1121 ENDDO1122 ENDDO1123 c1124 c- 3/ height of triangle with area= sum_dth and base = dthmin1125 1126 DO i=1,klon1127 IF ( wk_adv(i)) THEN1128 hw(i) = 2.*sum_dth(i)/amin1(dthmin(i),-0.5)1129 hw(i) = amax1(hwmin,hw(i))1130 ENDIF1131 ENDDO1132 c1133 c- 4/ now, get Ptop1134 c1135 DO i=1,klon1136 ktop(i) = 01137 z(i)=0.1138 ENDDO1139 c1140 DO k = 1,klev1141 DO i=1,klon1142 IF ( wk_adv(i)) THEN1143 dz(i) = amin1(-(ph(i,k+1)-Ph(i,k))/(rho(i,k)*rg),hw(i)-z(i))1144 IF (dz(i) .gt. 0) THEN1145 z(i) = z(i)+dz(i)1146 Ptop(i) = Ph(i,k)-rho(i,k)*rg*dz(i)1147 ktop(i) = k1148 ENDIF1149 ENDIF1150 ENDDO1151 ENDDO1152 c1153 c 4.5/Correct ktop and ptop1154 c1155 DO i=1,klon1156 IF ( wk_adv(i)) THEN1157 Ptop_new(i)=ptop(i)1158 ENDIF1159 ENDDO1160 c1161 DO k= klev,2,-11162 DO i=1,klon1163 cIM v3JYG; IF (k .GE. ktop(i)1164 IF ( wk_adv(i) .AND.1165 $ k .LE. ktop(i) .AND.1166 $ ptop_new(i) .EQ. ptop(i) .AND.1167 $ dth(i,k) .GT. -delta_t_min .and.1168 $ dth(i,k-1).LT. -delta_t_min) THEN1169 Ptop_new(i) = ((dth(i,k)+delta_t_min)*p(i,k-1)1170 $ - (dth(i,k-1)+delta_t_min)*p(i,k)) /(dth(i,k)1171 $ - dth(i,k-1))1172 ENDIF1173 ENDDO1174 ENDDO1175 c1176 c1177 DO i=1,klon1178 IF ( wk_adv(i)) THEN1179 ptop(i) = ptop_new(i)1180 ENDIF1181 ENDDO1182 1183 DO k=klev,1,-11184 DO i=1,klon1185 IF (ph(i,k+1) .LT. ptop(i)) ktop(i)=k1186 ENDDO1187 ENDDO1188 c1189 c 5/ Set deltatw & deltaqw to 0 above kupper1190 c1191 DO k = 1,klev1192 DO i=1,klon1193 IF ( wk_adv(i) .AND. k .GE. kupper(i)) THEN1194 deltatw(i,k) = 0.1195 deltaqw(i,k) = 0.1196 ENDIF1197 ENDDO1198 ENDDO1199 c1200 C1201 c-------------Cstar computation---------------------------------1202 DO i=1, klon1203 sum_thu(i) = 0.1204 sum_tu(i) = 0.1205 sum_qu(i) = 0.1206 sum_thvu(i) = 0.1207 sum_dth(i) = 0.1208 sum_dq(i) = 0.1209 sum_rho(i) = 0.1210 sum_dtdwn(i) = 0.1211 sum_dqdwn(i) = 0.1212 1213 av_thu(i) = 0.1214 av_tu(i) =0.1215 av_qu(i) =0.1216 av_thvu(i) = 0.1217 av_dth(i) = 0.1218 av_dq(i) = 0.1219 av_rho(i) =0.1220 av_dtdwn(i) =0.1221 av_dqdwn(i) = 0.1222 ENDDO1223 C1224 C Integrals (and wake top level number)1225 C --------------------------------------1226 C1227 C Initialize sum_thvu to 1st level virt. pot. temp.1228 1229 DO i=1,klon1230 z(i) = 1.1231 dz(i) = 1.1232 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i)1233 sum_dth(i) = 0.1234 ENDDO1235 1236 DO k = 1,klev1237 DO i=1,klon1238 dz(i) = -(max(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg)1239 IF (dz(i) .GT. 0) THEN1240 z(i) = z(i)+dz(i)1241 sum_thu(i) = sum_thu(i) + th1(i,k)*dz(i)1242 sum_tu(i) = sum_tu(i) + t1(i,k)*dz(i)1243 sum_qu(i) = sum_qu(i) + q1(i,k)*dz(i)1244 sum_thvu(i) = sum_thvu(i) + th1(i,k)*(1.+eps*q1(i,k))*dz(i)!itlmd1245 1246 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i)1247 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i)1248 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i)1249 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i)1250 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i)1251 ENDIF1252 ENDDO1253 ENDDO1254 c1255 DO i=1,klon1256 hw0(i) = z(i)1257 ENDDO1258 c1259 C1260 C - WAPE and mean forcing computation1261 C ---------------------------------------1262 C1263 C ---------------------------------------1264 C1265 C Means1266 1267 DO i=1,klon1268 av_thu(i) = sum_thu(i)/hw0(i)1269 av_tu(i) = sum_tu(i)/hw0(i)1270 av_qu(i) = sum_qu(i)/hw0(i)1271 av_thvu(i) = sum_thvu(i)/hw0(i)1272 av_dth(i) = sum_dth(i)/hw0(i)1273 av_dq(i) = sum_dq(i)/hw0(i)1274 av_rho(i) = sum_rho(i)/hw0(i)1275 av_dtdwn(i) = sum_dtdwn(i)/hw0(i)1276 av_dqdwn(i) = sum_dqdwn(i)/hw0(i)1277 c1278 wape(i) = - rg*hw0(i)*(av_dth(i)1279 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i)+av_dth(i)*1280 $ av_dq(i) ))/av_thvu(i)1281 ENDDO1282 C1283 C Filter out bad wakes1284 1285 DO k = 1,klev1286 DO i=1,klon1287 IF ( wape(i) .LT. 0.) THEN1288 deltatw(i,k) = 0.1289 deltaqw(i,k) = 0.1290 dth(i,k) = 0.1291 ENDIF1292 ENDDO1293 ENDDO1294 c1295 DO i=1,klon1296 IF ( wape(i) .LT. 0.) THEN1297 wape(i) = 0.1298 Cstar(i) = 0.1299 hw(i) = hwmin1300 sigmaw(i) = max(sigmad,sigd_con(i))1301 fip(i) = 0.1302 gwake(i) = .FALSE.1303 ELSE1304 Cstar(i) = stark*sqrt(2.*wape(i))1305 gwake(i) = .TRUE.1306 ENDIF1307 ENDDO1308 1309 ENDDO ! end sub-timestep loop1310 C1311 C -----------------------------------------------------------------1312 c Get back to tendencies per second1313 c1314 DO k = 1,klev1315 DO i=1,klon1316 IF ( wk_adv(i) .AND. k .LE. kupper(i)) THEN !! corr conservation eau1317 dtls(i,k) = dtls(i,k)/dtime1318 dqls(i,k) = dqls(i,k)/dtime1319 d_deltatw2(i,k)=d_deltatw2(i,k)/dtime1320 d_deltaqw2(i,k)=d_deltaqw2(i,k)/dtime1321 d_deltat_gw(i,k) = d_deltat_gw(i,k)/dtime1322 ENDIF1323 ENDDO1324 ENDDO1325 c1326 c1327 c----------------------------------------------------------1328 c Determine wake final state; recompute wape, cstar, ktop;1329 c filter out bad wakes.1330 c----------------------------------------------------------1331 c1332 C 2.1 - Undisturbed area and Wake integrals1333 C ---------------------------------------------------------1334 1335 DO i=1,klon1336 z(i) = 0.1337 sum_thu(i) = 0.1338 sum_tu(i) = 0.1339 sum_qu(i) = 0.1340 sum_thvu(i) = 0.1341 sum_dth(i) = 0.1342 sum_dq(i) = 0.1343 sum_rho(i) = 0.1344 sum_dtdwn(i) = 0.1345 sum_dqdwn(i) = 0.1346 1347 av_thu(i) = 0.1348 av_tu(i) =0.1349 av_qu(i) =0.1350 av_thvu(i) = 0.1351 av_dth(i) = 0.1352 av_dq(i) = 0.1353 av_rho(i) =0.1354 av_dtdwn(i) =0.1355 av_dqdwn(i) = 0.1356 ENDDO1357 C Potential temperatures and humidity1358 c----------------------------------------------------------1359 1360 DO k =1,klev1361 DO i=1,klon1362 IF ( wk_adv(i)) THEN1363 rho(i,k) = p(i,k)/(rd*te(i,k))1364 IF(k .eq. 1) THEN1365 rhoh(i,k) = ph(i,k)/(rd*te(i,k))1366 zhh(i,k)=01367 ELSE1368 rhoh(i,k) = ph(i,k)*2./(rd*(te(i,k)+te(i,k-1)))1369 zhh(i,k)=(ph(i,k)-ph(i,k-1))/(-rhoh(i,k)*RG)+zhh(i,k-1)1370 ENDIF1371 the(i,k) = te(i,k)/ppi(i,k)1372 thu(i,k) = (te(i,k) - deltatw(i,k)*sigmaw(i))/ppi(i,k)1373 tu(i,k) = te(i,k) - deltatw(i,k)*sigmaw(i)1374 qu(i,k) = qe(i,k) - deltaqw(i,k)*sigmaw(i)1375 rhow(i,k) = p(i,k)/(rd*(tu(i,k)+deltatw(i,k)))1376 dth(i,k) = deltatw(i,k)/ppi(i,k)1377 ENDIF1378 ENDDO1379 ENDDO1380 1381 C Integrals (and wake top level number)1382 C -----------------------------------------------------------1383 1384 C Initialize sum_thvu to 1st level virt. pot. temp.1385 1386 DO i=1,klon1387 IF ( wk_adv(i)) THEN1388 z(i) = 1.1389 dz(i) = 1.1390 sum_thvu(i) = thu(i,1)*(1.+eps*qu(i,1))*dz(i)1391 sum_dth(i) = 0.1392 ENDIF1393 ENDDO1394 1395 DO k = 1,klev1396 DO i=1,klon1397 IF ( wk_adv(i)) THEN1398 dz(i) = -(amax1(ph(i,k+1),ptop(i))-ph(i,k))/(rho(i,k)*rg)1399 IF (dz(i) .GT. 0) THEN1400 z(i) = z(i)+dz(i)1401 sum_thu(i) = sum_thu(i) + thu(i,k)*dz(i)1402 sum_tu(i) = sum_tu(i) + tu(i,k)*dz(i)1403 sum_qu(i) = sum_qu(i) + qu(i,k)*dz(i)1404 sum_thvu(i) = sum_thvu(i) + thu(i,k)*(1.+eps*qu(i,k))*dz(i)1405 sum_dth(i) = sum_dth(i) + dth(i,k)*dz(i)1406 sum_dq(i) = sum_dq(i) + deltaqw(i,k)*dz(i)1407 sum_rho(i) = sum_rho(i) + rhow(i,k)*dz(i)1408 sum_dtdwn(i) = sum_dtdwn(i) + dtdwn(i,k)*dz(i)1409 sum_dqdwn(i) = sum_dqdwn(i) + dqdwn(i,k)*dz(i)1410 ENDIF1411 ENDIF1412 ENDDO1413 ENDDO1414 c1415 DO i=1,klon1416 IF ( wk_adv(i)) THEN1417 hw0(i) = z(i)1418 ENDIF1419 ENDDO1420 c1421 C - WAPE and mean forcing computation1422 C-------------------------------------------------------------1423 1424 C Means1425 1426 DO i=1, klon1427 IF ( wk_adv(i)) THEN1428 av_thu(i) = sum_thu(i)/hw0(i)1429 av_tu(i) = sum_tu(i)/hw0(i)1430 av_qu(i) = sum_qu(i)/hw0(i)1431 av_thvu(i) = sum_thvu(i)/hw0(i)1432 av_dth(i) = sum_dth(i)/hw0(i)1433 av_dq(i) = sum_dq(i)/hw0(i)1434 av_rho(i) = sum_rho(i)/hw0(i)1435 av_dtdwn(i) = sum_dtdwn(i)/hw0(i)1436 av_dqdwn(i) = sum_dqdwn(i)/hw0(i)1437 1438 wape2(i) = - rg*hw0(i)*(av_dth(i)1439 $ + eps*(av_thu(i)*av_dq(i)+av_dth(i)*av_qu(i)+1440 $ av_dth(i)*av_dq(i) ))/av_thvu(i)1441 ENDIF1442 ENDDO1443 1444 C Prognostic variable update1445 C ------------------------------------------------------------1446 1447 C Filter out bad wakes1448 c1449 DO k = 1,klev1450 DO i=1,klon1451 IF ( wk_adv(i) .AND. wape2(i) .LT. 0.) THEN1452 deltatw(i,k) = 0.1453 deltaqw(i,k) = 0.1454 dth(i,k) = 0.1455 ENDIF1456 ENDDO1457 ENDDO1458 c1459 1460 DO i=1, klon1461 IF ( wk_adv(i)) THEN1462 IF ( wape2(i) .LT. 0.) THEN1463 wape2(i) = 0.1464 Cstar2(i) = 0.1465 hw(i) = hwmin1466 sigmaw(i) = amax1(sigmad,sigd_con(i))1467 fip(i) = 0.1468 gwake(i) = .FALSE.1469 ELSE1470 if(prt_level.ge.10) print*,'wape2>0'1471 Cstar2(i) = stark*sqrt(2.*wape2(i))1472 gwake(i) = .TRUE.1473 ENDIF1474 ENDIF1475 ENDDO1476 c1477 DO i=1, klon1478 IF ( wk_adv(i)) THEN1479 ktopw(i) = ktop(i)1480 ENDIF1481 ENDDO1482 c1483 DO i=1, klon1484 IF ( wk_adv(i)) THEN1485 IF (ktopw(i) .gt. 0 .and. gwake(i)) then1486 1487 Cjyg1 Utilisation d'un h_efficace constant ( ~ feeding layer)1488 ccc heff = 600.1489 C Utilisation de la hauteur hw1490 cc heff = 0.7*hw1491 heff(i) = hw(i)1492 1493 FIP(i) = 0.5*rho(i,ktopw(i))*Cstar2(i)**3*heff(i)*2*1494 $ sqrt(sigmaw(i)*wdens*3.14)1495 FIP(i) = alpk * FIP(i)1496 Cjyg21497 ELSE1498 FIP(i) = 0.1499 ENDIF1500 ENDIF1501 ENDDO1502 c1503 C Limitation de sigmaw1504 c1505 C sécurité : si le wake occuppe plus de 90 % de la surface de la maille,1506 C alors il disparait en se mélangeant à la partie undisturbed1507 c1508 sigmaw_max = 0.91509 DO k = 1,klev1510 DO i=1, klon1511 c correction NICOLAS $ ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0))) THEN1512 ! print*,'wape wape2 ktopw OK_qx_qw =',1513 ! $ wape(i),wape2(i),ktopw(i),OK_qx_qw(i)1514 IF ((sigmaw(i).GT.sigmaw_max).or.1515 $ ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0)).or.1516 $ (ktopw(i).le.2) .OR.1517 $ .not. OK_qx_qw(i)) THEN1518 cIM cf NR/JYG 251108 $ ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0))) THEN1519 ccc IF (sigmaw(i).GT.0.9) THEN1520 dtls(i,k) = 0.1521 dqls(i,k) = 0.1522 deltatw(i,k) = 0.1523 deltaqw(i,k) = 0.1524 ENDIF1525 ENDDO1526 ENDDO1527 c1528 DO i=1, klon1529 IF ( (sigmaw(i).GT.sigmaw_max).or.1530 $ ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0)).or.1531 $ (ktopw(i).le.2) .OR.1532 $ .not. OK_qx_qw(i)) THEN1533 ! correction NICOLAS $ ((wape(i).ge.wape2(i)).and.(wape2(i).le.1.0))) THEN1534 ccc IF (sigmaw(i).GT.0.9) THEN1535 wape(i) = 0.1536 cstar(i)= 0. !!corr itlmd1537 hw(i) = hwmin1538 sigmaw(i) = sigmad1539 fip(i) = 0.1540 ELSE1541 wape(i) = wape2(i)1542 cstar(i)= cstar2(i) !!corr itlmd1543 ENDIF1544 ENDDO1545 c1546 c1547 RETURN1548 END1549 1550 SUBROUTINE wake_vec_modulation(nlon,nl,wk_adv,qe,d_qe,1551 $ deltaqw,d_deltaqw,sigmaw,d_sigmaw,alpha)1552 c------------------------------------------------------1553 cDtermination du coefficient alpha tel que les tendances1554 c corriges alpha*d_G, pour toutes les grandeurs G, correspondent1555 c a une humidite positive dans la zone (x) et dans la zone (w).1556 c------------------------------------------------------1557 c1558 1559 c Input1560 REAL qe(nlon,nl),d_qe(nlon,nl)1561 REAL deltaqw(nlon,nl),d_deltaqw(nlon,nl)1562 REAL sigmaw(nlon),d_sigmaw(nlon)1563 LOGICAL wk_adv(nlon)1564 INTEGER nl,nlon1565 c Output1566 REAL alpha(nlon)1567 c Internal variables1568 REAL alpha1(nlon)1569 REAL x,a,b,c,discrim,zeta(nlon)1570 REAL epsilon1571 DATA epsilon/1.e-15/1572 c1573 DO k=1,nl1574 DO i = 1,nlon1575 IF (wk_adv(i)) THEN1576 IF ((deltaqw(i,k)+d_deltaqw(i,k)).ge.0.) then1577 zeta(i)=0.1578 ELSE1579 zeta(i)=1.1580 END IF1581 ENDIF1582 ENDDO1583 DO i = 1,nlon1584 IF (wk_adv(i)) THEN1585 x = qe(i,k)+(zeta(i)-sigmaw(i))*deltaqw(i,k)1586 $ +d_qe(i,k)+(zeta(i)-sigmaw(i))*d_deltaqw(i,k)1587 $ -d_sigmaw(i)*(deltaqw(i,k)+d_deltaqw(i,k))1588 a=-d_sigmaw(i)*d_deltaqw(i,k)1589 b=d_qe(i,k)+(zeta(i)-sigmaw(i))*d_deltaqw(i,k)1590 $ -deltaqw(i,k)*d_sigmaw(i)1591 c=qe(i,k)+(zeta(i)-sigmaw(i))*deltaqw(i,k)-epsilon1592 ! c=qe(i,k)+(zeta(i)-sigmaw(i))*deltaqw(i,k)1593 1594 discrim=b*b-4.*a*c1595 ! print*,'ZETA *********************'1596 ! print*,'zeta sigmaw ',zeta(:)1597 ! print*,'SIGMA *********************'1598 ! print*,'sigmaw ',sigmaw(:)1599 1600 ! print*,' x ************************'1601 ! print*,'x ',x1602 ! print*,' a+b ************************'1603 ! print*,'a+b ',a+b1604 1605 ! print*,'a b c delta zeta ',a,b,c,discrim1606 IF (a+b .GE. 0.) THEN1607 alpha1(i)=1.1608 ELSE1609 IF (x .GE. 0.) THEN1610 alpha1(i)=1.1611 ELSE1612 ! IF (a .GE. 0.) THEN1613 IF (a .GT. 0.) THEN1614 ! print*,'a b c delta zeta ',a,b,c,discrim,zeta(i)1615 ! print*,'-b+sqrt(discrim) ',-b+sqrt(discrim)1616 alpha1(i)=0.9*min( (2.*c)/(-b+sqrt(discrim)),1617 $ (-b+sqrt(discrim))/(2.*a) )1618 ELSE IF (a.eq.0.) THEN1619 alpha1(i)=0.9*(-c/b)1620 ELSE1621 ! print*,'a b c delta zeta ',a,b,c,discrim,zeta(i)1622 ! print*,'-b+sqrt(discrim) ',-b+sqrt(discrim)1623 alpha1(i)=0.9*max( (2.*c)/(-b+sqrt(discrim)),1624 $ (-b+sqrt(discrim))/(2.*a) )1625 ENDIF1626 ENDIF1627 ENDIF1628 ENDIF1629 ENDDO1630 ENDDO1631 c1632 DO i = 1,nlon1633 IF (wk_adv(i)) THEN1634 alpha(i) = min(alpha(i),alpha1(i))1635 ENDIF1636 ENDDO1637 c1638 return1639 end1640 1641 Subroutine WAKE_scal (p,ph,ppi,dtime,sigd_con1642 : ,te0,qe0,omgb1643 : ,dtdwn,dqdwn,amdwn,amup,dta,dqa1644 : ,wdtPBL,wdqPBL,udtPBL,udqPBL1645 o ,deltatw,deltaqw,dth,hw,sigmaw,wape,fip,gfl1646 o ,dtls,dqls1647 o ,ktopw,omgbdth,dp_omgb,wdens1648 o ,tu,qu1649 o ,dtKE,dqKE1650 o ,dtPBL,dqPBL1651 o ,omg,dp_deltomg,spread1652 o ,Cstar,d_deltat_gw1653 o ,d_deltatw2,d_deltaqw2)1654 1655 ***************************************************************1656 * *1657 * WAKE *1658 * retour a un Pupper fixe *1659 * *1660 * written by : GRANDPEIX Jean-Yves 09/03/2000 *1661 * modified by : ROEHRIG Romain 01/29/2007 *1662 ***************************************************************1663 c1664 USE dimphy1665 IMPLICIT none1666 c============================================================================1667 C1668 C1669 C But : Decrire le comportement des poches froides apparaissant dans les1670 C grands systemes convectifs, et fournir l'energie disponible pour1671 C le declenchement de nouvelles colonnes convectives.1672 C1673 C Variables d'etat : deltatw : ecart de temperature wake-undisturbed area1674 C deltaqw : ecart d'humidite wake-undisturbed area1675 C sigmaw : fraction d'aire occupee par la poche.1676 C1677 C Variable de sortie :1678 c1679 c wape : WAke Potential Energy1680 c fip : Front Incident Power (W/m2) - ALP1681 c gfl : Gust Front Length per unit area (m-1)1682 C dtls : large scale temperature tendency due to wake1683 C dqls : large scale humidity tendency due to wake1684 C hw : hauteur de la poche1685 C dp_omgb : vertical gradient of large scale omega1686 C omgbdth: flux of Delta_Theta transported by LS omega1687 C dtKE : differential heating (wake - unpertubed)1688 C dqKE : differential moistening (wake - unpertubed)1689 C omg : Delta_omg =vertical velocity diff. wake-undist. (Pa/s)1690 C dp_deltomg : vertical gradient of omg (s-1)1691 C spread : spreading term in dt_wake and dq_wake1692 C deltatw : updated temperature difference (T_w-T_u).1693 C deltaqw : updated humidity difference (q_w-q_u).1694 C sigmaw : updated wake fractional area.1695 C d_deltat_gw : delta T tendency due to GW1696 c1697 C Variables d'entree :1698 c1699 c aire : aire de la maille1700 c te0 : temperature dans l'environnement (K)1701 C qe0 : humidite dans l'environnement (kg/kg)1702 C omgb : vitesse verticale moyenne sur la maille (Pa/s)1703 C dtdwn: source de chaleur due aux descentes (K/s)1704 C dqdwn: source d'humidite due aux descentes (kg/kg/s)1705 C dta : source de chaleur due courants satures et detrain (K/s)1706 C dqa : source d'humidite due aux courants satures et detra (kg/kg/s)1707 C amdwn: flux de masse total des descentes, par unite de1708 C surface de la maille (kg/m2/s)1709 C amup : flux de masse total des ascendances, par unite de1710 C surface de la maille (kg/m2/s)1711 C p : pressions aux milieux des couches (Pa)1712 C ph : pressions aux interfaces (Pa)1713 C ppi : (p/p_0)**kapa (adim)1714 C dtime: increment temporel (s)1715 c1716 C Variables internes :1717 c1718 c rhow : masse volumique de la poche froide1719 C rho : environment density at P levels1720 C rhoh : environment density at Ph levels1721 C te : environment temperature | may change within1722 C qe : environment humidity | sub-time-stepping1723 C the : environment potential temperature1724 C thu : potential temperature in undisturbed area1725 C tu : temperature in undisturbed area1726 C qu : humidity in undisturbed area1727 C dp_omgb: vertical gradient og LS omega1728 C omgbw : wake average vertical omega1729 C dp_omgbw: vertical gradient of omgbw1730 C omgbdq : flux of Delta_q transported by LS omega1731 C dth : potential temperature diff. wake-undist.1732 C th1 : first pot. temp. for vertical advection (=thu)1733 C th2 : second pot. temp. for vertical advection (=thw)1734 C q1 : first humidity for vertical advection1735 C q2 : second humidity for vertical advection1736 C d_deltatw : terme de redistribution pour deltatw1737 C d_deltaqw : terme de redistribution pour deltaqw1738 C deltatw0 : deltatw initial1739 C deltaqw0 : deltaqw initial1740 C hw0 : hw initial1741 C sigmaw0: sigmaw initial1742 C amflux : horizontal mass flux through wake boundary1743 C wdens : number of wakes per unit area (3D) or per1744 C unit length (2D)1745 C Tgw : 1 sur la période de onde de gravité1746 c Cgw : vitesse de propagation de onde de gravité1747 c LL : distance entre 2 poches1748 1749 c-------------------------------------------------------------------------1750 c Déclaration de variables1751 c-------------------------------------------------------------------------1752 1753 #include "dimensions.h"1754 1944 cccc#include "dimphy.h" 1755 1945 #include "YOMCST.h" -
LMDZ4/trunk/libf/phylmd/write_histISCCP.h
r1045 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 IF (ok_isccp) THEN … … 77 77 . meantaucld(:,n)) 78 78 c 79 zx_tmp_fi2d(1:klon)= float(seed(1:klon,n))79 zx_tmp_fi2d(1:klon)=REAL(seed(1:klon,n)) 80 80 c 81 81 c print*,'n=',n,' write_ISCCP avant seed' -
LMDZ4/trunk/libf/phylmd/write_histmthNMC.h
r1398 r1403 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 4 IF (ok_histNMC(1)) THEN -
LMDZ4/trunk/libf/phylmd/write_histrac.h
r1279 r1403 9 9 CALL histwrite_phy(nid_tra,"phis",itau_w,pphis) 10 10 CALL histwrite_phy(nid_tra,"aire",itau_w,airephy) 11 CALL histwrite_phy(nid_tra,"zmasse",itau_w,zmasse) 11 12 12 13 !TRACEURS … … 65 66 ! DIVERS 66 67 CALL histwrite_phy(nid_tra,"pplay",itau_w,pplay) 67 CALL histwrite_phy(nid_tra," t",itau_w,t_seri)68 CALL histwrite_phy(nid_tra,"T",itau_w,t_seri) 68 69 CALL histwrite_phy(nid_tra,"mfu",itau_w,pmfu) 69 70 CALL histwrite_phy(nid_tra,"mfd",itau_w,pmfd) -
LMDZ4/trunk/libf/phylmd/yamada4.F
r938 r1403 38 38 c iflag_pbl=7 : MY 2.0.Fournier 39 39 c iflag_pbl=8 : MY 2.5 40 c iflag_pbl =9 : un test ?40 c iflag_pbl>=9 : MY 2.5 avec diffusion verticale 41 41 42 42 c....................................................................... … … 66 66 67 67 integer nlay,nlev 68 cym PARAMETER (nlay=klev)69 cym PARAMETER (nlev=klev+1)70 68 71 69 logical first … … 98 96 real fl,zzz,zl0,zq2,zn2 99 97 100 cym real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev) 101 cym s ,lyam(klon,klev),knyam(klon,klev) 102 cym s ,w2yam(klon,klev),t2yam(klon,klev) 103 real,allocatable,save,dimension(:,:) :: rino,smyam,styam,lyam, 104 s knyam,w2yam,t2yam 105 cym common/pbldiag/rino,smyam,styam,lyam,knyam,w2yam,t2yam 106 c$OMP THREADPRIVATE(rino,smyam,styam,lyam,knyam,w2yam,t2yam) 98 real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev) 99 s ,lyam(klon,klev),knyam(klon,klev) 100 s ,w2yam(klon,klev),t2yam(klon,klev) 107 101 logical,save :: firstcall=.true. 108 102 c$OMP THREADPRIVATE(firstcall) … … 119 113 120 114 if (firstcall) then 121 allocate(rino(klon,klev+1),smyam(klon,klev),styam(klon,klev))122 allocate(lyam(klon,klev),knyam(klon,klev))123 allocate(w2yam(klon,klev),t2yam(klon,klev))124 115 allocate(l0(klon)) 125 116 firstcall=.false. … … 127 118 128 119 129 if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le. 9)) then120 if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.10)) then 130 121 stop'probleme de coherence dans appel a MY' 131 122 endif … … 412 403 enddo 413 404 414 c if (iflag_pbl.ge.7..and.0.eq.1) then 415 c q2(:,1)=q2(:,2) 416 c call vdif_q2(dt,g,rconst,plev,temp,kq,q2) 417 c endif 405 ! Transport diffusif vertical de la TKE. 406 if (iflag_pbl.ge.9) then 407 ! print*,'YAMADA VDIF' 408 q2(:,1)=q2(:,2) 409 call vdif_q2(dt,g,rconst,ngrid,plev,temp,kq,q2) 410 endif 418 411 419 412 c Traitement des cas noctrunes avec l'introduction d'une longueur … … 492 485 return 493 486 end 487 SUBROUTINE vdif_q2(timestep,gravity,rconst,ngrid,plev,temp, 488 & kmy,q2) 489 use dimphy 490 IMPLICIT NONE 491 c....................................................................... 492 #include "dimensions.h" 493 cccc#include "dimphy.h" 494 c....................................................................... 495 c 496 c dt : pas de temps 497 498 real plev(klon,klev+1) 499 real temp(klon,klev) 500 real timestep 501 real gravity,rconst 502 real kstar(klon,klev+1),zz 503 real kmy(klon,klev+1) 504 real q2(klon,klev+1) 505 real deltap(klon,klev+1) 506 real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1) 507 integer ngrid 508 509 integer i,k 510 511 ! print*,'RD=',rconst 512 do k=1,klev 513 do i=1,ngrid 514 c test 515 ! print*,'i,k',i,k 516 ! print*,'temp(i,k)=',temp(i,k) 517 ! print*,'(plev(i,k)-plev(i,k+1))=',plev(i,k),plev(i,k+1) 518 zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) 519 kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz 520 s /(plev(i,k)-plev(i,k+1))*timestep 521 enddo 522 enddo 523 524 do k=2,klev 525 do i=1,ngrid 526 deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1)) 527 enddo 528 enddo 529 do i=1,ngrid 530 deltap(i,1)=0.5*(plev(i,1)-plev(i,2)) 531 deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1)) 532 denom(i,klev+1)=deltap(i,klev+1)+kstar(i,klev) 533 alpha(i,klev+1)=deltap(i,klev+1)*q2(i,klev+1)/denom(i,klev+1) 534 beta(i,klev+1)=kstar(i,klev)/denom(i,klev+1) 535 enddo 536 537 do k=klev,2,-1 538 do i=1,ngrid 539 denom(i,k)=deltap(i,k)+(1.-beta(i,k+1))* 540 s kstar(i,k)+kstar(i,k-1) 541 c correction d'un bug 10 01 2001 542 alpha(i,k)=(q2(i,k)*deltap(i,k) 543 s +kstar(i,k)*alpha(i,k+1))/denom(i,k) 544 beta(i,k)=kstar(i,k-1)/denom(i,k) 545 enddo 546 enddo 547 548 c Si on recalcule q2(1) 549 if(1.eq.0) then 550 do i=1,ngrid 551 denom(i,1)=deltap(i,1)+(1-beta(i,2))*kstar(i,1) 552 q2(i,1)=(q2(i,1)*deltap(i,1) 553 s +kstar(i,1)*alpha(i,2))/denom(i,1) 554 enddo 555 endif 556 c sinon, on peut sauter cette boucle... 557 558 do k=2,klev+1 559 do i=1,ngrid 560 q2(i,k)=alpha(i,k)+beta(i,k)*q2(i,k-1) 561 enddo 562 enddo 563 564 return 565 end 566 SUBROUTINE vdif_q2e(timestep,gravity,rconst,ngrid, 567 & plev,temp,kmy,q2) 568 use dimphy 569 IMPLICIT NONE 570 c....................................................................... 571 #include "dimensions.h" 572 cccc#include "dimphy.h" 573 c....................................................................... 574 c 575 c dt : pas de temps 576 577 real plev(klon,klev+1) 578 real temp(klon,klev) 579 real timestep 580 real gravity,rconst 581 real kstar(klon,klev+1),zz 582 real kmy(klon,klev+1) 583 real q2(klon,klev+1) 584 real deltap(klon,klev+1) 585 real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1) 586 integer ngrid 587 588 integer i,k 589 590 do k=1,klev 591 do i=1,ngrid 592 zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) 593 kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz 594 s /(plev(i,k)-plev(i,k+1))*timestep 595 enddo 596 enddo 597 598 do k=2,klev 599 do i=1,ngrid 600 deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1)) 601 enddo 602 enddo 603 do i=1,ngrid 604 deltap(i,1)=0.5*(plev(i,1)-plev(i,2)) 605 deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1)) 606 enddo 607 608 do k=klev,2,-1 609 do i=1,ngrid 610 q2(i,k)=q2(i,k)+ 611 s ( kstar(i,k)*(q2(i,k+1)-q2(i,k)) 612 s -kstar(i,k-1)*(q2(i,k)-q2(i,k-1)) ) 613 s /deltap(i,k) 614 enddo 615 enddo 616 617 do i=1,ngrid 618 q2(i,1)=q2(i,1)+ 619 s ( kstar(i,1)*(q2(i,2)-q2(i,1)) 620 s ) 621 s /deltap(i,1) 622 q2(i,klev+1)=q2(i,klev+1)+ 623 s ( 624 s -kstar(i,klev)*(q2(i,klev+1)-q2(i,klev)) ) 625 s /deltap(i,klev+1) 626 enddo 627 628 return 629 end -
LMDZ4/trunk/makegcm
r1297 r1403 49 49 ###### VERSION LMDZ.4 50 50 set INCALIB=../INCA3/config/lib 51 #set LMDGCM="`pwd`"52 #setenv LIBOGCM $LMDGCM/libo51 set LMDGCM="`pwd`" 52 setenv LIBOGCM $LMDGCM/libo 53 53 # 54 54 # 55 #setenv NCDFINC /tmpdir/fairhead/1P1bis/netcdf-3.6.1/include 56 #setenv NCDFLIB /tmpdir/fairhead/1P1bis/netcdf-3.6.1/lib 57 #setenv IOIPSLDIR /tmpdir/fairhead/IOIPSL/modipsl/lib 58 #setenv MODIPSLDIR /tmpdir/fairhead/IOIPSL/modipsl/lib 59 #setenv IOIPSLDIR /d4/fairhead/gfortran/ioispl-v2_1_9 60 #setenv MODIPSLDIR /d4/fairhead/gfortran/ioispl-v2_1_9 61 #setenv NCDFINC /d4/fairhead/gfortran/netcdf-4.0.1/include 62 #setenv NCDFLIB /d4/fairhead/gfortran/netcdf-4.0.1/lib 55 setenv IOIPSLDIR /d4/fairhead/gfortran/ioipsl_v2_1_9 56 setenv MODIPSLDIR /d4/fairhead/gfortran/ioipsl_v2_1_9 57 setenv NCDFINC /d4/fairhead/gfortran_4.4/netcdf-4.1.1/include 58 setenv NCDFLIB /d4/fairhead/gfortran_4.4/netcdf-4.1.1/lib 59 63 60 64 61 … … 1044 1041 cd $localdir 1045 1042 1043 set source_code=${code}.F 1044 if ( -f $LMDGCM/libf/dyn${dimc}d${FLAG_PARA}/${code}.F90 ) then 1045 set source_code=${code}.F90 1046 endif 1047 1046 1048 echo $make -f $LMDGCM/makefile \ 1047 1049 OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \ … … 1068 1070 MOD_SUFFIX=$mod_suffix \ 1069 1071 AR=$ar \ 1072 SOURCE=$source_code \ 1070 1073 PROG=$code 1071 1074 … … 1094 1097 MOD_SUFFIX=$mod_suffix \ 1095 1098 AR=$ar \ 1099 SOURCE=$source_code \ 1096 1100 PROG=$code 1097 1101 -
LMDZ4/trunk/orchidee.def
r524 r1403 1 #2 # $Header$3 1 # 4 2 # 5 # SECHIBA 3 # Parameter file for LMDZ4OR_v2 configuration 4 # See comments : http://forge.ipsl.jussieu.fr/orchidee/ 6 5 # 7 STOMATE_OK_CO2= FALSE6 STOMATE_OK_CO2=TRUE 8 7 # STOMATE_OK_STOMATE is not set 9 8 # STOMATE_OK_DGVM is not set 10 9 # STOMATE_WATCHOUT is not set 11 #SECHIBA_restart_in=default 12 SECHIBA_restart_in=start_sech.nc 10 SECHIBA_restart_in=default 13 11 SECHIBA_rest_out=sechiba_rest.nc 14 12 SECHIBA_reset_time=y 15 SECHIBA_reset_time is not set 13 # 16 14 OUTPUT_FILE=sechiba_out.nc 17 15 WRITE_STEP=2592000 18 SECHIBA_HISTLEVEL=10 16 SECHIBA_HISTLEVEL=5 17 # 18 SECHIBA_HISTFILE2 = FALSE 19 SECHIBA_OUTPUT_FILE2 = sechiba_out_2.nc 20 WRITE_STEP2 = 86400.0 21 SECHIBA_HISTLEVEL2 = 1 22 # 19 23 STOMATE_OUTPUT_FILE=stomate_history.nc 20 24 STOMATE_HIST_DT=10. … … 25 29 # IMPOSE_VEG is not set 26 30 VEGETATION_FILE=carteveg5km.nc 31 # VEGETATION_FILE=pft_new.nc 27 32 DIFFUCO_LEAFCI=233. 28 33 CONDVEG_SNOWA=default … … 42 47 HYDROL_DSP=default 43 48 HYDROL_QSV=0.0 49 HYDROL_OK_HDIFF=n 50 HYDROL_TAU_HDIFF=1800. 44 51 THERMOSOIL_TPRO=280. 45 52 RIVER_ROUTING=y 46 53 ROUTING_FILE=routing.nc 54 LAI_MAP=y 55 LAI_FILE=lai2D.nc 56 SECHIBA_QSINT=0.02 57 ALB_BARE_MODEL = FALSE 58 PERCENT_THROUGHFALL_PFT = 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30. 59 RVEG_PFT = .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5 60 CDRAG_FROM_GCM = .TRUE. 61 #LAND_USE=y 62 #VEGET_YEAR=0 63 #VEGET_UPDATE=1Y -
LMDZ4/trunk/physiq.def
r1279 r1403 1 #2 1 ## $Id$ 3 2 # 4 # 5 # Automatically generated make config: don t edit 6 # 7 type_ocean=force 8 # avec ou sans orchidee 9 VEGET=n 10 #type_run = AMIP, ENSP, clim 11 type_run=AMIP 12 # 13 # Controle des sorties 14 # sorties moyennees tous les jours dans histday.nc 15 OK_journe=y 16 # sorties moyennees tous les mois dans histmth.nc 17 OK_mensuel=y 18 # sorties moyennees toutes les 6 ou bien 3h dans histhf.nc 19 ok_hf=n 20 # sorties moyennees tous les pas de temps de la physique dans histins.nc 21 OK_instan=n 22 # 23 ecrit_mth=30. 24 ecrit_day=1. 25 ecrit_hf=0.25 26 # 27 #niveau de sortie "hf" lev_histhf 28 lev_histhf=4 29 #niveau de sortie "day" lev_histday 30 lev_histday=5 31 #niveau de sortie "mth" lev_histmth 32 lev_histmth=4 33 34 # parametres KE 35 if_ebil=0 36 epmax = .99 37 ok_adj_ema = n 38 iflag_clw = 1 39 # 40 # parametres nuages 41 cld_lc_lsc = 2.6e-4 42 cld_lc_con = 2.6e-4 43 cld_tau_lsc = 3600. 44 cld_tau_con = 3600. 45 ffallv_lsc = 1. 46 ffallv_con = 1. 47 coef_eva = 2.e-5 48 reevap_ice = y 49 iflag_cldcon = 3 50 iflag_pdf = 1 51 fact_cldcon = 1. 52 facttemps = 1.e-4 53 ok_newmicro = y 54 iflag_ratqs=0 55 ratqsbas = 0.005 56 ratqshaut = 0.33 57 rad_froid = 35 58 rad_chau1=12 59 rad_chau2=11 60 ksta_ter=1.e-7 61 ksta=1.e-10 62 #ok_kzmin : calcul Kzmin dans la CL de surface 63 ok_kzmin=y 64 # 65 # parametres climatique 66 R_ecc = 0.016715 67 R_peri = 102.7 68 R_incl = 23.441 69 solaire = 1365. 70 co2_ppm = 348. 71 #RCO2 = co2_ppm * 1.0e-06 * 44.011/28.97 72 #RCO2 = 348. * 1.0e-06 * 44.011/28.97 73 #RCO2 = 5.286789092164308E-04 74 #RCO2 = 425.43e-06 75 CH4_ppb = 1650. 76 #RCH4 = 1.65E-06* 16.043/28.97 77 #RCH4 = 9.137366240938903E-07 78 N2O_ppb = 306. 79 #RN2O = 306.E-09* 44.013/28.97 80 #RN2O = 4.648939592682085E-07 81 CFC11_ppt = 280. 82 #RCFC11 = 280.E-12* 137.3686/28.97 83 #RCFC11 = 1.327690990680013E-09 84 CFC12_ppt = 484. 85 #RCFC12 = 484.E-12* 120.9140/28.97 86 #RCFC12 = 2.020102726958923E-09 87 # 88 # effets direct et indirect des aerosols 89 ok_ade=n 90 ok_aie=n 91 bl95_b0=1.7 92 bl95_b1=0.2 93 # 94 # parametres simulateur ISCCP 95 #ok_isccp : y/n avec/sans simulateur ISCCP 96 ok_isccp=n 97 #top_height = 1 ou 3 98 top_height = 1 99 #overlap = 1, 2 ou 3 100 overlap = 3 101 #cdmmax 102 cdmmax = 2.5E-3 103 #cdhmax 104 cdhmax = 2.0E-3 105 # 106 #ok_regdyn : y/n calcul/non des regymes dynamiques sur regions pre-definies 107 ok_regdyn=y 108 # 109 # Flag pour la convection (1 pour LMD, 2 pour Tiedtke, 3 KE nouvelle physique, 30 KE IPCC) 110 iflag_con=30 111 # 112 # activation thermiques wake, ... 113 iflag_thermals = 0 114 nsplit_thermals =1 115 tau_thermals=1800. 116 iflag_pbl = 1 117 iflag_coupl=0 118 iflag_wake=0 119 iflag_clos=0 120 iflag_mix=1 121 qqa1=0. 122 qqa2=1. 123 ## frequence (en jours ) de l'ecriture du fichier histphy 124 ecritphy=30 3 # PARAMETRES ANCIENNEMENT DANS gcm.def 125 4 ## Cycle diurne ou non 126 5 cycle_diurne=y … … 129 8 ## Choix ou non de New oliq 130 9 new_oliq=y 10 ## Activation ou non de la parametrisation de Hines pour la strato 11 ok_hines=n 131 12 ## Orodr ou non pour l orographie 132 13 ok_orodr=y … … 136 17 ok_limitvrai=n 137 18 ## Nombre d'appels des routines de rayonnements ( par jour) 138 nbapp_rad=12 19 nbapp_rad=24 20 ## Flag pour la convection : 1 pour LMD, 2 pour Tiedtke, 3 KE(nvlle version JYG), 30 KE(version IPCC AR4), 4 KE vect 21 iflag_con=30 139 22 ## Facteur multiplication des precip convectives dans KE 140 23 cvl_corr=1.0 24 ## Facteur additif pour l'albedo 25 pmagic=0.008 26 # 27 # 28 # 29 # Parametres fichiers de sortie 30 # 31 ### type_run = type run par rapport aux fichiers et variables de sortie 32 # - type_run = CLIM/ENSP (=1) 33 # - type_run = AMIP/CFMI (=2) 34 type_run=AMIP 35 ### OK_journe= y sortir fichier journalier histday.nc, =n pas de fichier histday.nc 36 OK_journe=n 37 ### OK_mensuel= y sortir fichier mensuel histmth.nc, =n pas de fichier histmth.nc 38 OK_mensuel=y 39 ### OK_instan=y, ecrire sorties "instantannees" (chaque pas de temps de la physique) 40 OK_instan=n 41 ### OK_hf=y, ecrire sorties hautes frequence histhf.nc, =n pas de fichier histhf.nc 42 ok_hf=n 43 # 44 # Parametres niveau de sorties differents fichiers 45 # 46 ### lev_histhf=0-4, niveau de sortie fichier "histhf.nc" 47 # - lev_histhf=0 => pas de sorties histhf.nc 48 # - lev_histhf=2 => defaut 49 # - lev_histhf=3 => variables sur niveaux standards 50 # - lev_histhf=4 => histhf3d.nc champs 3d niveaux modele => fichier. histhf3d.nc 51 lev_histhf=2 52 ### lev_histday=0-5, niveau de sortie fichier "histday.nc" 53 # - lev_histday=0 => pas de sorties lev_histday.nc 54 # - lev_histday=2 => defaut 55 # - lev_histday=3 => + champs 3D => F. Lott 56 # - lev_histday=4 => + champs sous-surfaces 57 # - lev_histday=5 => + champs F. Aires 58 lev_histday=2 59 ### lev_histmth=0-4, niveau de sortie fichier "histmth.nc" 60 # - lev_histmth=0 => pas de sorties lev_histmth.nc 61 # - lev_histmth=2 => defaut 62 # - lev_histmth=3 => albedo, rugosite sous-surfaces 63 # - lev_histmth=4 => champs tendances 3d 64 lev_histmth=2 65 ### ecrit_hf = frequence ecriture fichier histhf.nc en jours 66 ecrit_hf=0.250 67 ### ecrit_day = frequence ecriture fichier histday.nc en jours 68 ecrit_day=1. 69 ### ecrit_mth = frequence ecriture fichier histmth.nc en jours 70 ecrit_mth=30 71 ### freqin_isccp = frequence input en secondes du simulateur ISCCP 72 freq_ISCCP=10800. 73 ### freqout_isccp = frequence output en jours du simulateur ISCCP 74 ecrit_ISCCP=30 75 ### niveau du diagnostique de conservation d energie 76 if_ebil=0 77 # 78 # parametres KE 79 # 80 ### epmax = Efficacite precipitation maximale 81 epmax = .999 82 ### ok_adj_ema = ?? pas utilise 83 ok_adj_ema = n 84 ### iflag_clw Flag calcul eau liquide 85 # - iflag_clw=0 : qcond_incld(i,l) = em_qcondc(l) 86 # - iflag_clw=1 : qcond_incld(i,l) = em_qcond(l) 87 # - iflag_clw=2 : eau liquide diagnostique en fonction de la Precip 88 iflag_clw = 1 89 # 90 # parametres nuages 91 # 92 ### cld_lc_lsc contenu en eau liquide des nuages large-scale (fisrtilp) 93 cld_lc_lsc = 4.16e-4 94 ### cld_lc_con contenu en eau liquide des nuages convectifs (fisrtilp) 95 cld_lc_con = 4.16e-4 96 ### cld_tau_lsc cte de temps utilisee pour eliminer l eau large-scale (fisrtilp) 97 cld_tau_lsc = 1800. 98 ### cld_tau_con cte de temps utilisee pour eliminer l eau convective (fisrtilp) 99 cld_tau_con = 1800. 100 ### ffallv_lsc cte utilisee dans calcul vitesse de chute cristaux de glace large-scale (fisrtilp) 101 ffallv_lsc = 0.5 102 ### ffallv_lsc cte utilisee dans calcul vitesse de chute cristaux de glace convectifs (fisrtilp) 103 ffallv_con = 0.5 104 ### coef_eva coef evaporation precips eau/glace (fisrtilp/fisrtilp_tr?/conlmd?) 105 coef_eva = 2.e-5 106 ### reevap_ice reevaporation de toute la precip dans la couche du dessous pour la glace (fisrtilp) 107 reevap_ice = y 108 ### iflag_cldcon flag pour calculer ratqsc=F(ratqsbas,fact_cldcon,q_seri) (physiq) 109 # - iflag_cldcon<=-1 diag. rain_Tiedtke 110 # - iflag_cldcon=1, ratqsc=ratqsbas+fact_cldcon*(q_seri(1)-q_seri(k))/q_seri(k) 111 # - iflag_cldcon=1/2, ratqs=max(ratqs,ratqsc) 112 # - iflag_cldcon=3, ratqs=ratqss 113 iflag_cldcon = 3 114 ### iflag_pdf : flag calcul distribution sous-maille de l eau et des nuages 115 # - iflag_pdf=0, version ratqs, 116 # - iflag_pdf=1, calcul eau condensee, fraction nuageuse, eau nuageuse a partir 117 # - des PDFS de Sandrine Bony 118 iflag_pdf = 1 119 ### fact_cldcon constante calcul ratqsc (voir iflag_cldcon) et proprietes nuages convectifs, clwcon0 (physiq.F) 120 fact_cldcon = 1. 121 ### facttemps= facteur de relaxation de ratqs (iflag_cldcon=1/2) et rnebcon (iflag_cldcon=3) 122 facttemps = 0. 123 ## ok_newmicro =y appel newmicro , =n appel nuage (calcul epaisseur optique et emmissivite des nuages) 124 ok_newmicro = y 125 ### iflag_ratqs=0 correspond a la version IPCC AR4 126 iflag_ratqs=0 127 ### ratqsbas ratqs en bas si iflag_cldcon=1 128 ratqsbas = 0.005 129 ### ratqshaut ratqs en haut pour ratqss "stables" 130 ratqshaut = 0.33 131 ### rad_froid rayon cristaux des nuages de glace "froids" 132 rad_froid = 35 133 ### rad_chau1 rayon goutelettes d eau chauds", en haut: k=4-klev 134 rad_chau1=12 135 ### rad_chau2 rayon goutelettes d eau chauds", en bas: k=1-3 136 rad_chau2=11 137 # 138 # Coefficient et parametres sur les drags 139 # 140 f_cdrag_ter=1. 141 f_cdrag_stable=1. 142 f_cdrag_oce=0.8 143 f_rugoro=0. 144 ### ksta_ter coef.diffusion minimale sur terre/sic/lic 145 ksta_ter=1.e-7 146 ### cdmmax = cdrag maximum pour le moment 147 cdmmax = 2.5E-3 148 ### cdhmax = cdrag maximum pour l energie 149 cdhmax = 2.0E-3 150 # 151 # Parametres "orbitaux/ ere geologique" 152 # 153 ### R_ecc = Excentricite 154 R_ecc = 0.016715 155 ### R_peri = Equinoxe 156 R_peri = 102.7 157 ### R_incl = Inclinaison 158 R_incl = 23.441 159 ### solaire = Constante solaire 160 solaire = 1361. 161 # 162 # Taux gaz a effet de serre 163 # 164 ### co2_ppm = taux CO2 en ppm 165 co2_ppm = 367. 166 ### CH4_ppb = taux CH4 en ppb 167 CH4_ppb = 1760. 168 ### N2O_ppb = taux N2O en ppb 169 N2O_ppb = 316. 170 ### CFC11_ppt = taux CFC11 en ppt 171 CFC11_ppt = 741.2 172 ### CFC12_ppt = taux CFC12 en ppt 173 CFC12_ppt = 535. 174 # 175 # Parametres effets directs/indirects des "aerosols" 176 # 177 ### ok_ade=y/n flag Aerosol direct effect 178 ok_ade=n 179 ### ok_aie=y/n flag Aerosol indirect effect 180 ok_aie=n 181 ### aer_type = Aerosol variation type : actuel / preind / scenario / annuel 182 aer_type=actuel 183 ### type of coupled aerosol =1 (default) =2 => bc only =3 => pom only =4 => seasalt only =5 => dust only =6 => all aerosol 184 flag_aerosol=6 185 ### bl95_b0 = Parameter in CDNC-maer link (Boucher&Lohmann 1995) 186 bl95_b0=1.7 187 ### bl95_b1 = Parameter in CDNC-maer link (Boucher&Lohmann 1995) 188 bl95_b1=0.2 189 # 190 # Parametre de lecture de l'ozone 191 # 192 # Allowed values are 0, 1 and 2 193 # 0: do not read an ozone climatology 194 # 1: read a single ozone climatology that will be used day and night 195 # 2: read two ozone climatologies, the average day and night climatology and the daylight climatology 196 read_climoz=0 197 # 198 # Parametres simulateur COSP (CFMIP Observational Simulator Package) 199 # 200 ### ok_cosp=y/n flag simulateur COSP 201 ok_cosp=n 202 ## freq_COSP = frequence d'appel de COSP en secondes 203 freq_COSP=10800. 204 # 205 # Parametres simulateur ISCCP 206 # 207 ### ok_isccp=y/n flag simulateur ISCCP 208 ok_isccp=n 209 ### top_height = flag choix calcul nuages par le simulateur en utilisant 210 # - les donnees IR et/ou VIS et l algorithme ISCCP-D1 211 # - top_height = 1 -> algo IR-VIS 212 # - top_height = 2 -> identique a 1, mais "ptop(ibox)=pfull(ilev)" 213 # - top_height = 3 -> algo IR 214 top_height = 1 215 ### overlap = Hypothese de Recouvrement (HR) utilisee pour le simulateur ISCCP 216 # - overlap=1 Max overlap 217 # - overlap=2 Random overlap 218 # - overlap=3 Max/Random overlap 219 overlap = 3 -
LMDZ4/trunk/run.def
r1279 r1403 1 # $Id$ 1 2 # 2 ## $Id$3 # 3 ## Fichier de configuration general 4 ## 4 5 INCLUDEDEF=physiq.def 5 6 INCLUDEDEF=gcm.def 6 7 INCLUDEDEF=orchidee.def 7 8 INCLUDEDEF=output.def 9 ## Type de calendrier utilise 10 ## valeur possible: earth_360d (defaut), earth_365d, earth_366d 11 calend=earth_360d 8 12 ## Jour de l'etat initial ( = 350 si 20 Decembre ,par expl. ,comme ici ) 9 13 dayref=1 … … 11 15 anneeref=1980 12 16 ## Nombre de jours d'integration 13 nday=1 17 nday=5 18 ## Remise a zero de la date initiale 19 raz_date=0 14 20 ## periode de sortie des variables de controle (en pas) 15 21 iconser=240 16 ## periode d'ecriture du fichier histoire (en jour) 17 iecri=1 22 ## sorties instantanees dans la dynamique (fichiers dyn_hist.nc and co.) 23 ok_dyn_ins=n 24 ## periode d'ecriture des sorties instantanees dans la dynamique 25 ## (en pas dynamiques) 26 iecri=960 27 ## sorties de valeurs moyennes dans la dynamique (fichiers dyn_hist_ave.nc and co.) 28 ok_dyn_ave=n 29 ## periode de stockage des moyennes dans la dynamique et dans dynzon 30 periodav=30 18 31 ## flag de sortie dynzon 19 32 ok_dynzon=n 20 ## periode de stockage fichier dynzon (en jour) 21 periodav=30. 22 ## Output diagnistics from the dynamics in Grads file dyn.dat 23 output_grads_dyn=n 33 ## activation du calcul d equilibrage de charge 34 adjust=n 35 ## activation du filtre fft 36 use_filtre_fft=n 37 ## niveau d'impression de controle 38 prt_level=1 39 ## 40 ## Informations sur la configuration utilisee 41 ## 42 ### type_ocean = force / slab /couple 43 type_ocean=force 44 ### version_ocean = nemo / opa8 45 version_ocean=nemo 46 ### VEGET= y si ORCHIDEE, =n si bucket 47 VEGET=n
Note: See TracChangeset
for help on using the changeset viewer.