Changeset 1279 for LMDZ4/trunk/libf/phylmd/physiq.F
- Timestamp:
- Dec 10, 2009, 10:02:56 AM (14 years ago)
- Location:
- LMDZ4/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk
- Property svn:mergeinfo changed
/LMDZ4/branches/LMDZ4-dev merged: 1150-1162,1164-1193,1195-1231,1234-1235,1237-1240,1242-1274,1276
- Property svn:mergeinfo changed
-
LMDZ4/trunk/libf/phylmd/physiq.F
r1149 r1279 1 c 1 ! $Id$ 2 ! 2 3 c#define IO_DEBUG 3 4 4 5 SUBROUTINE physiq (nlon,nlev, 5 . debut,lafin, rjourvrai,gmtime,pdtphys,6 . debut,lafin,jD_cur, jH_cur,pdtphys, 6 7 . paprs,pplay,pphi,pphis,presnivs,clesphy0, 7 8 . u,v,t,qx, … … 11 12 . , PVteta) 12 13 13 USE ioipsl 14 USE ioipsl, only: histbeg, histvert, histdef, histend, histsync, 15 $ histwrite, ju2ymds, ymds2ju, ioget_year_len 14 16 USE comgeomphy 17 USE phys_cal_mod 15 18 USE write_field_phy 16 19 USE dimphy … … 28 31 USE fonte_neige_mod, ONLY : fonte_neige_get_vars 29 32 USE phys_output_mod 33 use open_climoz_m, only: open_climoz ! ozone climatology from a file 34 use regr_pr_av_m, only: regr_pr_av 35 use netcdf95, only: nf95_close 36 use mod_phys_lmdz_mpi_data, only: is_mpi_root 37 USE aero_mod 38 use ozonecm_m, only: ozonecm ! ozone of J.-F. Royer 39 use conf_phys_m, only: conf_phys 40 use radlwsw_m, only: radlwsw 30 41 31 42 IMPLICIT none … … 50 61 c 51 62 c nlon----input-I-nombre de points horizontaux 52 c nlev----input-I-nombre de couches verticales 63 c nlev----input-I-nombre de couches verticales, doit etre egale a klev 53 64 c debut---input-L-variable logique indiquant le premier passage 54 65 c lafin---input-L-variable logique indiquant le dernier passage 55 c rjour---input-R-numero du jour de l'experience56 c gmtime--input-R-temps universel dans la journee (0 a 86400 s)66 c jD_cur -R-jour courant a l'appel de la physique (jour julien) 67 c jH_cur -R-heure courante a l'appel de la physique (jour julien) 57 68 c pdtphys-input-R-pas d'integration pour la physique (seconde) 58 69 c paprs---input-R-pression pour chaque inter-couche (en Pa) … … 104 115 PARAMETER (ok_stratus=.FALSE.) 105 116 c====================================================================== 106 LOGICAL, SAVE :: rnpb=.TRUE.107 c$OMP THREADPRIVATE(rnpb)108 117 REAL amn, amx 109 118 INTEGER igout … … 181 190 INTEGER nlon 182 191 INTEGER nlev 183 REAL rjourvrai184 REAL gmtime 192 REAL, intent(in):: jD_cur, jH_cur 193 185 194 REAL pdtphys 186 195 LOGICAL debut, lafin … … 279 288 real T2STD(klon,nlevSTD) 280 289 c 281 #include "radepsi.h"282 290 #include "radopt.h" 283 291 c … … 523 531 REAL clesphy0( longcles ) 524 532 c 525 c Variables quasi-arguments526 c527 REAL xjour528 SAVE xjour529 c$OMP THREADPRIVATE(xjour)530 c531 c532 533 c Variables propres a la physique 533 c534 c INTEGER radpas535 c SAVE radpas ! frequence d'appel rayonnement536 ccccccccc$OMP THREADPRIVATE(radpas)537 c538 cc INTEGER iflag_con539 c540 534 INTEGER itap 541 535 SAVE itap ! compteur pour la physique … … 705 699 c Conditions aux limites 706 700 c 707 INTEGER julien 701 ! 702 REAL :: day_since_equinox 703 ! Date de l'equinoxe de printemps 704 INTEGER, parameter :: mth_eq=3, day_eq=21 705 REAL :: jD_eq 706 707 LOGICAL, parameter :: new_orbit = .true. 708 708 709 c 709 710 INTEGER lmt_pas 710 711 SAVE lmt_pas ! frequence de mise a jour 711 712 c$OMP THREADPRIVATE(lmt_pas) 713 real zmasse(klon, llm) 714 C (column-density of mass of air in a cell, in kg m-2) 715 real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2 712 716 713 717 cIM sorties … … 731 735 EXTERNAL hgardfou ! verifier les temperatures 732 736 EXTERNAL nuage ! calculer les proprietes radiatives 733 EXTERNAL o3cm ! initialiser l'ozone737 CC EXTERNAL o3cm ! initialiser l'ozone 734 738 EXTERNAL orbite ! calculer l'orbite terrestre 735 EXTERNAL ozonecm ! prescrire l'ozone736 739 EXTERNAL phyetat0 ! lire l'etat initial de la physique 737 740 EXTERNAL phyredem ! ecrire l'etat de redemarrage de la physique 738 EXTERNAL radlwsw ! rayonnements solaire et infrarouge739 741 EXTERNAL suphel ! initialiser certaines constantes 740 742 EXTERNAL transp ! transport total de l'eau et de l'energie … … 877 879 c 878 880 REAL ratqss(klon,klev),ratqsc(klon,klev) 879 real ratqsbas,ratqshaut 880 save ratqsbas,ratqshaut 881 c$OMP THREADPRIVATE(ratqsbas,ratqshaut )881 real ratqsbas,ratqshaut,tau_ratqs 882 save ratqsbas,ratqshaut,tau_ratqs 883 c$OMP THREADPRIVATE(ratqsbas,ratqshaut,tau_ratqs) 882 884 real zpt_conv(klon,klev) 883 885 … … 887 889 logical ok_newmicro 888 890 save ok_newmicro 891 real ref_liq(klon,klev), ref_ice(klon,klev) 889 892 c$OMP THREADPRIVATE(ok_newmicro) 890 893 save fact_cldcon,facttemps … … 972 975 REAL zx_tmp_fiNC(klon,nlevSTD) 973 976 c#endif 974 REAL *8zx_tmp2_fi3d(klon,klev) ! variable temporaire pour champs 3D977 REAL(KIND=8) zx_tmp2_fi3d(klon,klev) ! variable temporaire pour champs 3D 975 978 REAL zx_tmp_2d(iim,jjmp1), zx_tmp_3d(iim,jjmp1,klev) 976 979 REAL zx_lon(iim,jjmp1), zx_lat(iim,jjmp1) … … 1056 1059 CHARACTER*40 t2mincels, t2maxcels !t2m min., t2m max 1057 1060 CHARACTER*40 tinst, tave, typeval 1058 cjq Aerosol effects (Johannes Quaas, 27/11/2003)1059 REAL sulfate(klon, klev) ! SO4 aerosol concentration [ug/m3]1060 1061 1061 REAL cldtaupi(klon,klev) ! Cloud optical thickness for pre-industrial (pi) aerosols 1062 1062 … … 1067 1067 1068 1068 ! Aerosol optical properties 1069 1070 ! Aerosol optical properties by INCA model 1071 CHARACTER*4 :: rfname(9) 1072 REAL aerindex(klon) ! POLDER aerosol index 1073 1069 CHARACTER*4, DIMENSION(naero_grp) :: rfname 1070 REAL, DIMENSION(klon) :: aerindex ! POLDER aerosol index 1071 REAL, DIMENSION(klon,klev) :: mass_solu_aero ! total mass concentration for all soluble aerosols[ug/m3] 1072 REAL, DIMENSION(klon,klev) :: mass_solu_aero_pi ! - " - (pre-industrial value) 1073 INTEGER :: naero ! aerosol species 1074 1074 1075 ! Parameters 1075 1076 LOGICAL ok_ade, ok_aie ! Apply aerosol (in)direct effects or not … … 1080 1081 ! false : lecture des aerosol dans un fichier 1081 1082 c$OMP THREADPRIVATE(aerosol_couple) 1082 1083 INTEGER, SAVE :: flag_aerosol 1084 c$OMP THREADPRIVATE(flag_aerosol) 1085 LOGICAL, SAVE :: new_aod 1086 c$OMP THREADPRIVATE(new_aod) 1087 1083 1088 c 1084 1089 c Declaration des constantes et des fonctions thermodynamiques … … 1086 1091 LOGICAL,SAVE :: first=.true. 1087 1092 c$OMP THREADPRIVATE(first) 1093 1094 integer iunit 1095 1096 integer, save:: read_climoz ! read ozone climatology 1097 C Allowed values are 0, 1 and 2 1098 C 0: do not read an ozone climatology 1099 C 1: read a single ozone climatology that will be used day and night 1100 C 2: read two ozone climatologies, the average day and night 1101 C climatology and the daylight climatology 1102 1103 integer, save:: ncid_climoz ! NetCDF file containing ozone climatologies 1104 1105 real, pointer, save:: press_climoz(:) 1106 ! edges of pressure intervals for ozone climatologies, in Pa, in strictly 1107 ! ascending order 1108 1109 integer, save:: co3i = 0 1110 ! time index in NetCDF file of current ozone fields 1111 c$OMP THREADPRIVATE(co3i) 1112 1113 integer ro3i 1114 ! required time index in NetCDF file for the ozone fields, between 1 1115 ! and 360 1116 1088 1117 #include "YOMCST.h" 1089 1118 #include "YOETHF.h" … … 1096 1125 cIM 100106 END : pouvoir sortir les ctes de la physique 1097 1126 c 1127 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1128 c Declarations pour Simulateur COSP 1129 c============================================================ 1130 real :: mr_ozone(klon,klev) 1098 1131 c====================================================================== 1099 1132 ! Ecriture eventuelle d'un profil verticale en entree de la physique. … … 1106 1139 write(lunout,*) 'DEBUT DE PHYSIQ !!!!!!!!!!!!!!!!!!!!' 1107 1140 write(lunout,*) 1108 s 'nlon, nlev,nqtot,debut,lafin,rjourvrai,gmtime,pdtphys'1141 s 'nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys' 1109 1142 write(lunout,*) 1110 s nlon, nlev,nqtot,debut,lafin,rjourvrai,gmtime,pdtphys1111 1112 write(lunout,*) 'pap ers, play, phi, u, v, t, omega'1113 do k=1, nlev1143 s nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys 1144 1145 write(lunout,*) 'paprs, play, phi, u, v, t' 1146 do k=1,klev 1114 1147 write(lunout,*) paprs(igout,k),pplay(igout,k),pphi(igout,k), 1115 s u(igout,k),v(igout,k),t(igout,k) ,omega(igout,k)1148 s u(igout,k),v(igout,k),t(igout,k) 1116 1149 enddo 1117 1150 write(lunout,*) 'ovap (g/kg), oliq (g/kg)' 1118 do k=1, nlev1151 do k=1,klev 1119 1152 write(lunout,*) qx(igout,k,1)*1000,qx(igout,k,2)*1000. 1120 1153 enddo … … 1132 1165 1133 1166 torsfc=0. 1167 forall (k=1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg 1134 1168 1135 1169 if (first) then … … 1140 1174 print*, 'Allocation des variables locales et sauvegardees' 1141 1175 call phys_local_var_init 1142 call phys_state_var_init 1176 c appel a la lecture du run.def physique 1177 call conf_phys(ok_journe, ok_mensuel, 1178 . ok_instan, ok_hf, 1179 . ok_LES, 1180 . solarlong0,seuil_inversion, 1181 . fact_cldcon, facttemps,ok_newmicro,iflag_radia, 1182 . iflag_cldcon,iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs, 1183 . ok_ade, ok_aie, aerosol_couple, 1184 . flag_aerosol, new_aod, 1185 . bl95_b0, bl95_b1, 1186 . iflag_thermals,nsplit_thermals,tau_thermals, 1187 . iflag_thermals_ed,iflag_thermals_optflux, 1188 c nv flags pour la convection et les poches froides 1189 . iflag_coupl,iflag_clos,iflag_wake, read_climoz) 1190 call phys_state_var_init(read_climoz) 1143 1191 print*, '=================================================' 1144 1192 … … 1156 1204 first=.false. 1157 1205 1158 endif ! fi srt1206 endif ! first 1159 1207 1160 1208 modname = 'physiq' … … 1175 1223 1176 1224 c====================================================================== 1177 xjour = rjourvrai 1225 ! Gestion calendrier : mise a jour du module phys_cal_mod 1226 ! 1227 CALL phys_cal_update(jD_cur,jH_cur) 1228 1178 1229 c 1179 1230 c Si c'est le debut, il faut initialiser plusieurs choses … … 1181 1232 c 1182 1233 IF (debut) THEN 1183 C1184 1234 !rv 1185 1235 cCRinitialisation de wght_th et lalim_conv pour la definition de la couche alimentation … … 1190 1240 u10m(:,:)=0. 1191 1241 v10m(:,:)=0. 1192 piz_ae(:,:,:)=0.1193 tau_ae(:,:,:)=0.1194 cg_ae(:,:,:)=0.1195 1242 rain_con(:)=0. 1196 1243 snow_con(:)=0. 1197 bl95_b0=0.1198 bl95_b1=0.1199 1244 topswai(:)=0. 1200 1245 topswad(:)=0. … … 1205 1250 wmax_th(:)=0. 1206 1251 tau_overturning_th(:)=0. 1252 1207 1253 IF (config_inca /= 'none') THEN 1208 tau_inca(:,:,:,:) = 0. 1209 piz_inca(:,:,:,:) = 0. 1210 cg_inca(:,:,:,:) = 0. 1211 ccm(:,:,:) = 0. 1212 topswai_inca(:) = 0. 1213 topswad_inca(:) = 0. 1214 topswad0_inca(:) = 0. 1215 topsw_inca(:,:) = 0. 1216 topsw0_inca(:,:) = 0. 1217 solswai_inca(:) = 0. 1218 solswad_inca(:) = 0. 1219 solswad0_inca(:) = 0. 1220 solsw_inca(:,:) = 0. 1221 solsw0_inca(:,:) = 0. 1254 ! jg : initialisation jusqu'au ces variables sont dans restart 1255 ccm(:,:,:) = 0. 1256 tau_aero(:,:,:,:) = 0. 1257 piz_aero(:,:,:,:) = 0. 1258 cg_aero(:,:,:,:) = 0. 1222 1259 END IF 1223 1260 … … 1230 1267 IF (ip_ebil_phy.ge.1) d_h_vcol_phy=0. 1231 1268 c 1232 c appel a la lecture du run.def physique1233 c1234 call conf_phys(ok_journe, ok_mensuel,1235 . ok_instan, ok_hf,1236 . ok_LES,1237 . solarlong0,seuil_inversion,1238 . fact_cldcon, facttemps,ok_newmicro,iflag_radia,1239 . iflag_cldcon,iflag_ratqs,ratqsbas,ratqshaut,1240 . ok_ade, ok_aie, aerosol_couple,1241 . bl95_b0, bl95_b1,1242 . iflag_thermals,nsplit_thermals,tau_thermals,1243 . iflag_thermals_ed,iflag_thermals_optflux,1244 cnv flags pour la convection et les poches froides1245 . iflag_coupl,iflag_clos,iflag_wake)1246 1247 1269 print*,'iflag_coupl,iflag_clos,iflag_wake', 1248 1270 . iflag_coupl,iflag_clos,iflag_wake … … 1377 1399 ENDIF 1378 1400 1379 rugoro=0. 1401 DO i=1,klon 1402 rugoro(i) = f_rugoro * MAX(1.0e-05, zstd(i)*zsig(i)/2.0) 1403 ENDDO 1404 1380 1405 c34EK 1381 1406 IF (ok_orodr) THEN 1382 1383 rugoro=0.1384 1407 1385 1408 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! … … 1413 1436 . lmt_pas 1414 1437 c 1415 cIM200505 ecrit_mth = NINT(86400./dtime *ecritphy) ! tous les ecritphy jours1416 c IF (ok_mensuel) THEN1417 c WRITE(lunout,*)'La frequence de sortie mensuelle est de ',1418 c . ecrit_mth1419 c ENDIF1420 c ecrit_day = NINT(86400./dtime *1.0) ! tous les jours1421 c IF (ok_journe) THEN1422 c WRITE(lunout,*)'La frequence de sortie journaliere est de ',1423 c . ecrit_day1424 c ENDIF1425 cIM 130904 BEG1426 cIM 080205 ecrit_hf = 86400./dtime *0.25 ! toutes les 6h1427 cIM 1703051428 c ecrit_hf = 86400./dtime/12. ! toutes les 2h1429 cIM 2303051430 cIM200505 ecrit_hf = 86400./dtime *0.25 ! toutes les 6h1431 c1432 cIM200505 ecrit_hf2mth = ecrit_day/ecrit_hf*301433 c1434 cIM200505 IF (ok_journe) THEN1435 cIM200505 WRITE(lunout,*)'La frequence de sortie hf est de ',1436 cIM200505 . ecrit_hf1437 cIM200505 ENDIF1438 cIM 130904 END1439 ccc ecrit_ins = NINT(86400./dtime *0.5) ! 2 fois par jour1440 ccc ecrit_ins = NINT(86400./dtime *0.25) ! 4 fois par jour1441 c ecrit_ins = NINT(86400./dtime/48.) ! a chaque pas de temps ==> PB. dans time_counter pour 1mois1442 c ecrit_ins = NINT(86400./dtime/12.) ! toutes les deux heures1443 cIM200505 ecrit_ins = NINT(86400./dtime/8.) ! toutes les trois heures1444 cIM200505 IF (ok_instan) THEN1445 cIM200505 WRITE(lunout,*)'La frequence de sortie instant. est de ',1446 cIM200505 . ecrit_ins1447 cIM200505 ENDIF1448 cIM200505 ecrit_reg = NINT(86400./dtime *0.25) ! 4 fois par jour1449 cIM200505 IF (ok_region) THEN1450 cIM200505 WRITE(lunout,*)'La frequence de sortie region est de ',1451 cIM200505 . ecrit_reg1452 cIM200505 ENDIF1453 cIM 030306 BEG1454 cIM ecrit_hf2mth = nombre de pas de temps de calcul de hf par mois apres lequel on ecrit1455 cIM : ne pas modifier ecrit_hf2mth1456 c1457 cIM 250308bad guide ecrit_hf2mth = 30*1/ecrit_hf1458 ecrit_hf2mth = ecrit_mth/ecrit_hf1459 c ecrit_ins en secondes, chaque pas de temps de la physique1460 ecrit_ins = dtime1461 cIM on passe les frequences de jours en secondes : ecrit_ins, ecrit_hf, ecrit_day, ecrit_mth, ecrit_tra, ecrit_reg1462 ecrit_hf = ecrit_hf * un_jour1463 !IM1464 IF(ecrit_day.LE.1.) THEN1465 ecrit_day = ecrit_day * un_jour !en secondes1466 ENDIF1467 !IM1468 ecrit_mth = ecrit_mth * un_jour1469 ecrit_reg = ecrit_reg * un_jour1470 ecrit_tra = ecrit_tra * un_jour1471 ecrit_ISCCP = ecrit_ISCCP * un_jour1472 ecrit_LES = ecrit_LES * un_jour1473 c1474 PRINT*,'physiq ecrit_ hf day mth reg tra ISCCP hf2mth',1475 . ecrit_hf,ecrit_day,ecrit_mth,ecrit_reg,ecrit_tra,ecrit_ISCCP,1476 . ecrit_hf2mth1477 1438 cIM 030306 END 1478 1439 … … 1494 1455 c$OMP MASTER 1495 1456 call phys_output_open(jjmp1,nlevSTD,clevSTD,nbteta, 1496 & ctetaSTD,dtime, presnivs,ok_veget,1457 & ctetaSTD,dtime,ok_veget, 1497 1458 & type_ocean,iflag_pbl,ok_mensuel,ok_journe, 1498 & ok_hf,ok_instan,ok_LES,ok_ade,ok_aie) 1459 & ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, 1460 & read_climoz, new_aod, aerosol_couple) 1499 1461 c$OMP END MASTER 1500 1462 c$OMP BARRIER … … 1514 1476 #endif 1515 1477 1478 cIM 250308bad guide ecrit_hf2mth = 30*1/ecrit_hf 1479 ecrit_hf2mth = ecrit_mth/ecrit_hf 1480 1481 ecrit_hf = ecrit_hf * un_jour 1482 !IM 1483 IF(ecrit_day.LE.1.) THEN 1484 ecrit_day = ecrit_day * un_jour !en secondes 1485 ENDIF 1486 !IM 1487 ecrit_mth = ecrit_mth * un_jour 1488 ecrit_ins = ecrit_ins * un_jour 1489 ecrit_reg = ecrit_reg * un_jour 1490 ecrit_tra = ecrit_tra * un_jour 1491 ecrit_ISCCP = ecrit_ISCCP * un_jour 1492 ecrit_LES = ecrit_LES * un_jour 1493 c 1494 PRINT*,'physiq ecrit_ hf day mth reg tra ISCCP hf2mth', 1495 . ecrit_hf,ecrit_day,ecrit_mth,ecrit_reg,ecrit_tra,ecrit_ISCCP, 1496 . ecrit_hf2mth 1497 cIM 030306 END 1498 1499 1516 1500 cXXXPB Positionner date0 pour initialisation de ORCHIDEE 1517 date0 = zjulian 1518 C date0 = day_ini 1501 date0 = jD_ref 1519 1502 WRITE(*,*) 'physiq date0 : ',date0 1520 1503 c … … 1534 1517 CALL VTe(VTphysiq) 1535 1518 CALL VTb(VTinca) 1536 iii = MOD(NINT(xjour),360) 1537 calday = FLOAT(iii) + gmtime 1538 WRITE(lunout,*) 'initial time ', xjour, calday 1519 ! iii = MOD(NINT(xjour),360) 1520 ! calday = FLOAT(iii) + jH_cur 1521 calday = FLOAT(days_elapsed) + jH_cur 1522 WRITE(lunout,*) 'initial time chemini', days_elapsed, calday 1539 1523 1540 1524 CALL chemini( … … 1550 1534 $ pdtphys, 1551 1535 $ annee_ref, 1552 $ day_ini) 1536 $ day_ref, 1537 $ itau_phy) 1553 1538 1554 1539 CALL VTe(VTinca) … … 1564 1549 call iniradia(klon,klev,paprs(1,1:klev+1)) 1565 1550 1551 C$omp single 1552 if (read_climoz >= 1) then 1553 call open_climoz(ncid_climoz, press_climoz) 1554 END IF 1555 C$omp end single 1566 1556 ENDIF 1567 1557 ! … … 1572 1562 ! 1573 1563 itap = itap + 1 1574 julien = MOD(NINT(xjour),360)1575 if (julien .eq. 0) julien = 3601576 1577 1564 ! 1578 1565 ! Update fraction of the sub-surfaces (pctsrf) and … … 1580 1567 ! on the surface fraction. 1581 1568 ! 1582 CALL change_srf_frac(itap, dtime, julien,1569 CALL change_srf_frac(itap, dtime, days_elapsed+1, 1583 1570 * pctsrf, falb1, falb2, ftsol, u10m, v10m, pbl_tke) 1584 1585 1571 1586 1572 ! Tendances bidons pour les processus qui n'affectent pas certaines … … 1731 1717 c Prescrire l'ozone et calculer l'albedo sur l'ocean. 1732 1718 c 1733 IF (MOD(itap-1,lmt_pas) .EQ. 0) THEN 1734 if(prt_level.ge.1) WRITE(lunout,*)' PHYS cond julien ',julien 1735 CALL ozonecm( FLOAT(julien), rlat, paprs, wo) 1719 if (read_climoz >= 1) then 1720 C Ozone from a file 1721 ! Update required ozone index: 1722 ro3i = int((days_elapsed + jh_cur - jh_1jan) 1723 $ / ioget_year_len(year_cur) * 360.) + 1 1724 if (ro3i == 361) ro3i = 360 1725 C (This should never occur, except perhaps because of roundup 1726 C error. See documentation.) 1727 if (ro3i /= co3i) then 1728 C Update ozone field: 1729 if (read_climoz == 1) then 1730 call regr_pr_av(ncid_climoz, (/"tro3"/), julien=ro3i, 1731 $ press_in_edg=press_climoz, paprs=paprs, v3=wo) 1732 else 1733 C read_climoz == 2 1734 call regr_pr_av(ncid_climoz, 1735 $ (/"tro3 ", "tro3_daylight"/), 1736 $ julien=ro3i, press_in_edg=press_climoz, paprs=paprs, 1737 $ v3=wo) 1738 end if 1739 ! Convert from mole fraction of ozone to column density of ozone in a 1740 ! cell, in kDU: 1741 forall (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l) 1742 $ * rmo3 / rmd * zmasse / dobson_u / 1e3 1743 C (By regridding ozone values for LMDZ only once every 360th of 1744 C year, we have already neglected the variation of pressure in one 1745 C 360th of year. So do not recompute "wo" at each time step even if 1746 C "zmasse" changes a little.) 1747 co3i = ro3i 1748 end if 1749 elseif (MOD(itap-1,lmt_pas) == 0) THEN 1750 C Once per day, update ozone from Royer: 1751 wo(:, :, 1) = ozonecm(rlat, paprs, rjour=real(days_elapsed+1)) 1736 1752 ENDIF 1737 1753 c … … 1774 1790 ! doit donc etre placé avant radlwsw et pbl_surface 1775 1791 1792 ! calcul selon la routine utilisee pour les planetes 1793 if (new_orbit) then 1794 call ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq) 1795 day_since_equinox = (jD_cur + jH_cur) - jD_eq 1796 ! day_since_equinox = (jD_cur) - jD_eq 1797 call solarlong(day_since_equinox, zlongi, dist) 1798 else 1799 ! calcul selon la routine utilisee pour l'AR4 1776 1800 ! choix entre calcul de la longitude solaire vraie ou valeur fixee a 1777 1801 ! solarlong0 1778 1779 if (solarlong0<-999.) then1780 CALL orbite(FLOAT(julien),zlongi,dist)1781 else1782 zlongi=solarlong0 ! longitude solaire vraie1783 dist=1. ! distance au soleil / moyenne1802 if (solarlong0<-999.) then 1803 CALL orbite(FLOAT(days_elapsed+1),zlongi,dist) 1804 else 1805 zlongi=solarlong0 ! longitude solaire vraie 1806 dist=1. ! distance au soleil / moyenne 1807 endif 1784 1808 endif 1785 1786 if(prt_level.ge.1) print*,'Longitude solaire ',zlongi,solarlong01809 if(prt_level.ge.1) & 1810 & write(lunout,*)'Longitude solaire ',zlongi,solarlong0,dist 1787 1811 1788 1812 ! Avec ou sans cycle diurne 1789 1813 IF (cycle_diurne) THEN 1790 1814 zdtime=dtime*FLOAT(radpas) ! pas de temps du rayonnement (s) 1791 CALL zenang(zlongi, gmtime,zdtime,rlat,rlon,rmu0,fract)1815 CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract) 1792 1816 ELSE 1793 1817 CALL angle(zlongi, rlat, fract, rmu0) … … 1822 1846 1823 1847 CALL pbl_surface( 1824 e dtime, date0, itap, julien,1848 e dtime, date0, itap, days_elapsed+1, 1825 1849 e debut, lafin, 1826 1850 e rlon, rlat, rugoro, rmu0, … … 1933 1957 END DO 1934 1958 END DO 1959 if (prt_level.ge.1) write(lunout,*) 'omega(igout, :) = ', 1960 $ omega(igout, :) 1935 1961 1936 1962 IF (iflag_con.EQ.1) THEN … … 2119 2145 2120 2146 if (itop_con(i).gt.klev-3) then 2121 print*,'La convection monte trop haut ' 2122 print*,'itop_con(,',i,',)=',itop_con(i) 2147 if(prt_level >= 9) then 2148 write(lunout,*)'La convection monte trop haut ' 2149 write(lunout,*)'itop_con(,',i,',)=',itop_con(i) 2150 endif 2123 2151 endif 2124 2152 ENDDO … … 2519 2547 enddo 2520 2548 2521 ! les ratqs sont une conbinaison de ratqss et ratqsc 2522 ! 1800s, en dur pour le moment, est le temps de 2523 ! relaxation des ratqs 2524 2525 facteur=exp(-pdtphys/1800.) 2526 2527 print*,'WARNING ratqs a revoir ' 2549 ! les ratqs sont une combinaison de ratqss et ratqsc 2550 print*,'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs 2551 2552 if (tau_ratqs>1.e-10) then 2553 facteur=exp(-pdtphys/tau_ratqs) 2554 else 2555 facteur=0. 2556 endif 2528 2557 ratqs(:,:)=ratqsc(:,:)*(1.-facteur)+ratqs(:,:)*facteur 2529 ratqs(:,:)=sqrt(ratqs(:,:)**2+ratqss(:,:)**2) 2530 2558 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2559 ! FH 22/09/2009 2560 ! La ligne ci-dessous faisait osciller le modele et donnait une solution 2561 ! assymptotique bidon et dépendant fortement du pas de temps. 2562 ! ratqs(:,:)=sqrt(ratqs(:,:)**2+ratqss(:,:)**2) 2563 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2564 ratqs(:,:)=max(ratqs(:,:),ratqss(:,:)) 2531 2565 else 2532 2566 ! on ne prend que le ratqs stable pour fisrtilp … … 2658 2692 cjq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr) 2659 2693 IF (ok_ade.OR.ok_aie) THEN 2660 IF ( .NOT. aerosol_couple ) THEN 2661 ! Get sulfate aerosol distribution 2662 CALL readsulfate(rjourvrai, debut, sulfate) 2663 CALL readsulfate_preind(rjourvrai, debut, sulfate_pi) 2664 2665 ! Calculate aerosol optical properties (Olivier Boucher) 2666 CALL aeropt(pplay, paprs, t_seri, sulfate, rhcl, 2667 . tau_ae, piz_ae, cg_ae, aerindex) 2668 ENDIF 2694 IF (.NOT. aerosol_couple) 2695 & CALL readaerosol_optic( 2696 & debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref, 2697 & pdtphys, pplay, paprs, t_seri, rhcl, presnivs, 2698 & mass_solu_aero, mass_solu_aero_pi, 2699 & tau_aero, piz_aero, cg_aero, 2700 & tausum_aero, tau3d_aero) 2669 2701 ELSE 2670 tau_ae(:,:,:)=0.02671 piz_ae(:,:,:)=0.0 2672 cg_ae(:,:,:)=0.0 2702 tau_aero(:,:,:,:) = 0. 2703 piz_aero(:,:,:,:) = 0. 2704 cg_aero(:,:,:,:) = 0. 2673 2705 ENDIF 2674 2706 … … 2791 2823 CALL VTe(VTphysiq) 2792 2824 CALL VTb(VTinca) 2793 calday = FLOAT( julien) + gmtime2825 calday = FLOAT(days_elapsed + 1) + jH_cur 2794 2826 2795 2827 IF (config_inca == 'aero') THEN 2796 2828 CALL AEROSOL_METEO_CALC( 2797 2829 $ calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, 2798 $ prfl,psfl,pctsrf,airephy, xjour,rlat,rlon,u10m,v10m)2830 $ prfl,psfl,pctsrf,airephy,rlat,rlon,u10m,v10m) 2799 2831 END IF 2800 2832 … … 2802 2834 2803 2835 CALL chemhook_begin (calday, 2804 $ julien,2805 $ gmtime,2836 $ days_elapsed+1, 2837 $ jH_cur, 2806 2838 $ pctsrf(1,1), 2807 2839 $ rlat, … … 2815 2847 $ u, 2816 2848 $ v, 2817 $ wo ,2849 $ wo(:, :, 1), 2818 2850 $ q_seri, 2819 2851 $ zxtsol, … … 2847 2879 2848 2880 IF (aerosol_couple) THEN 2849 sulfate(:,:)= ccm(:,:,1)2850 sulfate_pi(:,:) = ccm(:,:,2)2851 END IF2881 mass_solu_aero(:,:) = ccm(:,:,1) 2882 mass_solu_aero_pi(:,:) = ccm(:,:,2) 2883 END IF 2852 2884 2853 2885 if (ok_newmicro) then … … 2857 2889 . flwp, fiwp, flwc, fiwc, 2858 2890 e ok_aie, 2859 e sulfate, sulfate_pi,2891 e mass_solu_aero, mass_solu_aero_pi, 2860 2892 e bl95_b0, bl95_b1, 2861 s cldtaupi, re, fl )2893 s cldtaupi, re, fl, ref_liq, ref_ice) 2862 2894 else 2863 2895 CALL nuage (paprs, pplay, … … 2865 2897 . cldh, cldl, cldm, cldt, cldq, 2866 2898 e ok_aie, 2867 e sulfate, sulfate_pi,2899 e mass_solu_aero, mass_solu_aero_pi, 2868 2900 e bl95_b0, bl95_b1, 2869 2901 s cldtaupi, re, fl) … … 2895 2927 IF (aerosol_couple) THEN 2896 2928 #ifdef INCA 2897 CALL radlwsw_inca 2898 e (kdlon,kflev,dist, rmu0, fract, solaire, 2899 e paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri, 2900 e wo, 2901 e cldfra, cldemi, cldtau, 2902 s heat,heat0,cool,cool0,radsol,albpla, 2903 s topsw,toplw,solsw,sollw, 2904 s sollwdown, 2905 s topsw0,toplw0,solsw0,sollw0, 2906 s lwdn0, lwdn, lwup0, lwup, 2907 s swdn0, swdn, swup0, swup, 2908 e ok_ade, ok_aie, 2909 e tau_inca, piz_inca, cg_inca, 2910 s topswad_inca, solswad_inca, 2911 s topswad0_inca, solswad0_inca, 2912 s topsw_inca, topsw0_inca, 2913 s solsw_inca, solsw0_inca, 2914 e cldtaupi, 2915 s topswai_inca, solswai_inca) 2929 CALL radlwsw_inca 2930 e (kdlon,kflev,dist, rmu0, fract, solaire, 2931 e paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri, 2932 e wo(:, :, 1), 2933 e cldfra, cldemi, cldtau, 2934 s heat,heat0,cool,cool0,radsol,albpla, 2935 s topsw,toplw,solsw,sollw, 2936 s sollwdown, 2937 s topsw0,toplw0,solsw0,sollw0, 2938 s lwdn0, lwdn, lwup0, lwup, 2939 s swdn0, swdn, swup0, swup, 2940 e ok_ade, ok_aie, 2941 e tau_aero, piz_aero, cg_aero, 2942 s topswad_aero, solswad_aero, 2943 s topswad0_aero, solswad0_aero, 2944 s topsw_aero, topsw0_aero, 2945 s solsw_aero, solsw0_aero, 2946 e cldtaupi, 2947 s topswai_aero, solswai_aero) 2948 2916 2949 #endif 2917 2950 ELSE 2918 CALL radlwsw ! nouveau rayonnement (compatible Arpege-IFS) 2919 e (dist, rmu0, fract, 2920 e paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri, 2921 e wo, 2922 e cldfra, cldemi, cldtau, 2923 s heat,heat0,cool,cool0,radsol,albpla, 2924 s topsw,toplw,solsw,sollw, 2925 s sollwdown, 2926 s topsw0,toplw0,solsw0,sollw0, 2927 s lwdn0, lwdn, lwup0, lwup, 2928 s swdn0, swdn, swup0, swup, 2929 e ok_ade, ok_aie, ! new for aerosol radiative effects 2930 e tau_ae, piz_ae, cg_ae, ! ="= 2931 s topswad, solswad, ! ="= 2932 e cldtaupi, ! ="= 2933 s topswai, solswai,zqsat,flwc,fiwc) ! ="= 2934 ENDIF 2951 2952 CALL radlwsw 2953 e (dist, rmu0, fract, 2954 e paprs, pplay,zxtsol,albsol1, albsol2, 2955 e t_seri,q_seri,wo, 2956 e cldfra, cldemi, cldtau, 2957 e ok_ade, ok_aie, 2958 e tau_aero, piz_aero, cg_aero, 2959 e cldtaupi,new_aod, 2960 e zqsat, flwc, fiwc, 2961 s heat,heat0,cool,cool0,radsol,albpla, 2962 s topsw,toplw,solsw,sollw, 2963 s sollwdown, 2964 s topsw0,toplw0,solsw0,sollw0, 2965 s lwdn0, lwdn, lwup0, lwup, 2966 s swdn0, swdn, swup0, swup, 2967 s topswad_aero, solswad_aero, 2968 s topswai_aero, solswai_aero, 2969 o topswad0_aero, solswad0_aero, 2970 o topsw_aero, topsw0_aero, 2971 o solsw_aero, solsw0_aero, 2972 o topswcf_aero, solswcf_aero) 2973 2974 2975 ENDIF ! aerosol_couple 2935 2976 itaprad = 0 2936 ENDIF 2977 ENDIF ! MOD(itaprad,radpas) 2937 2978 itaprad = itaprad + 1 2938 2979 … … 3123 3164 cIM calcul composantes axiales du moment angulaire et couple des montagnes 3124 3165 c 3125 IF (is_sequential .AND. ok_orodr .AND. ok_orolf) THEN3166 IF (is_sequential) THEN 3126 3167 3127 CALL aaam_bud (27,klon,klev, rjourvrai,gmtime,3168 CALL aaam_bud (27,klon,klev,jD_cur-jD_ref,jH_cur, 3128 3169 C ra,rg,romega, 3129 3170 C rlat,rlon,pphis, … … 3143 3184 c 3144 3185 c 3186 !==================================================================== 3187 ! Interface Simulateur COSP (Calipso, ISCCP, MISR, ..) 3188 !==================================================================== 3189 ! Abderrahmane 24.08.09 3190 3191 IF (ok_cosp) THEN 3192 ! adeclarer 3193 #ifdef CPP_COSP 3194 IF (MOD(itap,NINT(freq_cosp/dtime)).EQ.0) THEN 3195 3196 print*,'freq_cosp',freq_cosp 3197 mr_ozone=wo(:, :, 1) * dobson_u * 1e3 / zmasse 3198 ! print*,'Dans physiq.F avant appel cosp ref_liq,ref_ice=', 3199 ! s ref_liq,ref_ice 3200 call phys_cosp(itap,dtime,freq_cosp, 3201 $ ecrit_mth,ecrit_day,ecrit_hf,overlap, 3202 $ klon,klev,rlon,rlat,presnivs, 3203 $ ref_liq,ref_ice, 3204 $ pctsrf(:,is_ter)+pctsrf(:,is_lic), 3205 $ zu10m,zv10m, 3206 $ zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, 3207 $ qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, 3208 $ prfl(:,1:klev),psfl(:,1:klev), 3209 $ pmflxr(:,1:klev),pmflxs(:,1:klev), 3210 $ mr_ozone,cldtau, cldemi) 3211 ! L calipso2D,calipso3D,cfadlidar,parasolrefl,atb,betamol, 3212 ! L cfaddbze,clcalipso2,dbze,cltlidarradar, 3213 ! M clMISR, 3214 ! R clisccp2,boxtauisccp,boxptopisccp,tclisccp,ctpisccp, 3215 ! I tauisccp,albisccp,meantbisccp,meantbclrisccp) 3216 3217 ENDIF 3218 3219 #endif 3220 ENDIF !ok_cosp 3221 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3145 3222 cAA 3146 3223 cAA Installation de l'interface online-offline pour traceurs … … 3150 3227 c==================================================================== 3151 3228 C 3152 IF (config_inca /= 'none') rnpb=.FALSE. 3153 3154 call phytrac ( rnpb, 3155 I itap, 3156 I julien, 3157 I gmtime, 3158 I debut, 3159 I lafin, 3160 I nlon, 3161 I nlev, 3162 I dtime, 3163 I u, 3164 I v, 3165 I t, 3166 I paprs, 3167 I pplay, 3168 I pmfu, 3169 I pmfd, 3170 I pen_u, 3171 I pde_u, 3172 I pen_d, 3173 I pde_d, 3174 I cdragh, 3175 I coefh, 3176 I fm_therm, 3177 I entr_therm, 3178 I u1, 3179 I v1, 3180 I ftsol, 3181 I pctsrf, 3182 I rlat, 3183 I frac_impa, 3184 I frac_nucl, 3185 I rlon, 3186 I presnivs, 3187 I pphis, 3188 I pphi, 3189 I albsol1, 3190 I qx(1,1,1), 3191 I rhcl, 3192 I cldfra, 3193 I rneb, 3194 I diafra, 3195 I cldliq, 3196 I itop_con, 3197 I ibas_con, 3198 I pmflxr, 3199 I pmflxs, 3200 I prfl, 3201 I psfl, 3202 I da, 3203 I phi, 3204 I mp, 3205 I upwd, 3206 I dnwd, 3207 I aerosol_couple, 3208 I flxmass_w, 3209 I tau_inca, 3210 I piz_inca, 3211 I cg_inca, 3212 I ccm, 3213 I rfname, 3214 O tr_seri) 3229 3230 call phytrac ( 3231 I itap, days_elapsed+1, jH_cur, debut, 3232 I lafin, dtime, u, v, t, 3233 I paprs, pplay, pmfu, pmfd, 3234 I pen_u, pde_u, pen_d, pde_d, 3235 I cdragh, coefh, fm_therm, entr_therm, 3236 I u1, v1, ftsol, pctsrf, 3237 I rlat, frac_impa, frac_nucl,rlon, 3238 I presnivs, pphis, pphi, albsol1, 3239 I qx(:,:,ivap),rhcl, cldfra, rneb, 3240 I diafra, cldliq, itop_con, ibas_con, 3241 I pmflxr, pmflxs, prfl, psfl, 3242 I da, phi, mp, upwd, 3243 I dnwd, aerosol_couple, flxmass_w, 3244 I tau_aero, piz_aero, cg_aero, ccm, 3245 I rfname, 3246 O tr_seri) 3215 3247 3216 3248 IF (offline) THEN … … 3218 3250 print*,'Attention on met a 0 les thermiques pour phystoke' 3219 3251 call phystokenc ( 3220 I nlon, nlev,pdtphys,rlon,rlat,3252 I nlon,klev,pdtphys,rlon,rlat, 3221 3253 I t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, 3222 3254 I fm_therm,entr_therm, … … 3252 3284 d_t_ec(i,k)=0.5/ZRCPD 3253 3285 $ *(u(i,k)**2+v(i,k)**2-u_seri(i,k)**2-v_seri(i,k)**2) 3286 ENDDO 3287 ENDDO 3288 3289 DO k = 1, klev 3290 DO i = 1, klon 3254 3291 t_seri(i,k)=t_seri(i,k)+d_t_ec(i,k) 3255 3292 d_t_ec(i,k) = d_t_ec(i,k)/dtime … … 3267 3304 C est egale a la variation de la physique au pas de temps precedent. 3268 3305 C Donc la somme de ces 2 variations devrait etre nulle. 3306 3269 3307 call diagphy(airephy,ztit,ip_ebil_phy 3270 3308 e , topsw, toplw, solsw, sollw, sens … … 3349 3387 $ day_ini, 3350 3388 $ airephy, 3351 $ xjour,3352 3389 $ pphi, 3353 3390 $ pphis, … … 3415 3452 write(lunout,*) 'FIN DE PHYSIQ !!!!!!!!!!!!!!!!!!!!' 3416 3453 write(lunout,*) 3417 s 'nlon, nlev,nqtot,debut,lafin,rjourvrai,gmtime,pdtphys pct tlos'3454 s 'nlon,klev,nqtot,debut,lafin,jD_cur, jH_cur, pdtphys pct tlos' 3418 3455 write(lunout,*) 3419 s nlon, nlev,nqtot,debut,lafin,rjourvrai,gmtime,pdtphys,3456 s nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur ,pdtphys, 3420 3457 s pctsrf(igout,is_ter), pctsrf(igout,is_lic),pctsrf(igout,is_oce), 3421 3458 s pctsrf(igout,is_sic) 3422 3459 write(lunout,*) 'd_t_dyn,d_t_con,d_t_lsc,d_t_ajsb,d_t_ajs,d_t_eva' 3423 do k=1, nlev3460 do k=1,klev 3424 3461 write(lunout,*) d_t_dyn(igout,k),d_t_con(igout,k), 3425 3462 s d_t_lsc(igout,k),d_t_ajsb(igout,k),d_t_ajs(igout,k), … … 3427 3464 enddo 3428 3465 write(lunout,*) 'cool,heat' 3429 do k=1, nlev3466 do k=1,klev 3430 3467 write(lunout,*) cool(igout,k),heat(igout,k) 3431 3468 enddo 3432 3469 3433 3470 write(lunout,*) 'd_t_oli,d_t_vdf,d_t_oro,d_t_lif,d_t_ec' 3434 do k=1, nlev3471 do k=1,klev 3435 3472 write(lunout,*) d_t_oli(igout,k),d_t_vdf(igout,k), 3436 3473 s d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k) … … 3439 3476 write(lunout,*) 'd_ps ',d_ps(igout) 3440 3477 write(lunout,*) 'd_u, d_v, d_t, d_qx1, d_qx2 ' 3441 do k=1, nlev3478 do k=1,klev 3442 3479 write(lunout,*) d_u(igout,k),d_v(igout,k),d_t(igout,k), 3443 3480 s d_qx(igout,k,1),d_qx(igout,k,2) … … 3501 3538 ! write(97) u_seri,v_seri,t_seri,q_seri 3502 3539 ! close(97) 3540 C$OMP MASTER 3541 if (read_climoz >= 1) then 3542 if (is_mpi_root) then 3543 call nf95_close(ncid_climoz) 3544 end if 3545 deallocate(press_climoz) ! pointer 3546 end if 3547 C$OMP END MASTER 3503 3548 ENDIF 3504 3549 3550 ! first=.false. 3505 3551 3506 3552 RETURN
Note: See TracChangeset
for help on using the changeset viewer.