Changeset 5186 for LMDZ6/branches/Amaury_dev/libf/dyn3d/lmdz_leapfrog.f90
- Timestamp:
- Sep 11, 2024, 6:03:07 PM (12 days ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d/lmdz_leapfrog.f90
r5185 r5186 1 ! $Id$ 2 3 4 5 SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0) 6 7 8 !IM : pour sortir les param. du modele dans un fis. netcdf 110106 9 USE IOIPSL 10 USE lmdz_infotrac, ONLY: nqtot, isoCheck 11 USE guide_mod, ONLY: guide_main 12 USE lmdz_write_field, ONLY: writefield 13 USE control_mod, ONLY: nday, day_step, planet_type, offline, & 14 iconser, iphysiq, iperiod, dissip_period, & 15 iecri, ip_ebil_dyn, ok_dynzon, ok_dyn_ins, & 16 periodav, ok_dyn_ave, output_grads_dyn 17 USE exner_hyb_m, ONLY: exner_hyb 18 USE exner_milieu_m, ONLY: exner_milieu 19 USE comvert_mod, ONLY: ap, bp, pressure_exner, presnivs 20 USE comconst_mod, ONLY: cpp, dtphys, dtvr, pi, ihf 21 USE logic_mod, ONLY: iflag_phys, ok_guide, forward, leapf, apphys, & 22 statcl, conser, apdiss, purmats, ok_strato 23 USE temps_mod, ONLY: jD_ref, jH_ref, itaufin, day_ini, day_ref, & 24 start_time, dt 25 USE lmdz_strings, ONLY: msg 26 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS 27 USE lmdz_description, ONLY: descript 28 USE lmdz_iniprint, ONLY: lunout, prt_level 29 USE lmdz_ssum_scopy, ONLY: scopy, ssum 30 USE lmdz_academic, ONLY: tetarappel, knewt_t, kfrict, knewt_g, clat4 31 USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, & 32 tetagrot, tetatemp, coefdis, vert_prof_dissip 33 USE lmdz_comgeom 34 35 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 36 USE lmdz_paramet 37 IMPLICIT NONE 38 39 ! ...... Version du 10/01/98 .......... 40 41 ! avec coordonnees verticales hybrides 42 ! avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 ) 43 44 !======================================================================= 45 46 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin 47 ! ------- 48 49 ! Objet: 50 ! ------ 51 52 ! GCM LMD nouvelle grille 53 54 !======================================================================= 55 56 ! ... Dans inigeom , nouveaux calculs pour les elongations cu , cv 57 ! et possibilite d'appeler une fonction f(y) a derivee tangente 58 ! hyperbolique a la place de la fonction a derivee sinusoidale. 59 60 ! ... Possibilite de choisir le shema pour l'advection de 61 ! q , en modifiant iadv dans traceur.def (10/02) . 62 63 ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99) 64 ! Pour Van-Leer iadv=10 65 66 !----------------------------------------------------------------------- 67 ! Declarations: 68 ! ------------- 69 70 71 72 73 REAL, INTENT(IN) :: time_0 ! not used 74 75 ! dynamical variables: 76 REAL, INTENT(INOUT) :: ucov(ip1jmp1, llm) ! zonal covariant wind 77 REAL, INTENT(INOUT) :: vcov(ip1jm, llm) ! meridional covariant wind 78 REAL, INTENT(INOUT) :: teta(ip1jmp1, llm) ! potential temperature 79 REAL, INTENT(INOUT) :: ps(ip1jmp1) ! surface pressure (Pa) 80 REAL, INTENT(INOUT) :: masse(ip1jmp1, llm) ! air mass 81 REAL, INTENT(INOUT) :: phis(ip1jmp1) ! geopotentiat at the surface 82 REAL, INTENT(INOUT) :: q(ip1jmp1, llm, nqtot) ! advected tracers 83 84 REAL :: p (ip1jmp1, llmp1) ! interlayer pressure 85 REAL :: pks(ip1jmp1) ! exner at the surface 86 REAL :: pk(ip1jmp1, llm) ! exner at mid-layer 87 REAL :: pkf(ip1jmp1, llm) ! filtered exner at mid-layer 88 REAL :: phi(ip1jmp1, llm) ! geopotential 89 REAL :: w(ip1jmp1, llm) ! vertical velocity 90 91 REAL :: zqmin, zqmax 92 93 ! variables dynamiques intermediaire pour le transport 94 REAL :: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse 95 96 ! variables dynamiques au pas -1 97 REAL :: vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm) 98 REAL :: tetam1(ip1jmp1, llm), psm1(ip1jmp1) 99 REAL :: massem1(ip1jmp1, llm) 100 101 ! tendances dynamiques 102 REAL :: dv(ip1jm, llm), du(ip1jmp1, llm) 103 REAL :: dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqtot), dp(ip1jmp1) 104 105 ! tendances de la dissipation 106 REAL :: dvdis(ip1jm, llm), dudis(ip1jmp1, llm) 107 REAL :: dtetadis(ip1jmp1, llm) 108 109 ! tendances physiques 110 REAL :: dvfi(ip1jm, llm), dufi(ip1jmp1, llm) 111 REAL :: dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqtot), dpfi(ip1jmp1) 112 113 ! variables pour le fichier histoire 114 REAL :: dtav ! intervalle de temps elementaire 115 116 REAL :: tppn(iim), tpps(iim), tpn, tps 117 118 INTEGER :: itau, itaufinp1, iav 119 ! INTEGER iday ! jour julien 120 REAL :: time 121 122 ! REAL finvmaold(ip1jmp1,llm) 123 124 !ym LOGICAL lafin 125 LOGICAL :: lafin = .FALSE. 126 INTEGER :: ij, iq, l 127 INTEGER :: ik 128 129 REAL :: time_step, t_wrt, t_ops 130 131 ! REAL rdayvrai,rdaym_ini 132 ! jD_cur: jour julien courant 133 ! jH_cur: heure julienne courante 134 REAL :: jD_cur, jH_cur 135 INTEGER :: an, mois, jour 136 REAL :: secondes 137 138 LOGICAL :: first, callinigrads 139 !IM : pour sortir les param. du modele dans un fis. netcdf 110106 140 save first 141 data first/.TRUE./ 142 REAL :: dt_cum 143 CHARACTER(LEN = 10) :: infile 144 INTEGER :: zan, tau0, thoriid 145 INTEGER :: nid_ctesGCM 146 save nid_ctesGCM 147 REAL :: degres 148 REAL :: rlong(iip1), rlatg(jjp1) 149 REAL :: zx_tmp_2d(iip1, jjp1) 150 INTEGER :: ndex2d(iip1 * jjp1) 151 LOGICAL :: ok_sync 152 parameter (ok_sync = .TRUE.) 153 LOGICAL :: physic 154 155 data callinigrads/.TRUE./ 156 CHARACTER(LEN = 10) :: string10 157 158 REAL :: flxw(ip1jmp1, llm) ! flux de masse verticale 159 160 !+jld variables test conservation energie 161 REAL :: ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm) 162 ! Tendance de la temp. potentiel d (theta)/ d t due a la 163 ! tansformation d'energie cinetique en energie thermique 164 ! cree par la dissipation 165 REAL :: dtetaecdt(ip1jmp1, llm) 166 REAL :: vcont(ip1jm, llm), ucont(ip1jmp1, llm) 167 REAL :: vnat(ip1jm, llm), unat(ip1jmp1, llm) 168 REAL :: d_h_vcol, d_qt, d_qw, d_ql, d_ec 169 CHARACTER(len = 15) :: ztit 170 !IM INTEGER ip_ebil_dyn ! PRINT level for energy conserv. diag. 171 !IM SAVE ip_ebil_dyn 172 !IM DATA ip_ebil_dyn/0/ 173 !-jld 174 175 CHARACTER(LEN = 80) :: dynhist_file, dynhistave_file 176 CHARACTER(LEN = *), parameter :: modname = "leapfrog" 177 CHARACTER(LEN = 80) :: abort_message 178 179 LOGICAL :: dissip_conservative 180 save dissip_conservative 181 data dissip_conservative/.TRUE./ 182 183 LOGICAL :: prem 184 save prem 185 DATA prem/.TRUE./ 186 INTEGER :: testita 187 PARAMETER (testita = 9) 188 189 logical, parameter :: flag_verif = .FALSE. 190 191 INTEGER :: itau_w ! pas de temps ecriture = itap + itau_phy 192 193 IF (nday>=0) THEN 194 itaufin = nday * day_step 195 else 196 itaufin = -nday 197 ENDIF 198 itaufinp1 = itaufin + 1 199 itau = 0 200 physic = .TRUE. 201 IF (iflag_phys==0.OR.iflag_phys==2) physic = .FALSE. 202 203 ! iday = day_ini+itau/day_step 204 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 205 ! IF(time.GT.1.) THEN 206 ! time = time-1. 207 ! iday = iday+1 208 ! ENDIF 209 210 211 !----------------------------------------------------------------------- 212 ! On initialise la pression et la fonction d'Exner : 213 ! -------------------------------------------------- 214 215 dq(:, :, :) = 0. 216 CALL pression (ip1jmp1, ap, bp, ps, p) 217 IF (pressure_exner) THEN 218 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 219 else 220 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 221 ENDIF 222 223 !----------------------------------------------------------------------- 224 ! Debut de l'integration temporelle: 225 ! ---------------------------------- 226 227 1 CONTINUE ! Matsuno Forward step begins here 228 229 ! date: (NB: date remains unchanged for Backward step) 230 ! ----- 231 232 jD_cur = jD_ref + day_ini - day_ref + & 233 (itau + 1) / day_step 234 jH_cur = jH_ref + start_time + & 235 mod(itau + 1, day_step) / float(day_step) 236 jD_cur = jD_cur + int(jH_cur) 237 jH_cur = jH_cur - int(jH_cur) 238 239 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 321') 240 241 IF (ok_guide) THEN 242 CALL guide_main(itau, ucov, vcov, teta, q, masse, ps) 243 ENDIF 244 245 246 247 ! IF( MOD( itau, 10* day_step ).EQ.0 ) THEN 248 ! CALL test_period ( ucov,vcov,teta,q,p,phis ) 249 ! PRINT *,' ---- Test_period apres continue OK ! -----', itau 250 ! ENDIF 251 ! 252 253 ! Save fields obtained at previous time step as '...m1' 254 CALL SCOPY(ijmllm, vcov, 1, vcovm1, 1) 255 CALL SCOPY(ijp1llm, ucov, 1, ucovm1, 1) 256 CALL SCOPY(ijp1llm, teta, 1, tetam1, 1) 257 CALL SCOPY(ijp1llm, masse, 1, massem1, 1) 258 CALL SCOPY(ip1jmp1, ps, 1, psm1, 1) 259 260 forward = .TRUE. 261 leapf = .FALSE. 262 dt = dtvr 263 264 ! ... P.Le Van .26/04/94 .... 265 ! Ehouarn: finvmaold is actually not used 266 ! CALL SCOPY ( ijp1llm, masse, 1, finvmaold, 1 ) 267 ! CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 ) 268 269 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 400') 270 271 2 CONTINUE ! Matsuno backward or leapfrog step begins here 272 273 !----------------------------------------------------------------------- 274 275 ! date: (NB: only leapfrog step requires recomputing date) 276 ! ----- 277 278 IF (leapf) THEN 1 MODULE lmdz_leapfrog 2 3 IMPLICIT NONE; PRIVATE 4 PUBLIC leapfrog 5 6 CONTAINS 7 8 SUBROUTINE leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0) 9 10 !IM : pour sortir les param. du modele dans un fis. netcdf 110106 11 USE IOIPSL 12 USE lmdz_infotrac, ONLY: nqtot, isoCheck 13 USE guide_mod, ONLY: guide_main 14 USE lmdz_write_field, ONLY: writefield 15 USE control_mod, ONLY: nday, day_step, planet_type, offline, & 16 iconser, iphysiq, iperiod, dissip_period, & 17 iecri, ip_ebil_dyn, ok_dynzon, ok_dyn_ins, & 18 periodav, ok_dyn_ave, output_grads_dyn 19 USE exner_hyb_m, ONLY: exner_hyb 20 USE exner_milieu_m, ONLY: exner_milieu 21 USE comvert_mod, ONLY: ap, bp, pressure_exner, presnivs 22 USE comconst_mod, ONLY: cpp, dtphys, dtvr, pi, ihf 23 USE logic_mod, ONLY: iflag_phys, ok_guide, forward, leapf, apphys, & 24 statcl, conser, apdiss, purmats, ok_strato 25 USE temps_mod, ONLY: jD_ref, jH_ref, itaufin, day_ini, day_ref, & 26 start_time, dt 27 USE lmdz_strings, ONLY: msg 28 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS 29 USE lmdz_description, ONLY: descript 30 USE lmdz_iniprint, ONLY: lunout, prt_level 31 USE lmdz_ssum_scopy, ONLY: scopy, ssum 32 USE lmdz_academic, ONLY: tetarappel, knewt_t, kfrict, knewt_g, clat4 33 USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, & 34 tetagrot, tetatemp, coefdis, vert_prof_dissip 35 USE lmdz_comgeom 36 37 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 38 USE lmdz_paramet 39 USE lmdz_addfi, ONLY: addfi 40 USE lmdz_caldyn, ONLY: caldyn 41 USE lmdz_caladvtrac, ONLY: caladvtrac 42 USE lmdz_bilan_dyn, ONLY: bilan_dyn 43 USE lmdz_check_isotopes, ONLY: check_isotopes_seq 44 USE lmdz_writedynav, ONLY: writedynav 45 USE lmdz_writehist, ONLY: writehist 46 USE lmdz_dissip, ONLY: dissip 47 USE lmdz_dynredem, ONLY: dynredem1 48 49 IMPLICIT NONE 50 51 ! ...... Version du 10/01/98 .......... 52 53 ! avec coordonnees verticales hybrides 54 ! avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 ) 55 56 !======================================================================= 57 58 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin 59 ! ------- 60 61 ! Objet: 62 ! ------ 63 64 ! GCM LMD nouvelle grille 65 66 !======================================================================= 67 68 ! ... Dans inigeom , nouveaux calculs pour les elongations cu , cv 69 ! et possibilite d'appeler une fonction f(y) a derivee tangente 70 ! hyperbolique a la place de la fonction a derivee sinusoidale. 71 72 ! ... Possibilite de choisir le shema pour l'advection de 73 ! q , en modifiant iadv dans traceur.def (10/02) . 74 75 ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99) 76 ! Pour Van-Leer iadv=10 77 78 !----------------------------------------------------------------------- 79 ! Declarations: 80 ! ------------- 81 82 REAL, INTENT(IN) :: time_0 ! not used 83 84 ! dynamical variables: 85 REAL, INTENT(INOUT) :: ucov(ip1jmp1, llm) ! zonal covariant wind 86 REAL, INTENT(INOUT) :: vcov(ip1jm, llm) ! meridional covariant wind 87 REAL, INTENT(INOUT) :: teta(ip1jmp1, llm) ! potential temperature 88 REAL, INTENT(INOUT) :: ps(ip1jmp1) ! surface pressure (Pa) 89 REAL, INTENT(INOUT) :: masse(ip1jmp1, llm) ! air mass 90 REAL, INTENT(INOUT) :: phis(ip1jmp1) ! geopotentiat at the surface 91 REAL, INTENT(INOUT) :: q(ip1jmp1, llm, nqtot) ! advected tracers 92 93 REAL :: p (ip1jmp1, llmp1) ! interlayer pressure 94 REAL :: pks(ip1jmp1) ! exner at the surface 95 REAL :: pk(ip1jmp1, llm) ! exner at mid-layer 96 REAL :: pkf(ip1jmp1, llm) ! filtered exner at mid-layer 97 REAL :: phi(ip1jmp1, llm) ! geopotential 98 REAL :: w(ip1jmp1, llm) ! vertical velocity 99 100 REAL :: zqmin, zqmax 101 102 ! variables dynamiques intermediaire pour le transport 103 REAL :: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse 104 105 ! variables dynamiques au pas -1 106 REAL :: vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm) 107 REAL :: tetam1(ip1jmp1, llm), psm1(ip1jmp1) 108 REAL :: massem1(ip1jmp1, llm) 109 110 ! tendances dynamiques 111 REAL :: dv(ip1jm, llm), du(ip1jmp1, llm) 112 REAL :: dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqtot), dp(ip1jmp1) 113 114 ! tendances de la dissipation 115 REAL :: dvdis(ip1jm, llm), dudis(ip1jmp1, llm) 116 REAL :: dtetadis(ip1jmp1, llm) 117 118 ! tendances physiques 119 REAL :: dvfi(ip1jm, llm), dufi(ip1jmp1, llm) 120 REAL :: dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqtot), dpfi(ip1jmp1) 121 122 ! variables pour le fichier histoire 123 REAL :: dtav ! intervalle de temps elementaire 124 125 REAL :: tppn(iim), tpps(iim), tpn, tps 126 127 INTEGER :: itau, itaufinp1, iav 128 ! INTEGER iday ! jour julien 129 REAL :: time 130 131 ! REAL finvmaold(ip1jmp1,llm) 132 133 !ym LOGICAL lafin 134 LOGICAL :: lafin = .FALSE. 135 INTEGER :: ij, iq, l 136 INTEGER :: ik 137 138 REAL :: time_step, t_wrt, t_ops 139 140 ! REAL rdayvrai,rdaym_ini 141 ! jD_cur: jour julien courant 142 ! jH_cur: heure julienne courante 143 REAL :: jD_cur, jH_cur 144 INTEGER :: an, mois, jour 145 REAL :: secondes 146 147 LOGICAL :: first, callinigrads 148 !IM : pour sortir les param. du modele dans un fis. netcdf 110106 149 save first 150 data first/.TRUE./ 151 REAL :: dt_cum 152 CHARACTER(LEN = 10) :: infile 153 INTEGER :: zan, tau0, thoriid 154 INTEGER :: nid_ctesGCM 155 save nid_ctesGCM 156 REAL :: degres 157 REAL :: rlong(iip1), rlatg(jjp1) 158 REAL :: zx_tmp_2d(iip1, jjp1) 159 INTEGER :: ndex2d(iip1 * jjp1) 160 LOGICAL :: ok_sync 161 parameter (ok_sync = .TRUE.) 162 LOGICAL :: physic 163 164 data callinigrads/.TRUE./ 165 CHARACTER(LEN = 10) :: string10 166 167 REAL :: flxw(ip1jmp1, llm) ! flux de masse verticale 168 169 !+jld variables test conservation energie 170 REAL :: ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm) 171 ! Tendance de la temp. potentiel d (theta)/ d t due a la 172 ! tansformation d'energie cinetique en energie thermique 173 ! cree par la dissipation 174 REAL :: dtetaecdt(ip1jmp1, llm) 175 REAL :: vcont(ip1jm, llm), ucont(ip1jmp1, llm) 176 REAL :: vnat(ip1jm, llm), unat(ip1jmp1, llm) 177 REAL :: d_h_vcol, d_qt, d_qw, d_ql, d_ec 178 CHARACTER(len = 15) :: ztit 179 !IM INTEGER ip_ebil_dyn ! PRINT level for energy conserv. diag. 180 !IM SAVE ip_ebil_dyn 181 !IM DATA ip_ebil_dyn/0/ 182 !-jld 183 184 CHARACTER(LEN = 80) :: dynhist_file, dynhistave_file 185 CHARACTER(LEN = *), parameter :: modname = "leapfrog" 186 CHARACTER(LEN = 80) :: abort_message 187 188 LOGICAL :: dissip_conservative 189 save dissip_conservative 190 data dissip_conservative/.TRUE./ 191 192 LOGICAL :: prem 193 save prem 194 DATA prem/.TRUE./ 195 INTEGER :: testita 196 PARAMETER (testita = 9) 197 198 logical, parameter :: flag_verif = .FALSE. 199 200 INTEGER :: itau_w ! pas de temps ecriture = itap + itau_phy 201 202 IF (nday>=0) THEN 203 itaufin = nday * day_step 204 else 205 itaufin = -nday 206 ENDIF 207 itaufinp1 = itaufin + 1 208 itau = 0 209 physic = .TRUE. 210 IF (iflag_phys==0.OR.iflag_phys==2) physic = .FALSE. 211 212 ! iday = day_ini+itau/day_step 213 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 214 ! IF(time.GT.1.) THEN 215 ! time = time-1. 216 ! iday = iday+1 217 ! ENDIF 218 219 220 !----------------------------------------------------------------------- 221 ! On initialise la pression et la fonction d'Exner : 222 ! -------------------------------------------------- 223 224 dq(:, :, :) = 0. 225 CALL pression (ip1jmp1, ap, bp, ps, p) 226 IF (pressure_exner) THEN 227 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 228 else 229 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 230 ENDIF 231 232 !----------------------------------------------------------------------- 233 ! Debut de l'integration temporelle: 234 ! ---------------------------------- 235 236 1 CONTINUE ! Matsuno Forward step begins here 237 238 ! date: (NB: date remains unchanged for Backward step) 239 ! ----- 240 279 241 jD_cur = jD_ref + day_ini - day_ref + & 280 242 (itau + 1) / day_step … … 283 245 jD_cur = jD_cur + int(jH_cur) 284 246 jH_cur = jH_cur - int(jH_cur) 285 ENDIF 286 287 288 ! gestion des appels de la physique et des dissipations: 289 ! ------------------------------------------------------ 290 291 ! ... P.Le Van ( 6/02/95 ) .... 292 293 apphys = .FALSE. 294 statcl = .FALSE. 295 conser = .FALSE. 296 apdiss = .FALSE. 297 298 IF(purmats) THEN 299 ! Purely Matsuno time stepping 300 IF(MOD(itau, iconser) ==0.AND. forward) conser = .TRUE. 301 IF(MOD(itau, dissip_period)==0.AND..NOT.forward) & 302 apdiss = .TRUE. 303 IF(MOD(itau, iphysiq)==0.AND..NOT.forward & 304 .AND. physic) apphys = .TRUE. 305 ELSE 306 ! Leapfrog/Matsuno time stepping 307 IF(MOD(itau, iconser) == 0) conser = .TRUE. 308 IF(MOD(itau + 1, dissip_period)==0 .AND. .NOT. forward) & 309 apdiss = .TRUE. 310 IF(MOD(itau + 1, iphysiq)==0.AND.physic) apphys = .TRUE. 311 END IF 312 313 ! Ehouarn: for Shallow Water case (ie: 1 vertical layer), 314 ! supress dissipation step 315 IF (llm==1) THEN 247 248 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 321') 249 250 IF (ok_guide) THEN 251 CALL guide_main(itau, ucov, vcov, teta, q, masse, ps) 252 ENDIF 253 254 255 256 ! IF( MOD( itau, 10* day_step ).EQ.0 ) THEN 257 ! CALL test_period ( ucov,vcov,teta,q,p,phis ) 258 ! PRINT *,' ---- Test_period apres continue OK ! -----', itau 259 ! ENDIF 260 ! 261 262 ! Save fields obtained at previous time step as '...m1' 263 CALL SCOPY(ijmllm, vcov, 1, vcovm1, 1) 264 CALL SCOPY(ijp1llm, ucov, 1, ucovm1, 1) 265 CALL SCOPY(ijp1llm, teta, 1, tetam1, 1) 266 CALL SCOPY(ijp1llm, masse, 1, massem1, 1) 267 CALL SCOPY(ip1jmp1, ps, 1, psm1, 1) 268 269 forward = .TRUE. 270 leapf = .FALSE. 271 dt = dtvr 272 273 ! ... P.Le Van .26/04/94 .... 274 ! Ehouarn: finvmaold is actually not used 275 ! CALL SCOPY ( ijp1llm, masse, 1, finvmaold, 1 ) 276 ! CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 ) 277 278 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 400') 279 280 2 CONTINUE ! Matsuno backward or leapfrog step begins here 281 282 !----------------------------------------------------------------------- 283 284 ! date: (NB: only leapfrog step requires recomputing date) 285 ! ----- 286 287 IF (leapf) THEN 288 jD_cur = jD_ref + day_ini - day_ref + & 289 (itau + 1) / day_step 290 jH_cur = jH_ref + start_time + & 291 mod(itau + 1, day_step) / float(day_step) 292 jD_cur = jD_cur + int(jH_cur) 293 jH_cur = jH_cur - int(jH_cur) 294 ENDIF 295 296 297 ! gestion des appels de la physique et des dissipations: 298 ! ------------------------------------------------------ 299 300 ! ... P.Le Van ( 6/02/95 ) .... 301 302 apphys = .FALSE. 303 statcl = .FALSE. 304 conser = .FALSE. 316 305 apdiss = .FALSE. 317 ENDIF 318 319 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 589') 320 321 !----------------------------------------------------------------------- 322 ! calcul des tendances dynamiques: 323 ! -------------------------------- 324 325 ! compute geopotential phi() 326 CALL geopot (ip1jmp1, teta, pk, pks, phis, phi) 327 328 time = jD_cur + jH_cur 329 CALL caldyn & 330 (itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, & 331 phi, conser, du, dv, dteta, dp, w, pbaru, pbarv, time) 332 333 334 !----------------------------------------------------------------------- 335 ! calcul des tendances advection des traceurs (dont l'humidite) 336 ! ------------------------------------------------------------- 337 338 CALL check_isotopes_seq(q, ip1jmp1, & 339 'leapfrog 686: avant caladvtrac') 340 341 IF(forward .OR. leapf) THEN 342 ! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step 343 CALL caladvtrac(q, pbaru, pbarv, & 344 p, masse, dq, teta, & 345 flxw, pk) 346 !WRITE(*,*) 'caladvtrac 346' 347 348 IF (offline) THEN 349 !maf stokage du flux de masse pour traceurs OFF-LINE 350 351 CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, & 352 dtvr, itau) 353 354 ENDIF ! of IF (offline) 355 356 ENDIF ! of IF( forward .OR. leapf ) 357 358 359 !----------------------------------------------------------------------- 360 ! integrations dynamique et traceurs: 361 ! ---------------------------------- 362 363 CALL msg('720', modname, isoCheck) 364 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 756') 365 366 CALL integrd (nqtot, vcovm1, ucovm1, tetam1, psm1, massem1, & 367 dv, du, dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis) 368 ! $ finvmaold ) 369 370 CALL msg('724', modname, isoCheck) 371 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 762') 372 373 ! .P.Le Van (26/04/94 ajout de finvpold dans l'appel d'integrd) 374 375 !----------------------------------------------------------------------- 376 ! calcul des tendances physiques: 377 ! ------------------------------- 378 ! ######## P.Le Van ( Modif le 6/02/95 ) ########### 379 380 IF(purmats) THEN 381 IF(itau==itaufin.AND..NOT.forward) lafin = .TRUE. 382 ELSE 383 IF(itau + 1 == itaufin) lafin = .TRUE. 384 ENDIF 385 386 387 IF(apphys) THEN 388 389 ! ....... Ajout P.Le Van ( 17/04/96 ) ........... 390 ! 306 307 IF(purmats) THEN 308 ! Purely Matsuno time stepping 309 IF(MOD(itau, iconser) ==0.AND. forward) conser = .TRUE. 310 IF(MOD(itau, dissip_period)==0.AND..NOT.forward) & 311 apdiss = .TRUE. 312 IF(MOD(itau, iphysiq)==0.AND..NOT.forward & 313 .AND. physic) apphys = .TRUE. 314 ELSE 315 ! Leapfrog/Matsuno time stepping 316 IF(MOD(itau, iconser) == 0) conser = .TRUE. 317 IF(MOD(itau + 1, dissip_period)==0 .AND. .NOT. forward) & 318 apdiss = .TRUE. 319 IF(MOD(itau + 1, iphysiq)==0.AND.physic) apphys = .TRUE. 320 END IF 321 322 ! Ehouarn: for Shallow Water case (ie: 1 vertical layer), 323 ! supress dissipation step 324 IF (llm==1) THEN 325 apdiss = .FALSE. 326 ENDIF 327 328 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 589') 329 330 !----------------------------------------------------------------------- 331 ! calcul des tendances dynamiques: 332 ! -------------------------------- 333 334 ! compute geopotential phi() 335 CALL geopot (ip1jmp1, teta, pk, pks, phis, phi) 336 337 time = jD_cur + jH_cur 338 CALL caldyn & 339 (itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, & 340 phi, conser, du, dv, dteta, dp, w, pbaru, pbarv, time) 341 342 343 !----------------------------------------------------------------------- 344 ! calcul des tendances advection des traceurs (dont l'humidite) 345 ! ------------------------------------------------------------- 346 347 CALL check_isotopes_seq(q, ip1jmp1, & 348 'leapfrog 686: avant caladvtrac') 349 350 IF(forward .OR. leapf) THEN 351 ! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step 352 CALL caladvtrac(q, pbaru, pbarv, & 353 p, masse, dq, teta, & 354 flxw, pk) 355 !WRITE(*,*) 'caladvtrac 346' 356 357 IF (offline) THEN 358 !maf stokage du flux de masse pour traceurs OFF-LINE 359 360 CALL fluxstokenc(pbaru, pbarv, masse, teta, phi, phis, & 361 dtvr, itau) 362 363 ENDIF ! of IF (offline) 364 365 ENDIF ! of IF( forward .OR. leapf ) 366 367 368 !----------------------------------------------------------------------- 369 ! integrations dynamique et traceurs: 370 ! ---------------------------------- 371 372 CALL msg('720', modname, isoCheck) 373 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 756') 374 375 CALL integrd (nqtot, vcovm1, ucovm1, tetam1, psm1, massem1, & 376 dv, du, dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis) 377 ! $ finvmaold ) 378 379 CALL msg('724', modname, isoCheck) 380 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 762') 381 382 ! .P.Le Van (26/04/94 ajout de finvpold dans l'appel d'integrd) 383 384 !----------------------------------------------------------------------- 385 ! calcul des tendances physiques: 386 ! ------------------------------- 387 ! ######## P.Le Van ( Modif le 6/02/95 ) ########### 388 389 IF(purmats) THEN 390 IF(itau==itaufin.AND..NOT.forward) lafin = .TRUE. 391 ELSE 392 IF(itau + 1 == itaufin) lafin = .TRUE. 393 ENDIF 394 395 IF(apphys) THEN 396 397 ! ....... Ajout P.Le Van ( 17/04/96 ) ........... 398 ! 399 400 CALL pression (ip1jmp1, ap, bp, ps, p) 401 IF (pressure_exner) THEN 402 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 403 else 404 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 405 endif 406 407 ! Appel a geopot ajoute le 2014/05/08 pour garantir la convergence numerique 408 ! avec dyn3dmem 409 CALL geopot (ip1jmp1, teta, pk, pks, phis, phi) 410 411 ! rdaym_ini = itau * dtvr / daysec 412 ! rdayvrai = rdaym_ini + day_ini 413 ! jD_cur = jD_ref + day_ini - day_ref 414 ! $ + int (itau * dtvr / daysec) 415 ! jH_cur = jH_ref + & 416 ! & (itau * dtvr / daysec - int(itau * dtvr / daysec)) 417 jD_cur = jD_ref + day_ini - day_ref + & 418 (itau + 1) / day_step 419 420 IF (planet_type =="generic") THEN 421 ! AS: we make jD_cur to be pday 422 jD_cur = int(day_ini + itau / day_step) 423 ENDIF 424 425 jH_cur = jH_ref + start_time + & 426 mod(itau + 1, day_step) / float(day_step) 427 jD_cur = jD_cur + int(jH_cur) 428 jH_cur = jH_cur - int(jH_cur) 429 ! WRITE(lunout,*)'itau, jD_cur = ', itau, jD_cur, jH_cur 430 ! CALL ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes) 431 ! WRITE(lunout,*)'current date = ',an, mois, jour, secondes 432 433 ! rajout debug 434 ! lafin = .TRUE. 435 436 437 ! Inbterface avec les routines de phylmd (phymars ... ) 438 ! ----------------------------------------------------- 439 440 !+jld 441 442 ! Diagnostique de conservation de l'energie : initialisation 443 IF (ip_ebil_dyn>=1) THEN 444 ztit = 'bil dyn' 445 ! Ehouarn: be careful, diagedyn is Earth-specific! 446 IF (planet_type=="earth") THEN 447 CALL diagedyn(ztit, 2, 1, 1, dtphys & 448 , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2)) 449 ENDIF 450 ENDIF ! of IF (ip_ebil_dyn.ge.1 ) 451 IF (CPPKEY_PHYS) THEN 452 CALL calfis(lafin, jD_cur, jH_cur, & 453 ucov, vcov, teta, q, masse, ps, p, pk, phis, phi, & 454 du, dv, dteta, dq, & 455 flxw, dufi, dvfi, dtetafi, dqfi, dpfi) 456 END IF 457 ! ajout des tendances physiques: 458 ! ------------------------------ 459 CALL addfi(dtphys, leapf, forward, & 460 ucov, vcov, teta, q, ps, & 461 dufi, dvfi, dtetafi, dqfi, dpfi) 462 ! since addfi updates ps(), also update p(), masse() and pk() 463 CALL pression (ip1jmp1, ap, bp, ps, p) 464 CALL massdair(p, masse) 465 IF (pressure_exner) THEN 466 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 467 else 468 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 469 endif 470 471 IF (ok_strato) THEN 472 CALL top_bound(vcov, ucov, teta, masse, dtphys) 473 ENDIF 474 475 476 ! Diagnostique de conservation de l'energie : difference 477 IF (ip_ebil_dyn>=1) THEN 478 ztit = 'bil phys' 479 IF (planet_type=="earth") THEN 480 CALL diagedyn(ztit, 2, 1, 1, dtphys & 481 , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2)) 482 ENDIF 483 ENDIF ! of IF (ip_ebil_dyn.ge.1 ) 484 485 ENDIF ! of IF( apphys ) 486 487 IF(iflag_phys==2) THEN ! "Newtonian" case 488 ! Academic case : Simple friction and Newtonan relaxation 489 ! ------------------------------------------------------- 490 DO l = 1, llm 491 DO ij = 1, ip1jmp1 492 teta(ij, l) = teta(ij, l) - dtvr * & 493 (teta(ij, l) - tetarappel(ij, l)) * (knewt_g + knewt_t(l) * clat4(ij)) 494 ENDDO 495 ENDDO ! of DO l=1,llm 496 497 IF (planet_type=="giant") THEN 498 ! add an intrinsic heat flux at the base of the atmosphere 499 teta(:, 1) = teta(:, 1) + dtvr * aire(:) * ihf / cpp / masse(:, 1) 500 endif 501 502 CALL friction(ucov, vcov, dtvr) 503 504 ! Sponge layer (if any) 505 IF (ok_strato) THEN 506 ! dufi(:,:)=0. 507 ! dvfi(:,:)=0. 508 ! dtetafi(:,:)=0. 509 ! dqfi(:,:,:)=0. 510 ! dpfi(:)=0. 511 ! CALL top_bound(vcov,ucov,teta,masse,dufi,dvfi,dtetafi) 512 CALL top_bound(vcov, ucov, teta, masse, dtvr) 513 ! CALL addfi( dtvr, leapf, forward , 514 ! $ ucov, vcov, teta , q ,ps , 515 ! $ dufi, dvfi, dtetafi , dqfi ,dpfi ) 516 ENDIF ! of IF (ok_strato) 517 ENDIF ! of IF (iflag_phys.EQ.2) 518 519 520 !-jld 391 521 392 522 CALL pression (ip1jmp1, ap, bp, ps, p) … … 395 525 else 396 526 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 397 endif398 399 ! Appel a geopot ajoute le 2014/05/08 pour garantir la convergence numerique400 ! avec dyn3dmem401 CALL geopot (ip1jmp1, teta, pk, pks, phis, phi)402 403 ! rdaym_ini = itau * dtvr / daysec404 ! rdayvrai = rdaym_ini + day_ini405 ! jD_cur = jD_ref + day_ini - day_ref406 ! $ + int (itau * dtvr / daysec)407 ! jH_cur = jH_ref + &408 ! & (itau * dtvr / daysec - int(itau * dtvr / daysec))409 jD_cur = jD_ref + day_ini - day_ref + &410 (itau + 1) / day_step411 412 IF (planet_type =="generic") THEN413 ! AS: we make jD_cur to be pday414 jD_cur = int(day_ini + itau / day_step)415 527 ENDIF 416 417 jH_cur = jH_ref + start_time + & 418 mod(itau + 1, day_step) / float(day_step) 419 jD_cur = jD_cur + int(jH_cur) 420 jH_cur = jH_cur - int(jH_cur) 421 ! WRITE(lunout,*)'itau, jD_cur = ', itau, jD_cur, jH_cur 422 ! CALL ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes) 423 ! WRITE(lunout,*)'current date = ',an, mois, jour, secondes 424 425 ! rajout debug 426 ! lafin = .TRUE. 427 428 429 ! Inbterface avec les routines de phylmd (phymars ... ) 430 ! ----------------------------------------------------- 431 432 !+jld 433 434 ! Diagnostique de conservation de l'energie : initialisation 435 IF (ip_ebil_dyn>=1) THEN 436 ztit = 'bil dyn' 437 ! Ehouarn: be careful, diagedyn is Earth-specific! 438 IF (planet_type=="earth") THEN 439 CALL diagedyn(ztit, 2, 1, 1, dtphys & 440 , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2)) 528 CALL massdair(p, masse) 529 530 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1196') 531 532 !----------------------------------------------------------------------- 533 ! dissipation horizontale et verticale des petites echelles: 534 ! ---------------------------------------------------------- 535 536 IF(apdiss) THEN 537 538 539 ! calcul de l'energie cinetique avant dissipation 540 CALL covcont(llm, ucov, vcov, ucont, vcont) 541 CALL enercin(vcov, ucov, vcont, ucont, ecin0) 542 543 ! dissipation 544 CALL dissip(vcov, ucov, teta, p, dvdis, dudis, dtetadis) 545 ucov = ucov + dudis 546 vcov = vcov + dvdis 547 ! teta=teta+dtetadis 548 549 550 !------------------------------------------------------------------------ 551 IF (dissip_conservative) THEN 552 ! On rajoute la tendance due a la transform. Ec -> E therm. cree 553 ! lors de la dissipation 554 CALL covcont(llm, ucov, vcov, ucont, vcont) 555 CALL enercin(vcov, ucov, vcont, ucont, ecin) 556 dtetaecdt = (ecin0 - ecin) / pk 557 ! teta=teta+dtetaecdt 558 dtetadis = dtetadis + dtetaecdt 559 endif 560 teta = teta + dtetadis 561 !------------------------------------------------------------------------ 562 563 564 ! ....... P. Le Van ( ajout le 17/04/96 ) ........... 565 ! ... Calcul de la valeur moyenne, unique de h aux poles ..... 566 ! 567 568 DO l = 1, llm 569 DO ij = 1, iim 570 tppn(ij) = aire(ij) * teta(ij, l) 571 tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l) 572 ENDDO 573 tpn = SSUM(iim, tppn, 1) / apoln 574 tps = SSUM(iim, tpps, 1) / apols 575 576 DO ij = 1, iip1 577 teta(ij, l) = tpn 578 teta(ij + ip1jm, l) = tps 579 ENDDO 580 ENDDO 581 582 IF (1 == 0) THEN 583 !!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics 584 !!! 2) should probably not be here anyway 585 !!! but are kept for those who would want to revert to previous behaviour 586 DO ij = 1, iim 587 tppn(ij) = aire(ij) * ps (ij) 588 tpps(ij) = aire(ij + ip1jm) * ps (ij + ip1jm) 589 ENDDO 590 tpn = SSUM(iim, tppn, 1) / apoln 591 tps = SSUM(iim, tpps, 1) / apols 592 593 DO ij = 1, iip1 594 ps(ij) = tpn 595 ps(ij + ip1jm) = tps 596 ENDDO 597 endif ! of if (1 == 0) 598 599 END IF ! of IF(apdiss) 600 601 ! ajout debug 602 ! IF( lafin ) THEN 603 ! abort_message = 'Simulation finished' 604 ! CALL abort_gcm(modname,abort_message,0) 605 ! ENDIF 606 607 ! ******************************************************************** 608 ! ******************************************************************** 609 ! .... fin de l'integration dynamique et physique pour le pas itau .. 610 ! ******************************************************************** 611 ! ******************************************************************** 612 613 ! preparation du pas d'integration suivant ...... 614 615 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1509') 616 617 IF (.NOT.purmats) THEN 618 ! ........................................................ 619 ! .............. schema matsuno + leapfrog .............. 620 ! ........................................................ 621 622 IF(forward .OR. leapf) THEN 623 itau = itau + 1 624 ! iday= day_ini+itau/day_step 625 ! time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 626 ! IF(time.GT.1.) THEN 627 ! time = time-1. 628 ! iday = iday+1 629 ! ENDIF 441 630 ENDIF 442 ENDIF ! of IF (ip_ebil_dyn.ge.1 ) 443 IF (CPPKEY_PHYS) THEN 444 CALL calfis(lafin, jD_cur, jH_cur, & 445 ucov, vcov, teta, q, masse, ps, p, pk, phis, phi, & 446 du, dv, dteta, dq, & 447 flxw, dufi, dvfi, dtetafi, dqfi, dpfi) 448 END IF 449 ! ajout des tendances physiques: 450 ! ------------------------------ 451 CALL addfi(dtphys, leapf, forward, & 452 ucov, vcov, teta, q, ps, & 453 dufi, dvfi, dtetafi, dqfi, dpfi) 454 ! since addfi updates ps(), also update p(), masse() and pk() 455 CALL pression (ip1jmp1, ap, bp, ps, p) 456 CALL massdair(p, masse) 457 IF (pressure_exner) THEN 458 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 459 else 460 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 461 endif 462 463 IF (ok_strato) THEN 464 CALL top_bound(vcov, ucov, teta, masse, dtphys) 465 ENDIF 466 467 468 ! Diagnostique de conservation de l'energie : difference 469 IF (ip_ebil_dyn>=1) THEN 470 ztit = 'bil phys' 471 IF (planet_type=="earth") THEN 472 CALL diagedyn(ztit, 2, 1, 1, dtphys & 473 , ucov, vcov, ps, p, pk, teta, q(:, :, 1), q(:, :, 2)) 474 ENDIF 475 ENDIF ! of IF (ip_ebil_dyn.ge.1 ) 476 477 ENDIF ! of IF( apphys ) 478 479 IF(iflag_phys==2) THEN ! "Newtonian" case 480 ! Academic case : Simple friction and Newtonan relaxation 481 ! ------------------------------------------------------- 482 DO l = 1, llm 483 DO ij = 1, ip1jmp1 484 teta(ij, l) = teta(ij, l) - dtvr * & 485 (teta(ij, l) - tetarappel(ij, l)) * (knewt_g + knewt_t(l) * clat4(ij)) 486 ENDDO 487 ENDDO ! of DO l=1,llm 488 489 IF (planet_type=="giant") THEN 490 ! add an intrinsic heat flux at the base of the atmosphere 491 teta(:, 1) = teta(:, 1) + dtvr * aire(:) * ihf / cpp / masse(:, 1) 492 endif 493 494 CALL friction(ucov, vcov, dtvr) 495 496 ! Sponge layer (if any) 497 IF (ok_strato) THEN 498 ! dufi(:,:)=0. 499 ! dvfi(:,:)=0. 500 ! dtetafi(:,:)=0. 501 ! dqfi(:,:,:)=0. 502 ! dpfi(:)=0. 503 ! CALL top_bound(vcov,ucov,teta,masse,dufi,dvfi,dtetafi) 504 CALL top_bound(vcov, ucov, teta, masse, dtvr) 505 ! CALL addfi( dtvr, leapf, forward , 506 ! $ ucov, vcov, teta , q ,ps , 507 ! $ dufi, dvfi, dtetafi , dqfi ,dpfi ) 508 ENDIF ! of IF (ok_strato) 509 ENDIF ! of IF (iflag_phys.EQ.2) 510 511 512 !-jld 513 514 CALL pression (ip1jmp1, ap, bp, ps, p) 515 IF (pressure_exner) THEN 516 CALL exner_hyb(ip1jmp1, ps, p, pks, pk, pkf) 517 else 518 CALL exner_milieu(ip1jmp1, ps, p, pks, pk, pkf) 519 ENDIF 520 CALL massdair(p, masse) 521 522 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1196') 523 524 !----------------------------------------------------------------------- 525 ! dissipation horizontale et verticale des petites echelles: 526 ! ---------------------------------------------------------- 527 528 IF(apdiss) THEN 529 530 531 ! calcul de l'energie cinetique avant dissipation 532 CALL covcont(llm, ucov, vcov, ucont, vcont) 533 CALL enercin(vcov, ucov, vcont, ucont, ecin0) 534 535 ! dissipation 536 CALL dissip(vcov, ucov, teta, p, dvdis, dudis, dtetadis) 537 ucov = ucov + dudis 538 vcov = vcov + dvdis 539 ! teta=teta+dtetadis 540 541 542 !------------------------------------------------------------------------ 543 IF (dissip_conservative) THEN 544 ! On rajoute la tendance due a la transform. Ec -> E therm. cree 545 ! lors de la dissipation 546 CALL covcont(llm, ucov, vcov, ucont, vcont) 547 CALL enercin(vcov, ucov, vcont, ucont, ecin) 548 dtetaecdt = (ecin0 - ecin) / pk 549 ! teta=teta+dtetaecdt 550 dtetadis = dtetadis + dtetaecdt 551 endif 552 teta = teta + dtetadis 553 !------------------------------------------------------------------------ 554 555 556 ! ....... P. Le Van ( ajout le 17/04/96 ) ........... 557 ! ... Calcul de la valeur moyenne, unique de h aux poles ..... 558 ! 559 560 DO l = 1, llm 561 DO ij = 1, iim 562 tppn(ij) = aire(ij) * teta(ij, l) 563 tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l) 564 ENDDO 565 tpn = SSUM(iim, tppn, 1) / apoln 566 tps = SSUM(iim, tpps, 1) / apols 567 568 DO ij = 1, iip1 569 teta(ij, l) = tpn 570 teta(ij + ip1jm, l) = tps 571 ENDDO 572 ENDDO 573 574 IF (1 == 0) THEN 575 !!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics 576 !!! 2) should probably not be here anyway 577 !!! but are kept for those who would want to revert to previous behaviour 578 DO ij = 1, iim 579 tppn(ij) = aire(ij) * ps (ij) 580 tpps(ij) = aire(ij + ip1jm) * ps (ij + ip1jm) 581 ENDDO 582 tpn = SSUM(iim, tppn, 1) / apoln 583 tps = SSUM(iim, tpps, 1) / apols 584 585 DO ij = 1, iip1 586 ps(ij) = tpn 587 ps(ij + ip1jm) = tps 588 ENDDO 589 endif ! of if (1 == 0) 590 591 END IF ! of IF(apdiss) 592 593 ! ajout debug 594 ! IF( lafin ) THEN 595 ! abort_message = 'Simulation finished' 596 ! CALL abort_gcm(modname,abort_message,0) 597 ! ENDIF 598 599 ! ******************************************************************** 600 ! ******************************************************************** 601 ! .... fin de l'integration dynamique et physique pour le pas itau .. 602 ! ******************************************************************** 603 ! ******************************************************************** 604 605 ! preparation du pas d'integration suivant ...... 606 607 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1509') 608 609 IF (.NOT.purmats) THEN 610 ! ........................................................ 611 ! .............. schema matsuno + leapfrog .............. 612 ! ........................................................ 613 614 IF(forward .OR. leapf) THEN 615 itau = itau + 1 616 ! iday= day_ini+itau/day_step 617 ! time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 618 ! IF(time.GT.1.) THEN 619 ! time = time-1. 620 ! iday = iday+1 621 ! ENDIF 622 ENDIF 623 624 IF(itau == itaufinp1) THEN 625 IF (flag_verif) THEN 626 WRITE(79, *) 'ucov', ucov 627 WRITE(80, *) 'vcov', vcov 628 WRITE(81, *) 'teta', teta 629 WRITE(82, *) 'ps', ps 630 WRITE(83, *) 'q', q 631 WRITE(85, *) 'q1 = ', q(:, :, 1) 632 WRITE(86, *) 'q3 = ', q(:, :, 3) 633 endif 634 635 abort_message = 'Simulation finished' 636 637 CALL abort_gcm(modname, abort_message, 0) 638 ENDIF 639 !----------------------------------------------------------------------- 640 ! ecriture du fichier histoire moyenne: 641 ! ------------------------------------- 642 643 IF(MOD(itau, iperiod)==0 .OR. itau==itaufin) THEN 644 IF(itau==itaufin) THEN 645 iav = 1 646 ELSE 647 iav = 0 648 ENDIF 649 650 ! Ehouarn: re-compute geopotential for outputs 651 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 652 653 IF (ok_dynzon) THEN 654 CALL bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, & 655 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q) 656 END IF 657 IF (ok_dyn_ave) THEN 658 CALL writedynav(itau, vcov, & 659 ucov, teta, pk, phi, q, masse, ps, phis) 660 ENDIF 661 662 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 663 664 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1584') 665 666 !----------------------------------------------------------------------- 667 ! ecriture de la bande histoire: 668 ! ------------------------------ 669 670 IF(MOD(itau, iecri)==0) THEN 671 ! ! Ehouarn: output only during LF or Backward Matsuno 672 IF (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) THEN 673 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 674 unat = 0. 675 DO l = 1, llm 676 unat(iip2:ip1jm, l) = ucov(iip2:ip1jm, l) / cu(iip2:ip1jm) 677 vnat(:, l) = vcov(:, l) / cv(:) 678 enddo 679 IF (ok_dyn_ins) THEN 680 ! WRITE(lunout,*) "leapfrog: CALL writehist, itau=",itau 681 CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps, phis) 682 ! CALL WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/))) 683 ! CALL WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/))) 684 ! CALL WriteField('teta',reshape(teta,(/iip1,jmp1,llm/))) 685 ! CALL WriteField('ps',reshape(ps,(/iip1,jmp1/))) 686 ! CALL WriteField('masse',reshape(masse,(/iip1,jmp1,llm/))) 687 endif ! of if (ok_dyn_ins) 688 ! For some Grads outputs of fields 689 IF (output_grads_dyn) THEN 690 INCLUDE "write_grads_dyn.h" 631 632 IF(itau == itaufinp1) THEN 633 IF (flag_verif) THEN 634 WRITE(79, *) 'ucov', ucov 635 WRITE(80, *) 'vcov', vcov 636 WRITE(81, *) 'teta', teta 637 WRITE(82, *) 'ps', ps 638 WRITE(83, *) 'q', q 639 WRITE(85, *) 'q1 = ', q(:, :, 1) 640 WRITE(86, *) 'q3 = ', q(:, :, 3) 691 641 endif 692 endif ! of if (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) 693 ENDIF ! of IF(MOD(itau,iecri).EQ.0) 694 695 IF(itau==itaufin) THEN 696 697 698 ! if (planet_type.EQ."earth") THEN 699 ! Write an Earth-format restart file 700 CALL dynredem1("restart.nc", start_time, & 701 vcov, ucov, teta, q, masse, ps) 702 ! END IF ! of if (planet_type.EQ."earth") 703 704 CLOSE(99) 705 IF (ok_guide) THEN 706 ! ! set ok_guide to false to avoid extra output 707 ! ! in following forward step 708 ok_guide = .FALSE. 709 endif 710 ! !!! Ehouarn: Why not stop here and now? 711 ENDIF ! of IF (itau.EQ.itaufin) 712 713 !----------------------------------------------------------------------- 714 ! gestion de l'integration temporelle: 715 ! ------------------------------------ 716 717 IF(MOD(itau, iperiod)==0) THEN 718 GO TO 1 719 ELSE IF (MOD(itau - 1, iperiod) == 0) THEN 720 721 IF(forward) THEN 722 ! fin du pas forward et debut du pas backward 723 724 forward = .FALSE. 725 leapf = .FALSE. 726 GO TO 2 727 728 ELSE 729 ! fin du pas backward et debut du premier pas leapfrog 730 731 leapf = .TRUE. 732 dt = 2. * dtvr 733 GO TO 2 734 END IF ! of IF (forward) 735 ELSE 736 737 ! ...... pas leapfrog ..... 738 739 leapf = .TRUE. 740 dt = 2. * dtvr 741 GO TO 2 742 END IF ! of IF (MOD(itau,iperiod).EQ.0) 743 ! ! ELSEIF (MOD(itau-1,iperiod).EQ.0) 744 745 ELSE ! of IF (.NOT.purmats) 746 747 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1664') 748 749 ! ........................................................ 750 ! .............. schema matsuno ............... 751 ! ........................................................ 752 IF(forward) THEN 753 754 itau = itau + 1 755 ! iday = day_ini+itau/day_step 756 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 757 758 ! IF(time.GT.1.) THEN 759 ! time = time-1. 760 ! iday = iday+1 761 ! ENDIF 762 763 forward = .FALSE. 764 IF(itau == itaufinp1) THEN 642 765 643 abort_message = 'Simulation finished' 644 766 645 CALL abort_gcm(modname, abort_message, 0) 767 646 ENDIF 768 GO TO 2 769 770 ELSE ! of IF(forward) i.e. backward step 771 772 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1698') 647 !----------------------------------------------------------------------- 648 ! ecriture du fichier histoire moyenne: 649 ! ------------------------------------- 773 650 774 651 IF(MOD(itau, iperiod)==0 .OR. itau==itaufin) THEN … … 779 656 ENDIF 780 657 781 ! !Ehouarn: re-compute geopotential for outputs658 ! Ehouarn: re-compute geopotential for outputs 782 659 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 783 660 … … 785 662 CALL bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, & 786 663 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q) 787 END IF664 END IF 788 665 IF (ok_dyn_ave) THEN 789 666 CALL writedynav(itau, vcov, & … … 791 668 ENDIF 792 669 793 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) 670 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 671 672 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1584') 673 674 !----------------------------------------------------------------------- 675 ! ecriture de la bande histoire: 676 ! ------------------------------ 794 677 795 678 IF(MOD(itau, iecri)==0) THEN 796 ! IF(MOD(itau,iecri*day_step).EQ.0) THEN 797 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 798 unat = 0. 799 DO l = 1, llm 800 unat(iip2:ip1jm, l) = ucov(iip2:ip1jm, l) / cu(iip2:ip1jm) 801 vnat(:, l) = vcov(:, l) / cv(:) 802 enddo 803 IF (ok_dyn_ins) THEN 804 ! WRITE(lunout,*) "leapfrog: CALL writehist (b)", 805 ! & itau,iecri 806 CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps, phis) 807 endif ! of if (ok_dyn_ins) 808 ! For some Grads outputs 809 IF (output_grads_dyn) THEN 810 INCLUDE "write_grads_dyn.h" 811 endif 812 813 ENDIF ! of IF(MOD(itau,iecri ).EQ.0) 679 ! ! Ehouarn: output only during LF or Backward Matsuno 680 IF (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) THEN 681 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 682 unat = 0. 683 DO l = 1, llm 684 unat(iip2:ip1jm, l) = ucov(iip2:ip1jm, l) / cu(iip2:ip1jm) 685 vnat(:, l) = vcov(:, l) / cv(:) 686 enddo 687 IF (ok_dyn_ins) THEN 688 ! WRITE(lunout,*) "leapfrog: CALL writehist, itau=",itau 689 CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps, phis) 690 ! CALL WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/))) 691 ! CALL WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/))) 692 ! CALL WriteField('teta',reshape(teta,(/iip1,jmp1,llm/))) 693 ! CALL WriteField('ps',reshape(ps,(/iip1,jmp1/))) 694 ! CALL WriteField('masse',reshape(masse,(/iip1,jmp1,llm/))) 695 endif ! of if (ok_dyn_ins) 696 ! For some Grads outputs of fields 697 IF (output_grads_dyn) THEN 698 INCLUDE "write_grads_dyn.h" 699 endif 700 endif ! of if (leapf.OR.(.NOT.leapf.AND.(.NOT.forward))) 701 ENDIF ! of IF(MOD(itau,iecri).EQ.0) 814 702 815 703 IF(itau==itaufin) THEN 704 705 816 706 ! if (planet_type.EQ."earth") THEN 707 ! Write an Earth-format restart file 817 708 CALL dynredem1("restart.nc", start_time, & 818 709 vcov, ucov, teta, q, masse, ps) 819 710 ! END IF ! of if (planet_type.EQ."earth") 711 712 CLOSE(99) 820 713 IF (ok_guide) THEN 821 714 ! ! set ok_guide to false to avoid extra output … … 823 716 ok_guide = .FALSE. 824 717 endif 825 ENDIF ! of IF(itau.EQ.itaufin) 826 827 forward = .TRUE. 828 GO TO 1 829 830 ENDIF ! of IF (forward) 831 832 END IF ! of IF(.NOT.purmats) 833 834 END SUBROUTINE leapfrog 718 ! !!! Ehouarn: Why not stop here and now? 719 ENDIF ! of IF (itau.EQ.itaufin) 720 721 !----------------------------------------------------------------------- 722 ! gestion de l'integration temporelle: 723 ! ------------------------------------ 724 725 IF(MOD(itau, iperiod)==0) THEN 726 GO TO 1 727 ELSE IF (MOD(itau - 1, iperiod) == 0) THEN 728 729 IF(forward) THEN 730 ! fin du pas forward et debut du pas backward 731 732 forward = .FALSE. 733 leapf = .FALSE. 734 GO TO 2 735 736 ELSE 737 ! fin du pas backward et debut du premier pas leapfrog 738 739 leapf = .TRUE. 740 dt = 2. * dtvr 741 GO TO 2 742 END IF ! of IF (forward) 743 ELSE 744 745 ! ...... pas leapfrog ..... 746 747 leapf = .TRUE. 748 dt = 2. * dtvr 749 GO TO 2 750 END IF ! of IF (MOD(itau,iperiod).EQ.0) 751 ! ! ELSEIF (MOD(itau-1,iperiod).EQ.0) 752 753 ELSE ! of IF (.NOT.purmats) 754 755 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1664') 756 757 ! ........................................................ 758 ! .............. schema matsuno ............... 759 ! ........................................................ 760 IF(forward) THEN 761 762 itau = itau + 1 763 ! iday = day_ini+itau/day_step 764 ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0 765 766 ! IF(time.GT.1.) THEN 767 ! time = time-1. 768 ! iday = iday+1 769 ! ENDIF 770 771 forward = .FALSE. 772 IF(itau == itaufinp1) THEN 773 abort_message = 'Simulation finished' 774 CALL abort_gcm(modname, abort_message, 0) 775 ENDIF 776 GO TO 2 777 778 ELSE ! of IF(forward) i.e. backward step 779 780 CALL check_isotopes_seq(q, ip1jmp1, 'leapfrog 1698') 781 782 IF(MOD(itau, iperiod)==0 .OR. itau==itaufin) THEN 783 IF(itau==itaufin) THEN 784 iav = 1 785 ELSE 786 iav = 0 787 ENDIF 788 789 ! ! Ehouarn: re-compute geopotential for outputs 790 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 791 792 IF (ok_dynzon) THEN 793 CALL bilan_dyn(2, dtvr * iperiod, dtvr * day_step * periodav, & 794 ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q) 795 ENDIF 796 IF (ok_dyn_ave) THEN 797 CALL writedynav(itau, vcov, & 798 ucov, teta, pk, phi, q, masse, ps, phis) 799 ENDIF 800 801 ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) 802 803 IF(MOD(itau, iecri)==0) THEN 804 ! IF(MOD(itau,iecri*day_step).EQ.0) THEN 805 CALL geopot(ip1jmp1, teta, pk, pks, phis, phi) 806 unat = 0. 807 DO l = 1, llm 808 unat(iip2:ip1jm, l) = ucov(iip2:ip1jm, l) / cu(iip2:ip1jm) 809 vnat(:, l) = vcov(:, l) / cv(:) 810 enddo 811 IF (ok_dyn_ins) THEN 812 ! WRITE(lunout,*) "leapfrog: CALL writehist (b)", 813 ! & itau,iecri 814 CALL writehist(itau, vcov, ucov, teta, phi, q, masse, ps, phis) 815 endif ! of if (ok_dyn_ins) 816 ! For some Grads outputs 817 IF (output_grads_dyn) THEN 818 INCLUDE "write_grads_dyn.h" 819 endif 820 821 ENDIF ! of IF(MOD(itau,iecri ).EQ.0) 822 823 IF(itau==itaufin) THEN 824 ! if (planet_type.EQ."earth") THEN 825 CALL dynredem1("restart.nc", start_time, & 826 vcov, ucov, teta, q, masse, ps) 827 ! END IF ! of if (planet_type.EQ."earth") 828 IF (ok_guide) THEN 829 ! ! set ok_guide to false to avoid extra output 830 ! ! in following forward step 831 ok_guide = .FALSE. 832 endif 833 ENDIF ! of IF(itau.EQ.itaufin) 834 835 forward = .TRUE. 836 GO TO 1 837 838 ENDIF ! of IF (forward) 839 840 END IF ! of IF(.NOT.purmats) 841 842 END SUBROUTINE leapfrog 843 844 END MODULE lmdz_leapfrog
Note: See TracChangeset
for help on using the changeset viewer.