diff --git a/MAR/code_mar/EUc101001o.e95010 b/MAR/code_mar/EUc101001o.e95010 new file mode 100644 index 0000000000000000000000000000000000000000..902e4e1a55b4a05d81b65663b1acaf8f9322ca29 --- /dev/null +++ b/MAR/code_mar/EUc101001o.e95010 @@ -0,0 +1,194 @@ + +---- 1 ---- Initialisation + + +---- 2 ---- Job informations + +Begin time : 01/10/2010 +End time : 31/10/2010 +Domain : EUc (/climato_tmp1/tdethinne/MAR/sim/EUc) + +Date : Tue 26 Sep 12:07:05 CEST 2023 +Host : srv7 +Work directory: /scratch/tdethinne +Messages in : /climato_tmp1/tdethinne/MAR/msg + +---- 3 ---- Work directory + + +---- 4 ---- input data files + + + > ECM.2010.10.01-05.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.01-05.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.01-05.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.01-05.EUR.nc.gz + + > ECM.2010.10.06-10.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.06-10.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.06-10.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.06-10.EUR.nc.gz + + > ECM.2010.10.11-15.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.11-15.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.11-15.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.11-15.EUR.nc.gz + + > ECM.2010.10.16-20.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.16-20.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.16-20.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.16-20.EUR.nc.gz + + > ECM.2010.10.21-25.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.21-25.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.21-25.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.21-25.EUR.nc.gz + + > ECM.2010.10.26-31.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.26-31.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.26-31.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.10.26-31.EUR.nc.gz + + > ECM.2010.11.01-05.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.11.01-05.EUR.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.11.01-05.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ECM.2010.11.01-05.EUR.nc.gz + + > ETOPO + +smget: /climato_tmp1/fettweis/MAR/in/ETOPO/etopo.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ETOPO/etopo.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ETOPO/etopo.nc.gz + + > ETOPO1 + +smget: /climato_tmp1/fettweis/MAR/in/ETOPO1/etopo1.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ETOPO1/etopo1.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ETOPO1/etopo1.nc.gz + + > ICEmask + +smget: /climato_tmp1/fettweis/MAR/in/ICEmask/ICEmask.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/ICEmask/ICEmask.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/ICEmask/ICEmask.nc.gz + + > FAO + +smget: /climato_tmp1/fettweis/MAR/in/FAO/FAO_SOIL.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/FAO_SOIL.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/FAO_SOIL.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/TEXUNIT.ASC.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/TEXUNIT.ASC.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/TEXUNIT.ASC.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/SOILPARAMETER.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/SOILPARAMETER.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/SOILPARAMETER.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/AFRmax-alb.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/AFRmax-alb.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/FAO/AFRmax-alb.nc.gz + + > SOIL + +smget: /climato_tmp1/fettweis/MAR/in/SOIL/GSWP-SOIL.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/SOIL/GSWP-SOIL.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/SOIL/GSWP-SOIL.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/SOIL/HWSDglob.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/SOIL/HWSDglob.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/SOIL/HWSDglob.nc.gz + + > VEGE + +smget: /climato_tmp1/fettweis/MAR/in/VEGE/AFRveg_IGBP.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/AFRveg_IGBP.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/AFRveg_IGBP.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/VEGE/BELveg_IRM.asc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/BELveg_IRM.asc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/BELveg_IRM.asc.gz +smget: /climato_tmp1/fettweis/MAR/in/VEGE/EURveg_IGBP.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/EURveg_IGBP.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/EURveg_IGBP.nc.gz + + > GlobCover V.2.2 Land Cover + +smget: /climato_tmp1/fettweis/MAR/in/VEGE/glcesa3a.nc.gz -> /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/glcesa3a.nc.gz +uc: /scratch/tdethinne/NST_EUc.10.10.01-31/input/VEGE/glcesa3a.nc.gz + + > MERRA2 LAI/GLF data set + + +---- 5 ---- Stock initialisation + + +---- 6 ---- NESTOR launch + +9.65user 2.55system 0:28.39elapsed 42%CPU (0avgtext+0avgdata 895812maxresident)k +2277128inputs+547832outputs (0major+1004044minor)pagefaults 0swaps + +NESTOR run: OK (Tue 26 Sep 12:08:41 CEST 2023) + +---- 7 ---- Backup: NESTOR output files + + +> output directory content + +total 273876 +-rw------- 1 tdethinne users 1317 Sep 26 12:08 MARdim.inc +-rw------- 1 tdethinne users 937 Sep 26 12:08 MARdim.inc_old +-rw------- 1 tdethinne users 1511 Sep 26 12:08 mardim_mod.f90 +-rw------- 1 tdethinne users 2124525 Sep 26 12:08 MARdom.dat +-rw------- 1 tdethinne users 6163500 Sep 26 12:08 MARdyn.DAT +-rw------- 1 tdethinne users 32405500 Sep 26 12:08 MARglf.DAT +-rw------- 1 tdethinne users 181805500 Sep 26 12:08 MARlbc.DAT +-rw------- 1 tdethinne users 3436 Sep 26 12:08 MAR_LB.inc_old +-rw------- 1 tdethinne users 5404500 Sep 26 12:08 MARsic.DAT +-rw------- 1 tdethinne users 1425776 Sep 26 12:08 MARsol.DAT +-rw------- 1 tdethinne users 136 Sep 26 12:08 MAR_SV.inc +-rw------- 1 tdethinne users 136 Sep 26 12:08 MAR_SV.inc_nv +-rw------- 1 tdethinne users 200 Sep 26 12:08 mar_sv_mod.f90 +-rw------- 1 tdethinne users 2462568 Sep 26 12:08 MARsvt.DAT +-rw------- 1 tdethinne users 2329 Sep 26 12:08 MAR_TV.inc_old +-rw------- 1 tdethinne users 48604500 Sep 26 12:08 MARubc.DAT + +> MAR*.inc* (MARdcl_EUc.2010.10.01.inc) + +MARdim.inc +MARdim.inc_old +MAR_LB.inc_old +MAR_SV.inc +MAR_SV.inc_nv +MAR_TV.inc_old +tar: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MAR*.inc* -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARdcl_EUc.2010.10.01.inc.tar +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARdcl_EUc.2010.10.01.inc.tar -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARdcl_EUc.2010.10.01.inc.tar + +> MARlbc (MARlbc_EUc.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARlbc_EUc.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARlbc_EUc.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARlbc_EUc.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARlbc_EUc.2010.10.01-31.DAT.gz +If any trouble here, MARlbc*.DAT is likely to become part of MARini*DAT + +> MARglf (MARglf_EUc.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARglf_EUc.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARglf_EUc.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARglf_EUc.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARglf_EUc.2010.10.01-31.DAT.gz +If any trouble here, MARglf*.DAT is likely to become part of MARini*DAT + +> MARsic (MARsic_EUc.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARsic_EUc.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARsic_EUc.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARsic_EUc.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARsic_EUc.2010.10.01-31.DAT.gz +If any trouble here, MARsic*.DAT is likely to become part of MARini*DAT + +> MARubc (MARubc_EUc.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARubc_EUc.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARubc_EUc.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARubc_EUc.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARubc_EUc.2010.10.01-31.DAT.gz +If any trouble here, MARubc*.DAT is likely to become part of MARini*DAT + +> MARdom (MARdom_EUc.2010.10.01.dat) + +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARdom_EUc.2010.10.01.dat -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARdom_EUc.2010.10.01.dat.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARdom_EUc.2010.10.01.dat.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARdom_EUc.2010.10.01.dat.gz + +> MARini (MARini_EUc.2010.10.01.DAT) + +MARdyn.DAT +MARsol.DAT +MARsvt.DAT +tar: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MAR*.DAT -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARini_EUc.2010.10.01.DAT.tar +gzip: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARini_EUc.2010.10.01.DAT.tar -> /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARini_EUc.2010.10.01.DAT.tar.gz +smput: /scratch/tdethinne/NST_EUc.10.10.01-31/output/MARini_EUc.2010.10.01.DAT.tar.gz -> /climato_tmp1/tdethinne/MAR/out/EUc/input/NESTOR/2010/MARini_EUc.2010.10.01.DAT.tar.gz + +---- 8 ---- Final job check + +EUc101001o job executed successfully on linux + +Tue 26 Sep 12:08:54 CEST 2023 + diff --git a/MAR/code_mar/EUd101001o.e95011 b/MAR/code_mar/EUd101001o.e95011 new file mode 100644 index 0000000000000000000000000000000000000000..c79e9bc667a40c4aa193b705cee924a13e08e687 --- /dev/null +++ b/MAR/code_mar/EUd101001o.e95011 @@ -0,0 +1,194 @@ + +---- 1 ---- Initialisation + + +---- 2 ---- Job informations + +Begin time : 01/10/2010 +End time : 31/10/2010 +Domain : EUd (/climato_tmp1/tdethinne/MAR/sim/EUd) + +Date : Tue 26 Sep 12:07:39 CEST 2023 +Host : srv7 +Work directory: /scratch/tdethinne +Messages in : /climato_tmp1/tdethinne/MAR/msg + +---- 3 ---- Work directory + + +---- 4 ---- input data files + + + > ECM.2010.10.01-05.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.01-05.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.01-05.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.01-05.EUR.nc.gz + + > ECM.2010.10.06-10.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.06-10.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.06-10.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.06-10.EUR.nc.gz + + > ECM.2010.10.11-15.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.11-15.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.11-15.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.11-15.EUR.nc.gz + + > ECM.2010.10.16-20.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.16-20.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.16-20.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.16-20.EUR.nc.gz + + > ECM.2010.10.21-25.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.21-25.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.21-25.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.21-25.EUR.nc.gz + + > ECM.2010.10.26-31.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.10.26-31.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.26-31.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.10.26-31.EUR.nc.gz + + > ECM.2010.11.01-05.EUR.nc + +smget: /MARin3/ERA-5-EUR/2010/ECM.2010.11.01-05.EUR.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.11.01-05.EUR.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ECM.2010.11.01-05.EUR.nc.gz + + > ETOPO + +smget: /climato_tmp1/fettweis/MAR/in/ETOPO/etopo.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ETOPO/etopo.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ETOPO/etopo.nc.gz + + > ETOPO1 + +smget: /climato_tmp1/fettweis/MAR/in/ETOPO1/etopo1.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ETOPO1/etopo1.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ETOPO1/etopo1.nc.gz + + > ICEmask + +smget: /climato_tmp1/fettweis/MAR/in/ICEmask/ICEmask.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/ICEmask/ICEmask.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/ICEmask/ICEmask.nc.gz + + > FAO + +smget: /climato_tmp1/fettweis/MAR/in/FAO/FAO_SOIL.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/FAO_SOIL.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/FAO_SOIL.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/TEXUNIT.ASC.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/TEXUNIT.ASC.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/TEXUNIT.ASC.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/SOILPARAMETER.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/SOILPARAMETER.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/SOILPARAMETER.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/FAO/AFRmax-alb.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/AFRmax-alb.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/FAO/AFRmax-alb.nc.gz + + > SOIL + +smget: /climato_tmp1/fettweis/MAR/in/SOIL/GSWP-SOIL.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/SOIL/GSWP-SOIL.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/SOIL/GSWP-SOIL.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/SOIL/HWSDglob.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/SOIL/HWSDglob.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/SOIL/HWSDglob.nc.gz + + > VEGE + +smget: /climato_tmp1/fettweis/MAR/in/VEGE/AFRveg_IGBP.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/AFRveg_IGBP.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/AFRveg_IGBP.nc.gz +smget: /climato_tmp1/fettweis/MAR/in/VEGE/BELveg_IRM.asc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/BELveg_IRM.asc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/BELveg_IRM.asc.gz +smget: /climato_tmp1/fettweis/MAR/in/VEGE/EURveg_IGBP.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/EURveg_IGBP.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/EURveg_IGBP.nc.gz + + > GlobCover V.2.2 Land Cover + +smget: /climato_tmp1/fettweis/MAR/in/VEGE/glcesa3a.nc.gz -> /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/glcesa3a.nc.gz +uc: /scratch/tdethinne/NST_EUd.10.10.01-31/input/VEGE/glcesa3a.nc.gz + + > MERRA2 LAI/GLF data set + + +---- 5 ---- Stock initialisation + + +---- 6 ---- NESTOR launch + +9.45user 2.11system 0:33.33elapsed 34%CPU (0avgtext+0avgdata 896216maxresident)k +2281352inputs+547832outputs (10major+428858minor)pagefaults 0swaps + +NESTOR run: OK (Tue 26 Sep 12:09:09 CEST 2023) + +---- 7 ---- Backup: NESTOR output files + + +> output directory content + +total 273876 +-rw------- 1 tdethinne users 1317 Sep 26 12:08 MARdim.inc +-rw------- 1 tdethinne users 937 Sep 26 12:08 MARdim.inc_old +-rw------- 1 tdethinne users 1511 Sep 26 12:08 mardim_mod.f90 +-rw------- 1 tdethinne users 2124525 Sep 26 12:08 MARdom.dat +-rw------- 1 tdethinne users 6163500 Sep 26 12:08 MARdyn.DAT +-rw------- 1 tdethinne users 32405500 Sep 26 12:09 MARglf.DAT +-rw------- 1 tdethinne users 181805500 Sep 26 12:09 MARlbc.DAT +-rw------- 1 tdethinne users 3436 Sep 26 12:08 MAR_LB.inc_old +-rw------- 1 tdethinne users 5404500 Sep 26 12:09 MARsic.DAT +-rw------- 1 tdethinne users 1425776 Sep 26 12:08 MARsol.DAT +-rw------- 1 tdethinne users 136 Sep 26 12:08 MAR_SV.inc +-rw------- 1 tdethinne users 136 Sep 26 12:08 MAR_SV.inc_nv +-rw------- 1 tdethinne users 200 Sep 26 12:08 mar_sv_mod.f90 +-rw------- 1 tdethinne users 2462568 Sep 26 12:08 MARsvt.DAT +-rw------- 1 tdethinne users 2329 Sep 26 12:08 MAR_TV.inc_old +-rw------- 1 tdethinne users 48604500 Sep 26 12:09 MARubc.DAT + +> MAR*.inc* (MARdcl_EUd.2010.10.01.inc) + +MARdim.inc +MARdim.inc_old +MAR_LB.inc_old +MAR_SV.inc +MAR_SV.inc_nv +MAR_TV.inc_old +tar: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MAR*.inc* -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARdcl_EUd.2010.10.01.inc.tar +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARdcl_EUd.2010.10.01.inc.tar -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARdcl_EUd.2010.10.01.inc.tar + +> MARlbc (MARlbc_EUd.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARlbc_EUd.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARlbc_EUd.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARlbc_EUd.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARlbc_EUd.2010.10.01-31.DAT.gz +If any trouble here, MARlbc*.DAT is likely to become part of MARini*DAT + +> MARglf (MARglf_EUd.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARglf_EUd.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARglf_EUd.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARglf_EUd.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARglf_EUd.2010.10.01-31.DAT.gz +If any trouble here, MARglf*.DAT is likely to become part of MARini*DAT + +> MARsic (MARsic_EUd.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARsic_EUd.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARsic_EUd.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARsic_EUd.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARsic_EUd.2010.10.01-31.DAT.gz +If any trouble here, MARsic*.DAT is likely to become part of MARini*DAT + +> MARubc (MARubc_EUd.2010.10.01-31.DAT) + +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARubc_EUd.2010.10.01-31.DAT -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARubc_EUd.2010.10.01-31.DAT.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARubc_EUd.2010.10.01-31.DAT.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARubc_EUd.2010.10.01-31.DAT.gz +If any trouble here, MARubc*.DAT is likely to become part of MARini*DAT + +> MARdom (MARdom_EUd.2010.10.01.dat) + +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARdom_EUd.2010.10.01.dat -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARdom_EUd.2010.10.01.dat.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARdom_EUd.2010.10.01.dat.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARdom_EUd.2010.10.01.dat.gz + +> MARini (MARini_EUd.2010.10.01.DAT) + +MARdyn.DAT +MARsol.DAT +MARsvt.DAT +tar: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MAR*.DAT -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARini_EUd.2010.10.01.DAT.tar +gzip: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARini_EUd.2010.10.01.DAT.tar -> /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARini_EUd.2010.10.01.DAT.tar.gz +smput: /scratch/tdethinne/NST_EUd.10.10.01-31/output/MARini_EUd.2010.10.01.DAT.tar.gz -> /climato_tmp1/tdethinne/MAR/out/EUd/input/NESTOR/2010/MARini_EUd.2010.10.01.DAT.tar.gz + +---- 8 ---- Final job check + +EUd101001o job executed successfully on linux + +Tue 26 Sep 12:09:26 CEST 2023 + diff --git a/MAR/code_mar/MAR_pp.def b/MAR/code_mar/MAR_pp.def new file mode 100644 index 0000000000000000000000000000000000000000..8302f108e0236cab08f760f4837cb0ab30a8a493 --- /dev/null +++ b/MAR/code_mar/MAR_pp.def @@ -0,0 +1,9 @@ +#define SB .true. /* Surface Boundary: modified externally (from Campain Data) */ +#define KC .true. /* TURBULENCE: T.K.E.(mz1):= T.K.E.(mz) */ +#define TZ .true. /* Z0 (Momentum) (typical value in polar models) */ +#define II .true. /* Search new Ice/Snow Interface */ +#define XF .true. /* For Xavier Fettweis */ +#define AC .true. /* For Cecile Agosta */ +#define up .true. /* For having more precip along the margin */ +#define SU .true. /* Slush Switch */ +#define GP .true. /* Soil /Vegetation Model: LAI, GLF Variations NOT prescrib. */ \ No newline at end of file diff --git a/MAR/code_mar/advbot_4.f90 b/MAR/code_mar/advbot_4.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1e64d1e689d164ad4b805b8f36e4adc0e0fae4aa --- /dev/null +++ b/MAR/code_mar/advbot_4.f90 @@ -0,0 +1,167 @@ +#include "MAR_pp.def" +subroutine ADVbot_4(flu, vec, aa0, aa1, aa2, aa3, aa4, & + cnp, cnm, sip, sim, sid, mmm, logpos) + ! + + ! +------------------------------------------------------------------------+ + ! | MAR ADVECTION 16-12-2000 MAR | + ! | subroutine ADVbot_4 includes the Advection Contribution | + ! | for positive definite scalar Variables | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: vec : variable to advect | + ! | ^^^^^ aa0,aa1,aa2,aa3,aa4: Work Area | + ! | cnp : Courant Number (x+ Cell) | + ! | cnm : Courant Number (x- Cell) | + ! | sip,sim,sid : Work Area | + ! | mmm : Dimension of the Variables | + ! | logpos : Positive definite Constraint Switch | + ! | | + ! | OUTPUT: flu : advection fluxes at each cell boundaries | + ! | ^^^^^^ | + ! | | + ! | METHOD : The Flux Form of the Equation is solved: | + ! | ^^^^^^^^ d(Qp*)/dt + d(uQp*)/dx + d(vQp*)/dy + d(sQp*)/ds = 0 | + ! | The scheme is that of Bott (1989) MWR, 117, 1007-1009 | + ! | and Bott (1989) MWR, 117, 2635 (Table 1) | + ! | | + ! | # OPTIONS: STANDARD: Bott Scheme, order 0 (zero) | + ! | # ^^^^^^^^ #B+ #B2 Bott Scheme, order 2 | + ! | # #B+ #B4 Bott Scheme, order 4 | + ! | | + ! +------------------------------------------------------------------------+ + ! + + use marphy + ! + + implicit none + ! + + integer mmm, logpos + ! + + real flu(0:mmm) + real vec(0:mmm) + real aa0(0:mmm) + real aa1(0:mmm) + real aa2(0:mmm) + real aa3(0:mmm) + real aa4(0:mmm) + real cnp(0:mmm) + real cnm(0:mmm) + real sip(0:mmm) + real sim(0:mmm) + real sid(0:mmm) + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + integer i, im1, ip1, im2, ip2 + real epsadv, propo1, propo2, propo3, propo4, propo5 + real prone1, prone2, prone3, prone4, prone5 + ! + + ! + + ! +--DATA + ! + ==== + ! + + data epsadv/1.e-6/ + ! + + do i = 0, mmm + im1 = max(i - 1, 0) + ip1 = min(i + 1, mmm) + im2 = max(i - 2, 0) + ip2 = min(i + 2, mmm) + ! + + ! + + ! +--Approximation of vec + ! + -------------------- + ! + + ! +--Polynomial Fitting, as in Bott (1989) MWR, 117, 2635 (Table 1) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + aa0(i) = vec(i) +#if(B2) + ! aa0, aa1, aa2 : Lagrange Polynomial Coefficients + ! (see Bott 1989 MWR Table 1 p.2635) + aa0(i) = (aa0(i) - vec(ip1) - vec(im1)) / 24.0 + aa1(i) = 0.50 * (vec(ip1) - vec(im1)) + aa2(i) = 0.50 * (vec(ip1) + vec(im1)) - vec(i) +#endif + ! + + aa0(i) = (9.0 * vec(ip2) - 116.0 * vec(ip1) + 2134.0 * vec(i) & + - 116.0 * vec(im1) + 9.0 * vec(im2)) / 1920.0 + aa1(i) = (-5.0 * vec(ip2) + 34.0 * vec(ip1) & + - 34.0 * vec(im1) + 5.0 * vec(im2)) / 48.0 + aa2(i) = (-3.0 * vec(ip2) + 36.0 * vec(ip1) - 66.0 * vec(i) & + + 36.0 * vec(im1) - 3.0 * vec(im2)) / 48.0 + aa3(i) = (vec(ip2) - 2.0 * vec(ip1) & + + 2.0 * vec(im1) - vec(im2)) / 12.0 + aa4(i) = (vec(ip2) - 4.0 * vec(ip1) + 6.0 * vec(i) & + - 4.0 * vec(im1) + vec(im2)) / 24.0 + enddo + ! + + ! +--Integral (7), Bott 1989 MWR 117 p. 1007 + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = 0, mmm + propo1 = 1.0 - 2.0 * cnp(i) + propo2 = propo1 * propo1 + propo3 = propo2 * propo1 + propo4 = propo3 * propo1 + propo5 = propo4 * propo1 + sip(i) = aa0(i) * cnp(i) & + + (aa1(i) / 8.0) * (1.0 - propo2) & + + (aa2(i) / 24.0) * (1.0 - propo3) & + + (aa3(i) / 64.0) * (1.0 - propo4) & + + (aa4(i) / 160.0) * (1.0 - propo5) + enddo + ! + + ! +--Integral (8), Bott 1989 MWR 117 p. 1008 + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = 0, mmm + ip1 = min(i + 1, mmm) + prone1 = 1.00 - 2.0 * cnm(i) + prone2 = prone1 * prone1 + prone3 = prone2 * prone1 + prone4 = prone3 * prone1 + prone5 = prone4 * prone1 + sim(i) = aa0(ip1) * cnm(i) & + - (aa1(ip1) / 8.0) * (1.0 - prone2) & + + (aa2(ip1) / 24.0) * (1.0 - prone3) & + - (aa3(ip1) / 64.0) * (1.0 - prone4) & + + (aa4(ip1) / 160.0) * (1.0 - prone5) + enddo + ! + + ! + + ! +--Positive Definite Constraint, Bott 1989, MWR 117 (14) p.1008 + ! + ------------------------------------------------------------ + ! + + if(logpos == 1) then + ! + + ! +--Positive Definite Constraint is applied + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = 0, mmm + sip(i) = max(sip(i), zero) + sim(i) = max(sim(i), zero) + sid(i) = aa0(i) + aa2(i) / 12.0 & + + aa4(i) / 80.0 + enddo + ! + + do i = 0, mmm + im1 = max(i - 1, 0) + sid(i) = max(sid(i), sip(i) + sim(im1) + epsadv) + enddo + ! + + do i = 0, mmm + ip1 = min(i + 1, mmm) + flu(i) = sip(i) * vec(i) / sid(i) - sim(i) * vec(ip1) / sid(ip1) + enddo + ! + + else + ! + + ! +--Positive Definite Constraint is not applied + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = 0, mmm + flu(i) = sip(i) - sim(i) + enddo + ! + + endif + ! + + return +endsubroutine ADVbot_4 diff --git a/MAR/code_mar/aftp11677 b/MAR/code_mar/aftp11677 new file mode 100644 index 0000000000000000000000000000000000000000..624f2c25cd4d25748c8ea0feffb492696acbd9eb --- /dev/null +++ b/MAR/code_mar/aftp11677 @@ -0,0 +1,72 @@ +ECM.2010.01.01-05.EUR.nc.gz +ECM.2010.01.06-10.EUR.nc.gz +ECM.2010.01.11-15.EUR.nc.gz +ECM.2010.01.16-20.EUR.nc.gz +ECM.2010.01.21-25.EUR.nc.gz +ECM.2010.01.26-31.EUR.nc.gz +ECM.2010.02.01-05.EUR.nc.gz +ECM.2010.02.06-10.EUR.nc.gz +ECM.2010.02.11-15.EUR.nc.gz +ECM.2010.02.16-20.EUR.nc.gz +ECM.2010.02.21-25.EUR.nc.gz +ECM.2010.02.26-28.EUR.nc.gz +ECM.2010.03.01-05.EUR.nc.gz +ECM.2010.03.06-10.EUR.nc.gz +ECM.2010.03.11-15.EUR.nc.gz +ECM.2010.03.16-20.EUR.nc.gz +ECM.2010.03.21-25.EUR.nc.gz +ECM.2010.03.26-31.EUR.nc.gz +ECM.2010.04.01-05.EUR.nc.gz +ECM.2010.04.06-10.EUR.nc.gz +ECM.2010.04.11-15.EUR.nc.gz +ECM.2010.04.16-20.EUR.nc.gz +ECM.2010.04.21-25.EUR.nc.gz +ECM.2010.04.26-30.EUR.nc.gz +ECM.2010.05.01-05.EUR.nc.gz +ECM.2010.05.06-10.EUR.nc.gz +ECM.2010.05.11-15.EUR.nc.gz +ECM.2010.05.16-20.EUR.nc.gz +ECM.2010.05.21-25.EUR.nc.gz +ECM.2010.05.26-31.EUR.nc.gz +ECM.2010.06.01-05.EUR.nc.gz +ECM.2010.06.06-10.EUR.nc.gz +ECM.2010.06.11-15.EUR.nc.gz +ECM.2010.06.16-20.EUR.nc.gz +ECM.2010.06.21-25.EUR.nc.gz +ECM.2010.06.26-30.EUR.nc.gz +ECM.2010.07.01-05.EUR.nc.gz +ECM.2010.07.06-10.EUR.nc.gz +ECM.2010.07.11-15.EUR.nc.gz +ECM.2010.07.16-20.EUR.nc.gz +ECM.2010.07.21-25.EUR.nc.gz +ECM.2010.07.26-31.EUR.nc.gz +ECM.2010.08.01-05.EUR.nc.gz +ECM.2010.08.06-10.EUR.nc.gz +ECM.2010.08.11-15.EUR.nc.gz +ECM.2010.08.16-20.EUR.nc.gz +ECM.2010.08.21-25.EUR.nc.gz +ECM.2010.08.26-31.EUR.nc.gz +ECM.2010.09.01-05.EUR.nc.gz +ECM.2010.09.06-10.EUR.nc.gz +ECM.2010.09.11-15.EUR.nc.gz +ECM.2010.09.16-20.EUR.nc.gz +ECM.2010.09.21-25.EUR.nc.gz +ECM.2010.09.26-30.EUR.nc.gz +ECM.2010.10.01-05.EUR.nc.gz +ECM.2010.10.06-10.EUR.nc.gz +ECM.2010.10.11-15.EUR.nc.gz +ECM.2010.10.16-20.EUR.nc.gz +ECM.2010.10.21-25.EUR.nc.gz +ECM.2010.10.26-31.EUR.nc.gz +ECM.2010.11.01-05.EUR.nc.gz +ECM.2010.11.06-10.EUR.nc.gz +ECM.2010.11.11-15.EUR.nc.gz +ECM.2010.11.16-20.EUR.nc.gz +ECM.2010.11.21-25.EUR.nc.gz +ECM.2010.11.26-30.EUR.nc.gz +ECM.2010.12.01-05.EUR.nc.gz +ECM.2010.12.06-10.EUR.nc.gz +ECM.2010.12.11-15.EUR.nc.gz +ECM.2010.12.16-20.EUR.nc.gz +ECM.2010.12.21-25.EUR.nc.gz +ECM.2010.12.26-31.EUR.nc.gz diff --git a/MAR/code_mar/cva_filtering.f90 b/MAR/code_mar/cva_filtering.f90 new file mode 100644 index 0000000000000000000000000000000000000000..578494de828cc38452a1b56921ec9a4ffaa1148a --- /dev/null +++ b/MAR/code_mar/cva_filtering.f90 @@ -0,0 +1,63 @@ +subroutine cva_filtering(wrk1, level1) + + ! +------------------------------------------------------------------------+ + ! | MAR CONVECTION 11-01-2016 MAR | + ! | | + ! | subroutine CVA_filtering | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + + implicit none + + ! weight : weight for the central pixel + real, parameter :: weight = 8 + + integer i, j, k, m + integer l, kk, level1, level2 + real wrk1(mx, my, mz), uu, vv + real wrk2(mx, my), wrk3(mx, my), w + + level2 = min(max(1, level1), mz) + +!$OMP PARALLEL DO private(i,j,k,kk,l,w,uu,vv,wrk3,wrk2) + do kk = 1, level2 + do j = 6, my - 5 + do i = 6, mx - 5 + + wrk3(i, j) = 0 + wrk2(i, j) = 0 + + do k = -1, 1 + do l = -1, 1 + w = 1 + if(l == 0) w = 2 + if(k == 0) w = 2 + if(l == 0 .and. k == 0) w = weight + + if(i + k > mx - 5 .or. i + k < 6) w = 0 + if(j + l > my - 5 .or. j + l < 6) w = 0 + + wrk3(i, j) = wrk3(i, j) + w + wrk2(i, j) = wrk2(i, j) + wrk1(i + k, j + l, kk) * w + enddo + enddo + + wrk2(i, j) = wrk2(i, j) / wrk3(i, j) + enddo + enddo + + do j = 6, my - 5 + do i = 6, mx - 5 + wrk1(i, j, kk) = wrk2(i, j) + enddo + enddo + enddo +!$OMP END PARALLEL DO + +endsubroutine cva_filtering diff --git a/MAR/code_mar/cvagen_mnh.f90 b/MAR/code_mar/cvagen_mnh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..77913dfcde4a8616c4ceb108c741ac7c0d482233 --- /dev/null +++ b/MAR/code_mar/cvagen_mnh.f90 @@ -0,0 +1,819 @@ +#include "MAR_pp.def" +subroutine CVAgen_MNH + ! +------------------------------------------------------------------------+ + ! | MAR CONVECTION Mon 25-01-2021 MAR | + ! | subroutine CVAgen links MAR to a CONVECTIVE ADJUSMENT procedure | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ itexpe : Experiment Iteration Counter | + ! | itConv : Adjustment Calls Counter | + ! | dt_loc2 : Mass Flux Scheme: Time Step | + ! | | + ! | dx : grid spacing (m) | + ! | dy : grid spacing (m) | + ! | tairDY(mx,my,mz) : air temperature (K) | + ! | qiHY(mx,my,mz) : air cloud crystals conc. (kg/kg) | + ! | qsHY(mx,my,mz) : air snow flakes conc. (kg/kg) | + ! | qwHY(mx,my,mz) : air cloud droplets conc. (kg/kg) | + ! | qrHY(mx,my,mz) : air rain drops conc. (kg/kg) | + ! | | + ! | INPUT / OUTPUT: dx : grid spacing (m) | + ! | ^^^^^^^^^^^^^^^ dy : grid spacing (m) | + ! | pktaDY(mx,my,mz) : air temperature (K) | + ! | qvDY(mx,my,mz) : air specific humidity (kg/kg) | + ! | rainHY(mx,my) : rain Precipitation (m) | + ! | rainCA(mx,my) : rain Precipitation (m) | + ! | | + ! | REFER. : 1) MesoNH CONVECTIVE ADJUSMENT Routine | + ! | ^^^^^^^^ 2) cfr. head of subroutine CONVECTION | + ! | | + ! | # OPTIONS: #pb Limited Scalar Operations ==> NO vectorization | + ! | # ^^^^^^^^ #EW Energy and Water ?Conservation | + ! | # #AN Anabatic Wind Parameterization | + ! | # #GU Gust Front Parameterization | + ! | # #gu Gust Front Parameterization (NO vectorization) | + ! | # #GW Gust Front Parameterization (OUTPUT) | + ! | | + ! | MODIF. HGall?e: 18-11-2004: Adaptation to CVAmnh.f90.laurent | + ! | ^^^^^^ (Argument kensbl of CONVECTION removed) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_te + use mar_hy + use mar_ca + use mar_pb + use mar_sl + use mar_ra + use marmagic +#if(EW) + use mar_ew +#endif + + implicit none +#if(AN) + real rANA, hANA(mx, my) + common / CVAgen_MNH_ANA / rANA, hANA +#endif +#if(GW) + integer i_Gmax, k_Gmax, i_Gmin, k_Gmin + real waGmax, TaGmin +#endif +#if(GU) + real waGust(mx, my, mzz) + real TaGust(mx, my, mz), dtxLoc + common / CVAgen_MNHgust / TaGust, dtxLoc +#endif + + logical Odeep, Oshal + common / CVAgen_MNH_lt / Odeep, Oshal + real pdtCVx, pdtCV, PTdcv, PTscv + integer nntCV0, jjtCV0, iitCV0 + common / CVAgen_MNH_rt / pdtCVx, pdtCV, PTdcv, PTscv + common / CVAgen_MNH_nt / nntCV0, jjtCV0, iitCV0 + + integer KLON_0, KLEV_0 + parameter(KLON_0=KLON, KLEV_0=KLEV) + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + character * 3 vectcv + integer klcvOK, dt_loc2 + integer iklon, klc + + logical Odeep0, Oshal0, Orset0, Odown0, OsetA0, OCvTC0 + integer kidia0, kfdia0, kbdia0, ktdia0, kIce_0, kensbl + + real pdtCV0, PTdcv0, PTscv0 + real Pdxdy0(KLON) + real P_pa_0(KLON, KLEV) + real P_za_0(KLON, KLEV) + real P_Ta_0(KLON, KLEV) + real P_Qa_0(KLON, KLEV) + real P_Qw_0(KLON, KLEV) + real P_Qi_0(KLON, KLEV) + real P_Ua_0(KLON, KLEV) + real P_Va_0(KLON, KLEV) + real P_Wa_0(KLON, KLEV) + real P_TKE(KLON, KLEV) + real ratio_rfsf, ratio_temp, ratio_prec + + integer locCVA + real OK_CVA, MAX_TT(mx, my), min_TT_off + real wrk1(mx, my, mz), wrk1_mx +#if(AN) + real bANA, zANA, wANA(mx, my, mz), zlev + real dANA, vANA, xANA +#endif + +#if(EW) + ! +--Diagnostic Variables + ! + -------------------- + integer irmx, jrmx, iter_0 + real rr_max, temp_r, energ0, water0, waterb +#endif + + ! +--Mass Flux convective Scheme: Set Up DATA + ! + ======================================== + + data kidia0/1/ + ! +... kidia0 : value of the first point in x + + data kbdia0/1/ + ! +... kbdia0 : vertical computations: lowest level + + data ktdia0/1/ + ! +... ktdia0 : vertical computations: over KLEV + 1 - ktdia0 levels + + data pdtCV0/600./ + !XF + ! +... pdtCV0 : time interval between 2 CALLs of deep convection + + data Odeep0/.true./ + ! +... Odeep0 : Deep Convection Switch + + data Oshal0/.true./ + ! +... Oshal0 : Shallow Convection Switch + + data Orset0/.true./ + ! +... Orset0 : refresh or not all tendencies at every call + + data Odown0/.true./ + ! +... Odown0 : take or not convective downdrafts into account + + data kIce_0/1/ + ! +... kIce_0 : flag for ice ( 1 = yes, + ! + 0 = no ice ) + data OsetA0/.true./ + ! +... OsetA0 : logical to set convective adjustment time by user + + data PTdcv0/1200./ + ! +... PTdcv0 : user defined deep adjustment time + + data PTscv0/1200./ + ! +... PTscv0 : user defined shallow adjustment time + + data kensbl/3/ + ! +... kensbl : value for a "climate" run + + data OCvTC0/.false./ + ! +... OCvTC0 : flag to compute convective transport + ! + for chemical tracer + + ! XF + data min_TT_off/270.15/ + ! + min_TT_off : temperature min for switching on the convect. adjust. + +#if(AN) + ! +--Anabatic Breeze Parameterization + ! + -------------------------------- + ! xANA : Characteristic Mountain Width Scale + data xANA/10.0e+3/ + ! vANA : Characteristic Mountain Breeze Wind Scale + data vANA/4.0e+0/ +#endif + + ! +--SET UP CONVECTION SWITCHES + ! + ========================== + + do i = 1, mx; do j = 1, my + if(adj_CA(i, j) == 0 .or. itexpe == 0) then + drr_CA(i, j) = 0. + dss_CA(i, j) = 0. + do k = 1, mz + dpktCA(i, j, k) = 0. + dqv_CA(i, j, k) = 0. + dqw_CA(i, j, k) = 0. + dqi_CA(i, j, k) = 0. + enddo + endif + enddo; + enddo + + if(iterun == 0) then + !XF + if(MFLX_d) then + Odeep = MFLX_d + else + Odeep = Odeep0 + write(6, *) 'Deep Convection Switch set to ', Odeep + endif + if(MFLX_s) then + Oshal = MFLX_s + else + Oshal = Oshal0 + write(6, *) 'Shallow Convection Switch set to ', Oshal + endif + + if(tMFLXd > 0.) then + pdtCVx = tMFLXd + else + !XF + pdtCVx = max(600., min(pdtCV0, 4.*dt)) +#if(AC) + pdtCVx = 1800. +#endif +#if(GL) + pdtCVx = 1200. +#endif + write(6, *) 'Interv. Convection call set to ', pdtCVx + endif + + if(aMFLXd > 0.) then + PTdcv = aMFLXd + else + ! OsetA0 must be .true. + PTdcv = max(600., min(PTdcv0, 4.*dt)) +#if(GL) + PTdcv = 1200. +#endif +#if(AC) + PTdcv = 1800. +#endif + write(6, *) 'Deep Convection Time Scale set to ', PTdcv + endif + if(aMFLXs > 0.) then + PTscv = aMFLXs + else + ! OsetA0 must be .true. + PTscv = max(600., min(PTscv0, 4.*dt)) +#if(GL) + ! PTscv = 2 * PTdcv + PTscv = 1200 +#endif +#if(AC) + PTscv = 1800. +#endif + write(6, *) 'Shallow Convection Time Scale set to ', PTscv + endif + + endif + + ! +--Set UP Anabatic Breeze Parameterization + ! + ======================================= + + if(itexpe == 0) then +#if(GU) + open(unit=70, status='new', file='W_GUST.out') + rewind 70 + dtxLoc = dt_loc2 / dx +#endif +#if(AN) + ! rANA : Subgrid Mountain Breeze: Horizontal Divergence + ! + (Factor 2 included for 2 horizontal Directions) + rANA = 2.0d+0 * vANA / xANA + do j = 1, my + do i = 1, mx + dANA = sh(i, j) & + - 0.25 * (sh(im1(i), j) + sh(ip1(i), j) & + + sh(i, jm1(j)) + sh(i, jp1(j))) + ! hANA: D("Subgrid Mountain" Height - "Resolved Mountain" Height) + hANA(i, j) = abs(dANA) * max(zero, dx / xANA - unun) + hANA(i, j) = sh(i, j) * 2.0d+0 + enddo + enddo +#endif +#if(GU) + do k = 1, mz + do j = 1, my + do i = 1, mx + TaGust(i, j, k) = 0. + enddo + enddo + enddo +#endif + + ! +--Set UP Verification + ! + =================== + + klcvOK = mx2 * my2 + klcvOK = 1 + if(klon /= klcvOK) then + if(klon > 1) then + vectcv = 'NON' + else + vectcv = ' ' + endif + write(6, 6000) klon, klcvOK, vectcv +6000 format(/, '++++++++ klon (mardim_mod.f90) =', i6, ' .NE.', i6, ' ++++++++++++++', & + /, '++++++++ NOT adapted to a ', a3, ' vectorized code ++++++++++++++', & + /, '++++++++ BAD SET UP of #pb or klon parameter ++++++++++++++', & + /, ' ==> !?%@&* Emergency EXIT in CVAgen_MNH') + stop + endif + +#if(EW) + ! +--Mass Flux convective Scheme: Set Up Energy/Water Verification + ! + ============================================================= + energ0 = 0.0 + water0 = 0.0 + iter_0 = 0 + write(6, 600) +600 format(/, ' CVAgen_MNH: Energy/Water Verification Set UP') +#endif + endif + + ! +--Mass Flux Scheme: Set Up Time Stepping + ! + ====================================== + + dt_loc2 = dt ! cvagen_mnh is called every time step + + if(iterun == 0) then + + adj_CA = -1 + + pdtCV = pdtCVx +#if(xx) + pdtCV = min(dt_loc2, pdtCVx) +#endif + if(pdtCV < dt_loc2) then + pdtCV = dt_loc2 + jjtCV0 = 1 + else + jjtCV0 = pdtCV / dt_loc2 + ! +... jjtCV0 : Number of Diffusion Steps for 1 Convective Step + + pdtCV = dt_loc2 * jjtCV0 + ! +... pdtCV : Calibrated Convection Time Step + + endif + iitCV0 = 0 + endif + + ! +--Update Convective Mass Flux + ! + =========================== + + if(mod(iitCV0, jjtCV0) == 0) then + +#if(AN) + ! +--Contribution from Subgrid Mountain Breeze + ! + ----------------------------------------- + do k = 1, mz + do j = 1, my + do i = 1, mx + zlev = gplvDY(i, j, k) * grvinv + bANA = min(zlev, zi__TE(i, j)) + zANA = hANA(i, j) + 2.0 * bANA + if(zlev <= zANA .and. & + TairSL(i, j) > tairDY(i, j, mz)) then + ! Half Integrated Horizontal Divergence + wANA(i, j, k) = rANA * 0.5 * bANA + else + wANA(i, j, k) = 0.0 + endif + enddo + enddo + enddo +#endif + +#if(GW) + ! +--Contribution from the Cold Air Pool + ! + ----------------------------------- + waGmax = 0. + TaGmin = 0. +#endif +#if(GU) + do k = mz, 2, -1 + do j = jp11, my1 + do i = ip11, mx1 + waGust(i, j, k) = ((4.0 * TaGust(i, j, k) & + - TaGust(ip1(i), j, k) - TaGust(i, jp1(j), k) & + - TaGust(im1(i), j, k) - TaGust(i, jm1(j), k)) & + * (0.50e6 / dx) & + * (gpmiDY(i, j, k) - gpmiDY(i, j, k + 1)) & + + waGust(i, j, k + 1) * gplvDY(i, j, k + 1)) & + / gplvDY(i, j, k) & + * max(zero, sign(unun, zi__TE(i, j) & + - gplvDY(i, j, k) * grvinv)) + waGust(i, j, k) = max(zero, waGust(i, j, k)) +#endif +#if(GW) + if(TaGmin < TaGust(i, j, k)) then + TaGmin = TaGust(i, j, k) + i_Gmin = i + k_Gmin = k + endif + if(waGmax < waGust(i, j, k)) then + waGmax = waGust(i, j, k) + i_Gmax = i + k_Gmax = k + endif +#endif +#if(GU) + enddo + enddo + enddo +#endif +#if(GW) + i_Gmax = max(2, i_Gmax) + i_Gmax = min(mx1, i_Gmax) + k_Gmax = max(1, k_Gmax) + k_Gmax = min(mz, k_Gmax) + write(70, 700) itexpe, & + i_Gmax, k_Gmax,(waGust(i, 1, k_Gmax), i=i_Gmax - 1, i_Gmax + 1), & + i_Gmin, k_Gmin,(TaGust(i, 1, k_Gmax), i=i_Gmax - 1, i_Gmax + 1), & + grvinv * gplvDY(i_Gmax, 1, k_Gmax), zi__TE(i_Gmax, 1) +700 format(2i6, i4, 3f9.3, i6, i4, 3f9.3, 2f12.0) +#endif + + ! +--Mass Flux convective Scheme: Set Up Vertical Profiles + ! + ----------------------------------------------------- + + kfdia0 = klon + ! +... kfdia0 : value of the last point in x + + iklon = 0 + + !XF + max_TT = -273.15 + + !$OMP PARALLEL do & + !$OMP firstprivate(i,k,klc,iklon,OK_CVA, & + !$OMP kidia0, kfdia0, kbdia0, ktdia0, & + !$OMP pdtCV , Odeep , Oshal , Orset0, Odown0, kIce_0, & + !$OMP OsetA0, PTdcv , PTscv , & + !$OMP kensbl,ratio_rfsf ,ratio_temp,ratio_prec, & + !$OMP P_pa_0, P_za_0, Pdxdy0, & + !$OMP P_Ta_0, P_Qa_0, P_Qw_0, P_Qi_0, P_Ua_0, P_Va_0, P_Wa_0, & + !$OMP Kstep1, PdTa_1, PdQa_1, PdQw_1, PdQi_1, & + !$OMP Pdrr_1, Pdss_1, & + !$OMP PuMF_1, PdMF_1, Pfrr_1, Pfss_1, Pcape1, K_CbT1, K_CbB1, & + !$OMP OCvTC0, P_CH_0, PdCH_1,P_TKE) & + !$OMP schedule(dynamic) + + do j = 6, my - 5 + do i = 6, mx - 5 + + iklon = 1 + iklon + iklon = 1 + + Pdxdy0(iklon) = dx3(i, j) * dy3(i, j) + ! +... Pdxdy0 : grid area [m2] + + do klc = 1, klev + k = mzz - klc + P_pa_0(iklon, klc) = (pstDY(i, j) * sigma(k) + ptopDY) * 1.e3 + ! +... P_pa_0 : pressure in layer [Pa] + + P_za_0(iklon, klc) = gplvDY(i, j, k) * grvinv + ! +... P_za_0 : height of model layer [m] + + P_Ta_0(iklon, klc) = tairDY(i, j, k) + ! +... P_Ta_0 : grid scale T at time t [K] + + !XF + max_TT(i, j) = max(max_TT(i, j), tairDY(i, j, k)) + !XF! P_Qa_0 : grid scale water vapor at time t [kg/kg] + P_Qa_0(iklon, klc) = qvDY(i, j, k) + ! P_Qw_0 : grid scale Cloud drops at time t [kg/kg] + P_Qw_0(iklon, klc) = qwHY(i, j, k) / (1.0 - qwHY(i, j, k)) + !XF bug ? + ! P_Qi_0 : grid scale Cloud ice at time t [kg/kg] + P_Qi_0(iklon, klc) = qiHY(i, j, k) / (1.0 - qiHY(i, j, k)) + !XF bug ? + ! P_Ua_0 : grid scale hor. wind u at time t [m/s] + P_Ua_0(iklon, klc) = uairDY(i, j, k) + ! P_Va_0 : grid scale hor. wind v at time t [m/s] + P_Va_0(iklon, klc) = vairDY(i, j, k) + ! P_Wa_0 : grid scale vertic.wind at time t [m/s] + P_Wa_0(iklon, klc) = wairDY(i, j, k) * 0.01 & + + sqrt(2.*ect_TE(i, j, k) / 3.) +#if(AN) + P_Wa_0(iklon, klc) = P_Wa_0(iklon, klc) + wANA(i, j, k) +#endif +#if(GU) + P_Wa_0(iklon, klc) = P_Wa_0(iklon, klc) + waGust(i, j, k) +#endif + + enddo + adj_CA(i, j) = 0. + + if(radsol(i, j) <= 10 .and. tairDY(i, j, mz) <= 283.15 .and. & + tairDY(i, j, mz) < (tairDY(i, j, mz - 1) + tairDY(i, j, mz - 2)) / 2.) & + MAX_TT(i, j) = -273.15 ! night + inversion + tt < 10 deg + + ! +--Mass Flux convective Scheme: iteration, in case of no vectorization + ! + ------------------------------------------------------------------- + + if(MAX_TT(i, j) >= min_tt_off) then + ! + *************** + call CONVECTION( & + KLON_0, KLEV_0, kidia0, kfdia0, kbdia0, ktdia0, & + pdtCV, Odeep, Oshal, Orset0, Odown0, kIce_0, & + OsetA0, PTdcv, PTscv, & + kensbl, & + P_pa_0, P_za_0, Pdxdy0, & + P_Ta_0, P_Qa_0, P_Qw_0, P_Qi_0, P_Ua_0, P_Va_0, P_Wa_0, & + Kstep1, PdTa_1, PdQa_1, PdQw_1, PdQi_1, & + Pdrr_1, Pdss_1, & + PuMF_1, PdMF_1, Pfrr_1, Pfss_1, Pcape1, K_CbT1, K_CbB1, & + OCvTC0, KTCCH0, P_CH_0, PdCH_1, P_TKE) + ! + *************** + + ! +--Mass Flux convective Scheme: products, in case of no vectorization + ! + ------------------------------------------------------------------- + + capeCA(i, j) = Pcape1(iklon) + adj_CA(i, j) = Kstep1(iklon) + drr_CA(i, j) = Pdrr_1(iklon) * dt_loc2 + dss_CA(i, j) = Pdss_1(iklon) * dt_loc2 + + drr_CA(i, j) = max(0., drr_CA(i, j) - dss_CA(i, j)) + !XF Pdrr_1 = pecip total + + ratio_temp = (tairDY(i, j, mz - 1) + tairDY(i, j, mz - 2) & + + tairDY(i, j, mz - 3) + tairDY(i, j, mz - 4)) / 4. + + ratio_prec = drr_CA(i, j) + + ratio_rfsf = max(0., min(1., & + (ratio_temp - rain_snow_limit) / 2.)) + + drr_CA(i, j) = ratio_prec * ratio_rfsf + dss_CA(i, j) = dss_CA(i, j) + ratio_prec * (1.-ratio_rfsf) + + if(isnan(capeCA(i, j))) adj_CA(i, j) = -1 + if(isnan(drr_CA(i, j))) adj_CA(i, j) = -1 + if(isnan(dss_CA(i, j))) adj_CA(i, j) = -1 + if(drr_CA(i, j) > 0.1) adj_CA(i, j) = -1 + if(drr_CA(i, j) < 0) adj_CA(i, j) = -1 + if(dss_CA(i, j) > 0.1) adj_CA(i, j) = -1 + if(dss_CA(i, j) < 0) adj_CA(i, j) = -1 + if(abs(dpktCA(i, j, k)) > 2) adj_CA(i, j) = -1 + if(abs(dqv_CA(i, j, k)) > 0.002) adj_CA(i, j) = -1 + + do klc = 1, klev + k = mzz - klc + + dpktCA(i, j, k) = PdTa_1(iklon, klc) * dt_loc2 / pkDY(i, j, k) + dqv_CA(i, j, k) = PdQa_1(iklon, klc) * dt_loc2 + dqw_CA(i, j, k) = PdQw_1(iklon, klc) * dt_loc2 + dqi_CA(i, j, k) = PdQi_1(iklon, klc) * dt_loc2 +#if(gu) + TaGust(i, j, k) = TaGust(i, j, k) * exp(-dtxLoc * ssvSL(i, j, k)) & + + PdTa_1(iklon, klc) * dt_loc2 + TaGust(i, j, k) = min(TaGust(i, j, k), zero) +#endif + if(isnan(dpktCA(i, j, k))) adj_CA(i, j) = -1 + if(isnan(dqv_CA(i, j, k))) adj_CA(i, j) = -1 + if(isnan(dqw_CA(i, j, k))) adj_CA(i, j) = -1 + if(isnan(dqi_CA(i, j, k))) adj_CA(i, j) = -1 + enddo + endif + + if(adj_CA(i, j) <= 0 .or. MAX_TT(i, j) < min_tt_off) then + capeCA(i, j) = 0. + drr_CA(i, j) = 0. + dss_CA(i, j) = 0. + do klc = 1, klev + k = mzz - klc + dpktCA(i, j, k) = 0. + dqv_CA(i, j, k) = 0. + dqw_CA(i, j, k) = 0. + dqi_CA(i, j, k) = 0. + enddo + endif + + enddo + enddo + !$OMP END PARALLEL DO + + ! +--Mass Flux convective Scheme: iteration, in case of vectorization + ! + ------------------------------------------------------------------- + + if(klon > 1) then + + ! + *************** + call CONVECTION( & + KLON_0, KLEV_0, kidia0, kfdia0, kbdia0, ktdia0, & + pdtCV, Odeep, Oshal, Orset0, Odown0, kIce_0, & + OsetA0, PTdcv, PTscv, & + kensbl, & + P_pa_0, P_za_0, Pdxdy0, & + P_Ta_0, P_Qa_0, P_Qw_0, P_Qi_0, P_Ua_0, P_Va_0, P_Wa_0, & + Kstep1, PdTa_1, PdQa_1, PdQw_1, PdQi_1, & + Pdrr_1, Pdss_1, & + PuMF_1, PdMF_1, Pfrr_1, Pfss_1, Pcape1, K_CbT1, K_CbB1, & + OCvTC0, KTCCH0, P_CH_0, PdCH_1, P_TKE) + ! + *************** + + ! +--Mass Flux convective Scheme: products, in case of vectorization + ! + ------------------------------------------------------------------- + + iklon = 0 + do j = jp11, my1 + do i = ip11, mx1 + iklon = 1 + iklon + + capeCA(i, j) = Pcape1(iklon) + adj_CA(i, j) = Kstep1(iklon) + drr_CA(i, j) = Pdrr_1(iklon) * dt_loc2 + dss_CA(i, j) = Pdss_1(iklon) * dt_loc2 + + do klc = 1, klev + k = mzz - klc + + dpktCA(i, j, k) = PdTa_1(iklon, klc) * dt_loc2 / pkDY(i, j, k) + dqv_CA(i, j, k) = PdQa_1(iklon, klc) * dt_loc2 + dqw_CA(i, j, k) = PdQw_1(iklon, klc) * dt_loc2 + dqi_CA(i, j, k) = PdQi_1(iklon, klc) * dt_loc2 +#if(GU) + TaGust(i, j, k) = TaGust(i, j, k) * exp(-dtxLoc * ssvSL(i, j, k)) & + + PdTa_1(iklon, klc) * dt_loc2 + TaGust(i, j, k) = min(TaGust(i, j, k), zero) +#endif + enddo + enddo + enddo + + endif +#if(EW) + ! +--Vertical Integrated Energy and Water Content + ! + ============================================ + + do j = jp11, my1 + do i = ip11, mx1 + enr0EW(i, j) = 0.0 + wat0EW(i, j) = 0.0 + do k = 1, mz + temp_r = pktaDY(i, j, k) * pkDY(i, j, k) + enr0EW(i, j) = enr0EW(i, j) & + + (temp_r & + - (qwHY(i, j, k) + qrHY(i, j, k)) * r_LvCp & + - (qiHY(i, j, k) + qsHY(i, j, k)) * r_LsCp) * dsigm1(k) + wat0EW(i, j) = wat0EW(i, j) & + + (qvDY(i, j, k) & + + qwHY(i, j, k) + qrHY(i, j, k) & + + qiHY(i, j, k) + qsHY(i, j, k)) * dsigm1(k) + enddo + enr0EW(i, j) = enr0EW(i, j) * pstDYn(i, j) * grvinv + ! wat0EW [m] contains implicit factor 1.d3 [kPa-->Pa] /ro_Wat + wat0EW(i, j) = wat0EW(i, j) * pstDYn(i, j) * grvinv + energ0 = energ0 - enr0EW(i, j) + water0 = water0 - wat0EW(i, j) + enddo + enddo +#endif + + ! + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--filtering + ! + ========= + + do j = jp11, my1 + do i = ip11, mx1 + wrk1(i, j, 1) = adj_CA(i, j) + wrk1(i, j, 2) = drr_CA(i, j) + wrk1(i, j, 3) = dss_CA(i, j) + enddo + enddo + + call cva_filtering(wrk1, 3) + do j = jp11, my1 + do i = ip11, mx1 + if(wrk1(i, j, 1) <= 0) then + drr_CA(i, j) = 0. + dss_CA(i, j) = 0. + adj_CA(i, j) = 0. + else + adj_CA(i, j) = max(1, nint(wrk1(i, j, 1))) + drr_CA(i, j) = wrk1(i, j, 2) + dss_CA(i, j) = wrk1(i, j, 3) + endif + enddo + enddo + + call cva_filtering(dpktCA, mz) + call cva_filtering(dqv_CA, mz) + call cva_filtering(dqw_CA, mz) + call cva_filtering(dqi_CA, mz) + + endif + + ! +--Mass Flux convective Scheme + ! + =========================== + + do j = 6, my - 5 + do i = 6, mx - 5 + + ! + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + locCVA = min(adj_CA(i, j), 1) + OK_CVA = max(locCVA, 0) + !XF + if(adj_CA(i, j) > 0 & + .and. max(drr_CA(i, j), dss_CA(i, j)) < 0.25 * dt_loc2 / 3600 & + .and. min(drr_CA(i, j), dss_CA(i, j)) >= 0) then + ! !MIN= 0 - MAX= 250mm/h + OK_CVA = 1.0 + adj_CA(i, j) = adj_CA(i, j) - 1 + ! +... ^^^^ Number of remaining time step before the end of convection + + adj_CA(i, j) = max(adj_CA(i, j), 0) + + ! +----Temporal tendencies on pktaDY, qvDY and rainHY + ! + ---------------------------------------------- + DO k = 1, mz + pktaDY(i, j, k) = pktaDY(i, j, k) + dpktCA(i, j, k) * OK_CVA + qvDY(i, j, k) = max(qvDY(i, j, k) + dqv_CA(i, j, k) * OK_CVA & + , epsq) + !if(k>=mzhyd) then + qwHY(i, j, k) = max(qwHY(i, j, k) + dqw_CA(i, j, k) * OK_CVA, eps9) + qiHY(i, j, k) = max(qiHY(i, j, k) + dqi_CA(i, j, k) * OK_CVA, eps9) + !end if + enddo + + rainHY(i, j) = rainHY(i, j) + drr_CA(i, j) * OK_CVA + rainCA(i, j) = rainCA(i, j) + drr_CA(i, j) * OK_CVA + + snowHY(i, j) = snowHY(i, j) + dss_CA(i, j) * OK_CVA + snowCA(i, j) = snowCA(i, j) + dss_CA(i, j) * OK_CVA + snohSL(i, j) = snohSL(i, j) + dss_CA(i, j) * OK_CVA + + else ! { adj_CA(i,j).gt. 0 } + + do k = 1, mz + dpktCA(i, j, k) = 0. + dqv_CA(i, j, k) = 0. + dqw_CA(i, j, k) = 0. + dqi_CA(i, j, k) = 0. + enddo + + endif + + ! + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + enddo + enddo + +#if(EW) + ! +--Vertical Integrated Energy and Water Content + ! + ============================================ + do j = jp11, my1 + do i = ip11, mx1 + enr1EW(i, j) = 0.0 + wat1EW(i, j) = 0.0 + watfEW(i, j) = -drr_CA(i, j) + do k = 1, mz + temp_r = pktaDY(i, j, k) * pkDY(i, j, k) + enr1EW(i, j) = enr1EW(i, j) & + + (temp_r & + - (qwHY(i, j, k) + qrHY(i, j, k)) * r_LvCp & + - (qiHY(i, j, k) + qsHY(i, j, k)) * r_LsCp) * dsigm1(k) + wat1EW(i, j) = wat1EW(i, j) & + + (qvDY(i, j, k) & + + qwHY(i, j, k) + qrHY(i, j, k) & + + qiHY(i, j, k) + qsHY(i, j, k)) * dsigm1(k) + enddo + enr1EW(i, j) = enr1EW(i, j) * pstDYn(i, j) * grvinv & + - drr_CA(i, j) * r_LvCp + ! wat1EW [m] contains implicit factor 1.d3 [kPa-->Pa] /ro_Wat + wat1EW(i, j) = wat1EW(i, j) * pstDYn(i, j) * grvinv + energ0 = energ0 + enr1EW(i, j) + water0 = water0 + wat1EW(i, j) + iter_0 = iter_0 + 1 + enddo + enddo +#endif + +#if(EW) + ! +--Vertical Integrated Energy and Water Content: OUTPUT + ! + ==================================================== + irmx = imez + jrmx = jmez + rr_max = 0.0 + do j = jp11, my1 + do i = ip11, mx1 + if(drr_CA(i, j) > rr_max) then + rr_max = drr_CA(i, j) + irmx = i + jrmx = j + endif + enddo + enddo + waterb = wat1EW(irmx, jrmx) - wat0EW(irmx, jrmx) - watfEW(irmx, jrmx) + write(6, 606) itexpe, enr0EW(irmx, jrmx), 1.d3 * wat0EW(irmx, jrmx), & + irmx, jrmx, enr1EW(irmx, jrmx), 1.d3 * wat1EW(irmx, jrmx), & + 1.d3 * watfEW(irmx, jrmx), & + 1.d3 * waterb, & + energ0 / iter_0, water0 / iter_0 +606 format(i9, ' Before CVAj: E0 =', f12.6, ' W0 = ', f9.6, & + /, i5, i4, ' After CVAj: E1 =', f12.6, ' W1 = ', f9.6, & + ' W Flux =', f9.6, & + ' Div(W) =', e9.3, & + /, 9x, ' Mean dE =', f12.9, ' dW = ', e9.3) +#endif + + iitCV0 = iitCV0 + 1 + + return +endsubroutine CVAgen_MNH diff --git a/MAR/code_mar/cvamnh.f90 b/MAR/code_mar/cvamnh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f461770af8711c44a18e0222d7fa2c3c866b3f61 --- /dev/null +++ b/MAR/code_mar/cvamnh.f90 @@ -0,0 +1,9446 @@ +MODULE MODD_CONVPAR_SHAL +! ######################## +! +!!**** *MODD_CONVPAR_SHAL* - Declaration of convection constants +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to declare the +!! constants in the deep convection parameterization. +!! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CONVPAR_SHAL) +!! +!! AUTHOR +!! ------ +!! P. Bechtold *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 04/10/98 +!! E. Bazile 05/05/09 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + implicit none +! + REAL, SAVE :: XA25 ! 25 km x 25 km reference grid area +! + REAL, SAVE :: XCRAD ! cloud radius + REAL, SAVE :: XCTIME_SHAL ! convective adjustment time + REAL, SAVE :: XCDEPTH ! minimum necessary cloud depth + REAL, SAVE :: XCDEPTH_D ! maximum allowed cloud thickness + REAL, SAVE :: XDTPERT ! add small Temp perturb. at LCL + REAL, SAVE :: XATPERT ! Parameter for temp Perturb + REAL, SAVE :: XBTPERT ! Parameter for temp Perturb + ! (XATPERT* TKE/Cp + XBTPERT) * XDTPERT + REAL, SAVE :: XENTR ! entrainment constant (m/Pa) = 0.2 (m) +! + REAL, SAVE :: XZLCL ! maximum allowed allowed height + ! difference between departure level and surface + REAL, SAVE :: XZPBL ! minimum mixed layer depth to sustain convection + REAL, SAVE :: XWTRIG ! constant in vertical velocity trigger +! +! + REAL, SAVE :: XNHGAM ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) + REAL, SAVE :: XTFRZ1 ! begin of freezing interval + REAL, SAVE :: XTFRZ2 ! end of freezing interval +! +! + REAL, SAVE :: XSTABT ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE + REAL, SAVE :: XSTABC ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE + REAL, SAVE :: XAW, XBW ! Parameters for WLCL = XAW * W + XBW + LOGICAL, SAVE :: LLSMOOTH ! Default=TRUE but not necessary +!$OMP threadprivate(XA25,XCRAD,XCTIME_SHAL,XCDEPTH,XCDEPTH_D,XDTPERT,XATPERT, & +!$OMP XENTR,XZLCL,XZPBL,XWTRIG,XNHGAM,XTFRZ1,XTFRZ2,XSTABT,XSTABC, & +!$OMP XAW,XBW ,LLSMOOTH) +ENDMODULE MODD_CONVPAR_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +MODULE MODD_CONVPAR +! ################### +! +!!**** *MODD_CONVPAR* - Declaration of convection constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! constants in the deep convection parameterization. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CONVPAR) +!! +!! AUTHOR +!! ------ +!! P. Bechtold *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/11/96 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + implicit none +! + REAL, SAVE :: XA25 ! 25 km x 25 km reference grid area +! + REAL, SAVE :: XCRAD ! cloud radius + REAL, SAVE :: XCDEPTH ! minimum necessary cloud depth + REAL, SAVE :: XENTR ! entrainment constant (m/Pa) = 0.2 (m) +! + REAL, SAVE :: XZLCL ! maximum allowed allowed height + ! difference between departure level and surface + REAL, SAVE :: XZPBL ! minimum mixed layer depth to sustain convection + REAL, SAVE :: XWTRIG ! constant in vertical velocity trigger +! +! + REAL, SAVE :: XNHGAM ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) + REAL, SAVE :: XTFRZ1 ! begin of freezing interval + REAL, SAVE :: XTFRZ2 ! end of freezing interval +! + REAL, SAVE :: XRHDBC ! relative humidity below cloud in downdraft +! + REAL, SAVE :: XRCONV ! constant in precipitation conversion + REAL, SAVE :: XSTABT ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE + REAL, SAVE :: XSTABC ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE + REAL, SAVE :: XUSRDPTH ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft + REAL, SAVE :: XMELDPTH ! layer (Pa) through which precipitation melt is + ! allowed below melting level + REAL, SAVE :: XUVDP ! constant for pressure perturb in momentum transport +!$OMP threadprivate(XA25,XCRAD,XCDEPTH,XENTR,XZLCL,XZPBL,XWTRIG,XNHGAM,XTFRZ1, & +!$OMP XTFRZ2,XRHDBC,XRCONV,XSTABT,XSTABC,XUSRDPTH,XMELDPTH,XUVDP) +ENDMODULE MODD_CONVPAR + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### +MODULE MODI_INI_CONVPAR_E1 +! ##################### +! + INTERFACE +! + subroutine INI_CONVPAR_E1 + ENDsubroutine INI_CONVPAR_E1 +! + ENDINTERFACE +! +ENDMODULE MODI_INI_CONVPAR_E1 +! +! +! ######################### +subroutine INI_CONVPAR_E1 +! ######################### +! +!!**** *INI_CONVPAR * - routine to initialize the convective constants modules +!! with modifications for ensemble run. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the constants +! stored in modules MODD_CONVPAR, MODD_CST, MODD_CONVPAREXT. +! +! +!!** METHOD +!! ------ +!! The deep convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAR +! + implicit none +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! + XA25 = 100.E6 ! 25 km x 25 km reference grid area +! + XCRAD = 500. ! cloud radius + XCDEPTH = 3.E3 ! minimum necessary cloud depth + XENTR = 0.03 ! entrainment constant (m/Pa) = 0.2 (m) +! + XZLCL = 3.5E3 ! maximum allowed allowed height + ! difference between the surface and the LCL + XZPBL = 60.E2 ! minimum mixed layer depth to sustain convection + XWTRIG = 6.00 ! constant in vertical velocity trigger +! +! + XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) + XTFRZ1 = 268.16 ! begin of freezing interval + XTFRZ2 = 248.16 ! end of freezing interval +! + XRHDBC = 0.9 ! relative humidity below cloud in downdraft + + XRCONV = 0.015 ! constant in precipitation conversion + XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE + XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE + XUSRDPTH = 165.E2 ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft + XMELDPTH = 200.E2 ! layer (Pa) through which precipitation melt is + ! allowed below downdraft + XUVDP = 0.7 ! constant for pressure perturb in momentum transport +! +! +ENDsubroutine INI_CONVPAR_E1 + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### +MODULE MODI_INI_CONVPAR +! ##################### +! + INTERFACE +! + subroutine INI_CONVPAR + ENDsubroutine INI_CONVPAR +! + ENDINTERFACE +! +ENDMODULE MODI_INI_CONVPAR +! +! +! +! ###################### +subroutine INI_CONVPAR +! ###################### +! +!!**** *INI_CONVPAR * - routine to initialize the constants modules +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the constants +! stored in modules MODD_CONVPAR, MODD_CST, MODD_CONVPAREXT. +! +! +!!** METHOD +!! ------ +!! The deep convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAR +! + implicit none +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! + XA25 = 625.E6 ! 25 km x 25 km reference grid area +! + XCRAD = 1500. ! cloud radius + XCDEPTH = 2.5E3 ! minimum necessary cloud depth + XENTR = 0.03 ! entrainment constant (m/Pa) = 0.2 (m) +! + XZLCL = 3.5E3 ! maximum allowed allowed height + ! difference between the surface and the LCL + XZPBL = 60.E2 ! minimum mixed layer depth to sustain convection + XWTRIG = 6.00 ! constant in vertical velocity trigger +! +! + XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) + XTFRZ1 = 268.16 ! begin of freezing interval + XTFRZ2 = 248.16 ! end of freezing interval +! + XRHDBC = 0.9 ! relative humidity below cloud in downdraft + + XRCONV = 0.015 ! constant in precipitation conversion + XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE + XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE + XUSRDPTH = 165.E2 ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft + XMELDPTH = 100.E2 ! layer (Pa) through which precipitation melt is + ! allowed below downdraft + XUVDP = 0.7 ! constant for pressure perturb in momentum transport +! +! +ENDsubroutine INI_CONVPAR + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### +MODULE MODI_INI_CONVPAR_SHAL +! ##################### +! + INTERFACE +! + subroutine INI_CONVPAR_SHAL + ENDsubroutine INI_CONVPAR_SHAL +! + ENDINTERFACE +! +ENDMODULE MODI_INI_CONVPAR_SHAL +! +! +! ########################### +subroutine INI_CONVPAR_SHAL +! ########################### +! +!!**** *INI_CONVPAR * - routine to initialize the constants modules +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants +!! stored in modules MODD_CONVPAR_SHAL +!! +!! +!!** METHOD +!! ------ +!! The shallow convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR_SHAL : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR_SHAL, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!! 05/05/09 E. Bazile +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAR_SHAL +! + implicit none +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! + XA25 = 625.E6 ! 25 km x 25 km reference grid area +! + XCRAD = 50. ! cloud radius + XCTIME_SHAL = 10800. ! convective adjustment time + XCDEPTH = 0.5E3 ! minimum necessary shallow cloud depth + XCDEPTH_D = 2.5E3 ! maximum allowed shallow cloud depth + XDTPERT = .2 ! add small Temp perturbation at LCL + XATPERT = 0. ! 0.=original scheme , recommended = 1000. + XBTPERT = 1. ! 1.=original scheme , recommended = 0. +! + XENTR = 0.02 ! entrainment constant (m/Pa) = 0.2 (m) +! + XZLCL = 0.5E3 ! maximum allowed allowed height + ! difference between the DPL and the surface + XZPBL = 40.E2 ! minimum mixed layer depth to sustain convection +! +! + XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) + XTFRZ1 = 268.16 ! begin of freezing interval + XTFRZ2 = 248.16 ! end of freezing interval +! + + XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE + XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE + XAW = 0. ! 0.= Original scheme , 1 = recommended + XBW = 1. ! 1.= Original scheme , 0 = recommended + LLSMOOTH = .true. +! +! +ENDsubroutine INI_CONVPAR_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +! ######spl +subroutine CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, ODEEP, OSHAL, OREFRESH_ALL, ODOWN, KICE, & + OSETTADJ, PTADJD, PTADJS, & + KENSM, & + PPABS, PZZ, PDXDY, & + PT, PRV, PRC, PRI, PU, PV, PW, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + PPRTEN, PPRSTEN, & + PUMF, PDMF, PPRLFLX, PPRSFLX, PCAPE, KCLTOP, KCLBAS, & + OCHTRANS, KCH1, PCH1, PCH1TEN, & + SeBi_TKE) +! ############################################################################ +! +!!**** Interface routine to the fast MNH convection code developed for ECMWF/ARPEGE IFS +!! having a structure typical for operational routines +!! +!! +!! PURPOSE +!! ------- +!! The routine interfaces the MNH convection code as developed for operational +!! forecast models like ECMWF, ARPEGE or HIRLAM with the typical MNH array structure +!! Calls the deep and/or shallow convection routine +!! +!! +!!** METHOD +!! ------ +!! Returns one tendency for shallow+deep convection but each part can +!! be activated/desactivated separately. +!! For deep convection one can enable up to 3 additional ensemble members +!! - this substantially improves the smoothness of the scheme and +!! allows for runs with different cloud radii (entrainment rates) and +!! reduces the arbitrariness inherent to convective trigger condition +!! +!! +!! +!! EXTERNAL +!! -------- +!! CONVECT_DEEP +!! CONVECT_SHALLOW +!! INI_CONVPAR, INI_CONVPAR1 +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 11/12/98 +!! Modif 11/04/O2 allow for ensemble of deep updrafts/downdrafts +!! +!! REFERENCE +!! --------- +!! Bechtold et al., 2001, Quart. J. Roy. Meteor. Soc., Vol 127, pp 869-886: +!! A mass flux convection scheme for regional and global models. +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x + INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x + INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 + INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 + REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme + LOGICAL, INTENT(IN) :: ODEEP ! switch for deep convection + LOGICAL, INTENT(IN) :: OSHAL ! switch for shallow convection + LOGICAL, INTENT(IN) :: OREFRESH_ALL ! refresh or not all + ! tendencies at every call + LOGICAL, INTENT(IN) :: ODOWN ! take or not convective + ! downdrafts into account + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + INTEGER, INTENT(IN) :: KENSM ! number of additional deep convection calls + ! for ensemble (presently limited to 3) + ! KENSM=0 corresponds to base run with + ! 1 deep and 1 shallow call + LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user + REAL, INTENT(IN) :: PTADJD ! user defined deep adjustment time (s) + REAL, INTENT(IN) :: PTADJS ! user defined shal. adjustment time (s) +! + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PT ! grid scale T at time t (K) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! grid scale water vapor (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PW ! grid scale vertical velocity (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPABS ! grid scale pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m2) + +! + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter(recompute + ! tendency or keep it + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PTTEN ! convective temperat. tendency (K/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRTEN ! total surf precipitation tendency (m/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRSTEN! solid surf precipitation tendency (m/s) +! +! Chemical Tracers: + LOGICAL, INTENT(IN) :: OCHTRANS ! flag to compute convective + ! transport for chemical tracer + INTEGER, INTENT(IN) :: KCH1 ! number of species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(IN) :: PCH1 ! grid scale chemical species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(INOUT):: PCH1TEN ! chemical convective tendency + ! (1/s) +! +! Diagnostic variables: + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s m2) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s m2) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRLFLX! liquid precip flux (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRSFLX! solid precip flux (m/s) + REAL, DIMENSION(KLON), INTENT(INOUT) :: PCAPE ! CAPE (J/kg) + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KCLTOP ! cloud top level (number of model level) + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KCLBAS ! cloud base level(number of model level) + ! they are given a value of + ! 0 if no convection +! +!* 0.2 Declarations of local variables : +! + INTEGER :: JI, JK, JN ! loop index +! + REAL, DIMENSION(KLON) :: ZTIMEC, ZPRLTEN +! +! special for shallow convection + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTTENS, ZRVTENS, ZRCTENS, ZRITENS, & + ZUMFS + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZCH1TENS + INTEGER, DIMENSION(:), ALLOCATABLE :: ICLBASS, ICLTOPS +! +!* 0.3 Declarations of additional Ensemble fields: +! + integer :: KENS ! number of allowed additional deep convection calls + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZTTENE ! convective temperat. tendency (K/s) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZRVTENE ! convective r_v tendency (1/s) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZRCTENE ! convective r_c tendency (1/s) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZRITENE ! convective r_i tendency (1/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRLTENE ! liquid surf precipitation tendency (m/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRSTENE ! solid surf precipitation tendency (m/s) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZUMFE ! updraft mass flux (kg/s m2) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZDMFE ! downdraft mass flux (kg/s m2) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZPRLFLXE ! liquid precip flux (m/s) + REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZPRSFLXE ! solid precip flux (m/s) + REAL, DIMENSION(:, :, :, :), ALLOCATABLE:: ZCH1TENE ! chemical convective tendency + INTEGER, DIMENSION(:, :), ALLOCATABLE :: ICLTOPE ! cloud top level (number of model level) + INTEGER, DIMENSION(:, :), ALLOCATABLE :: ICLBASE ! cloud base level(number of model level) + REAL, DIMENSION(:), ALLOCATABLE :: ZEDUMMY ! field not to be recomputed by ensemble + INTEGER, DIMENSION(:), ALLOCATABLE :: IEDUMMY ! field not to be recomputed by ensemble + REAL, DIMENSION(:), ALLOCATABLE :: ZWEIGHT ! weighting factor for ensemble members + real :: ZSUM ! sum of weighting factors + + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: SeBi_TKE ! TKE +! +!------------------------------------------------------------------------------- +! +! +!* 0.5 Allocate 2D (horizontal, vertical) arrays and additional ensemble arrays +! ------------------------------------------------------------------------ +! + ALLOCATE(ZTTENS(KLON, KLEV)); ALLOCATE(ZRVTENS(KLON, KLEV)) + ALLOCATE(ZRCTENS(KLON, KLEV)); ALLOCATE(ZRITENS(KLON, KLEV)) + ALLOCATE(ZCH1TENS(KLON, KLEV, KCH1)) + ALLOCATE(ZUMFS(KLON, KLEV)) + ALLOCATE(ICLBASS(KLON)); ALLOCATE(ICLTOPS(KLON)) +! + KCLTOP(:) = 1 ! set default value when no convection + KCLBAS(:) = 1 ! can be changed depending on user + ICLTOPS(:) = 1 + ICLBASS(:) = 1 +! + KENS = MIN(KENSM, 3) + if(KENS > 0) then + ALLOCATE(ZTTENE(KLON, KLEV, KENS)) + ALLOCATE(ZRVTENE(KLON, KLEV, KENS)) + ALLOCATE(ZRCTENE(KLON, KLEV, KENS)) + ALLOCATE(ZRITENE(KLON, KLEV, KENS)) + ALLOCATE(ZUMFE(KLON, KLEV, KENS)) + ALLOCATE(ZDMFE(KLON, KLEV, KENS)) + ALLOCATE(ZCH1TENE(KLON, KLEV, KCH1, KENS)) + ALLOCATE(ZPRLFLXE(KLON, KLEV, KENS)) + ALLOCATE(ZPRSFLXE(KLON, KLEV, KENS)) + ALLOCATE(ZPRLTENE(KLON, KENS)) + ALLOCATE(ZPRSTENE(KLON, KENS)) + ALLOCATE(ICLTOPE(KLON, KENS)) + ALLOCATE(ICLBASE(KLON, KENS)) + ALLOCATE(ZEDUMMY(KLON)) + ALLOCATE(IEDUMMY(KLON)) + ALLOCATE(ZWEIGHT(KENS)) + endif +! +!* 4.a Call deep convection routine +! ---------------------------- +! + if(ODEEP) then +! +! 1. Base version +! + call INI_CONVPAR +! + if(OSETTADJ) ZTIMEC(:) = PTADJD + +! + +!print*, "PRV beg",MAXVAL(PTTEN),MAXVAL(PRVTEN),MAXVAL(PRCTEN),MAXVAL(PRITEN) + call DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH_ALL, ODOWN, OSETTADJ, & + PPABS, PZZ, PDXDY, ZTIMEC, & + PT, PRV, PRC, PRI, PU, PV, PW, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + ZPRLTEN, PPRSTEN, & + KCLTOP, KCLBAS, PPRLFLX, PPRSFLX, & + PUMF, PDMF, PCAPE, & + OCHTRANS, KCH1, PCH1, PCH1TEN) +! +! 2. Additional Ensemble members +! + if(KENS > 0) then +! + call INI_CONVPAR_E1 +! +!* first member - changes in MODD_CONVPAR (cloud radius of 500 m or so) +! specified in INI_CONVPAR1 +! + call DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH_ALL, ODOWN, OSETTADJ, & + PPABS, PZZ, PDXDY, ZTIMEC, & + PT, PRV, PRC, PRI, PU, PV, PW, & + IEDUMMY, ZTTENE(:, :, 1), ZRVTENE(:, :, 1), ZRCTENE(:, :, 1), ZRITENE(:, :, 1), & + ZPRLTENE(:, 1), ZPRSTENE(:, 1), & + ICLTOPE(:, 1), ICLBASE(:, 1), ZPRLFLXE(:, :, 1), ZPRSFLXE(:, :, 1), & + ZUMFE(:, :, 1), ZDMFE(:, :, 1), ZEDUMMY, & + OCHTRANS, KCH1, PCH1, ZCH1TENE(:, :, :, 1)) + endif +! + if(KENS > 1) then +! + call INI_CONVPAR +! +!* second member (positive vertical velocity perturb for Trigger) +! + call DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH_ALL, ODOWN, OSETTADJ, & + PPABS, PZZ, PDXDY, ZTIMEC, & + PT, PRV, PRC, PRI, PU, PV, PW * 1.5 + 1.e-4, & + IEDUMMY, ZTTENE(:, :, 2), ZRVTENE(:, :, 2), ZRCTENE(:, :, 2), ZRITENE(:, :, 2), & + ZPRLTENE(:, 2), ZPRSTENE(:, 2), & + ICLTOPE(:, 2), ICLBASE(:, 2), ZPRLFLXE(:, :, 2), ZPRSFLXE(:, :, 2), & + ZUMFE(:, :, 2), ZDMFE(:, :, 2), ZEDUMMY, & + OCHTRANS, KCH1, PCH1, ZCH1TENE(:, :, :, 2)) + endif +! + if(KENS > 2) then +! +!* third member (negative vertical velocity perturb for Trigger) +! + call DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH_ALL, ODOWN, OSETTADJ, & + PPABS, PZZ, PDXDY, ZTIMEC, & + PT, PRV, PRC, PRI, PU, PV, PW*.5 - 1.e-4, & + IEDUMMY, ZTTENE(:, :, 3), ZRVTENE(:, :, 3), ZRCTENE(:, :, 3), ZRITENE(:, :, 3), & + ZPRLTENE(:, 3), ZPRSTENE(:, 3), & + ICLTOPE(:, 3), ICLBASE(:, 3), ZPRLFLXE(:, :, 3), ZPRSFLXE(:, :, 3), & + ZUMFE(:, :, 3), ZDMFE(:, :, 3), ZEDUMMY, & + OCHTRANS, KCH1, PCH1, ZCH1TENE(:, :, :, 3)) + endif +! +!print*, "PRV end",MAXVAL(PTTEN),MAXVAL(PRVTEN),MAXVAL(PRCTEN),MAXVAL(PRITEN) + endif + if(.not. ODEEP) then + KCOUNT(:) = 0 + PTTEN(:, :) = 0. + PRVTEN(:, :) = 0. + PRCTEN(:, :) = 0. + PRITEN(:, :) = 0. + PUMF(:, :) = 0. + PDMF(:, :) = 0. + ! KCLTOP(:) =1 + ! KCLBAS(:) =1 + PCH1TEN(:, :, :) = 0. + ZPRLTEN(:) = 0. + PPRSTEN(:) = 0. + PPRLFLX(:, :) = 0. + PPRSFLX(:, :) = 0. + PCAPE(:) = 0. + endif + +! +!* 4.b Call shallow convection routine +! ------------------------------- +! + if(OSHAL) then +! + if(.not. ODEEP) call INI_CONVPAR + call INI_CONVPAR_SHAL +! + call SHALLOW_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OSETTADJ, PTADJS, & + PPABS, PZZ, SeBi_TKE(:, KBDIA + 1), & + PT, PRV, PRC, PRI, PW, & + ZTTENS, ZRVTENS, ZRCTENS, ZRITENS, & + ICLTOPS, ICLBASS, ZUMFS, & + OCHTRANS, KCH1, PCH1, ZCH1TENS) + endif + if(.not. OSHAL) then + ZTTENS(:, :) = 0. + ZRVTENS(:, :) = 0. + ZRCTENS(:, :) = 0. + ZRITENS(:, :) = 0. + ZUMFS(:, :) = 0 + ! ICLTOPS(:) =1 + ! ICLBASS(:) =1 + ZCH1TENS(:, :, :) = 0. + endif +! +!* 5. Add - if activated - ensemble average values for deep +! and then shallow convective tendencies +! --------------------------------------------------------- +! + ZSUM = 1. + if(KENS > 0) then + if(KENS == 1) ZWEIGHT(:) = .5 + if(KENS > 1) ZWEIGHT(:) = 1. + do JN = 1, KENS + PTTEN(:, :) = PTTEN(:, :) + ZWEIGHT(JN) * ZTTENE(:, :, JN) + PRVTEN(:, :) = PRVTEN(:, :) + ZWEIGHT(JN) * ZRVTENE(:, :, JN) + PRCTEN(:, :) = PRCTEN(:, :) + ZWEIGHT(JN) * ZRCTENE(:, :, JN) + PRITEN(:, :) = PRITEN(:, :) + ZWEIGHT(JN) * ZRITENE(:, :, JN) + PPRLFLX(:, :) = PPRLFLX(:, :) + ZWEIGHT(JN) * ZPRLFLXE(:, :, JN) + PPRSFLX(:, :) = PPRSFLX(:, :) + ZWEIGHT(JN) * ZPRSFLXE(:, :, JN) + PUMF(:, :) = PUMF(:, :) + ZWEIGHT(JN) * ZUMFE(:, :, JN) + PDMF(:, :) = PDMF(:, :) + ZWEIGHT(JN) * ZDMFE(:, :, JN) + ZPRLTEN(:) = ZPRLTEN(:) + ZWEIGHT(JN) * ZPRLTENE(:, JN) + PPRSTEN(:) = PPRSTEN(:) + ZWEIGHT(JN) * ZPRSTENE(:, JN) + KCLTOP(:) = MAX(KCLTOP(:), ICLTOPE(:, JN)) + KCLBAS(:) = MAX(KCLBAS(:), ICLBASE(:, JN)) + if(OCHTRANS) & + & PCH1TEN(:, :, :) = PCH1TEN(:, :, :) + ZWEIGHT(JN) * ZCH1TENE(:, :, :, JN) + enddo +! + ZSUM = 1./(1.+SUM(ZWEIGHT(:))) + endif +! + PTTEN(:, :) = PTTEN(:, :) * ZSUM + ZTTENS(:, :) + PRVTEN(:, :) = PRVTEN(:, :) * ZSUM + ZRVTENS(:, :) + PRCTEN(:, :) = PRCTEN(:, :) * ZSUM + ZRCTENS(:, :) + PRITEN(:, :) = PRITEN(:, :) * ZSUM + ZRITENS(:, :) + PPRLFLX(:, :) = PPRLFLX(:, :) * ZSUM + PPRSFLX(:, :) = PPRSFLX(:, :) * ZSUM + PUMF(:, :) = PUMF(:, :) * ZSUM + ZUMFS(:, :) + PDMF(:, :) = PDMF(:, :) * ZSUM + PPRTEN(:) = (ZPRLTEN(:) + PPRSTEN(:)) * ZSUM + PPRSTEN(:) = PPRSTEN(:) * ZSUM + KCLTOP(:) = MAX(KCLTOP(:), ICLTOPS(:)) + KCLBAS(:) = MAX(KCLBAS(:), ICLBASS(:)) + if(OCHTRANS) then + PCH1TEN(:, :, :) = PCH1TEN(:, :, :) * ZSUM + ZCH1TENS(:, :, :) + endif +! +!* 6. Deallocate local arrays +! + DEALLOCATE(ICLBASS); DEALLOCATE(ICLTOPS) + DEALLOCATE(ZUMFS) + DEALLOCATE(ZCH1TENS) + DEALLOCATE(ZRCTENS); DEALLOCATE(ZRITENS) + DEALLOCATE(ZTTENS); DEALLOCATE(ZRVTENS) + + if(KENS > 0) then + DEALLOCATE(ZTTENE); DEALLOCATE(ZRVTENE) + DEALLOCATE(ZRCTENE); DEALLOCATE(ZRITENE) + DEALLOCATE(ZUMFE); DEALLOCATE(ZDMFE) + DEALLOCATE(ZCH1TENE) + DEALLOCATE(ZPRLFLXE); DEALLOCATE(ZPRSFLXE) + DEALLOCATE(ZPRLTENE); DEALLOCATE(ZPRSTENE) + DEALLOCATE(ZEDUMMY); DEALLOCATE(IEDUMMY) + DEALLOCATE(ZWEIGHT) +! XF BUG BUG 26/09/2016 + DEALLOCATE(ICLTOPE) + DEALLOCATE(ICLBASE) +! XF BUG BUG + endif +! +! +ENDsubroutine CONVECTION + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ############### +MODULE MODD_CST +! ############### +! +!!**** *MODD_CST* - declaration of Physic constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! Physics constants. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CST) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 16/05/94 +!! J. Stein 02/01/95 add xrholw +!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI +!! J. Stein 25/07/97 add XTH00 +!! V. Masson 05/10/98 add XRHOLI +!! C. Mari 31/10/00 add NDAYSEC +!! V. Masson 01/03/03 add conductivity of ice +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + implicit none + REAL, PARAMETER :: XPI = 2.*ASIN(1.) ! Pi +! + REAL, PARAMETER :: XDAY = 86400. + REAL, PARAMETER :: XSIYEA = 365.25 * XDAY * 2.*XPI / 6.283076 + REAL, PARAMETER :: XSIDAY = XDAY / (1.+XDAY / XSIYEA) ! day duration, sideral year duration, + ! sideral day duration +! + REAL, PARAMETER :: XKARMAN = 0.4 ! von karman constant + REAL, PARAMETER :: XLIGHTSPEED = 299792458. ! light speed + REAL, PARAMETER :: XPLANCK = 6.6260755E-34 ! Planck constant + REAL, PARAMETER :: XBOLTZ = 1.380658E-23 ! Boltzman constant + REAL, PARAMETER :: XAVOGADRO = 6.0221367E+23 ! Avogadro number +! + REAL, PARAMETER :: XRADIUS = 6371229. + REAL, PARAMETER :: XOMEGA = 2.*XPI / XSIDAY ! Earth radius, earth rotation + REAL, PARAMETER :: XG = 9.80665 ! Gravity constant +! + REAL, PARAMETER :: XP00 = 1.E5 ! Reference pressure +! + REAL, PARAMETER :: XSTEFAN = (2.*XPI**5 / 15.) * ((XBOLTZ / XPLANCK) * XBOLTZ) * (XBOLTZ / (XLIGHTSPEED * XPLANCK))**2 + REAL, PARAMETER :: XI0 = 1370. ! Stefan-Boltzman constant, solar constant +! + REAL, PARAMETER :: XMD = 28.9644E-3 + REAL, PARAMETER :: XMV = 18.0153E-3 ! Molar mass of dry air and molar mass of vapor + REAL, PARAMETER :: XRD = XAVOGADRO * XBOLTZ / XMD + REAL, PARAMETER :: XRV = XAVOGADRO * XBOLTZ / XMV ! Gaz constant for dry air, gaz constant for vapor + REAL, PARAMETER :: XCPD = 7.*XRD / 2. + REAL, PARAMETER :: XCPV = 4.*XRV ! Cpd (dry air), Cpv (vapor) + REAL, PARAMETER :: XRHOLW = 1000. ! Volumic mass of liquid water + REAL, PARAMETER :: XCL = 4.218E+3 + REAL, PARAMETER :: XCI = 2.106E+3 ! Cl (liquid), Ci (ice) + REAL, PARAMETER :: XTT = 273.16 ! Triple point temperature + REAL, PARAMETER :: XLVTT = 2.5008E+6 ! Vaporization heat constant + REAL, PARAMETER :: XLSTT = 2.8345E+6 ! Sublimation heat constant + REAL, PARAMETER :: XLMTT = XLSTT - XLVTT ! Melting heat constant + REAL, PARAMETER :: XESTT = 611.14 ! Saturation vapor pressure at triple point + ! temperature + REAL, PARAMETER :: XGAMW = (XCL - XCPV) / XRV ! Constants for saturation vapor pressure function + REAL, PARAMETER :: XBETAW = (XLVTT / XRV) + (XGAMW * XTT) + REAL, PARAMETER :: XALPW = LOG(XESTT) + (XBETAW / XTT) + (XGAMW * LOG(XTT)) +! + REAL, PARAMETER :: XGAMI = (XCI - XCPV) / XRV ! Constants for saturation vapor pressure function over solid ice + REAL, PARAMETER :: XBETAI = (XLSTT / XRV) + (XGAMI * XTT) + REAL, PARAMETER :: XALPI = LOG(XESTT) + (XBETAI / XTT) + (XGAMI * LOG(XTT)) +! + REAL, PARAMETER :: XCONDI = 2.22 ! thermal conductivity of ice (W m-1 K-1) + REAL, PARAMETER :: XTH00 = 300. ! reference value for the potential + ! temperature + REAL, PARAMETER :: XRHOLI = 900. ! Volumic mass of liquid water +! + INTEGER, PARAMETER :: NDAYSEC = 24 * 3600 ! Number of seconds in a day +! +! +! Some machine precision value depending of real4/8 use +! + REAL, PARAMETER :: XMNH_TINY = 1.0e-30 ! minimum real on this machine + REAL, PARAMETER :: XMNH_TINY_12 = SQRT(XMNH_TINY) ! sqrt(minimum real on this machine) + REAL, PARAMETER :: XMNH_EPSILON = EPSILON(XMNH_EPSILON) ! minimum space with 1.0 + REAL, PARAMETER :: XMNH_HUGE = HUGE(XMNH_HUGE) ! minimum real on this machine + + REAL, PARAMETER :: XEPS_DT = 1.0e-5 ! default value for DT test + REAL, PARAMETER :: XRES_FLAT_CART = 1.0e-12 ! default flat&cart residual tolerance + REAL, PARAMETER :: XRES_OTHER = 1.0e-9 ! default not flat&cart residual tolerance + REAL, PARAMETER :: XRES_PREP = 1.0e-8 ! default prep residual tolerance + +! +ENDMODULE MODD_CST + +!! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +!! ************************************************************************************************** +!! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ +! +! +! +! +!!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!!MNH_LIC for details. version 1. +!!----------------------------------------------------------------- +!!--------------- special set of characters for RCS information +!!----------------------------------------------------------------- +!! $Source$ $Revision$ +!! MASDEV4_7 init 2006/05/18 13:07:25 +!!----------------------------------------------------------------- +!! ################### +! MODULE MODI_INI_CST +!! ################### +!! +!INTERFACE +!! +!subroutine INI_CST +!END subroutine INI_CST +!! +!END INTERFACE +!! +!END MODULE MODI_INI_CST +!! +!! +!! +!! ################## +! subroutine INI_CST +!! ################## +!! +!!!**** *INI_CST * - routine to initialize the module MODD_CST +!!! +!!! PURPOSE +!!! ------- +!! The purpose of this routine is to initialize the physical constants +!! stored in module MODD_CST. +!! +!! +!!!** METHOD +!!! ------ +!!! The physical constants are set to their numerical values +!!! +!!! +!!! EXTERNAL +!!! -------- +!!! FMLOOK : to retrieve logical unit number associated to a file +!!! +!!! IMPLICIT ARGUMENTS +!!! ------------------ +!!! Module MODD_CST : contains physical constants +!!! +!!! REFERENCE +!!! --------- +!!! Book2 of the documentation (module MODD_CST, routine INI_CST) +!!! +!!! +!!! AUTHOR +!!! ------ +!!! V. Ducrocq * Meteo France * +!!! +!!! MODIFICATIONS +!!! ------------- +!!! Original 18/05/94 +!!! J. Stein 02/01/95 add the volumic mass of liquid water +!!! J.-P. Pinty 13/12/95 add the water vapor pressure over solid ice +!!! J. Stein 29/06/97 add XTH00 +!!! V. Masson 05/10/98 add XRHOLI +!!! C. Mari 31/10/00 add NDAYSEC +!!! V. Masson 01/03/03 add XCONDI +!!! J. Escobar 28/03/2014 for pb with emissivity/aerosol reset XMNH_TINY=1.0e-80 in real8 case +!!! +!!------------------------------------------------------------------------------- +!! +!!* 0. DECLARATIONS +!! ------------ +!! +!USE MODD_CST +!! +!implicit none +!! +!!------------------------------------------------------------------------------- +!! +!!* 1. FUNDAMENTAL CONSTANTS +!! --------------------- +!! +!!XPI = 2.*ASIN(1.) +!!XKARMAN = 0.4 +!!XLIGHTSPEED = 299792458. +!!XPLANCK = 6.6260755E-34 +!!XBOLTZ = 1.380658E-23 +!!XAVOGADRO = 6.0221367E+23 +!! +!!------------------------------------------------------------------------------- +!! +!!* 2. ASTRONOMICAL CONSTANTS +!! ---------------------- +!! +!!XDAY = 86400. +!!XSIYEA = 365.25*XDAY*2.*XPI/ 6.283076 +!!XSIDAY = XDAY/(1.+XDAY/XSIYEA) +!!XOMEGA = 2.*XPI/XSIDAY +!!NDAYSEC = 24*3600 ! Number of seconds in a day +!! +!!-------------------------------------------------------------------------------! +!! +!! +!!* 3. TERRESTRIAL GEOIDE CONSTANTS +!! ---------------------------- +!! +!!XRADIUS = 6371229. +!!XG = 9.80665 +!! +!!------------------------------------------------------------------------------- +!! +!!* 4. REFERENCE PRESSURE +!! ------------------- +!! +!!XP00 = 1.E5 +!!XTH00 = 300. +!!------------------------------------------------------------------------------- +!! +!!* 5. RADIATION CONSTANTS +!! ------------------- +!! +!!JUAN OVERFLOW XSTEFAN = 2.* XPI**5 * XBOLTZ**4 / (15.* XLIGHTSPEED**2 * XPLANCK**3) +!!XSTEFAN = ( 2.* XPI**5 / 15. ) * ( (XBOLTZ / XPLANCK) * XBOLTZ ) * (XBOLTZ/(XLIGHTSPEED*XPLANCK))**2 +!!XI0 = 1370. +!! +!!------------------------------------------------------------------------------- +!! +!!* 6. THERMODYNAMIC CONSTANTS +!! ----------------------- +!! +!!XMD = 28.9644E-3 +!!XMV = 18.0153E-3 +!!XRD = XAVOGADRO * XBOLTZ / XMD +!!XRV = XAVOGADRO * XBOLTZ / XMV +!!XCPD = 7.* XRD /2. +!!XCPV = 4.* XRV +!!XRHOLW = 1000. +!!XRHOLI = 900. +!!XCONDI = 2.22 +!!XCL = 4.218E+3 +!!XCI = 2.106E+3 +!!XTT = 273.16 +!!XLVTT = 2.5008E+6 +!!XLSTT = 2.8345E+6 +!!XLMTT = XLSTT - XLVTT +!!XESTT = 611.14 +!!XGAMW = (XCL - XCPV) / XRV +!!XBETAW = (XLVTT/XRV) + (XGAMW * XTT) +!!XALPW = LOG(XESTT) + (XBETAW /XTT) + (XGAMW *LOG(XTT)) +!!XGAMI = (XCI - XCPV) / XRV +!!XBETAI = (XLSTT/XRV) + (XGAMI * XTT) +!!XALPI = LOG(XESTT) + (XBETAI /XTT) + (XGAMI *LOG(XTT)) +! +!! +!! Some machine precision value depending of real4/8 use +!! +! +! +!!XMNH_EPSILON = EPSILON (XMNH_EPSILON ) +!!XMNH_HUGE = HUGE (XMNH_HUGE ) +! +!!SeBi #ifdef MNH_MPI_DOUBLE_PRECISION +!!XMNH_TINY = 1.0e-80 +!!XEPS_DT = 1.0e-5 +!!XRES_FLAT_CART = 1.0e-12 +!!XRES_OTHER = 1.0e-9 +!!XRES_PREP = 1.0e-8 +!!SeBi #else +!!XMNH_TINY = TINY (XMNH_TINY ) +!!XEPS_DT = 1.0e-4 +!!XRES_FLAT_CART = 1.0e-12 +!!XRES_OTHER = 1.0e-7 +!!XRES_PREP = 1.0e-4 +!!SeBi #endif +!!XMNH_TINY_12 = SQRT (XMNH_TINY ) +! +! +! +!! +!!------------------------------------------------------------------------------- +!! +!END subroutine INI_CST + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_SATMIXRATIO +! ################# +! + INTERFACE +! + subroutine CONVECT_SATMIXRATIO(KLON, & + PPRES, PT, PEW, PLV, PLS, PCPH) +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON), INTENT(IN) :: PT ! temperature +! + REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! vapor saturation mixing ratio + REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v + REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s + REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +! + ENDsubroutine CONVECT_SATMIXRATIO +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_SATMIXRATIO +! ######spl +subroutine CONVECT_SATMIXRATIO(KLON, & + PPRES, PT, PEW, PLV, PLS, PCPH) +! ################################################################ +! +!!**** Compute vapor saturation mixing ratio over liquid water +!! +!! +!! PDRPOSE +!! ------- +!! The purpose of this routine is to determine saturation mixing ratio +!! and to return values for L_v L_s and C_ph +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_SATMIXRATIO) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------- ------------------------------------------------------ +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON), INTENT(IN) :: PT ! temperature +! + REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! vapor saturation mixing ratio + REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v + REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s + REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +! +!* 0.2 Declarations of local variables : +! + REAL, DIMENSION(KLON) :: ZT ! temperature + real :: ZEPS ! R_d / R_v +! +! +!------------------------------------------------------------------------------- +! + ZEPS = XRD / XRV +! + ZT(:) = MIN(400., MAX(PT(:), 10.)) ! overflow bound + PEW(:) = EXP(XALPW - XBETAW / ZT(:) - XGAMW * ALOG(ZT(:))) + PEW(:) = ZEPS * PEW(:) / (PPRES(:) - PEW(:)) +! + PLV(:) = XLVTT + (XCPV - XCL) * (ZT(:) - XTT) ! compute L_v + PLS(:) = XLSTT + (XCPV - XCI) * (ZT(:) - XTT) ! compute L_i +! + PCPH(:) = XCPD + XCPV * PEW(:) ! compute C_ph +! +ENDsubroutine CONVECT_SATMIXRATIO + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl +MODULE MODD_CONVPAREXT +! ###################### +! + implicit none +! + INTEGER, SAVE :: JCVEXB ! start vertical computations at + ! 1 + JCVEXB = 1 + ( KBDIA - 1 ) + INTEGER, SAVE :: JCVEXT ! limit vertical computations to + ! KLEV - JCVEXT = KLEV - ( KTDIA - 1 ) +!$OMP threadprivate(JCVEXB,JCVEXT) +ENDMODULE MODD_CONVPAREXT + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_TRIGGER_FUNCT +! ################# +! + INTERFACE +! + subroutine CONVECT_TRIGGER_FUNCT(KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG, & + PCAPE) +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KLEV ! vertical loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH, PTHV ! theta, theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! envir. satur. theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PW ! vertical velocity +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! CAPE (J/kg) for diagnostics +! + ENDsubroutine CONVECT_TRIGGER_FUNCT +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_TRIGGER_FUNCT +! ######################################################################### +subroutine CONVECT_TRIGGER_FUNCT(KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG, & + PCAPE) +! ######################################################################### +! +!!**** Determine convective columns as well as the cloudy values of theta, +!! and qv at the lifting condensation level (LCL) +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine convective columns +!! +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! What we look for is the undermost unstable level at each grid point. +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! maximum height difference between +!! ! the surface and the DPL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XWTRIG ! constant in vertical velocity trigger +!! XCDEPTH ! minimum necessary cloud depth +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 20/03/97 Select first departure level +!! that produces a cloud thicker than XCDEPTH +!! Last modified 12/12/97 add small perturbation +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR + USE MODD_CONVPAREXT + USE MODI_CONVECT_SATMIXRATIO +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KLEV ! vertical loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH, PTHV ! theta, theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! envir. satur. theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PW ! vertical velocity +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! CAPE (J/kg) for diagnostics +! +!* 0.2 Declarations of local variables : +! + INTEGER :: JKK, JK, JKP, JKM, JKDL, JL, JKT, JT! vertical loop index + INTEGER :: JI ! horizontal loop index + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + real :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d + real :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON) :: ZTHLCL, ZTLCL, ZRVLCL, & ! locals for PTHLCL,PTLCL + ZWLCL, ZZLCL, ZTHVELCL ! PRVLCL, .... + INTEGER, DIMENSION(KLON) :: IDPL, IPBL, ILCL ! locals for KDPL, ... + REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL + REAL, DIMENSION(KLON) :: ZZDPL ! height of DPL + REAL, DIMENSION(KLON) :: ZTHVLCL ! theta_v at LCL = mixed layer value + REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature + REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure + REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure + REAL, DIMENSION(KLON) :: ZCAPE ! convective available energy (m^2/s^2/g) + REAL, DIMENSION(KLON) :: ZTHEUL ! updraft equiv. pot. temperature (K) + REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air + REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer + REAL, DIMENSION(KLON) :: ZTOP ! estimated cloud top (m) + REAL, DIMENSION(KLON, KLEV):: ZCAP ! CAPE at every level for diagnostics + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays + LOGICAL, DIMENSION(KLON) :: GTRIG, GTRIG2 ! local arrays for OTRIG + LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! + ZEPS = XRD / XRV + ZEPSA = XRV / XRD + ZCPORD = XCPD / XRD + ZRDOCP = XRD / XCPD + OTRIG(:) = .false. + IDPL(:) = KDPL(:) + IPBL(:) = KPBL(:) + ILCL(:) = KLCL(:) + PWLCL(:) = 0. + ZWLCL(:) = 0. + PTHLCL(:) = 1. + PTHVELCL(:) = 1. + PTLCL(:) = 1. + PRVLCL(:) = 0. + PWLCL(:) = 0. + PZLCL(:) = PZ(:, IKB) + ZZDPL(:) = PZ(:, IKB) + GTRIG2(:) = .true. + ZCAP(:, :) = 0. +! +! +! +! 1. Determine highest necessary loop test layer +! ------------------------------------------- +! + JT = IKE - 2 + do JK = IKB + 1, IKE - 2 + if(PZ(1, JK) - PZ(1, IKB) < 12.E3) JT = JK + enddo +! +! +!* 2. Enter loop for convection test +! ------------------------------ +! + JKP = MINVAL(IDPL(:)) + 1 + JKT = JT + do JKK = JKP, JKT +! + GWORK1(:) = ZZDPL(:) - PZ(:, IKB) < XZLCL + ! we exit the trigger test when the center of the mixed layer is more + ! than 3500 m above soil level. + WHERE(GWORK1(:)) + ZDPTHMIX(:) = 0. + ZPRESMIX(:) = 0. + ZTHLCL(:) = 0. + ZRVLCL(:) = 0. + ZZDPL(:) = PZ(:, JKK) + IDPL(:) = JKK + ENDWHERE +! +! +!* 3. Construct a mixed layer of at least 60 hPa (XZPBL) +! ------------------------------------------ +! + do JK = JKK, IKE - 1 + JKM = JK + 1 + do JI = 1, IIE + if(GWORK1(JI) .and. ZDPTHMIX(JI) < XZPBL) then + IPBL(JI) = JK + ZWORK1(JI) = PPRES(JI, JK) - PPRES(JI, JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI, JK) * ZWORK1(JI) + ZTHLCL(JI) = ZTHLCL(JI) + PTH(JI, JK) * ZWORK1(JI) + ZRVLCL(JI) = ZRVLCL(JI) + PRV(JI, JK) * ZWORK1(JI) + endif + enddo + if(MINVAL(ZDPTHMIX(:)) >= XZPBL) EXIT + enddo +! +! + WHERE(GWORK1(:)) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:) + .3 ! add small perturbation + ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:) + 1.e-4 + ZTHVLCL(:) = ZTHLCL(:) * (1.+ZEPSA * ZRVLCL(:)) & + / (1.+ZRVLCL(:)) +! +!* 4.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! ---------------------------------------------------- +! +! + ZTMIX(:) = ZTHLCL(:) * (ZPRESMIX(:) / XP00)**ZRDOCP + ZEVMIX(:) = ZRVLCL(:) * ZPRESMIX(:) / (ZRVLCL(:) + ZEPS) + ZEVMIX(:) = MAX(1.E-8, ZEVMIX(:)) + ZWORK1(:) = LOG(ZEVMIX(:) / 613.3) + ! dewpoint temperature + ZWORK1(:) = (4780.8 - 32.19 * ZWORK1(:)) / (17.502 - ZWORK1(:)) + ! adiabatic saturation temperature + ZTLCL(:) = ZWORK1(:) - (.212 + 1.571E-3 * (ZWORK1(:) - XTT) & + - 4.36E-4 * (ZTMIX(:) - XTT)) * (ZTMIX(:) - ZWORK1(:)) + ZTLCL(:) = MIN(ZTLCL(:), ZTMIX(:)) + ZPLCL(:) = XP00 * (ZTLCL(:) / ZTHLCL(:))**ZCPORD +! + ENDWHERE +! +! +!* 4.2 Correct ZTLCL in order to be completely consistent +! with MNH saturation formula +! --------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPLCL, ZTLCL, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(GWORK1(:)) + ZWORK2(:) = ZWORK1(:) / ZTLCL(:) * (XBETAW / ZTLCL(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - ZRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + ZTLCL(:) = ZTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + ENDWHERE +! +! +!* 4.3 If ZRVLCL = PRVMIX is oversaturated set humidity +! and temperature to saturation values. +! --------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(GWORK1(:) .and. ZRVLCL(:) > ZWORK1(:)) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * (XBETAW / ZTMIX(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - ZRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + ZTLCL(:) = ZTMIX(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) + ZRVLCL(:) = ZRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + ZTHLCL(:) = ZTLCL(:) * (XP00 / ZPLCL(:))**ZRDOCP + ZTHVLCL(:) = ZTHLCL(:) * (1.+ZEPSA * ZRVLCL(:)) & + / (1.+ZRVLCL(:)) + ENDWHERE +! +! +!* 5.1 Determine vertical loop index at the LCL and DPL +! -------------------------------------------------- +! + do JK = JKK, IKE - 1 + do JI = 1, IIE + if(ZPLCL(JI) <= PPRES(JI, JK) .and. GWORK1(JI)) ILCL(JI) = JK + 1 + enddo + enddo +! +! +!* 5.2 Estimate height and environm. theta_v at LCL +! -------------------------------------------------- +! + do JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + ZDP(JI) = LOG(ZPLCL(JI) / PPRES(JI, JKM)) / & + LOG(PPRES(JI, JK) / PPRES(JI, JKM)) + ZWORK1(JI) = PTHV(JI, JKM) + (PTHV(JI, JK) - PTHV(JI, JKM)) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels ILCL and ILCL-1. + ZWORK2(JI) = PZ(JI, JKM) + (PZ(JI, JK) - PZ(JI, JKM)) * ZDP(JI) + enddo + WHERE(GWORK1(:)) + ZTHVELCL(:) = ZWORK1(:) + ZZLCL(:) = ZWORK2(:) + ENDWHERE +! +! +!* 6. Check to see if cloud is bouyant +! -------------------------------- +! +!* 6.1 Compute grid scale vertical velocity perturbation term ZWORK1 +! ------------------------------------------------------------- +! + ! normalize w grid scale to a 25 km refer. grid + do JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + JKDL = IDPL(JI) + !ZWORK1(JI) = ( PW(JI,JKM) + ( PW(JI,JK) - PW(JI,JKM) ) * ZDP(JI) ) & + ZWORK1(JI) = (PW(JI, JK) + PW(JI, JKDL) * ZZLCL(JI) / PZ(JI, JKDL))*.5 & + * SQRT(PDXDY(JI) / XA25) +! - 0.02 * ZZLCL(JI) / XZLCL ! avoid spurious convection + enddo + ! compute sign of normalized grid scale w + ZWORK2(:) = SIGN(1., ZWORK1(:)) + ZWORK1(:) = XWTRIG * ZWORK2(:) * ABS(ZWORK1(:))**0.333 & + * (XP00 / ZPLCL(:))**ZRDOCP +! +!* 6.2 Compute parcel vertical velocity at LCL +! --------------------------------------- +! + do JI = 1, IIE + JKDL = IDPL(JI) + ZWORK3(JI) = XG * ZWORK1(JI) * (ZZLCL(JI) - PZ(JI, JKDL)) & + / (PTHV(JI, JKDL) + ZTHVELCL(JI)) + enddo + WHERE(GWORK1(:)) + ZWLCL(:) = 1.+.5 * ZWORK2(:) * SQRT(ABS(ZWORK3(:))) + GTRIG(:) = ZTHVLCL(:) - ZTHVELCL(:) + ZWORK1(:) > 0. .and. & + ZWLCL(:) > 0. + ENDWHERE +! +! +!* 6.3 Look for parcel that produces sufficient cloud depth. +! The cloud top is estimated as the level where the CAPE +! is smaller than a given value (based on vertical velocity eq.) +! -------------------------------------------------------------- +! + ZTHEUL(:) = ZTLCL(:) * (ZTHLCL(:) / ZTLCL(:)) & + **(1.-0.28 * ZRVLCL(:)) & + * EXP((3374.6525 / ZTLCL(:) - 2.5403) * & + ZRVLCL(:) * (1.+0.81 * ZRVLCL(:))) +! + ZCAPE(:) = 0. + ZTOP(:) = 0. + ZWORK3(:) = 0. + JKM = MINVAL(ILCL(:)) + do JL = JKM, JT + JK = JL + 1 + do JI = 1, IIE + ZWORK1(JI) = (2.*ZTHEUL(JI) / & + (PTHES(JI, JK) + PTHES(JI, JL)) - 1.) * (PZ(JI, JK) - PZ(JI, JL)) + if(JL < ILCL(JI)) ZWORK1(JI) = 0. + ! if ( JL <= ILCL(JI) ) ZWORK1(JI) = 0. + ZCAPE(JI) = ZCAPE(JI) + ZWORK1(JI) + ZCAP(JI, JKK) = ZCAP(JI, JKK) + XG * MAX(0., ZWORK1(JI)) ! actual CAPE + ZWORK2(JI) = XNHGAM * XG * ZCAPE(JI) + 1.05 * ZWLCL(JI) * ZWLCL(JI) + ! the factor 1.05 takes entrainment into account + ZWORK2(JI) = SIGN(1., ZWORK2(JI)) + ZWORK3(JI) = ZWORK3(JI) + MIN(0., ZWORK2(JI)) + ZWORK3(JI) = MAX(-1., ZWORK3(JI)) + ! Nota, the factors ZWORK2 and ZWORK3 are only used to avoid + ! if and goto statements, the difficulty is to extract only + ! the level where the criterium is first fullfilled + ZTOP(JI) = PZ(JI, JL)*.5 * (1.+ZWORK2(JI)) * (1.+ZWORK3(JI)) + & + ZTOP(JI)*.5 * (1.-ZWORK2(JI)) + enddo + enddo +! +! + WHERE(ZTOP(:) - ZZLCL(:) >= XCDEPTH .and. GTRIG(:) .and. GTRIG2(:)) + GTRIG2(:) = .false. + OTRIG(:) = GTRIG(:) ! we select the first departure level + PTHLCL(:) = ZTHLCL(:) ! that gives sufficient cloud depth + PRVLCL(:) = ZRVLCL(:) + PTLCL(:) = ZTLCL(:) + PWLCL(:) = ZWLCL(:) + PZLCL(:) = ZZLCL(:) + PTHVELCL(:) = ZTHVELCL(:) + KDPL(:) = IDPL(:) + KPBL(:) = IPBL(:) + KLCL(:) = ILCL(:) + ENDWHERE +! + enddo +! + do JI = 1, IIE + PCAPE(JI) = MAXVAL(ZCAP(JI, :)) ! maximum CAPE for diagnostics + enddo +! +! +ENDsubroutine CONVECT_TRIGGER_FUNCT + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ############################################################################# +! ################# +MODULE MODI_CONVECT_CONDENS +! ################# +! + INTERFACE +! + subroutine CONVECT_CONDENS(KLON, & + KICE, PPRES, PTHL, PRW, PRCO, PRIO, PZ, OWORK1, & + PT, PEW, PRC, PRI, PLV, PLS, PCPH) +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON), INTENT(IN) :: PTHL ! enthalpy (J/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PRW ! total water mixing ratio + REAL, DIMENSION(KLON), INTENT(IN) :: PRCO ! cloud water estimate (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PRIO ! cloud ice estimate (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PZ ! level height (m) + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1 ! logical mask +! +! + REAL, DIMENSION(KLON), INTENT(OUT):: PT ! temperature + REAL, DIMENSION(KLON), INTENT(OUT):: PRC ! cloud water mixing ratio(kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PRI ! cloud ice mixing ratio (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v + REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s + REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph + REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! water saturation mixing ratio +! + ENDsubroutine CONVECT_CONDENS +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CONDENS +subroutine CONVECT_CONDENS(KLON, & + KICE, PPRES, PTHL, PRW, PRCO, PRIO, PZ, OWORK1, & + PT, PEW, PRC, PRI, PLV, PLS, PCPH) +! ############################################################################# +! +!!**** Compute temperature cloud and ice water content from enthalpy and r_w +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine cloud condensate +!! and to return values for L_v, L_s and C_ph +!! +!! +!!** METHOD +!! ------ +!! Condensate is extracted iteratively +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CST +!! XG ! gravity constant +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XALPI, XBETAI, XGAMI ! constants for ice saturation pressure +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! end of freezing interval +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CONDENS) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON), INTENT(IN) :: PTHL ! enthalpy (J/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PRW ! total water mixing ratio + REAL, DIMENSION(KLON), INTENT(IN) :: PRCO ! cloud water estimate (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PRIO ! cloud ice estimate (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PZ ! level height (m) + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1 ! logical mask +! +! + REAL, DIMENSION(KLON), INTENT(OUT):: PT ! temperature + REAL, DIMENSION(KLON), INTENT(OUT):: PRC ! cloud water mixing ratio(kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PRI ! cloud ice mixing ratio (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v + REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s + REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph + REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! water saturation mixing ratio +! +!* 0.2 Declarations of local variables KLON +! + INTEGER :: JITER ! iteration index + real :: ZEPS ! R_d / R_v +! + REAL, DIMENSION(KLON) :: ZEI ! ice saturation mixing ratio + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZT ! work arrays +! +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize temperature and Exner function +! ----------------------------------------- +! + ZEPS = XRD / XRV +! +! + ! Make a first temperature estimate, based e.g. on values of + ! r_c and r_i at lower level +! + !! Note that the definition of ZCPH is not the same as used in + !! routine CONVECT_SATMIXRATIO + PCPH(:) = XCPD + XCPV * PRW(:) + ZWORK1(:) = (1.+PRW(:)) * XG * PZ(:) + PT(:) = (PTHL(:) + PRCO(:) * XLVTT + PRIO(:) * XLSTT - ZWORK1(:)) & + / PCPH(:) + PT(:) = MAX(180., MIN(330., PT(:))) ! set overflow bounds in + ! case that PTHL=0 +! +! +!* 2. Enter the iteration loop +! ------------------------ +! + do JITER = 1, 6 + PEW(:) = EXP(XALPW - XBETAW / PT(:) - XGAMW * ALOG(PT(:))) + ZEI(:) = EXP(XALPI - XBETAI / PT(:) - XGAMI * ALOG(PT(:))) + PEW(:) = ZEPS * PEW(:) / (PPRES(:) - PEW(:)) + ZEI(:) = ZEPS * ZEI(:) / (PPRES(:) - ZEI(:)) +! + PLV(:) = XLVTT + (XCPV - XCL) * (PT(:) - XTT) ! compute L_v + PLS(:) = XLSTT + (XCPV - XCI) * (PT(:) - XTT) ! compute L_i +! + ZWORK2(:) = (XTFRZ1 - PT(:)) / (XTFRZ1 - XTFRZ2) ! freezing interval + ZWORK2(:) = MAX(0., MIN(1., ZWORK2(:))) * REAL(KICE) + ZWORK3(:) = (1.-ZWORK2(:)) * PEW(:) + ZWORK2(:) * ZEI(:) + PRC(:) = MAX(0.,(1.-ZWORK2(:)) * (PRW(:) - ZWORK3(:))) + PRI(:) = MAX(0., ZWORK2(:) * (PRW(:) - ZWORK3(:))) + ZT(:) = (PTHL(:) + PRC(:) * PLV(:) + PRI(:) * PLS(:) - ZWORK1(:)) & + / PCPH(:) + PT(:) = PT(:) + (ZT(:) - PT(:)) * 0.4 ! force convergence + PT(:) = MAX(175., MIN(330., PT(:))) + enddo +! +! +ENDsubroutine CONVECT_CONDENS + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_MIXING_FUNCT +! ################# +! + INTERFACE +! + subroutine CONVECT_MIXING_FUNCT(KLON, & + PMIXC, KMF, PER, PDR) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KMF ! switch for dist. function + REAL, DIMENSION(KLON), INTENT(IN) :: PMIXC ! critical mixed fraction +! + REAL, DIMENSION(KLON), INTENT(OUT):: PER ! normalized entrainment rate + REAL, DIMENSION(KLON), INTENT(OUT):: PDR ! normalized detrainment rate +! + ENDsubroutine CONVECT_MIXING_FUNCT +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_MIXING_FUNCT +! ######spl +subroutine CONVECT_MIXING_FUNCT(KLON, & + PMIXC, KMF, PER, PDR) +! ####################################################### +! +!!**** Determine the area under the distribution function +!! KMF = 1 : gaussian KMF = 2 : triangular distribution function +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the entrainment and +!! detrainment rate by evaluating the are under the distribution +!! function. The integration interval is limited by the critical +!! mixed fraction PMIXC +!! +!! +!! +!!** METHOD +!! ------ +!! Use handbook of mathemat. functions by Abramowitz and Stegun, 1968 +!! +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine MIXING_FUNCT) +!! Abramovitz and Stegun (1968), handbook of math. functions +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KMF ! switch for dist. function + REAL, DIMENSION(KLON), INTENT(IN) :: PMIXC ! critical mixed fraction +! + REAL, DIMENSION(KLON), INTENT(OUT):: PER ! normalized entrainment rate + REAL, DIMENSION(KLON), INTENT(OUT):: PDR ! normalized detrainment rate +! +!* 0.2 Declarations of local variables : +! + real :: ZSIGMA = 0.166666667 ! standard deviation + real :: ZFE = 4.931813949 ! integral normalization + real :: ZSQRTP = 2.506628, ZP = 0.33267 ! constants + real :: ZA1 = 0.4361836, ZA2 = -0.1201676 ! constants + real :: ZA3 = 0.9372980, ZT1 = 0.500498 ! constants + real :: ZE45 = 0.01111 ! constant +! + REAL, DIMENSION(KLON) :: ZX, ZY, ZW1, ZW2 ! work variables + real :: ZW11 +! +! +!------------------------------------------------------------------------------- +! +! 1. Use gaussian function for KMF=1 +! ------------------------------- +! + if(KMF == 1) then + ! ZX(:) = ( PMIXC(:) - 0.5 ) / ZSIGMA + ZX(:) = 6.*PMIXC(:) - 3. + ZW1(:) = 1./(1.+ZP * ABS(ZX(:))) + ZY(:) = EXP(-0.5 * ZX(:) * ZX(:)) + ZW2(:) = ZA1 * ZW1(:) + ZA2 * ZW1(:) * ZW1(:) + & + ZA3 * ZW1(:) * ZW1(:) * ZW1(:) + ZW11 = ZA1 * ZT1 + ZA2 * ZT1 * ZT1 + ZA3 * ZT1 * ZT1 * ZT1 + endif +! + WHERE(KMF == 1 .and. ZX(:) >= 0.) + PER(:) = ZSIGMA * (0.5 * (ZSQRTP - ZE45 * ZW11 & + - ZY(:) * ZW2(:)) + ZSIGMA * (ZE45 - ZY(:))) & + - 0.5 * ZE45 * PMIXC(:) * PMIXC(:) + PDR(:) = ZSIGMA * (0.5 * (ZY(:) * ZW2(:) - ZE45 * ZW11) & + + ZSIGMA * (ZE45 - ZY(:))) & + - ZE45 * (0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:)) + ENDWHERE + WHERE(KMF == 1 .and. ZX(:) < 0.) + PER(:) = ZSIGMA * (0.5 * (ZY(:) * ZW2(:) - ZE45 * ZW11) & + + ZSIGMA * (ZE45 - ZY(:))) & + - 0.5 * ZE45 * PMIXC(:) * PMIXC(:) + PDR(:) = ZSIGMA * (0.5 * (ZSQRTP - ZE45 * ZW11 - ZY(:) & + * ZW2(:)) + ZSIGMA * (ZE45 - ZY(:))) & + - ZE45 * (0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:)) + ENDWHERE +! + PER(:) = PER(:) * ZFE + PDR(:) = PDR(:) * ZFE +! +! +! 2. Use triangular function KMF=2 +! ------------------------------- +! +! not yet released +! +! +ENDsubroutine CONVECT_MIXING_FUNCT + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_UPDRAFT +! ################# +! + INTERFACE +! + subroutine CONVECT_UPDRAFT(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PURR, PURS, PUPR, & + PUTPR, PCAPE, KCTL, KETL, PUTT) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHV ! grid scale theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! + INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTT ! updraft temperature(K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURR ! liquid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(KLON, KLEV), INTENT(OUT)::PURS ! solid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(KLON, KLEV), INTENT(OUT)::PUPR ! updraft precipitation in + ! flux units (kg water / s) + REAL, DIMENSION(KLON), INTENT(OUT):: PUTPR ! total updraft precipitation + ! in flux units (kg water / s) + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! + ENDsubroutine CONVECT_UPDRAFT +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_UPDRAFT +! ########################################################################## +subroutine CONVECT_UPDRAFT(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PURR, PURS, PUPR, & + PUTPR, PCAPE, KCTL, KETL, PUTT) +! ########################################################################## +! +!!**** Compute updraft properties from DPL to CTL. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine updraft properties +!! ( mass flux, thermodynamics, precipitation ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_MIXING_FUNCT +!! Routine CONVECT_CONDENS +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV, XCL ! Cp of dry air, water vapor and liquid water +!! XTT ! triple point temperature +!! XLVTT ! vaporisation heat at XTT +!! +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! XCDEPTH ! minimum necessary cloud depth +!! XENTR ! entrainment constant +!! XRCONV ! constant in precipitation conversion +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! begin of freezing interval +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_UPDRAFT) +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 10/12/97 +!! V.Masson, C.Lac, Sept. 2010 : Correction of a loop for reproducibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR + USE MODD_CONVPAREXT +! + USE MODI_CONVECT_CONDENS + USE MODI_CONVECT_MIXING_FUNCT +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHV ! grid scale theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! + INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTT ! updraft temperature(K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURR ! liquid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(KLON, KLEV), INTENT(OUT)::PURS ! solid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(KLON, KLEV), INTENT(OUT)::PUPR ! updraft precipitation in + ! flux units (kg water / s) + REAL, DIMENSION(KLON), INTENT(OUT):: PUTPR ! total updraft precipitation + ! in flux units (kg water / s) + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal and vertical loop bounds + INTEGER :: JI ! horizontal loop index + INTEGER :: JK, JKP, JKM, JK1, JK2, JKMIN ! vertical loop index + real :: ZEPSA ! R_v / R_d, C_pv / C_pd + real :: ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON) :: ZUT ! updraft temperature (K) + REAL, DIMENSION(KLON) :: ZUW1, ZUW2 ! square of updraft vert. + ! velocity at levels k and k+1 + REAL, DIMENSION(KLON) :: ZE1, ZE2, ZD1, ZD2 ! fractional entrainm./detrain + ! rates at levels k and k+1 + REAL, DIMENSION(KLON) :: ZMIXF ! critical mixed fraction + REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph + REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. + REAL, DIMENSION(KLON) :: ZURV ! updraft water vapor at level k+1 + REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) + REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5, & + ZWORK6 ! work arrays + INTEGER, DIMENSION(KLON) :: IWORK ! wok array + LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK2, GWORK4 + ! work arrays + LOGICAL, DIMENSION(KLON, KLEV) :: GWORK6 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT + IIE = KLON +! +! +!* 1. Initialize updraft properties and local variables +! ------------------------------------------------- +! + ZEPSA = XRV / XRD + ZRDOCP = XRD / XCPD +! + PUMF(:, :) = 0. + PUER(:, :) = 0. + PUDR(:, :) = 0. + PUTHL(:, :) = 0. + PUTHV(:, :) = 0. + PUTT(:, :) = 0. + PURW(:, :) = 0. + PURC(:, :) = 0. + PURI(:, :) = 0. + PUPR(:, :) = 0. + PURR(:, :) = 0. + PURS(:, :) = 0. + PUTPR(:) = 0. + ZUW1(:) = PWLCL(:) * PWLCL(:) + ZUW2(:) = 0. + ZE1(:) = 1. + ZD1(:) = 0. + PCAPE(:) = 0. + KCTL(:) = IKB + KETL(:) = KLCL(:) + GWORK2(:) = .true. + ZPI(:) = 1. + ZWORK3(:) = 0. + ZWORK4(:) = 0. + ZWORK5(:) = 0. + ZWORK6(:) = 0. + GWORK1(:) = .false. + GWORK4(:) = .false. +! +! +!* 1.1 Compute undilute updraft theta_e for CAPE computations +! Bolton (1980) formula. +! Define accurate enthalpy for updraft +! ----------------------------------------------------- +! + ZTHEUL(:) = PTLCL(:) * (PTHLCL(:) / PTLCL(:))**(1.-0.28 * PRVLCL(:)) & + * EXP((3374.6525 / PTLCL(:) - 2.5403) * & + PRVLCL(:) * (1.+0.81 * PRVLCL(:))) +! +! + ZWORK1(:) = (XCPD + PRVLCL(:) * XCPV) * PTLCL(:) & + + (1.+PRVLCL(:)) * XG * PZLCL(:) +! +! +!* 2. Set updraft properties between DPL and LCL +! ------------------------------------------ +! + JKP = MAXVAL(KLCL(:)) + JKM = MINVAL(KDPL(:)) + do JK = JKM, JKP + do JI = 1, IIE + if(JK >= KDPL(JI) .and. JK < KLCL(JI)) then + PUMF(JI, JK) = PMFLCL(JI) + PUTHL(JI, JK) = ZWORK1(JI) + PUTHV(JI, JK) = PTHLCL(JI) * (1.+ZEPSA * PRVLCL(JI)) / & + (1.+PRVLCL(JI)) + PURW(JI, JK) = PRVLCL(JI) + endif + enddo + enddo +! +! +!* 3. Enter loop for updraft computations +! ------------------------------------ +! +! Correction for reproduciblity +!JKMIN = MINVAL( KLCL(:) ) - 1 + JKMIN = MINVAL(KLCL(:)) - 2 + do JK = MAX(IKB + 1, JKMIN), IKE - 1 + ZWORK6(:) = 1. + JKP = JK + 1 +! + GWORK4(:) = JK >= KLCL(:) - 1 + GWORK1(:) = GWORK4(:) .and. GWORK2(:) ! this mask is used to confine + ! updraft computations between the LCL and the CTL +! + WHERE(JK == KLCL(:) - 1) ZWORK6(:) = 0. ! factor that is used in buoyancy + ! computation at first level above LCL +! +! +!* 4. Estimate condensate, L_v L_i, Cph and theta_v at level k+1 +! ---------------------------------------------------------- +! + ZWORK1(:) = PURC(:, JK) + PURR(:, JK) + ZWORK2(:) = PURI(:, JK) + PURS(:, JK) + call CONVECT_CONDENS(KLON, KICE, PPRES(:, JKP), PUTHL(:, JK), PURW(:, JK), & + ZWORK1, ZWORK2, PZ(:, JKP), GWORK1, ZUT, ZURV, & + PURC(:, JKP), PURI(:, JKP), ZLV, ZLS, ZCPH) +! +! + ZPI(:) = (XP00 / PPRES(:, JKP))**ZRDOCP + WHERE(GWORK1(:)) +! + PUTHV(:, JKP) = ZPI(:) * ZUT(:) * (1.+ZEPSA * ZURV(:)) & + / (1.+PURW(:, JK)) + PUTT(:, JKP) = ZUT(:) +! +! +!* 5. Compute square of vertical velocity using entrainment +! at level k +! ----------------------------------------------------- +! + ZWORK3(:) = PZ(:, JKP) - PZ(:, JK) * ZWORK6(:) - & + (1.-ZWORK6(:)) * PZLCL(:) ! level thickness + ZWORK4(:) = PTHV(:, JK) * ZWORK6(:) + & + (1.-ZWORK6(:)) * PTHVELCL(:) + ZWORK5(:) = 2.*ZUW1(:) * PUER(:, JK) / MAX(.1, PUMF(:, JK)) + ZUW2(:) = ZUW1(:) + ZWORK3(:) * XNHGAM * XG * & + ((PUTHV(:, JK) + PUTHV(:, JKP)) / & + (ZWORK4(:) + PTHV(:, JKP)) - 1.) & ! buoyancy term + - ZWORK5(:) ! entrainment term +! +! +!* 6. Update total precipitation: dr_r=(r_c+r_i)*exp(-rate*dz) +! -------------------------------------------------------- +! +! compute level mean vertical velocity + ZWORK2(:) = 0.5 * & + (SQRT(MAX(1.E-2, ZUW2(:))) + & + SQRT(MAX(1.E-2, ZUW1(:)))) + PURR(:, JKP) = 0.5 * (PURC(:, JK) + PURC(:, JKP) + PURI(:, JK) + PURI(:, JKP)) & + * (1.-EXP(-XRCONV * ZWORK3(:) / ZWORK2(:))) + PUPR(:, JKP) = PURR(:, JKP) * PUMF(:, JK) ! precipitation rate ( kg water / s) + PUTPR(:) = PUTPR(:) + PUPR(:, JKP) ! total precipitation rate + ZWORK2(:) = PURR(:, JKP) / MAX(1.E-8, PURC(:, JKP) + PURI(:, JKP)) + PURR(:, JKP) = ZWORK2(:) * PURC(:, JKP) ! liquid precipitation + PURS(:, JKP) = ZWORK2(:) * PURI(:, JKP) ! solid precipitation +! +! +!* 7. Update r_c, r_i, enthalpy, r_w for precipitation +! ------------------------------------------------------- +! + PURW(:, JKP) = PURW(:, JK) - PURR(:, JKP) - PURS(:, JKP) + PURC(:, JKP) = PURC(:, JKP) - PURR(:, JKP) + PURI(:, JKP) = PURI(:, JKP) - PURS(:, JKP) + PUTHL(:, JKP) = (XCPD + PURW(:, JKP) * XCPV) * ZUT(:) & + + (1.+PURW(:, JKP)) * XG * PZ(:, JKP) & + - ZLV(:) * PURC(:, JKP) - ZLS(:) * PURI(:, JKP) +! + ZUW1(:) = ZUW2(:) +! + ENDWHERE +! +! +!* 8. Compute entrainment and detrainment using conservative +! variables adjusted for precipitation ( not for entrainment) +! ----------------------------------------------------------- +! +!* 8.1 Compute critical mixed fraction by estimating unknown +! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix +! We determine the zero crossing of the linear curve +! evaluating the derivative using ZMIXF=0.1. +! ----------------------------------------------------- +! + ZMIXF(:) = 0.1 ! starting value for critical mixed fraction + ZWORK1(:) = ZMIXF(:) * PTHL(:, JKP) & + + (1.-ZMIXF(:)) * PUTHL(:, JKP) ! mixed enthalpy + ZWORK2(:) = ZMIXF(:) * PRW(:, JKP) & + + (1.-ZMIXF(:)) * PURW(:, JKP) ! mixed r_w +! + call CONVECT_CONDENS(KLON, KICE, PPRES(:, JKP), ZWORK1, ZWORK2, & + PURC(:, JKP), PURI(:, JKP), PZ(:, JKP), GWORK1, ZUT, & + ZWORK3, ZWORK4, ZWORK5, ZLV, ZLS, ZCPH) +! put in enthalpy and r_w and get T r_c, r_i (ZUT, ZWORK4-5) +! + ! compute theta_v of mixture + ZWORK3(:) = ZUT(:) * ZPI(:) * (1.+ZEPSA * ( & + ZWORK2(:) - ZWORK4(:) - ZWORK5(:))) / (1.+ZWORK2(:)) + ! compute final value of critical mixed fraction using theta_v + ! of mixture, grid-scale and updraft + ZMIXF(:) = MAX(0., PUTHV(:, JKP) - PTHV(:, JKP)) * ZMIXF(:) / & + (PUTHV(:, JKP) - ZWORK3(:) + 1.E-10) + ZMIXF(:) = MAX(0., MIN(1., ZMIXF(:))) +! +! +!* 8.2 Compute final midlevel values for entr. and detrainment +! after call of distribution function +! ------------------------------------------------------- +! +! + call CONVECT_MIXING_FUNCT(KLON, ZMIXF, 1, ZE2, ZD2) +! Note: routine MIXING_FUNCT returns fractional entrainm/detrainm. rates +! +! ZWORK1(:) = XENTR * PMFLCL(:) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + zwork1(:) = xentr * xg / xcrad * pumf(:, jk) * (pz(:, jkp) - pz(:, jk)) +! ZWORK1(:) = XENTR * pumf(:,jk) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + ZWORK2(:) = 0. + WHERE(GWORK1(:)) ZWORK2(:) = 1. + ZE2(:) = .5; ZD2(:) = .6 ! set entrainment=detrainment for better + ! mass flux profiles in deep continental convection + WHERE(PUTHV(:, JKP) > PTHV(:, JKP)) + PUER(:, JKP) = 0.5 * ZWORK1(:) * (ZE1(:) + ZE2(:)) * ZWORK2(:) + PUDR(:, JKP) = 0.5 * ZWORK1(:) * (ZD1(:) + ZD2(:)) * ZWORK2(:) + elseWHERE + PUER(:, JKP) = 0. + PUDR(:, JKP) = ZWORK1(:) * ZWORK2(:) + ENDWHERE +! +!* 8.3 Determine equilibrium temperature level +! -------------------------------------- +! + WHERE(PUTHV(:, JKP) > PTHV(:, JKP) .and. JK > KLCL(:) + 1 & + .and. GWORK1(:)) + KETL(:) = JKP ! equilibrium temperature level + ENDWHERE +! +!* 8.4 If the calculated detrained mass flux is greater than +! the total updraft mass flux, or vertical velocity is +! negative, all cloud mass detrains at previous model level, +! exit updraft calculations - CTL is attained +! ------------------------------------------------------- +! + WHERE(GWORK1(:)) & + GWORK2(:) = PUMF(:, JK) - PUDR(:, JKP) > 10. .and. ZUW2(:) > 0. + WHERE(GWORK2(:)) KCTL(:) = JKP ! cloud top level +!!!! Correction Bug C.Lac 30/10/08 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + KCTL(:) = MIN(KCTL(:), IKE - 1) + GWORK1(:) = GWORK2(:) .and. GWORK4(:) +! + if(COUNT(GWORK2(:)) == 0) EXIT +! +! +!* 9. Compute CAPE for undilute ascent using theta_e and +! theta_es instead of theta_v. This estimation produces +! a significantly larger value for CAPE than the actual one. +! ---------------------------------------------------------- +! + WHERE(GWORK1(:)) +! + ZWORK3(:) = PZ(:, JKP) - PZ(:, JK) * ZWORK6(:) - & + (1.-ZWORK6(:)) * PZLCL(:) ! level thickness + ZWORK2(:) = PTHES(:, JK) + (1.-ZWORK6(:)) * & + (PTHES(:, JKP) - PTHES(:, JK)) / (PZ(:, JKP) - PZ(:, JK)) * & + (PZLCL(:) - PZ(:, JK)) ! linear interpolation for theta_es at LCL + ! ( this is only done for model level just above LCL +! + ZWORK1(:) = (2.*ZTHEUL(:)) / (ZWORK2(:) + PTHES(:, JKP)) - 1. + PCAPE(:) = PCAPE(:) + XG * ZWORK3(:) * MAX(0., ZWORK1(:)) +! +! +!* 10. Compute final values of updraft mass flux, enthalpy, r_w +! at level k+1 +! -------------------------------------------------------- +! + PUMF(:, JKP) = PUMF(:, JK) - PUDR(:, JKP) + PUER(:, JKP) + PUMF(:, JKP) = MAX(PUMF(:, JKP), 0.1) + PUTHL(:, JKP) = (PUMF(:, JK) * PUTHL(:, JK) + & + PUER(:, JKP) * PTHL(:, JK) - PUDR(:, JKP) * PUTHL(:, JK)) & + / PUMF(:, JKP) + PUTHL(:, JKP) - PUTHL(:, JK) + PURW(:, JKP) = (PUMF(:, JK) * PURW(:, JK) + & + PUER(:, JKP) * PRW(:, JK) - PUDR(:, JKP) * PURW(:, JK)) & + / PUMF(:, JKP) - PURR(:, JKP) - PURS(:, JKP) +! +! + ZE1(:) = ZE2(:) ! update fractional entrainment/detrainment + ZD1(:) = ZD2(:) +! + ENDWHERE +! + enddo +! +!* 12.1 Set OTRIG to False if cloud thickness < XCDEPTH +! or CAPE < 1 +! ------------------------------------------------ +! + do JI = 1, IIE + JK = KCTL(JI) + OTRIG(JI) = PZ(JI, JK) - PZLCL(JI) >= XCDEPTH & + .and. PCAPE(JI) > 1. + enddo + WHERE(.not. OTRIG(:)) + KCTL(:) = IKB + ENDWHERE + KETL(:) = MAX(KETL(:), KLCL(:) + 2) + KETL(:) = MIN(KETL(:), KCTL(:)) +! +! +!* 12.2 If the ETL and CTL are the same detrain updraft mass +! flux at this level +! ------------------------------------------------------- +! + ZWORK1(:) = 0. + WHERE(KETL(:) == KCTL(:)) ZWORK1(:) = 1. +! + do JI = 1, IIE + JK = KETL(JI) + PUDR(JI, JK) = PUDR(JI, JK) + & + (PUMF(JI, JK) - PUER(JI, JK)) * ZWORK1(JI) + PUER(JI, JK) = PUER(JI, JK) * (1.-ZWORK1(JI)) + PUMF(JI, JK) = PUMF(JI, JK) * (1.-ZWORK1(JI)) + JKP = KCTL(JI) + 1 + PUER(JI, JKP) = 0. ! entrainm/detr rates have been already computed + PUDR(JI, JKP) = 0. ! at level KCTL+1, set them to zero + PURW(JI, JKP) = 0. + PURC(JI, JKP) = 0. + PURI(JI, JKP) = 0. + PUTHL(JI, JKP) = 0. + PURI(JI, JKP + 1) = 0. + PURC(JI, JKP + 1) = 0. + enddo +! +!* 12.3 Adjust mass flux profiles, detrainment rates, and +! precipitation fallout rates to reflect linear decrease +! in mass flux between the ETL and CTL +! ------------------------------------------------------- +! + ZWORK1(:) = 0. + JK1 = MINVAL(KETL(:)) + JK2 = MAXVAL(KCTL(:)) + do JK = JK1, JK2 + do JI = 1, IIE + if(JK > KETL(JI) .and. JK <= KCTL(JI)) then + ZWORK1(JI) = ZWORK1(JI) + PDPRES(JI, JK) + endif + enddo + enddo +! + do JI = 1, IIE + JK = KETL(JI) + ZWORK1(JI) = PUMF(JI, JK) / MAX(1., ZWORK1(JI)) + enddo +! + do JK = JK1 + 1, JK2 + JKP = JK - 1 + do JI = 1, IIE + if(JK > KETL(JI) .and. JK <= KCTL(JI)) then + ! PUTPR(JI) = PUTPR(JI) - ( PURR(JI,JK) + PURS(JI,JK) ) * PUMF(JI,JKP) + PUTPR(JI) = PUTPR(JI) - PUPR(JI, JK) + PUDR(JI, JK) = PDPRES(JI, JK) * ZWORK1(JI) + PUMF(JI, JK) = PUMF(JI, JKP) - PUDR(JI, JK) + PUPR(JI, JK) = PUMF(JI, JKP) * (PURR(JI, JK) + PURS(JI, JK)) + PUTPR(JI) = PUTPR(JI) + PUPR(JI, JK) + endif + enddo + enddo +! +! 12.4 Set mass flux and entrainment in the source layer. +! Linear increase throughout the source layer. +! ------------------------------------------------------- +! +!IWORK(:) = MIN( KPBL(:), KLCL(:) - 1 ) + IWORK(:) = KPBL(:) + do JI = 1, IIE + JK = KDPL(JI) + JKP = IWORK(JI) +! mixed layer depth + ZWORK2(JI) = PPRES(JI, JK) - PPRES(JI, JKP) + PDPRES(JI, JK) + enddo +! + JKP = MAXVAL(IWORK(:)) + do JK = JKM, JKP + do JI = 1, IIE + if(JK >= KDPL(JI) .and. JK <= IWORK(JI)) then + PUER(JI, JK) = PUER(JI, JK) + PMFLCL(JI) * PDPRES(JI, JK) / (ZWORK2(JI) + 0.1) + PUMF(JI, JK) = PUMF(JI, JK - 1) + PUER(JI, JK) + endif + enddo + enddo +! +! +!* 13. If cloud thickness is smaller than 3 km, no +! convection is allowed +! Nota: For technical reasons, we stop the convection +! computations in this case and do not go back to +! TRIGGER_FUNCT to look for the next unstable LCL +! which could produce a thicker cloud. +! --------------------------------------------------- +! + GWORK6(:, :) = SPREAD(OTRIG(:), DIM=2, NCOPIES=KLEV) + WHERE(.not. OTRIG(:)) PUTPR(:) = 0. + WHERE(.not. GWORK6(:, :)) + PUMF(:, :) = 0. + PUDR(:, :) = 0. + PUER(:, :) = 0. + PUTHL(:, :) = PTHL(:, :) + PURW(:, :) = PRW(:, :) + PUPR(:, :) = 0. + PURC(:, :) = 0. + PURI(:, :) = 0. + PURR(:, :) = 0. + PURS(:, :) = 0. + ENDWHERE +! +ENDsubroutine CONVECT_UPDRAFT + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_TSTEP_PREF +! ################# +! + INTERFACE +! + subroutine CONVECT_TSTEP_PREF(KLON, KLEV, & + PU, PV, PPRES, PZ, PDXDY, KLCL, KCTL, & + PTIMEA, PPREF) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! lifting condensation level index + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! cloud top level index +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTIMEA ! advective time period + REAL, DIMENSION(KLON), INTENT(OUT):: PPREF ! precipitation efficiency +! + ENDsubroutine CONVECT_TSTEP_PREF +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_TSTEP_PREF +! ###################################################################### +subroutine CONVECT_TSTEP_PREF(KLON, KLEV, & + PU, PV, PPRES, PZ, PDXDY, KLCL, KCTL, & + PTIMEA, PPREF) +! ###################################################################### +! +!!**** Routine to compute convective advection time step and precipitation +!! efficiency +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! advection time step PTIMEC as a function of the mean ambient +!! wind as well as the precipitation efficiency as a function +!! of wind shear and cloud base height. +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAREXT +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! lifting condensation level index + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! cloud top level index +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTIMEA ! advective time period + REAL, DIMENSION(KLON), INTENT(OUT):: PPREF ! precipitation efficiency +! +! +!* 0.2 Declarations of local variables KLON +! + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + INTEGER :: JI ! horizontal loop index + INTEGER :: JK, JKLC, JKP5, JKCT ! vertical loop index +! + INTEGER, DIMENSION(KLON) :: IP500 ! index of 500 hPa levels + REAL, DIMENSION(KLON) :: ZCBH ! cloud base height + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Determine vertical index for 500 hPa levels +! ------------------------------------------ +! +! + IP500(:) = IKB + do JK = IKB, IKE + WHERE(PPRES(:, JK) >= 500.E2) IP500(:) = JK + enddo +! +! +!* 2. Compute convective time step +! ---------------------------- +! + ! compute wind speed at LCL, 500 hPa, CTL + + do JI = 1, IIE + JKLC = KLCL(JI) + JKP5 = IP500(JI) + JKCT = KCTL(JI) + ZWORK1(JI) = SQRT(PU(JI, JKLC) * PU(JI, JKLC) + & + PV(JI, JKLC) * PV(JI, JKLC)) + ZWORK2(JI) = SQRT(PU(JI, JKP5) * PU(JI, JKP5) + & + PV(JI, JKP5) * PV(JI, JKP5)) + ZWORK3(JI) = SQRT(PU(JI, JKCT) * PU(JI, JKCT) + & + PV(JI, JKCT) * PV(JI, JKCT)) + enddo +! + ZWORK2(:) = MAX(0.1, 0.5 * (ZWORK1(:) + ZWORK2(:))) +! + PTIMEA(:) = SQRT(PDXDY(:)) / ZWORK2(:) +! +! +!* 3. Compute precipitation efficiency +! ----------------------------------- +! +!* 3.1 Precipitation efficiency as a function of wind shear +! ---------------------------------------------------- +! + ZWORK2(:) = SIGN(1., ZWORK3(:) - ZWORK1(:)) + do JI = 1, IIE + JKLC = KLCL(JI) + JKCT = KCTL(JI) + ZWORK1(JI) = (PU(JI, JKCT) - PU(JI, JKLC)) * & + (PU(JI, JKCT) - PU(JI, JKLC)) + & + (PV(JI, JKCT) - PV(JI, JKLC)) * & + (PV(JI, JKCT) - PV(JI, JKLC)) + ZWORK1(JI) = 1.E3 * ZWORK2(JI) * SQRT(ZWORK1(JI)) / & + MAX(1.E-2, PZ(JI, JKCT) - PZ(JI, JKLC)) + enddo +! + PPREF(:) = 1.591 + ZWORK1(:) * (-.639 + ZWORK1(:) * ( & + 9.53E-2 - ZWORK1(:) * 4.96E-3)) + PPREF(:) = MAX(.4, MIN(PPREF(:), .9)) +! +!* 3.2 Precipitation efficiency as a function of cloud base height +! ---------------------------------------------------------- +! + do JI = 1, IIE + JKLC = KLCL(JI) + ZCBH(JI) = MAX(3.,(PZ(JI, JKLC) - PZ(JI, IKB)) * 3.281E-3) + enddo + ZWORK1(:) = .9673 + ZCBH(:) * (-.7003 + ZCBH(:) * (.1622 + & + ZCBH(:) * (-1.2570E-2 + ZCBH(:) * (4.2772E-4 - & + ZCBH(:) * 5.44E-6)))) + ZWORK1(:) = MAX(.4, MIN(.9, 1./(1.+ZWORK1(:)))) +! +!* 3.3 Mean precipitation efficiency is used to compute rainfall +! ---------------------------------------------------------- +! + PPREF(:) = 0.5 * (PPREF(:) + ZWORK1(:)) +! +! +ENDsubroutine CONVECT_TSTEP_PREF + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_DOWNDRAFT +! ################# +! + INTERFACE +! + subroutine CONVECT_DOWNDRAFT(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTH, PTHES, & + PRW, PRC, PRI, & + PPREF, KLCL, KCTL, KETL, & + PUTHL, PURW, PURC, PURI, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PMIXF, PDTEVR, KLFS, KDBL, KML, & + PDTEVRF) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c (cloud water) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i (cloud ice) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! level height (m) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of + ! equilibrium (zero buoyancy) level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! " vert. index of melting level + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft r_c (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft r_i (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDRW ! downdraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PMIXF ! mixed fraction at LFS + REAL, DIMENSION(KLON), INTENT(OUT):: PDTEVR ! total downdraft evaporation + ! rate at LFS (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDTEVRF! downdraft evaporation rate + INTEGER, DIMENSION(KLON), INTENT(OUT):: KLFS ! contains vert. index of LFS + INTEGER, DIMENSION(KLON), INTENT(OUT):: KDBL ! contains vert. index of DBL +! + ENDsubroutine CONVECT_DOWNDRAFT +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_DOWNDRAFT +! ########################################################################## +subroutine CONVECT_DOWNDRAFT(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTH, PTHES, & + PRW, PRC, PRI, & + PPREF, KLCL, KCTL, KETL, & + PUTHL, PURW, PURC, PURI, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PMIXF, PDTEVR, KLFS, KDBL, KML, & + PDTEVRF) +! ########################################################################## +! +!!**** Compute downdraft properties from LFS to DBL. +!! +!! +!! PDRPOSE +!! ------- +!! The purpose of this routine is to determine downdraft properties +!! ( mass flux, thermodynamics ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from top. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XCPV, XCL, XCI ! Cp of water vapor, liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporisation/sublimation heat at XTT +!! +!! Module MODD_CONVPAR +!! XCRAD ! cloud radius +!! XZPBL ! thickness of downdraft detrainment layer +!! XENTR ! entrainment constant in pressure coordinates +!! XRHDBC ! relative humidity in downdraft below cloud +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_DOWNDRAFT) +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!! C.Lac 27/09/10 modification loop index for reproducibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR + USE MODD_CONVPAREXT +! + USE MODI_CONVECT_SATMIXRATIO +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c (cloud water) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i (cloud ice) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! level height (m) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of + ! equilibrium (zero buoyancy) level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! " vert. index of melting level + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft r_c (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft r_i (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDRW ! downdraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PMIXF ! mixed fraction at LFS + REAL, DIMENSION(KLON), INTENT(OUT):: PDTEVR ! total downdraft evaporation + ! rate at LFS (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PDTEVRF! downdraft evaporation rate + INTEGER, DIMENSION(KLON), INTENT(OUT):: KLFS ! contains vert. index of LFS + INTEGER, DIMENSION(KLON), INTENT(OUT):: KDBL ! contains vert. index of DBL +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + INTEGER :: JK, JKP, JKM, JKT ! vertical loop index + INTEGER :: JI, JL ! horizontal loop index + INTEGER :: JITER ! iteration loop index + real :: ZRDOCP ! R_d / C_pd + real :: ZEPS ! R_d / R_v +! + INTEGER, DIMENSION(KLON) :: IDDT ! top level of detrainm. layer + REAL, DIMENSION(KLON) :: ZTHE ! environm. theta_e (K) + REAL, DIMENSION(KLON) :: ZDT, ZDTP ! downdraft temperature (K) + REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph + REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. + REAL, DIMENSION(KLON) :: ZDDT ! thickness (hPa) of detrainm. layer + REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4 ! work arrays + LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Initialize downdraft properties +! ------------------------------- +! + ZRDOCP = XRD / XCPD + ZEPS = XRD / XRV + PDMF(:, :) = 0. + PDER(:, :) = 0. + PDDR(:, :) = 0. + PDRW(:, :) = 0. + PDTHL(:, :) = 0. + PDTEVR(:) = 0. + PMIXF(:) = 0. + ZTHE(:) = 0. + ZDDT(:) = PDPRES(:, IKB + 2) + KDBL(:) = IKB + 1 + KLFS(:) = IKB + 1 + IDDT(:) = KDBL(:) + 1 +! +! +!* 2. Determine the LFS by looking for minimum of environmental +! saturated theta_e +! ---------------------------------------------------------- +! + ZWORK1(:) = 900. ! starting value for search of minimum envir. theta_e + do JK = MINVAL(KLCL(:)) + 2, MAXVAL(KETL(:)) + do JI = 1, IIE + GWORK1(JI) = JK >= KLCL(JI) + 2 .and. JK < KETL(JI) + if(GWORK1(JI) .and. ZWORK1(JI) > PTHES(JI, JK)) then + KLFS(JI) = JK + ZWORK1(JI) = MIN(ZWORK1(JI), PTHES(JI, JK)) + endif + enddo + enddo +! +! +!* 3. Determine the mixed fraction using environmental and updraft +! values of theta_e at LFS +! --------------------------------------------------------- +! + do JI = 1, IIE + JK = KLFS(JI) + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ! compute updraft theta_e + ZWORK3(JI) = PURW(JI, JK) - PURC(JI, JK) - PURI(JI, JK) + ZDT(JI) = PTH(JI, JK) / ZPI(JI) + ZLV(JI) = XLVTT + (XCPV - XCL) * (ZDT(JI) - XTT) + ZLS(JI) = XLSTT + (XCPV - XCI) * (ZDT(JI) - XTT) + ZCPH(JI) = XCPD + XCPV * PURW(JI, JK) + ZDT(JI) = (PUTHL(JI, JK) - (1.+PURW(JI, JK)) * XG * PZ(JI, JK) & + + ZLV(JI) * PURC(JI, JK) + ZLS(JI) * PURI(JI, JK)) / ZCPH(JI) + ZWORK1(JI) = ZDT(JI) * ZPI(JI)**(1.-0.28 * ZWORK3(JI)) & + * EXP((3374.6525 / ZDT(JI) - 2.5403) & + * ZWORK3(JI) * (1.+0.81 * ZWORK3(JI))) + ! compute environmental theta_e + ZDT(JI) = PTH(JI, JK) / ZPI(JI) + ZLV(JI) = XLVTT + (XCPV - XCL) * (ZDT(JI) - XTT) + ZLS(JI) = XLSTT + (XCPV - XCI) * (ZDT(JI) - XTT) + ZWORK3(JI) = PRW(JI, JK) - PRC(JI, JK) - PRI(JI, JK) + ZCPH(JI) = XCPD + XCPV * PRW(JI, JK) + ZWORK2(JI) = ZDT(JI) * ZPI(JI)**(1.-0.28 * ZWORK3(JI)) & + * EXP((3374.6525 / ZDT(JI) - 2.5403) & + * ZWORK3(JI) * (1.+0.81 * ZWORK3(JI))) + ! compute mixed fraction + PMIXF(JI) = MAX(0.,(ZWORK1(JI) - PTHES(JI, JK))) & + / (ZWORK1(JI) - ZWORK2(JI) + 1.E-10) + PMIXF(JI) = MAX(0., MIN(1., PMIXF(JI))) + ZWORK4(JI) = PPRES(JI, JK) + enddo +! +! +!* 4. Estimate the effect of melting on the downdraft +! --------------------------------------------- +! + ZWORK1(:) = 0. + ! use total solid precipitation +!do JK = IKB + 1, IKE +! ZWORK1(:) = ZWORK1(:) + PURS(:,JK) ! total snow/hail content +!end do +! + do JI = 1, IIE + JK = KLCL(JI) + JKP = KCTL(JI) + ZWORK1(JI) = 0.5 * (PURW(JI, JK) - PURW(JI, JKP)) + enddo +! + ! temperature perturbation due to melting at LFS + ZWORK3(:) = 0. + WHERE(KML(:) > IKB + 2) + ZWORK3(:) = ZWORK1(:) * (ZLS(:) - ZLV(:)) / ZCPH(:) + ZDT(:) = ZDT(:) - ZWORK3(:) * REAL(KICE) + ENDWHERE +! +! +!* 5. Initialize humidity at LFS as a saturated mixture of +! updraft and environmental air +! ----------------------------------------------------- +! + do JI = 1, IIE + JK = KLFS(JI) + PDRW(JI, JK) = PMIXF(JI) * PRW(JI, JK) + (1.-PMIXF(JI)) * PURW(JI, JK) + ZWORK2(JI) = PDRW(JI, JK) - (1.-PMIXF(JI)) & + * (PURC(JI, JK) + PURI(JI, JK)) + enddo +! +! +!* 6.1 Determine the DBL by looking for level where the envir. +! theta_es at the LFS corrected by melting effects becomes +! larger than envir. value +! --------------------------------------------------------- +! + ! compute satur. mixing ratio for melting corrected temperature + call CONVECT_SATMIXRATIO(KLON, ZWORK4, ZDT, ZWORK3, ZLV, ZLS, ZCPH) +! + ! compute envir. saturated theta_e for melting corrected temperature + ZWORK1(:) = MIN(ZWORK2(:), ZWORK3(:)) + ZWORK3(:) = ZWORK3(:) * ZWORK4(:) / (ZWORK3(:) + ZEPS) ! sat. pressure + ZWORK3(:) = ALOG(ZWORK3(:) / 613.3) + ! dewp point temperature + ZWORK3(:) = (4780.8 - 32.19 * ZWORK3(:)) / (17.502 - ZWORK3(:)) + ! adiabatic saturation temperature + ZWORK3(:) = ZWORK3(:) - (.212 + 1.571E-3 * (ZWORK3(:) - XTT) & + - 4.36E-4 * (ZDT(:) - XTT)) * (ZDT(:) - ZWORK3(:)) + ZWORK4(:) = SIGN(0.5, ZWORK2(:) - ZWORK3(:)) + ZDT(:) = ZDT(:) * (.5 + ZWORK4(:)) + (.5 - ZWORK4(:)) * ZWORK3(:) + ZWORK2(:) = ZDT(:) * ZPI(:)**(1.-0.28 * ZWORK2(:)) & + * EXP((3374.6525 / ZDT(:) - 2.5403) & + * ZWORK1(:) * (1.+0.81 * ZWORK1(:))) +! + GWORK1(:) = .true. + JKM = MAXVAL(KLFS(:)) + do JK = JKM - 1, IKB + 1, -1 + do JI = 1, IIE + if(JK < KLFS(JI) .and. ZWORK2(JI) > PTHES(JI, JK) .and. GWORK1(JI)) then + KDBL(JI) = JK + GWORK1(JI) = .false. + endif + enddo + enddo +! +! +!* 7. Define mass flux and entr/detr. rates at LFS +! ------------------------------------------- +! + do JI = 1, IIE + JK = KLFS(JI) + ZWORK1(JI) = PPRES(JI, JK) / & + (XRD * ZDT(JI) * (1.+ZEPS * ZWORK1(JI))) ! density + PDMF(JI, JK) = -(1.-PPREF(JI)) * ZWORK1(JI) * XPI * XCRAD * XCRAD + PDTHL(JI, JK) = ZWORK2(JI) ! theta_l is here actually theta_e + ZWORK2(JI) = PDMF(JI, JK) + PDDR(JI, JK) = 0. + PDER(JI, JK) = -PMIXF(JI) * PDMF(JI, JK) + enddo +! +! +! 7.1 Downdraft detrainment is assumed to occur in a layer +! of 60 hPa, determine top level IDDT of this layer +! --------------------------------------------------------- +! + ZWORK1(:) = 0. + do JK = IKB + 2, JKM + ZWORK1(:) = ZWORK1(:) + PDPRES(:, JK) + !WHERE ( JK > KDBL(:) .and. ZWORK1(:) <= XZPBL ) + WHERE(JK > KDBL(:) .and. JK <= KLCL(:)) + ZDDT(:) = ZWORK1(:) + IDDT(:) = JK + ENDWHERE + enddo +! +! +!* 8. Enter loop for downdraft computations. Make a first guess +! of initial downdraft mass flux. +! In the downdraft computations we use theta_es instead of +! enthalpy as it allows to better take into account evaporation +! effects. As the downdraft detrainment rate is zero apart +! from the detrainment layer, we just compute enthalpy +! downdraft from theta_es in this layer. +! ---------------------------------------------------------- +! +! +! + do JK = JKM - 1, IKB + 1, -1 + JKP = JK + 1 + do JI = 1, IIE + if(JK < KLFS(JI) .and. JK >= IDDT(JI)) then + PDER(JI, JK) = -ZWORK2(JI) * XENTR * PDPRES(JI, JKP) / XCRAD + ! DER and DPRES are positive + PDMF(JI, JK) = PDMF(JI, JKP) - PDER(JI, JK) + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ZDT(JI) = PTH(JI, JK) / ZPI(JI) + ZWORK1(JI) = PRW(JI, JK) - PRC(JI, JK) - PRI(JI, JK) + ZTHE(JI) = ZDT(JI) * ZPI(JI)**(1.-0.28 * ZWORK1(JI)) & + * EXP((3374.6525 / ZDT(JI) - 2.5403) & + * ZWORK1(JI) * (1.+0.81 * ZWORK1(JI))) + ! PDTHL is here theta_es, later on in this routine this table is + ! reskipped to enthalpy + PDTHL(JI, JK) = (PDTHL(JI, JKP) * PDMF(JI, JKP) - ZTHE(JI) * PDER(JI, JK) & + ) / (PDMF(JI, JK) - 1.E-7) + PDRW(JI, JK) = (PDRW(JI, JKP) * PDMF(JI, JKP) - PRW(JI, JK) * PDER(JI, JK) & + ) / (PDMF(JI, JK) - 1.E-7) + endif + if(JK < IDDT(JI) .and. JK >= KDBL(JI)) then + JL = IDDT(JI) + PDDR(JI, JK) = -PDMF(JI, JL) * PDPRES(JI, JKP) / ZDDT(JI) + PDMF(JI, JK) = PDMF(JI, JKP) + PDDR(JI, JK) + PDTHL(JI, JK) = PDTHL(JI, JKP) + PDRW(JI, JK) = PDRW(JI, JKP) + endif + enddo + enddo +! +! +!* 9. Calculate total downdraft evaporation +! rate for given mass flux (between DBL and IDDT) +! ----------------------------------------------- +! + PDTEVRF(:, :) = 0. +! Reproducibility +!JKT = MAXVAL( IDDT(:) ) +!do JK = IKB + 1, JKT + do JK = IKB + 1, IKE +! + ZPI(:) = (XP00 / PPRES(:, JK))**ZRDOCP + ZDT(:) = PTH(:, JK) / ZPI(:) +! +!* 9.1 Determine wet bulb temperature at DBL from theta_e. +! The iteration algoritm is similar to that used in +! routine CONVECT_CONDENS +! -------------------------------------------------- +! + do JITER = 1, 4 + call CONVECT_SATMIXRATIO(KLON, PPRES(:, JK), ZDT, ZWORK1, ZLV, ZLS, ZCPH) + ZDTP(:) = PDTHL(:, JK) / (ZPI(:)**(1.-0.28 * ZWORK1(:)) & + * EXP((3374.6525 / ZDT(:) - 2.5403) & + * ZWORK1(:) * (1.+0.81 * ZWORK1(:)))) + ZDT(:) = 0.4 * ZDTP(:) + 0.6 * ZDT(:) ! force convergence + enddo +! +! +!* 9.2 Sum total downdraft evaporation rate. No evaporation +! if actual humidity is larger than specified one. +! ----------------------------------------------------- +! + ZWORK2(:) = ZWORK1(:) / ZDT(:) * (XBETAW / ZDT(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = ZLV(:) / ZCPH(:) * ZWORK1(:) * (1.-XRHDBC) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) ! temperature perturb ! due to evaporation + ZDT(:) = ZDT(:) + ZWORK2(:) +! + call CONVECT_SATMIXRATIO(KLON, PPRES(:, JK), ZDT, ZWORK3, ZLV, ZLS, ZCPH) +! + ZWORK3(:) = ZWORK3(:) * XRHDBC + ZWORK1(:) = MAX(0., ZWORK3(:) - PDRW(:, JK)) + PDTEVR(:) = PDTEVR(:) + ZWORK1(:) * PDDR(:, JK) + PDTEVRF(:, JK) = PDTEVRF(:, JK) + ZWORK1(:) * PDDR(:, JK) + ! compute enthalpie and humidity in the detrainment layer + PDRW(:, JK) = MAX(PDRW(:, JK), ZWORK3(:)) + PDTHL(:, JK) = ((XCPD + PDRW(:, JK) * XCPV) * ZDT(:) & + + (1.+PDRW(:, JK)) * XG * PZ(:, JK)) +! + enddo +! +! +!* 12. If downdraft does not evaporate any water for specified +! relative humidity, no downdraft is allowed +! --------------------------------------------------------- +! + ZWORK2(:) = 1. + WHERE(PDTEVR(:) < 1. .OR. KLFS(:) == IKB + 1) ZWORK2(:) = 0. + do JK = IKB, JKM + KDBL(:) = KDBL(:) * INT(ZWORK2(:)) + (1 - INT(ZWORK2(:))) * IKB + KLFS(:) = KLFS(:) * INT(ZWORK2(:)) + (1 - INT(ZWORK2(:))) * IKB + PDMF(:, JK) = PDMF(:, JK) * ZWORK2(:) + PDER(:, JK) = PDER(:, JK) * ZWORK2(:) + PDDR(:, JK) = PDDR(:, JK) * ZWORK2(:) + ZWORK1(:) = REAL(KLFS(:) - JK) ! use this to reset thl_d + ZWORK1(:) = MAX(0., MIN(1., ZWORK1(:))) ! and rv_d to zero above LFS + PDTHL(:, JK) = PDTHL(:, JK) * ZWORK2(:) * ZWORK1(:) + PDRW(:, JK) = PDRW(:, JK) * ZWORK2(:) * ZWORK1(:) + PDTEVR(:) = PDTEVR(:) * ZWORK2(:) + PDTEVRF(:, JK) = PDTEVRF(:, JK) * ZWORK2(:) + enddo +! +ENDsubroutine CONVECT_DOWNDRAFT + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_PRECIP_ADJUST +! ################# +! + INTERFACE +! + subroutine CONVECT_PRECIP_ADJUST(KLON, KLEV, & + PPRES, PUMF, PUER, PUDR, & + PUPR, PUTPR, PURW, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PPREF, PTPR, PMIXF, PDTEVR, & + KLFS, KDBL, KLCL, KCTL, KETL, & + PDTEVRF) + +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PUTPR ! updraft total precipit. (kg/s + REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency + REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! critical mixed fraction at LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of equilibrium + ! (zero buoyancy) level + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KLFS ! contains vert. index of LFS + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KDBL ! contains vert. index of DBL +! + REAL, DIMENSION(KLON), INTENT(INOUT) :: PDTEVR ! total downdraft evaporation + ! rate at LFS + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDTEVRF! downdraft evaporation rate + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUPR ! updraft precipit. (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDRW ! downdraft total water (kg/kg) +! + REAL, DIMENSION(KLON), INTENT(OUT) :: PTPR ! total precipitation (kg/s) + ! = downdraft precipitation +! + ENDsubroutine CONVECT_PRECIP_ADJUST +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_PRECIP_ADJUST +! ###################################################################### +subroutine CONVECT_PRECIP_ADJUST(KLON, KLEV, & + PPRES, PUMF, PUER, PUDR, & + PUPR, PUTPR, PURW, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PPREF, PTPR, PMIXF, PDTEVR, & + KLFS, KDBL, KLCL, KCTL, KETL, & + PDTEVRF) +! ###################################################################### +! +!!**** Adjust up- and downdraft mass fluxes to be consistent with the +!! mass transport at the LFS given by the precipitation efficiency +!! relation. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust up- and downdraft mass +!! fluxes below the LFS to be consistent with the precipitation +!! efficiency relation +!! +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XUSRDPTH ! pressure depth to compute updraft humidity +!! ! supply rate for downdraft +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_PRECIP_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAREXT + USE MODD_CONVPAR +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(IN) :: PUTPR ! updraft total precipit. (kg/s + REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency + REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! critical mixed fraction at LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of equilibrium + ! (zero buoyancy) level + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KLFS ! contains vert. index of LFS + INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KDBL ! contains vert. index of DBL +! + REAL, DIMENSION(KLON), INTENT(INOUT) :: PDTEVR ! total downdraft evaporation + ! rate at LFS + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDTEVRF! downdraft evaporation rate + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUPR ! updraft precipit. (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDRW ! downdraft total water (kg/kg) +! + REAL, DIMENSION(KLON), INTENT(OUT) :: PTPR ! total precipitation (kg/s) + ! = downdraft precipitation +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + INTEGER :: JK, JKT1, JKT2, JKT3 ! vertical loop index + INTEGER :: JI ! horizontal loop index +! + INTEGER, DIMENSION(KLON) :: IPRL + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, & + ZWORK4, ZWORK5, ZWORK6 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT + IIE = KLON + JKT1 = MAXVAL(KLFS(:)) + JKT2 = MAXVAL(KCTL(:)) + JKT3 = MINVAL(KLCL(:)) +! +! +! 1. Set some output variables for columns where no downdraft +! exists. Exit if there is no downdraft at all. +! -------------------------------------------------------- +! + IPRL(:) = IKB + PTPR(:) = 0. +! + WHERE(PDTEVR(:) == 0.) + PTPR(:) = PUTPR(:) ! no downdraft evaporation => no downdraft, all + ! precipitation occurs in updraft + ENDWHERE + if(COUNT(PDTEVR(:) > 0.) == 0) then ! exit routine if no downdraft exists + RETURN + endif +! +!* 2. The total mass transported from the updraft to the down- +! draft at the LFS must be consistent with the three water +! budget terms : +! --------------------------------------------------------- +! +!* 2.1 Downdraft evaporation rate at the DBL. The evaporation +! rate in downdraft must be consistent with precipitation +! efficiency relation. +! -------------------------------------------------------- +! +! + do JI = 1, IIE + JK = KLFS(JI) + ZWORK1(JI) = PDTEVR(JI) / MIN(-1.E-1, PDMF(JI, JK)) + ZWORK6(JI) = PDMF(JI, JK) + enddo +! +!* 2.2 Some preliminar computations for downdraft = total +! precipitation rate. The precipitation is evaluated in +! a layer thickness DP=XUSRDPTH=165 hPa above the LCL. +! The difference between updraft precipitation and downdraft +! precipitation (updraft supply rate) is used to drive the +! downdraft through evaporational cooling. +! -------------------------------------------------------- +! + do JI = 1, IIE + JK = KLCL(JI) + ZWORK5(JI) = PPRES(JI, JK) + enddo +! + PTPR(:) = 0. + do JK = JKT3, JKT2 + WHERE(JK >= KLCL(:) .and. PPRES(:, JK) >= ZWORK5(:) - XUSRDPTH) + PTPR(:) = PTPR(:) + PUPR(:, JK) + IPRL(:) = JK + ENDWHERE + enddo + IPRL(:) = MIN(KETL(:), IPRL(:)) +! + do JI = 1, IIE + JK = IPRL(JI) + PTPR(JI) = PUMF(JI, JK + 1) * PURW(JI, JK + 1) + PTPR(JI) + enddo +! + PTPR(:) = PPREF(:) * MIN(PUTPR(:), PTPR(:)) + ZWORK4(:) = PUTPR(:) - PTPR(:) +! +! +!* 2.3 Total amount of precipitation that falls out of the up- +! draft between the LCL and the LFS. +! Condensate transfer from up to downdraft at LFS +! --------------------------------------------------------- +! + ZWORK5(:) = 0. + do JK = JKT3, JKT1 + WHERE(JK >= KLCL(:) .and. JK <= KLFS(:)) + ZWORK5(:) = ZWORK5(:) + PUPR(:, JK) + ENDWHERE + enddo +! + do JI = 1, IIE + JK = KLFS(JI) + ZWORK2(JI) = (1.-PPREF(JI)) * ZWORK5(JI) * & + (1.-PMIXF(JI)) / MAX(1.E-1, PUMF(JI, JK)) + enddo +! +! +!* 2.4 Increase the first guess downdraft mass flux to satisfy +! precipitation efficiency relation. +! If downdraft does not evaporate any water at the DBL for +! the specified relative humidity, or if the corrected mass +! flux at the LFS is positive no downdraft is allowed +! --------------------------------------------------------- +! +! +!ZWORK1(:) = ZWORK4(:) / ( ZWORK1(:) + ZWORK2(:) + 1.E-8 ) + ZWORK1(:) = -ZWORK4(:) / (-ZWORK1(:) + ZWORK2(:) + 1.E-8) + ZWORK2(:) = ZWORK1(:) / MIN(-1.E-1, ZWORK6(:)) ! ratio of budget consistent to actual DMF +! + ZWORK3(:) = 1. + ZWORK6(:) = 1. + WHERE(ZWORK1(:) > 0. .OR. PDTEVR(:) < 1.) + KDBL(:) = IKB + KLFS(:) = IKB + PDTEVR(:) = 0. + ZWORK2(:) = 0. + ZWORK3(:) = 0. + ZWORK6(:) = 0. + ENDWHERE +! + do JK = IKB, JKT1 + PDMF(:, JK) = PDMF(:, JK) * ZWORK2(:) + PDER(:, JK) = PDER(:, JK) * ZWORK2(:) + PDDR(:, JK) = PDDR(:, JK) * ZWORK2(:) + PDTEVRF(:, JK) = PDTEVRF(:, JK) * ZWORK2(:) + PDRW(:, JK) = PDRW(:, JK) * ZWORK3(:) + PDTHL(:, JK) = PDTHL(:, JK) * ZWORK3(:) + enddo + ZWORK4(:) = ZWORK2(:) +! +! +!* 3. Increase updraft mass flux, mass detrainment rate, and water +! substance detrainment rates to be consistent with the transfer +! of the estimated mass from the up- to the downdraft at the LFS +! -------------------------------------------------------------- +! + do JI = 1, IIE + JK = KLFS(JI) + ZWORK2(JI) = (1.-ZWORK6(JI)) + ZWORK6(JI) * & + (PUMF(JI, JK) - (1.-PMIXF(JI)) * ZWORK1(JI)) / & + MAX(1.E-1, PUMF(JI, JK)) + enddo +! +! + JKT1 = MAXVAL(KLFS(:)) ! value of KLFS might have been reset to IKB above + do JK = IKB, JKT1 + do JI = 1, IIE + if(JK <= KLFS(JI)) then + PUMF(JI, JK) = PUMF(JI, JK) * ZWORK2(JI) + PUER(JI, JK) = PUER(JI, JK) * ZWORK2(JI) + PUDR(JI, JK) = PUDR(JI, JK) * ZWORK2(JI) + PUPR(JI, JK) = PUPR(JI, JK) * ZWORK2(JI) + endif + enddo + enddo +! +! +!* 4. Increase total = downdraft precipitation and evaporation rate +! ------------------------------------------------------------- +! + WHERE(PDTEVR(:) > 0.) + PTPR(:) = PTPR(:) + PPREF(:) * ZWORK5(:) * (ZWORK2(:) - 1.) + PDTEVR(:) = PUTPR(:) - PTPR(:) + PDTEVRF(:, IKB + 1) = PDTEVR(:) + elseWHERE + PTPR(:) = PUTPR(:) + ENDWHERE +! +! +ENDsubroutine CONVECT_PRECIP_ADJUST + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_CLOSURE_THRVLCL +! ################# +! + INTERFACE +! + subroutine CONVECT_CLOSURE_THRVLCL(KLON, KLEV, & + PPRES, PTH, PRV, PZ, OWORK1, & + PTHLCL, PRVLCL, PZLCL, PTLCL, PTELCL, & + KLCL, KDPL, KPBL) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layer top + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1! logical mask +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temperature at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTELCL ! environm. temp. at LCL (K) + INTEGER, DIMENSION(KLON), INTENT(OUT):: KLCL ! contains vert. index of LCL +! + ENDsubroutine CONVECT_CLOSURE_THRVLCL +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CLOSURE_THRVLCL +! ######################################################################### +subroutine CONVECT_CLOSURE_THRVLCL(KLON, KLEV, & + PPRES, PTH, PRV, PZ, OWORK1, & + PTHLCL, PRVLCL, PZLCL, PTLCL, PTELCL, & + KLCL, KDPL, KPBL) +! ######################################################################### +! +!!**** Determine thermodynamic properties at new LCL +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the thermodynamic +!! properties at the new lifting condensation level LCL +!! +!! +!! +!!** METHOD +!! ------ +!! see CONVECT_TRIGGER_FUNCT +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! lowest allowed pressure difference between +!! ! surface and LCL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XWTRIG ! constant in vertical velocity trigger +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR + USE MODD_CONVPAREXT + USE MODI_CONVECT_SATMIXRATIO +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layer top + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1! logical mask +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temperature at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTELCL ! environm. temp. at LCL (K) + INTEGER, DIMENSION(KLON), INTENT(OUT):: KLCL ! contains vert. index of LCL +! +!* 0.2 Declarations of local variables : +! + INTEGER :: JK, JKM, JKMIN, JKMAX ! vertical loop index + INTEGER :: JI ! horizontal loop index + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + real :: ZEPS ! R_d / R_v + real :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL + REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature + REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure + REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure + REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air + REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! + ZEPS = XRD / XRV + ZCPORD = XCPD / XRD + ZRDOCP = XRD / XCPD +! + ZDPTHMIX(:) = 0. + ZPRESMIX(:) = 0. + PTHLCL(:) = 300. + PTLCL(:) = 300. + PTELCL(:) = 300. + PRVLCL(:) = 0. + PZLCL(:) = PZ(:, IKB) + ZTMIX(:) = 230. + ZPLCL(:) = 1.E4 + KLCL(:) = IKB + 1 +! +! +!* 2. Construct a mixed layer as in TRIGGER_FUNCT +! ------------------------------------------- +! + JKMAX = MAXVAL(KPBL(:)) + JKMIN = MINVAL(KDPL(:)) + do JK = IKB + 1, JKMAX + JKM = JK + 1 + do JI = 1, IIE + if(JK >= KDPL(JI) .and. JK <= KPBL(JI)) then +! + ZWORK1(JI) = PPRES(JI, JK) - PPRES(JI, JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI, JK) * ZWORK1(JI) + PTHLCL(JI) = PTHLCL(JI) + PTH(JI, JK) * ZWORK1(JI) + PRVLCL(JI) = PRVLCL(JI) + PRV(JI, JK) * ZWORK1(JI) +! + endif + enddo + enddo +! +! + WHERE(OWORK1(:)) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + PTHLCL(:) = PTHLCL(:) / ZDPTHMIX(:) + PRVLCL(:) = PRVLCL(:) / ZDPTHMIX(:) +! +!* 3.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! -------------------------------------------------- +! +! + ZTMIX(:) = PTHLCL(:) * (ZPRESMIX(:) / XP00)**ZRDOCP + ZEVMIX(:) = PRVLCL(:) * ZPRESMIX(:) / (PRVLCL(:) + ZEPS) + ZEVMIX(:) = MAX(1.E-8, ZEVMIX(:)) + ZWORK1(:) = ALOG(ZEVMIX(:) / 613.3) + ! dewpoint temperature + ZWORK1(:) = (4780.8 - 32.19 * ZWORK1(:)) / (17.502 - ZWORK1(:)) + ! adiabatic saturation temperature + PTLCL(:) = ZWORK1(:) - (.212 + 1.571E-3 * (ZWORK1(:) - XTT) & + - 4.36E-4 * (ZTMIX(:) - XTT)) * (ZTMIX(:) - ZWORK1(:)) + PTLCL(:) = MIN(PTLCL(:), ZTMIX(:)) + ZPLCL(:) = XP00 * (PTLCL(:) / PTHLCL(:))**ZCPORD +! + ENDWHERE +! + ZPLCL(:) = MIN(2.E5, MAX(10., ZPLCL(:))) ! bound to avoid overflow +! +! +!* 3.2 Correct PTLCL in order to be completely consistent +! with MNH saturation formula +! -------------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPLCL, PTLCL, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(OWORK1(:)) + ZWORK2(:) = ZWORK1(:) / PTLCL(:) * (XBETAW / PTLCL(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - PRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + PTLCL(:) = PTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + ENDWHERE +! +! +!* 3.3 If PRVLCL is oversaturated set humidity and temperature +! to saturation values. +! ------------------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(OWORK1(:) .and. PRVLCL(:) > ZWORK1(:)) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * (XBETAW / ZTMIX(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - PRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + PTLCL(:) = ZTMIX(:) + ZLV(:) / ZCPH(:) * ZWORK2(:) + PRVLCL(:) = PRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + PTHLCL(:) = PTLCL(:) * (XP00 / ZPLCL(:))**ZRDOCP + ENDWHERE +! +! +!* 4.1 Determine vertical loop index at the LCL +! ----------------------------------------- +! + do JK = JKMIN, IKE - 1 + do JI = 1, IIE + if(ZPLCL(JI) <= PPRES(JI, JK) .and. OWORK1(JI)) then + KLCL(JI) = JK + 1 + PZLCL(JI) = PZ(JI, JK + 1) + endif + enddo + enddo +! +! +!* 4.2 Estimate height and environmental temperature at LCL +! ---------------------------------------------------- +! + do JI = 1, IIE + JK = KLCL(JI) + JKM = JK - 1 + ZDP(JI) = ALOG(ZPLCL(JI) / PPRES(JI, JKM)) / & + ALOG(PPRES(JI, JK) / PPRES(JI, JKM)) + ZWORK1(JI) = PTH(JI, JK) * (PPRES(JI, JK) / XP00)**ZRDOCP + ZWORK2(JI) = PTH(JI, JKM) * (PPRES(JI, JKM) / XP00)**ZRDOCP + ZWORK1(JI) = ZWORK2(JI) + (ZWORK1(JI) - ZWORK2(JI)) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels KLCL and KLCL-1. + ZWORK2(JI) = PZ(JI, JKM) + (PZ(JI, JK) - PZ(JI, JKM)) * ZDP(JI) + enddo + WHERE(OWORK1(:)) + PTELCL(:) = ZWORK1(:) + PZLCL(:) = ZWORK2(:) + ENDWHERE +! +! +! +ENDsubroutine CONVECT_CLOSURE_THRVLCL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_CLOSURE_ADJUST +! ################# +! + INTERFACE +! + subroutine CONVECT_CLOSURE_ADJUST(KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR, & + PDMF, PZDMF, PDER, PZDER, PDDR, PZDDR, & + PPRMELT, PZPRMELT, PDTEVR, PZDTEVR, & + PTPR, PZTPR, & + PPRLFLX, PZPRLFL, PPRSFLX, PZPRSFL) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUDR ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDDR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PZTPR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR ! donwndraft evapor. (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PZDTEVR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRMELT ! melting of precipitation + REAL, DIMENSION(KLON), INTENT(INOUT):: PZPRMELT ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRLFLX! liquid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZPRLFL! initial value " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRSFLX! solid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZPRSFL! initial value " +! + ENDsubroutine CONVECT_CLOSURE_ADJUST +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CLOSURE_ADJUST +! ########################################################################### +subroutine CONVECT_CLOSURE_ADJUST(KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR, & + PDMF, PZDMF, PDER, PZDER, PDDR, PZDDR, & + PPRMELT, PZPRMELT, PDTEVR, PZDTEVR, & + PTPR, PZTPR, & + PPRLFLX, PZPRLFL, PPRSFLX, PZPRSFL) +! ########################################################################### +! +!!**** Uses closure adjustment factor to adjust mass flux and to modify +!! precipitation efficiency when necessary. The computations are +!! similar to routine CONVECT_PRECIP_ADJUST. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust the mass flux using the +!! factor PADJ computed in CONVECT_CLOSURE +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! EXTERNAL +!! -------- +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! None +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAREXT +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUDR ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZDDR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PZTPR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR ! donwndraft evapor. (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PZDTEVR ! initial value of " + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRMELT ! melting of precipitation + REAL, DIMENSION(KLON), INTENT(INOUT):: PZPRMELT ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRLFLX! liquid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZPRLFL! initial value " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PPRSFLX! solid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZPRSFL! initial value " +! +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IKB, IKE ! vert. loop bounds + INTEGER :: JK ! vertical loop index +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute loop bounds +! ------------------- +! + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Adjust mass flux by the factor PADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + PPRMELT(:) = PZPRMELT(:) * PADJ(:) + PDTEVR(:) = PZDTEVR(:) * PADJ(:) + PTPR(:) = PZTPR(:) * PADJ(:) +! + do JK = IKB + 1, IKE + PUMF(:, JK) = PZUMF(:, JK) * PADJ(:) + PUER(:, JK) = PZUER(:, JK) * PADJ(:) + PUDR(:, JK) = PZUDR(:, JK) * PADJ(:) + PDMF(:, JK) = PZDMF(:, JK) * PADJ(:) + PDER(:, JK) = PZDER(:, JK) * PADJ(:) + PDDR(:, JK) = PZDDR(:, JK) * PADJ(:) + PPRLFLX(:, JK) = PZPRLFL(:, JK) * PADJ(:) + PPRSFLX(:, JK) = PZPRSFL(:, JK) * PADJ(:) + enddo +! +ENDsubroutine CONVECT_CLOSURE_ADJUST + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_CLOSURE +! ################# +! + INTERFACE +! + subroutine CONVECT_CLOSURE(KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KLFS, KCTL, KML, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PUPR, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PTPR, PSPR, PDTEVR, & + PCAPE, PTIMEC, & + KFTSTEPS, & + PDTEVRF, PPRLFLX, PPRSFLX) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer + INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! index for melting level + REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy + INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUPR ! updraft precipitation in + ! flux units (kg water / s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDRW ! downdraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total surf precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(OUT) :: PSPR ! solid surf precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR! donwndraft evapor. (kg/s) +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDTEVRF! downdraft evaporation rate + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PPRLFLX! liquid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PPRSFLX! solid precip flux +! + ENDsubroutine CONVECT_CLOSURE +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CLOSURE +! ######################################################################### +subroutine CONVECT_CLOSURE(KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KLFS, KCTL, KML, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PUPR, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PTPR, PSPR, PDTEVR, & + PCAPE, PTIMEC, & + KFTSTEPS, & + PDTEVRF, PPRLFLX, PPRSFLX) +! ######################################################################### +! +!!**** Uses modified Fritsch-Chappell closure +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the final adjusted +!! (over a time step PTIMEC) environmental values of THETA_l, R_w, R_c, R_i +!! The final convective tendencies can then be evaluated in the main +!! routine DEEP_CONVECT by (PTHC-PTH)/PTIMEC +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XSTABT ! stability factor in time integration +!! XSTABC ! stability factor in CAPE adjustment +!! XMELDPTH ! allow melting over specific pressure depth +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE) +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 04/10/97 change for enthalpie, r_c + r_i tendencies +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR + USE MODD_CONVPAREXT +! + USE MODI_CONVECT_SATMIXRATIO + USE MODI_CONVECT_CLOSURE_THRVLCL + USE MODI_CONVECT_CLOSURE_ADJUST +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer + INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! index for melting level + REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy + INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUPR ! updraft precipitation in + ! flux units (kg water / s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDRW ! downdraft total water (kg/kg) + REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total surf precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(OUT) :: PSPR ! solid surf precipitation (kg/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR! donwndraft evapor. (kg/s) +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDTEVRF! downdraft evaporation rate + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PPRLFLX! liquid precip flux + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PPRSFLX! solid precip flux +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + INTEGER :: IKS ! vertical dimension + INTEGER :: JK, JKP, JKMAX ! vertical loop index + INTEGER :: JI ! horizontal loop index + INTEGER :: JITER ! iteration loop index + INTEGER :: JSTEP ! fractional time loop index + real :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON, KLEV) :: ZTHLC ! convectively adjusted + ! grid scale enthalpy + REAL, DIMENSION(KLON, KLEV) :: ZOMG ! conv. environm. subsidence (Pa/s) + REAL, DIMENSION(KLON, KLEV) :: ZUMF ! non-adjusted updraft mass flux + REAL, DIMENSION(KLON, KLEV) :: ZUER ! " updraft entrainm. rate + REAL, DIMENSION(KLON, KLEV) :: ZUDR ! " updraft detrainm. rate + REAL, DIMENSION(KLON, KLEV) :: ZDMF ! " downdraft mass flux + REAL, DIMENSION(KLON, KLEV) :: ZDER ! " downdraft entrainm. rate + REAL, DIMENSION(KLON, KLEV) :: ZDDR ! " downdraft detrainm. rate + REAL, DIMENSION(KLON) :: ZTPR ! " total precipitation + REAL, DIMENSION(KLON) :: ZDTEVR ! " total downdraft evapor. + REAL, DIMENSION(KLON, KLEV):: ZPRLFLX ! " liquid precip flux + REAL, DIMENSION(KLON, KLEV):: ZPRSFLX ! " solid precip flux + REAL, DIMENSION(KLON) :: ZPRMELT ! melting of precipitation + REAL, DIMENSION(KLON) :: ZPRMELTO ! non-adjusted " + REAL, DIMENSION(KLON) :: ZADJ ! mass adjustment factor + REAL, DIMENSION(KLON) :: ZADJMAX ! limit value for ZADJ + REAL, DIMENSION(KLON) :: ZCAPE ! new CAPE after adjustment + REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step + REAL, DIMENSION(KLON, KLEV):: ZTIMC ! 2D work array for ZTIMEC +! + REAL, DIMENSION(KLON) :: ZTHLCL ! new theta at LCL + REAL, DIMENSION(KLON) :: ZRVLCL ! new r_v at LCL + REAL, DIMENSION(KLON) :: ZZLCL ! height of LCL + REAL, DIMENSION(KLON) :: ZTLCL ! temperature at LCL + REAL, DIMENSION(KLON) :: ZTELCL ! envir. temper. at LCL + REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent + REAL, DIMENSION(KLON) :: ZTHES1, ZTHES2! saturation environm. theta_e + REAL, DIMENSION(KLON, KLEV) :: ZTHMFIN, ZTHMFOUT, ZRWMFIN, ZRWMFOUT + REAL, DIMENSION(KLON, KLEV) :: ZRCMFIN, ZRCMFOUT, ZRIMFIN, ZRIMFOUT + ! work arrays for environm. compensat. mass flux + REAL, DIMENSION(KLON) :: ZPI ! (P/P00)**R_d/C_pd + REAL, DIMENSION(KLON) :: ZLV ! latent heat of vaporisation + REAL, DIMENSION(KLON) :: ZLS ! latent heat of sublimation + REAL, DIMENSION(KLON) :: ZLM ! latent heat of melting + REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph + REAL, DIMENSION(KLON) :: ZMELDPTH ! actual depth of melting layer + INTEGER, DIMENSION(KLON) :: ITSTEP ! fractional convective time step + INTEGER, DIMENSION(KLON) :: ICOUNT ! timestep counter + INTEGER, DIMENSION(KLON) :: ILCL ! index lifting condens. level + INTEGER, DIMENSION(KLON) :: IWORK1 ! work array + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5 + REAL, DIMENSION(KLON, KLEV):: ZWORK6 + LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK3! work arrays + LOGICAL, DIMENSION(KLON, KLEV) :: GWORK4 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.2 Initialize local variables +! ---------------------------- +! +! + PSPR(:) = 0. + ZTIMC(:, :) = 0. + ZTHES2(:) = 0. + ZWORK1(:) = 0. + ZWORK2(:) = 0. + ZWORK3(:) = 0. + ZWORK4(:) = 0. + ZWORK5(:) = 0. + GWORK1(:) = .false. + GWORK3(:) = .false. + GWORK4(:, :) = .false. + ILCL(:) = KLCL(:) +! + ZCPORD = XCPD / XRD + ZRDOCP = XRD / XCPD +! + ZADJ(:) = 1. + ZWORK5(:) = 1. + WHERE(.not. OTRIG1(:)) ZWORK5(:) = 0. +! +! +!* 0.3 Compute loop bounds +! ------------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKS = KLEV + IKE = KLEV - JCVEXT + JKMAX = MAXVAL(KCTL(:)) +! +! +!* 2. Save initial mass flux values to be used in adjustment procedure +! --------------------------------------------------------------- +! + ZUMF(:, :) = PUMF(:, :) + ZUER(:, :) = PUER(:, :) + ZUDR(:, :) = PUDR(:, :) + ZDMF(:, :) = PDMF(:, :) + ZDER(:, :) = PDER(:, :) + ZDDR(:, :) = PDDR(:, :) + ZTPR(:) = PTPR(:) + ZDTEVR(:) = PDTEVR(:) + ZOMG(:, :) = 0. + PWSUB(:, :) = 0. + ZPRMELT(:) = 0. + PPRLFLX(:, :) = 0. + ZPRLFLX(:, :) = 0. + PPRSFLX(:, :) = 0. + ZPRSFLX(:, :) = 0. +! +! +!* 2.1 Some preliminar computations for melting of precipitation +! used later in section 9 and computation of precip fluxes +! Precipitation fluxes are updated for melting and evaporation +! --------------------------------------------------------- +! +! + ZWORK1(:) = 0. + ZMELDPTH(:) = 0. + ZWORK6(:, :) = 0. + do JK = JKMAX + 1, IKB + 1, -1 + ! Nota: PUPR is total precipitation flux, but the solid, liquid + ! precipitation is stored in units kg/kg; therefore we compute here + ! the solid fraction of the total precipitation flux. + do JI = 1, IIE + ZWORK2(JI) = PUPR(JI, JK) / (PURC(JI, JK) + PURI(JI, JK) + 1.E-8) + ZPRMELT(JI) = ZPRMELT(JI) + PURI(JI, JK) * ZWORK2(JI) + ZWORK1(JI) = ZWORK1(JI) + PURC(JI, JK) * ZWORK2(JI) - PDTEVRF(JI, JK) + ZPRLFLX(JI, JK) = MAX(0., ZWORK1(JI)) + ZPRMELT(JI) = ZPRMELT(JI) + MIN(0., ZWORK1(JI)) + ZPRSFLX(JI, JK) = ZPRMELT(JI) + if(KML(JI) >= JK .and. ZMELDPTH(JI) <= XMELDPTH) then + ZPI(JI) = (PPRES(JI, JK) / XP00)**ZRDOCP + ZWORK3(JI) = PTH(JI, JK) * ZPI(JI) ! temperature estimate + ZLM(JI) = XLSTT + (XCPV - XCI) * (ZWORK3(JI) - XTT) - & + (XLVTT + (XCPV - XCL) * (ZWORK3(JI) - XTT)) ! L_s - L_v + ZCPH(JI) = XCPD + XCPV * PRW(JI, JK) + ZMELDPTH(JI) = ZMELDPTH(JI) + PDPRES(JI, JK) + ZWORK6(JI, JK) = ZLM(JI) * PTIMEC(JI) / PLMASS(JI, JK) * PDPRES(JI, JK) + ZOMG(JI, JK) = 1. ! at this place only used as work variable + endif + enddo +! + enddo +! + ZWORK2(:) = 0. + do JK = JKMAX, IKB + 1, -1 + ZWORK1(:) = ZPRMELT(:) * PDPRES(:, JK) / MAX(XMELDPTH, ZMELDPTH(:)) + ZWORK2(:) = ZWORK2(:) + ZWORK1(:) * ZOMG(:, JK) + ZPRLFLX(:, JK) = ZPRLFLX(:, JK) + ZWORK2(:) + ZPRSFLX(:, JK) = ZPRSFLX(:, JK) - ZWORK2(:) + enddo + WHERE(ZPRSFLX(:, :) < 1.) ZPRSFLX(:, :) = 0. + ZPRMELTO(:) = ZPRMELT(:) +! +! +!* 3. Compute limits on the closure adjustment factor so that the +! inflow in convective drafts from a given layer can't be larger +! than the mass contained in this layer initially. +! --------------------------------------------------------------- +! + ZADJMAX(:) = 1000. + IWORK1(:) = MAX(ILCL(:), KLFS(:)) + JKP = MINVAL(KDPL(:)) + do JK = JKP, IKE + do JI = 1, IIE + if(JK > KDPL(JI) .and. JK <= IWORK1(JI)) then + ZWORK1(JI) = PLMASS(JI, JK) / & + ((PUER(JI, JK) + PDER(JI, JK) + 1.E-5) * PTIMEC(JI)) + ZADJMAX(JI) = MIN(ZADJMAX(JI), ZWORK1(JI)) + endif + enddo + enddo +! +! + GWORK1(:) = OTRIG1(:) ! logical array to limit adjustment to not definitively + ! adjusted columns +! + do JK = IKB, IKE + ZTHLC(:, JK) = PTHL(:, JK) ! initialize adjusted envir. values + PRWC(:, JK) = PRW(:, JK) + PRCC(:, JK) = PRC(:, JK) + PRIC(:, JK) = PRI(:, JK) + PTHC(:, JK) = PTH(:, JK) + enddo +! +! +! + do JITER = 1, 6 ! Enter adjustment loop to assure that all CAPE is + ! removed within the advective time interval TIMEC +! + ZTIMEC(:) = PTIMEC(:) + GWORK4(:, :) = SPREAD(GWORK1(:), DIM=2, NCOPIES=IKS) + WHERE(GWORK4(:, :)) PWSUB(:, :) = 0. + ZOMG(:, :) = 0. +! + do JK = IKB + 1, JKMAX + JKP = MAX(IKB + 1, JK - 1) + WHERE(GWORK1(:) .and. JK <= KCTL(:)) +! +! +!* 4. Determine vertical velocity at top and bottom of each layer +! to satisfy mass continuity. +! --------------------------------------------------------------- + ! we compute here Domega/Dp = - g rho Dw/Dz = 1/Dt +! + ZWORK1(:) = -(PUER(:, JKP) + PDER(:, JKP) - & + PUDR(:, JKP) - PDDR(:, JKP)) / PLMASS(:, JKP) +! + PWSUB(:, JK) = PWSUB(:, JKP) - PDPRES(:, JK - 1) * ZWORK1(:) + ! we use PDPRES(JK-1) and not JKP in order to have zero subsidence + ! at the first layer +! +! +!* 5. Compute fractional time step. For stability or +! mass conservation reasons one must split full time step PTIMEC) +! --------------------------------------------------------------- +! + ZWORK1(:) = XSTABT * PDPRES(:, JKP) / (ABS(PWSUB(:, JK)) + 1.E-10) + ! the factor XSTABT is used for stability reasons + ZTIMEC(:) = MIN(ZTIMEC(:), ZWORK1(:)) +! + ! transform vertical velocity in mass flux units + ZOMG(:, JK) = PWSUB(:, JK) * PDXDY(:) / XG + ENDWHERE + enddo +! +! + WHERE(GWORK4(:, :)) + ZTHLC(:, :) = PTHL(:, :) ! reinitialize adjusted envir. values + PRWC(:, :) = PRW(:, :) ! when iteration criterium not attained + PRCC(:, :) = PRC(:, :) + PRIC(:, :) = PRI(:, :) + PTHC(:, :) = PTH(:, :) + ENDWHERE +! +! +! 6. Check for mass conservation, i.e. ZWORK1 > 1.E-2 +! If mass is not conserved, the convective tendencies +! automatically become zero. +! ---------------------------------------------------- +! + do JI = 1, IIE + JK = KCTL(JI) + ZWORK1(JI) = PUDR(JI, JK) * PDPRES(JI, JK) / (PLMASS(JI, JK) + .1) & + - PWSUB(JI, JK) + enddo + WHERE(GWORK1(:) .and. ABS(ZWORK1(:)) - .01 > 0.) + GWORK1(:) = .false. + PTIMEC(:) = 1.E-1 + ZTPR(:) = 0. + ZWORK5(:) = 0. + ENDWHERE + do JK = IKB, IKE + PWSUB(:, JK) = PWSUB(:, JK) * ZWORK5(:) + ZPRLFLX(:, JK) = ZPRLFLX(:, JK) * ZWORK5(:) + ZPRSFLX(:, JK) = ZPRSFLX(:, JK) * ZWORK5(:) + enddo + GWORK4(:, 1:IKB) = .false. + GWORK4(:, IKE:IKS) = .false. +! + ITSTEP(:) = INT(PTIMEC(:) / ZTIMEC(:)) + 1 + ZTIMEC(:) = PTIMEC(:) / REAL(ITSTEP(:)) ! adjust fractional time step + ! to be an integer multiple of PTIMEC + ZTIMC(:, :) = SPREAD(ZTIMEC(:), DIM=2, NCOPIES=IKS) + ICOUNT(:) = 0 +! +! +! + KFTSTEPS = MAXVAL(ITSTEP(:)) + do JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop here +! + ICOUNT(:) = ICOUNT(:) + 1 +! + GWORK3(:) = ITSTEP(:) >= ICOUNT(:) .and. GWORK1(:) +! +! +!* 7. Assign enthalpy and r_w values at the top and bottom of each +! layer based on the sign of w +! ------------------------------------------------------------ +! + ZTHMFIN(:, :) = 0. + ZRWMFIN(:, :) = 0. + ZRCMFIN(:, :) = 0. + ZRIMFIN(:, :) = 0. + ZTHMFOUT(:, :) = 0. + ZRWMFOUT(:, :) = 0. + ZRCMFOUT(:, :) = 0. + ZRIMFOUT(:, :) = 0. +! + do JK = IKB + 1, JKMAX + do JI = 1, IIE + GWORK4(JI, JK) = GWORK3(JI) .and. JK <= KCTL(JI) + enddo + JKP = MAX(IKB + 1, JK - 1) + do JI = 1, IIE + if(GWORK3(JI)) then +! + ZWORK1(JI) = SIGN(1., ZOMG(JI, JK)) + ZWORK2(JI) = 0.5 * (1.+ZWORK1(JI)) + ZWORK1(JI) = 0.5 * (1.-ZWORK1(JI)) + ZTHMFIN(JI, JK) = -ZOMG(JI, JK) * ZTHLC(JI, JKP) * ZWORK1(JI) + ZTHMFOUT(JI, JK) = ZOMG(JI, JK) * ZTHLC(JI, JK) * ZWORK2(JI) + ZRWMFIN(JI, JK) = -ZOMG(JI, JK) * PRWC(JI, JKP) * ZWORK1(JI) + ZRWMFOUT(JI, JK) = ZOMG(JI, JK) * PRWC(JI, JK) * ZWORK2(JI) + ZRCMFIN(JI, JK) = -ZOMG(JI, JK) * PRCC(JI, JKP) * ZWORK1(JI) + ZRCMFOUT(JI, JK) = ZOMG(JI, JK) * PRCC(JI, JK) * ZWORK2(JI) + ZRIMFIN(JI, JK) = -ZOMG(JI, JK) * PRIC(JI, JKP) * ZWORK1(JI) + ZRIMFOUT(JI, JK) = ZOMG(JI, JK) * PRIC(JI, JK) * ZWORK2(JI) + endif + enddo + do JI = 1, IIE + if(GWORK3(JI)) then + ZTHMFIN(JI, JKP) = ZTHMFIN(JI, JKP) + ZTHMFOUT(JI, JK) * ZWORK2(JI) + ZTHMFOUT(JI, JKP) = ZTHMFOUT(JI, JKP) + ZTHMFIN(JI, JK) * ZWORK1(JI) + ZRWMFIN(JI, JKP) = ZRWMFIN(JI, JKP) + ZRWMFOUT(JI, JK) * ZWORK2(JI) + ZRWMFOUT(JI, JKP) = ZRWMFOUT(JI, JKP) + ZRWMFIN(JI, JK) * ZWORK1(JI) + ZRCMFIN(JI, JKP) = ZRCMFIN(JI, JKP) + ZRCMFOUT(JI, JK) * ZWORK2(JI) + ZRCMFOUT(JI, JKP) = ZRCMFOUT(JI, JKP) + ZRCMFIN(JI, JK) * ZWORK1(JI) + ZRIMFIN(JI, JKP) = ZRIMFIN(JI, JKP) + ZRIMFOUT(JI, JK) * ZWORK2(JI) + ZRIMFOUT(JI, JKP) = ZRIMFOUT(JI, JKP) + ZRIMFIN(JI, JK) * ZWORK1(JI) +! + endif + enddo + enddo +! + WHERE(GWORK4(:, :)) +! +!****************************************************************************** +! +!* 8. Update the environmental values of enthalpy and r_w at each level +! NOTA: These are the MAIN EQUATIONS of the scheme +! ----------------------------------------------------------------- +! +! + ZTHLC(:, :) = ZTHLC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZTHMFIN(:, :) + PUDR(:, :) * PUTHL(:, :) + & + PDDR(:, :) * PDTHL(:, :) - ZTHMFOUT(:, :) - & + (PUER(:, :) + PDER(:, :)) * PTHL(:, :)) + PRWC(:, :) = PRWC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRWMFIN(:, :) + PUDR(:, :) * PURW(:, :) + & + PDDR(:, :) * PDRW(:, :) - ZRWMFOUT(:, :) - & + (PUER(:, :) + PDER(:, :)) * PRW(:, :)) + PRCC(:, :) = PRCC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRCMFIN(:, :) + PUDR(:, :) * PURC(:, :) - ZRCMFOUT(:, :) - & + (PUER(:, :) + PDER(:, :)) * PRC(:, :)) + PRIC(:, :) = PRIC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRIMFIN(:, :) + PUDR(:, :) * PURI(:, :) - ZRIMFOUT(:, :) - & + (PUER(:, :) + PDER(:, :)) * PRI(:, :)) +! +! +!****************************************************************************** +! + ENDWHERE +! + enddo ! Exit the fractional time step loop +! +! +!* 9. Allow frozen precipitation to melt over a 200 mb deep layer +! ----------------------------------------------------------- +! + do JK = JKMAX, IKB + 1, -1 + ZTHLC(:, JK) = ZTHLC(:, JK) - & + ZPRMELT(:) * ZWORK6(:, JK) / MAX(XMELDPTH, ZMELDPTH(:)) + enddo +! +! +!* 10. Compute final linearized value of theta envir. +! ---------------------------------------------- +! + do JK = IKB + 1, JKMAX + do JI = 1, IIE + if(GWORK1(JI) .and. JK <= KCTL(JI)) then + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ZCPH(JI) = XCPD + PRWC(JI, JK) * XCPV + ZWORK2(JI) = PTH(JI, JK) / ZPI(JI) ! first temperature estimate + ZLV(JI) = XLVTT + (XCPV - XCL) * (ZWORK2(JI) - XTT) + ZLS(JI) = XLVTT + (XCPV - XCI) * (ZWORK2(JI) - XTT) + ! final linearized temperature + ZWORK2(JI) = (ZTHLC(JI, JK) + ZLV(JI) * PRCC(JI, JK) + ZLS(JI) * PRIC(JI, JK) & + - (1.+PRWC(JI, JK)) * XG * PZ(JI, JK)) / ZCPH(JI) + ZWORK2(JI) = MAX(180., MIN(340., ZWORK2(JI))) + PTHC(JI, JK) = ZWORK2(JI) * ZPI(JI) ! final adjusted envir. theta + endif + enddo + enddo +! +! +!* 11. Compute new cloud ( properties at new LCL ) +! NOTA: The computations are very close to +! that in routine TRIGGER_FUNCT +! --------------------------------------------- +! + call CONVECT_CLOSURE_THRVLCL(KLON, KLEV, & + PPRES, PTHC, PRWC, PZ, GWORK1, & + ZTHLCL, ZRVLCL, ZZLCL, ZTLCL, ZTELCL, & + ILCL, KDPL, KPBL) +! +! + ZTLCL(:) = MAX(230., MIN(335., ZTLCL(:))) ! set some overflow bounds + ZTELCL(:) = MAX(230., MIN(335., ZTELCL(:))) + ZTHLCL(:) = MAX(230., MIN(345., ZTHLCL(:))) + ZRVLCL(:) = MAX(0., MIN(1., ZRVLCL(:))) +! +! +!* 12. Compute adjusted CAPE +! --------------------- +! + ZCAPE(:) = 0. + ZPI(:) = ZTHLCL(:) / ZTLCL(:) + ZPI(:) = MAX(0.95, MIN(1.5, ZPI(:))) + ZWORK1(:) = XP00 / ZPI(:)**ZCPORD ! pressure at LCL +! + call CONVECT_SATMIXRATIO(KLON, ZWORK1, ZTELCL, ZWORK3, ZLV, ZLS, ZCPH) + ZWORK3(:) = MIN(.1, MAX(0., ZWORK3(:))) +! + ! compute theta_e updraft undilute + ZTHEUL(:) = ZTLCL(:) * ZPI(:)**(1.-0.28 * ZRVLCL(:)) & + * EXP((3374.6525 / ZTLCL(:) - 2.5403) & + * ZRVLCL(:) * (1.+0.81 * ZRVLCL(:))) +! + ! compute theta_e saturated environment at LCL + ZTHES1(:) = ZTELCL(:) * ZPI(:)**(1.-0.28 * ZWORK3(:)) & + * EXP((3374.6525 / ZTELCL(:) - 2.5403) & + * ZWORK3(:) * (1.+0.81 * ZWORK3(:))) +! + do JK = MINVAL(ILCL(:)), JKMAX + JKP = JK - 1 + do JI = 1, IIE + ZWORK4(JI) = 1. + if(JK == ILCL(JI)) ZWORK4(JI) = 0. +! + ! compute theta_e saturated environment and adjusted values + ! of theta +! + GWORK3(JI) = JK >= ILCL(JI) .and. JK <= KCTL(JI) .and. GWORK1(JI) +! + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ZWORK2(JI) = PTHC(JI, JK) / ZPI(JI) + enddo +! + call CONVECT_SATMIXRATIO(KLON, PPRES(:, JK), ZWORK2, ZWORK3, ZLV, ZLS, ZCPH) +! +! + do JI = 1, IIE + if(GWORK3(JI)) then + ZTHES2(JI) = ZWORK2(JI) * ZPI(JI)**(1.-0.28 * ZWORK3(JI)) & + * EXP((3374.6525 / ZWORK2(JI) - 2.5403) & + * ZWORK3(JI) * (1.+0.81 * ZWORK3(JI))) +! + ZWORK3(JI) = PZ(JI, JK) - PZ(JI, JKP) * ZWORK4(JI) - & + (1.-ZWORK4(JI)) * ZZLCL(JI) ! level thickness + ZWORK1(JI) = (2.*ZTHEUL(JI)) / (ZTHES1(JI) + ZTHES2(JI)) - 1. + ZCAPE(JI) = ZCAPE(JI) + XG * ZWORK3(JI) * MAX(0., ZWORK1(JI)) + ZTHES1(JI) = ZTHES2(JI) + endif + enddo + enddo +! +! +!* 13. Determine mass adjustment factor knowing how much +! CAPE has been removed. +! ------------------------------------------------- +! + WHERE(GWORK1(:)) + ZWORK1(:) = MAX(PCAPE(:) - ZCAPE(:), 0.1 * PCAPE(:)) + ZWORK2(:) = ZCAPE(:) / (PCAPE(:) + 1.E-8) +! + GWORK1(:) = ZWORK2(:) > 0.1 .OR. ZCAPE(:) == 0. ! mask for adjustment + ENDWHERE +! + WHERE(ZCAPE(:) == 0. .and. GWORK1(:)) ZADJ(:) = ZADJ(:) * 0.5 + WHERE(ZCAPE(:) /= 0. .and. GWORK1(:)) & + ZADJ(:) = ZADJ(:) * XSTABC * PCAPE(:) / (ZWORK1(:) + 1.E-8) + ZADJ(:) = MIN(ZADJ(:), ZADJMAX(:)) +! +! +!* 13. Adjust mass flux by the factor ZADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + call CONVECT_CLOSURE_ADJUST(KLON, KLEV, ZADJ, & + PUMF, ZUMF, PUER, ZUER, PUDR, ZUDR, & + PDMF, ZDMF, PDER, ZDER, PDDR, ZDDR, & + ZPRMELT, ZPRMELTO, PDTEVR, ZDTEVR, & + PTPR, ZTPR, & + PPRLFLX, ZPRLFLX, PPRSFLX, ZPRSFLX) +! +! + if(COUNT(GWORK1(:)) == 0) EXIT ! exit big adjustment iteration loop + ! when all columns have reached + ! desired degree of stabilization. +! + enddo ! end of big adjustment iteration loop +! +! + ! skip adj. total water array to water vapor + do JK = IKB, IKE + PRWC(:, JK) = MAX(0., PRWC(:, JK) - PRCC(:, JK) - PRIC(:, JK)) + enddo +! + ! compute surface solid (ice) precipitation + PSPR(:) = ZPRMELT(:) * (1.-ZMELDPTH(:) / XMELDPTH) + PSPR(:) = MAX(0., PSPR(:)) +! +! +ENDsubroutine CONVECT_CLOSURE + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +! ###################### +MODULE MODI_DEEP_CONVECTION +! ###################### +! + INTERFACE +! + subroutine DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH, ODOWN, OSETTADJ, & + PPABST, PZZ, PDXDY, PTIMEC, & + PTT, PRVT, PRCT, PRIT, PUT, PVT, PWT, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + PPRLTEN, PPRSTEN, & + KCLTOP, KCLBAS, PPRLFLX, PPRSFLX, & + PUMF, PDMF, PCAPE, & + OCH1CONV, KCH1, PCH1, PCH1TEN) + + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x + INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x + INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 + INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 + REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + LOGICAL, INTENT(IN) :: OREFRESH ! refresh or not tendencies + ! at every call + LOGICAL, INTENT(IN) :: ODOWN ! take or not convective + ! downdrafts into account + LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTT ! grid scale temperature at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRCT ! grid scale r_c " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRIT ! grid scale r_i " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUT ! grid scale horiz. wind u " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PVT ! grid scale horiz. wind v " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! horizontal grid area (m-a2) + REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC ! value of convective adjustment + ! time if OSETTADJ=.true. +! + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter (recompute + ! tendency or keep it) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRLTEN! liquid surf. precipitation + ! tendency (m/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRSTEN! solid surf. precipitation + ! tendency (m/s) + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PPRLFLX! liquid precip flux (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PPRSFLX! solid precip flux (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s m2) + REAL, DIMENSION(KLON), INTENT(INOUT):: PCAPE ! maximum CAPE (J/kg) +! + LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport + INTEGER, INTENT(IN) :: KCH1 ! number of species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(IN) :: PCH1! grid scale chemical species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) + LOGICAL :: OUSECHEM ! flag for chemistry + LOGICAL :: OCH_CONV_SCAV ! & scavenging + LOGICAL :: OCH_CONV_LINOX ! & LiNOx + LOGICAL :: ODUST ! flag for dust + LOGICAL :: OSALT ! flag for sea salt + REAL, DIMENSION(KLON, KLEV) :: PRHODREF ! grid scale density + REAL, DIMENSION(KLON) :: PIC_RATE ! IC lightning frequency + REAL, DIMENSION(KLON) :: PCG_RATE ! CG lightning frequency + +! + ENDsubroutine DEEP_CONVECTION +! + ENDINTERFACE +! +ENDMODULE MODI_DEEP_CONVECTION +! +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/09/21 10:55:01 +!----------------------------------------------------------------- +! ############################################################################ +subroutine DEEP_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH, ODOWN, OSETTADJ, & + PPABST, PZZ, PDXDY, PTIMEC, & + PTT, PRVT, PRCT, PRIT, PUT, PVT, PWT, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + PPRLTEN, PPRSTEN, & + KCLTOP, KCLBAS, PPRLFLX, PPRSFLX, & + PUMF, PDMF, PCAPE, & + OCH1CONV, KCH1, PCH1, PCH1TEN) +! ############################################################################ +! +!!**** Monitor routine to compute all convective tendencies by calls +!! of several subroutines. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! tendencies. The routine first prepares all necessary grid-scale +!! variables. The final convective tendencies are then computed by +!! calls of different subroutines. +!! +!! +!!** METHOD +!! ------ +!! We start by selecting convective columns in the model domain through +!! the call of routine TRIGGER_FUNCT. Then, we allocate memory for the +!! convection updraft and downdraft variables and gather the grid scale +!! variables in convective arrays. +!! The updraft and downdraft computations are done level by level starting +!! at the bottom and top of the domain, respectively. +!! All computations are done on MNH thermodynamic levels. The depth +!! of the current model layer k is defined by DP(k)=P(k-1)-P(k) +!! +!! +!! +!! EXTERNAL +!! -------- +!! CONVECT_TRIGGER_FUNCT +!! CONVECT_SATMIXRATIO +!! CONVECT_UPDRAFT +!! CONVECT_CONDENS +!! CONVECT_MIXING_FUNCT +!! CONVECT_TSTEP_PREF +!! CONVECT_DOWNDRAFT +!! CONVECT_PRECIP_ADJUST +!! CONVECT_CLOSURE +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! number Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XRHOLW ! density of liquid water +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! XCL, XCI ! specific heat for liquid water and ice +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! +!! +!! REFERENCE +!! --------- +!! +!! Bechtold, 1997 : Meso-NH scientific documentation (31 pp) +!! Bechtold et al., 2001, Quart. J. Roy. Met. Soc. +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. 47, 2784-2801. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. 24, 165-170. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 04/10/97 replace theta_il by enthalpy +!! " 10/12/98 changes for ARPEGE +!! " 12/12/00 add conservation correction +!! C. Mari 13/02/01 add scavenging of chemical species in updraft +!! P. Jabouille 02/07/01 case of lagragian variables +!! P. Tulet 02/03/05 update for dust +!! C.Lac 27/09/10 modification loop index for reproducibility +!! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAREXT + USE MODD_CONVPAR +!USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND, & +! NSV_CHEMBEG,NSV_CHEMEND, & +! NSV_LNOXBEG +!USE MODD_CH_M9_n, ONLY : CNAMES +! +!USE MODI_CH_CONVECT_LINOX + USE MODI_CONVECT_TRIGGER_FUNCT + USE MODI_CONVECT_UPDRAFT + USE MODI_CONVECT_TSTEP_PREF + USE MODI_CONVECT_DOWNDRAFT + USE MODI_CONVECT_PRECIP_ADJUST + USE MODI_CONVECT_CLOSURE +!USE MODI_CH_CONVECT_SCAVENGING +!USE MODI_CONVECT_CHEM_TRANSPORT +! +!SeBi #ifdef MNH_PGI +!SeBi USE MODE_PACK_PGI +!SeBi #endif +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x + INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x + INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 + INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 + REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + LOGICAL, INTENT(IN) :: OREFRESH ! refresh or not tendencies + ! at every call + LOGICAL, INTENT(IN) :: ODOWN ! take or not convective + ! downdrafts into account + LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTT ! grid scale temperature at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRCT ! grid scale r_c " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRIT ! grid scale r_i " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUT ! grid scale horiz. wind u " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PVT ! grid scale horiz. wind v " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! horizontal grid area (m-a2) + REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC ! value of convective adjustment + ! time if OSETTADJ=.true. +! + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter (recompute + ! tendency or keep it) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRLTEN! liquid surf. precipitation + ! tendency (m/s) + REAL, DIMENSION(KLON), INTENT(INOUT):: PPRSTEN! solid surf. precipitation + ! tendency (m/s) + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PPRLFLX! liquid precip flux (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PPRSFLX! solid precip flux (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s m2) + REAL, DIMENSION(KLON), INTENT(INOUT):: PCAPE ! maximum CAPE (J/kg) +! + LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport + INTEGER, INTENT(IN) :: KCH1 ! number of species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(IN) :: PCH1! grid scale chemical species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) + LOGICAL :: OUSECHEM ! flag for chemistry + LOGICAL :: OCH_CONV_SCAV ! & scavenging + LOGICAL :: OCH_CONV_LINOX ! & LiNOx + LOGICAL :: ODUST ! flag for dust + LOGICAL :: OSALT ! flag for sea salt + REAL, DIMENSION(KLON, KLEV) :: PRHODREF ! grid scale density + REAL, DIMENSION(KLON) :: PIC_RATE ! IC lightning frequency + REAL, DIMENSION(KLON) :: PCG_RATE ! CG lightning frequency +! +! +!* 0.2 Declarations of local fixed memory variables : +! + INTEGER :: ITEST, ICONV, ICONV1 ! number of convective columns + INTEGER :: IIB, IIE ! horizontal loop bounds + INTEGER :: IKB, IKE ! vertical loop bounds + INTEGER :: IKS ! vertical dimension + INTEGER :: JI, JL, JJ ! horizontal loop index + INTEGER :: JN ! number of tracers + INTEGER :: JK, JKP, JKM ! vertical loop index + INTEGER :: IFTSTEPS ! only used for chemical tracers + real :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d + real :: ZRDOCP ! R_d/C_p +! + LOGICAL, DIMENSION(KLON, KLEV) :: GTRIG3 ! 3D logical mask for convection + LOGICAL, DIMENSION(KLON) :: GTRIG ! 2D logical mask for trigger test + REAL, DIMENSION(KLON, KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, + ! theta_v, theta_es + REAL, DIMENSION(KLON) :: ZTIME ! convective time period + REAL, DIMENSION(KLON) :: ZWORK2, ZWORK2B ! work array + real :: ZW1 ! work variable +! +! +!* 0.2 Declarations of local allocatable variables : +! + INTEGER, DIMENSION(:), ALLOCATABLE :: IDPL ! index for parcel departure level + INTEGER, DIMENSION(:), ALLOCATABLE :: IPBL ! index for source layer top + INTEGER, DIMENSION(:), ALLOCATABLE :: ILCL ! index for lifting condensation level + INTEGER, DIMENSION(:), ALLOCATABLE :: IETL ! index for zero buoyancy level + INTEGER, DIMENSION(:), ALLOCATABLE :: ICTL ! index for cloud top level + INTEGER, DIMENSION(:), ALLOCATABLE :: ILFS ! index for level of free sink + INTEGER, DIMENSION(:), ALLOCATABLE :: IDBL ! index for downdraft base level + INTEGER, DIMENSION(:), ALLOCATABLE :: IML ! melting level +! + INTEGER, DIMENSION(:), ALLOCATABLE :: ISDPL ! index for parcel departure level + INTEGER, DIMENSION(:), ALLOCATABLE :: ISPBL ! index for source layer top + INTEGER, DIMENSION(:), ALLOCATABLE :: ISLCL ! index for lifting condensation level + REAL, DIMENSION(:), ALLOCATABLE :: ZSTHLCL ! updraft theta at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSTLCL ! updraft temp. at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSRVLCL ! updraft rv at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSWLCL ! updraft w at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSZLCL ! LCL height + REAL, DIMENSION(:), ALLOCATABLE :: ZSTHVELCL! envir. theta_v at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSDXDY ! grid area (m^2) +! +! grid scale variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZZ ! height of model layer (m) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRES ! grid scale pressure + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZU ! grid scale horiz. u component on theta grid + REAL, DIMENSION(:, :), ALLOCATABLE :: ZV ! grid scale horiz. v component on theta grid + REAL, DIMENSION(:, :), ALLOCATABLE :: ZW ! grid scale vertical velocity on theta grid + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTT ! temperature + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTH ! grid scale theta + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHV ! grid scale theta_v + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHES, ZTHEST ! grid scale saturated theta_e + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRW ! grid scale total water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRV ! grid scale water vapor (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRC ! grid scale cloud water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRI ! grid scale cloud ice (kg/kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZDXDY ! grid area (m^2) +! +! updraft variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUER ! updraft entrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUPR ! updraft precipitation in + ! flux units (kg water / s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUTHV ! updraft theta_v (K) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUTT ! updraft temperature (K) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURW ! updraft total water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURR ! liquid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURS ! solid precipit. (kg/kg) + ! produced in model layer + REAL, DIMENSION(:), ALLOCATABLE :: ZUTPR ! total updraft precipitation (kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZMFLCL ! cloud base unit mass flux(kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZCAPE ! available potent. energy + REAL, DIMENSION(:), ALLOCATABLE :: ZTHLCL ! updraft theta at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZTLCL ! updraft temp. at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZRVLCL ! updraft rv at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZWLCL ! updraft w at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZZLCL ! LCL height + REAL, DIMENSION(:), ALLOCATABLE :: ZTHVELCL! envir. theta_v at LCL +! +! downdraft variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDDR ! downdraft detrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDTHL ! downdraft enthalpy (J/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDRW ! downdraft total water (kg/kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZMIXF ! mixed fraction at LFS + REAL, DIMENSION(:), ALLOCATABLE :: ZTPR ! total surf precipitation (kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZSPR ! solid surf precipitation (kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZDTEVR ! donwndraft evapor. (kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZPREF ! precipitation efficiency + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDTEVRF ! donwndraft evapor. (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRLFLX ! liquid precip flux + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRSFLX ! solid precip flux +! +! closure variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZLMASS ! mass of model layer (kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEA ! advective time period + REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEC, ZTIMED! time during which convection is + ! active at grid point (as ZTIME) +! + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHC ! conv. adj. grid scale theta + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRVC ! conv. adj. grid scale r_w + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(:, :), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s) +! + LOGICAL, DIMENSION(:), ALLOCATABLE :: GTRIG1 ! logical mask for convection + LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK ! logical work array + INTEGER, DIMENSION(:), ALLOCATABLE :: IINDEX, IJINDEX, IJSINDEX, IJPINDEX!hor.index + REAL, DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph + REAL, DIMENSION(:), ALLOCATABLE :: ZLV, ZLS! latent heat of vaporis., sublim. + real :: ZES ! saturation vapor mixng ratio +! +! Chemical Tracers: + REAL, DIMENSION(:, :, :), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg) + REAL, DIMENSION(:, :, :), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1 + REAL, DIMENSION(:, :), ALLOCATABLE:: ZWORK3 ! work array + LOGICAL, DIMENSION(:, :, :), ALLOCATABLE::GTRIG4 ! logical mask + integer :: JN_NO ! index of NO compound in PCH1 + REAL, DIMENSION(:, :), ALLOCATABLE :: ZWORK4, ZWORK4C + ! LiNOx conc. and tendency + REAL, DIMENSION(:, :), ALLOCATABLE :: ZZZ, ZRHODREF + REAL, DIMENSION(:), ALLOCATABLE :: ZIC_RATE, ZCG_RATE +! +!------------------------------------------------------------------------------- +! +!* SeBi set some logical to false and real to nul because unused here +! ------------------------------------------------------------- + OUSECHEM = .false. + OCH_CONV_SCAV = .false. + OCH_CONV_LINOX = .false. + ODUST = .false. + OSALT = .false. + PRHODREF = 0.0 + PIC_RATE = 0.0 + PCG_RATE = 0.0 + +! +!* 0.3 Compute loop bounds +! ------------------- +! + IIB = KIDIA + IIE = KFDIA + JCVEXB = MAX(0, KBDIA - 1) + IKB = 1 + JCVEXB + IKS = KLEV + JCVEXT = MAX(0, KTDIA - 1) + IKE = IKS - JCVEXT +! +! +!* 0.5 Update convective counter ( where KCOUNT > 0 +! convection is still active ). +! --------------------------------------------- +! + KCOUNT(IIB:IIE) = KCOUNT(IIB:IIE) - 1 +! + if(OREFRESH) then + KCOUNT(:) = 1 + KCOUNT(IIB:IIE) = 0 ! refresh or not at every call + endif +! + GTRIG(:) = KCOUNT(:) <= 0 + ITEST = COUNT(GTRIG(:)) + if(ITEST == 0) then ! if convection is already active at every grid point + RETURN + endif + ! exit DEEP_CONVECTION +! +! +!* 0.7 Reset convective tendencies to zero if convective +! counter becomes negative +! ------------------------------------------------- +! + do JJ = 1, KLEV; do JI = 1, KLON + GTRIG3(JI, JJ) = GTRIG(JI) + ENDdo; ENDdo + WHERE(GTRIG3(:, :)) + PTTEN(:, :) = 0. + PRVTEN(:, :) = 0. + PRCTEN(:, :) = 0. + PRITEN(:, :) = 0. + PPRLFLX(:, :) = 0. + PPRSFLX(:, :) = 0. +! PUTEN(:,:) = 0. +! PVTEN(:,:) = 0. + PUMF(:, :) = 0. + PDMF(:, :) = 0. + ENDWHERE + WHERE(GTRIG(:)) + PPRLTEN(:) = 0. + PPRSTEN(:) = 0. + KCLTOP(:) = 0 + KCLBAS(:) = 0 + PCAPE(:) = 0. + ENDWHERE + ALLOCATE(GTRIG4(KLON, KLEV, KCH1)) + do JK = 1, KCH1; do JJ = 1, KLEV; do JI = 1, KLON +!GTRIG4(:,:,:) = SPREAD( GTRIG3(:,:), DIM=3, NCOPIES=KCH1 ) + GTRIG4(JI, JJ, JK) = GTRIG3(JI, JJ) + ENDdo; ENDdo; enddo + WHERE(GTRIG4(:, :, :)) PCH1TEN(:, :, :) = 0. + DEALLOCATE(GTRIG4) +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize local variables +! ---------------------------- +! + ZEPS = XRD / XRV + ZEPSA = XRV / XRD + ZRDOCP = XRD / XCPD +! +! +!* 1.1 Set up grid scale theta, theta_v, theta_es +! ------------------------------------------ +! + ZTHT(:, :) = 300. + ZSTHV(:, :) = 300. + ZSTHES(:, :) = 400. + do JK = IKB, IKE + do JI = IIB, IIE + if(PPABST(JI, JK) > 40.E2) then + ZTHT(JI, JK) = PTT(JI, JK) * (XP00 / PPABST(JI, JK))**ZRDOCP + ZSTHV(JI, JK) = ZTHT(JI, JK) * (1.+ZEPSA * PRVT(JI, JK)) / & + (1.+PRVT(JI, JK) + PRCT(JI, JK) + PRIT(JI, JK)) +! + ! use conservative Bolton (1980) formula for theta_e + ! it is used to compute CAPE for undilute parcel ascent + ! For economical reasons we do not use routine CONVECT_SATMIXRATIO here +! + ZES = EXP(XALPW - XBETAW / PTT(JI, JK) - XGAMW * LOG(PTT(JI, JK))) + ZES = ZEPS * ZES / (PPABST(JI, JK) - ZES) + ZSTHES(JI, JK) = PTT(JI, JK) * (ZTHT(JI, JK) / PTT(JI, JK))** & + (1.-0.28 * ZES) * EXP((3374.6525 / PTT(JI, JK) - 2.5403) & + * ZES * (1.+0.81 * ZES)) + endif + enddo + enddo +! +!------------------------------------------------------------------------------- +! +!* 2. Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +!* 2.1 Allocate arrays depending on number of model columns that need +! to be tested for convection (i.e. where no convection is present +! at the moment. +! -------------------------------------------------------------- +! + ALLOCATE(ZPRES(ITEST, IKS)) + ALLOCATE(ZZ(ITEST, IKS)) + ALLOCATE(ZW(ITEST, IKS)) + ALLOCATE(ZTH(ITEST, IKS)) + ALLOCATE(ZTHV(ITEST, IKS)) + ALLOCATE(ZTHEST(ITEST, IKS)) + ALLOCATE(ZRV(ITEST, IKS)) + ALLOCATE(ZSTHLCL(ITEST)) + ALLOCATE(ZSTLCL(ITEST)) + ALLOCATE(ZSRVLCL(ITEST)) + ALLOCATE(ZSWLCL(ITEST)) + ALLOCATE(ZSZLCL(ITEST)) + ALLOCATE(ZSTHVELCL(ITEST)) + ALLOCATE(ISDPL(ITEST)) + ALLOCATE(ISPBL(ITEST)) + ALLOCATE(ISLCL(ITEST)) + ALLOCATE(ZSDXDY(ITEST)) + ALLOCATE(GTRIG1(ITEST)) + ALLOCATE(ZCAPE(ITEST)) + ALLOCATE(IINDEX(KLON)) + ALLOCATE(IJSINDEX(ITEST)) + do JI = 1, KLON + IINDEX(JI) = JI + enddo + IJSINDEX(:) = PACK(IINDEX(:), MASK=GTRIG(:)) +! + ZPRES = 0. + ZZ = 0. + ZTH = 0. + ZTHV = 0. + ZTHEST = 0. + ZRV = 0. + ZW = 0. +! + do JK = IKB, IKE + do JI = 1, ITEST + JL = IJSINDEX(JI) + ZPRES(JI, JK) = PPABST(JL, JK) + ZZ(JI, JK) = PZZ(JL, JK) + ZTH(JI, JK) = ZTHT(JL, JK) + ZTHV(JI, JK) = ZSTHV(JL, JK) + ZTHEST(JI, JK) = ZSTHES(JL, JK) + ZRV(JI, JK) = MAX(0., PRVT(JL, JK)) + ZW(JI, JK) = PWT(JL, JK) + enddo + enddo + do JI = 1, ITEST + JL = IJSINDEX(JI) + ZSDXDY(JI) = PDXDY(JL) + enddo +! +!* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c +! and envir. saturation theta_e +! ------------------------------------------------------------ +! +! +!* 2.3 Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! + ISLCL(:) = MAX(IKB, 2) ! initialize DPL PBL and LCL + ISDPL(:) = IKB + ISPBL(:) = IKB +! +! + call CONVECT_TRIGGER_FUNCT(ITEST, KLEV, & + ZPRES, ZTH, ZTHV, ZTHEST, & + ZRV, ZW, ZZ, ZSDXDY, & + ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, & + ZSTHVELCL, ISLCL, ISDPL, ISPBL, GTRIG1, & + ZCAPE) +! + do JI = 1, ITEST + JL = IJSINDEX(JI) + PCAPE(JL) = ZCAPE(JI) + enddo +! + DEALLOCATE(ZPRES) + DEALLOCATE(ZZ) + DEALLOCATE(ZTH) + DEALLOCATE(ZTHV) + DEALLOCATE(ZTHEST) + DEALLOCATE(ZRV) + DEALLOCATE(ZW) + DEALLOCATE(ZCAPE) +! +!------------------------------------------------------------------------------- +! +!* 3. After the call of TRIGGER_FUNCT we allocate all the dynamic +! arrays used in the convection scheme using the mask GTRIG, i.e. +! we do calculus only in convective columns. This corresponds to +! a GATHER operation. +! -------------------------------------------------------------- +! + ICONV = COUNT(GTRIG1(:)) + if(ICONV == 0) then + DEALLOCATE(ZSTHLCL) + DEALLOCATE(ZSTLCL) + DEALLOCATE(ZSRVLCL) + DEALLOCATE(ZSWLCL) + DEALLOCATE(ZSZLCL) + DEALLOCATE(ZSTHVELCL) + DEALLOCATE(ZSDXDY) + DEALLOCATE(ISLCL) + DEALLOCATE(ISDPL) + DEALLOCATE(ISPBL) + DEALLOCATE(GTRIG1) + DEALLOCATE(IINDEX) + DEALLOCATE(IJSINDEX) + RETURN ! no convective column has been found, exit DEEP_CONVECTION + endif +! + ! vertical index variables +! + ALLOCATE(IDPL(ICONV)) + ALLOCATE(IPBL(ICONV)) + ALLOCATE(ILCL(ICONV)) + ALLOCATE(ICTL(ICONV)) + ALLOCATE(IETL(ICONV)) +! + ! grid scale variables +! + ALLOCATE(ZZ(ICONV, IKS)); ZZ = 0.0 + ALLOCATE(ZPRES(ICONV, IKS)); ZPRES = 0.0 + ALLOCATE(ZDPRES(ICONV, IKS+1)); ZDPRES = 0.0 + ALLOCATE(ZU(ICONV, IKS)); ZU = 0.0 + ALLOCATE(ZV(ICONV, IKS)); ZV = 0.0 + ALLOCATE(ZTT(ICONV, IKS)); ZTT = 0.0 + ALLOCATE(ZTH(ICONV, IKS)); ZTH = 0.0 + ALLOCATE(ZTHV(ICONV, IKS)); ZTHV = 0.0 + ALLOCATE(ZTHL(ICONV, IKS)); ZTHL = 0.0 + ALLOCATE(ZTHES(ICONV, IKS)); ZTHES = 0.0 + ALLOCATE(ZRV(ICONV, IKS)); ZRV = 0.0 + ALLOCATE(ZRC(ICONV, IKS)); ZRC = 0.0 + ALLOCATE(ZRI(ICONV, IKS)); ZRI = 0.0 + ALLOCATE(ZRW(ICONV, IKS)); ZRW = 0.0 + ALLOCATE(ZDXDY(ICONV)); ZDXDY = 0.0 +! + ! updraft variables +! + ALLOCATE(ZUMF(ICONV, IKS)) + ALLOCATE(ZUER(ICONV, IKS)) + ALLOCATE(ZUDR(ICONV, IKS)) + ALLOCATE(ZUPR(ICONV, IKS)) + ALLOCATE(ZUTHL(ICONV, IKS)) + ALLOCATE(ZUTHV(ICONV, IKS)) + ALLOCATE(ZUTT(ICONV, IKS)) + ALLOCATE(ZURW(ICONV, IKS)) + ALLOCATE(ZURC(ICONV, IKS)) + ALLOCATE(ZURI(ICONV, IKS)) + ALLOCATE(ZURR(ICONV, IKS)) + ALLOCATE(ZURS(ICONV, IKS)) + ALLOCATE(ZUTPR(ICONV)) + ALLOCATE(ZTHLCL(ICONV)) + ALLOCATE(ZTLCL(ICONV)) + ALLOCATE(ZRVLCL(ICONV)) + ALLOCATE(ZWLCL(ICONV)) + ALLOCATE(ZMFLCL(ICONV)) + ALLOCATE(ZZLCL(ICONV)) + ALLOCATE(ZTHVELCL(ICONV)) + ALLOCATE(ZCAPE(ICONV)) +! +! work variables +! + ALLOCATE(IJINDEX(ICONV)) + ALLOCATE(IJPINDEX(ICONV)) + ALLOCATE(ZCPH(ICONV)) + ALLOCATE(ZLV(ICONV)) + ALLOCATE(ZLS(ICONV)) +! +! +!* 3.1 Gather grid scale and updraft base variables in +! arrays using mask GTRIG +! --------------------------------------------------- +! + GTRIG(:) = UNPACK(GTRIG1(:), MASK=GTRIG, FIELD=.false.) + IJINDEX(:) = PACK(IINDEX(:), MASK=GTRIG(:)) +! + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + ZZ(JI, JK) = PZZ(JL, JK) + ZPRES(JI, JK) = PPABST(JL, JK) + ZTT(JI, JK) = PTT(JL, JK) + ZTH(JI, JK) = ZTHT(JL, JK) + ZTHES(JI, JK) = ZSTHES(JL, JK) + ZRV(JI, JK) = MAX(0., PRVT(JL, JK)) + ZRC(JI, JK) = MAX(0., PRCT(JL, JK)) + ZRI(JI, JK) = MAX(0., PRIT(JL, JK)) + ZTHV(JI, JK) = ZSTHV(JL, JK) + ZU(JI, JK) = PUT(JL, JK) + ZV(JI, JK) = PVT(JL, JK) + enddo + enddo + if(OSETTADJ) then + ALLOCATE(ZTIMED(ICONV)) + do JI = 1, ICONV + JL = IJINDEX(JI) + ZTIMED(JI) = PTIMEC(JL) + enddo + endif +! + do JI = 1, ITEST + IJSINDEX(JI) = JI + enddo + IJPINDEX(:) = PACK(IJSINDEX(:), MASK=GTRIG1(:)) + do JI = 1, ICONV + JL = IJPINDEX(JI) + IDPL(JI) = ISDPL(JL) + IPBL(JI) = ISPBL(JL) + ILCL(JI) = ISLCL(JL) + ZTHLCL(JI) = ZSTHLCL(JL) + ZTLCL(JI) = ZSTLCL(JL) + ZRVLCL(JI) = ZSRVLCL(JL) + ZWLCL(JI) = ZSWLCL(JL) + ZZLCL(JI) = ZSZLCL(JL) + ZTHVELCL(JI) = ZSTHVELCL(JL) + ZDXDY(JI) = ZSDXDY(JL) + enddo + ALLOCATE(GWORK(ICONV)) + GWORK(:) = PACK(GTRIG1(:), MASK=GTRIG1(:)) + DEALLOCATE(GTRIG1) + ALLOCATE(GTRIG1(ICONV)) + GTRIG1(:) = GWORK(:) +! + DEALLOCATE(GWORK) + DEALLOCATE(IJPINDEX) + DEALLOCATE(ISDPL) + DEALLOCATE(ISPBL) + DEALLOCATE(ISLCL) + DEALLOCATE(ZSTHLCL) + DEALLOCATE(ZSTLCL) + DEALLOCATE(ZSRVLCL) + DEALLOCATE(ZSWLCL) + DEALLOCATE(ZSZLCL) + DEALLOCATE(ZSTHVELCL) + DEALLOCATE(ZSDXDY) +! +! +!* 3.2 Compute pressure difference +! --------------------------------------------------- +! + ZDPRES(:, IKB) = 0. + do JK = IKB + 1, IKE + ZDPRES(:, JK) = ZPRES(:, JK - 1) - ZPRES(:, JK) + enddo +! +!* 3.3 Compute environm. enthalpy and total water = r_v + r_i + r_c +! ---------------------------------------------------------- +! + do JK = IKB, IKE, 1 + ZRW(:, JK) = ZRV(:, JK) + ZRC(:, JK) + ZRI(:, JK) + ZCPH(:) = XCPD + XCPV * ZRW(:, JK) + ZLV(:) = XLVTT + (XCPV - XCL) * (ZTT(:, JK) - XTT) ! compute L_v + ZLS(:) = XLSTT + (XCPV - XCI) * (ZTT(:, JK) - XTT) ! compute L_i + ZTHL(:, JK) = ZCPH(:) * ZTT(:, JK) + (1.+ZRW(:, JK)) * XG * ZZ(:, JK) & + - ZLV(:) * ZRC(:, JK) - ZLS(:) * ZRI(:, JK) + enddo +! +!------------------------------------------------------------------------------- +! +!* 4. Compute updraft properties +! ---------------------------- +! +!* 4.1 Set mass flux at LCL ( here a unit mass flux with w = 1 m/s ) +! ------------------------------------------------------------- +! + do JI = 1, ICONV + JK = ILCL(JI) - 1 + ZMFLCL(JI) = ZPRES(JI, JK) / (XRD * ZTT(JI, JK) * & + (1.+ZEPS * ZRVLCL(JI))) * XPI * XCRAD * XCRAD & + * MAX(1., ZDXDY(JI) / XA25) + enddo +! + DEALLOCATE(ZCPH) + DEALLOCATE(ZLV) + DEALLOCATE(ZLS) +! +! + call CONVECT_UPDRAFT(ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTHL, ZTHV, ZTHES, ZRW, & + ZTHLCL, ZTLCL, ZRVLCL, ZWLCL, ZZLCL, ZTHVELCL, & + ZMFLCL, GTRIG1, ILCL, IDPL, IPBL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZUTHV, ZURW, & + ZURC, ZURI, ZURR, ZURS, ZUPR, & + ZUTPR, ZCAPE, ICTL, IETL, ZUTT) +! +! +! +!* 4.2 In routine UPDRAFT GTRIG1 has been set to false when cloud +! thickness is smaller than 3 km +! ----------------------------------------------------------- +! +! + ICONV1 = COUNT(GTRIG1) +! + if(ICONV1 > 0) then +! +!* 4.3 Allocate memory for downdraft variables +! --------------------------------------- +! +! downdraft variables +! + ALLOCATE(ILFS(ICONV)) + ALLOCATE(IDBL(ICONV)) + ALLOCATE(IML(ICONV)) + ALLOCATE(ZDMF(ICONV, IKS)) + ALLOCATE(ZDER(ICONV, IKS)) + ALLOCATE(ZDDR(ICONV, IKS)) + ALLOCATE(ZDTHL(ICONV, IKS)) + ALLOCATE(ZDRW(ICONV, IKS)) + ALLOCATE(ZLMASS(ICONV, IKS)); ZLMASS = 0.0 + do JK = IKB, IKE + ZLMASS(:, JK) = ZDXDY(:) * ZDPRES(:, JK) / XG ! mass of model layer + enddo + ZLMASS(:, IKB) = ZLMASS(:, IKB + 1) + ALLOCATE(ZMIXF(ICONV)) + ALLOCATE(ZTPR(ICONV)) + ALLOCATE(ZSPR(ICONV)) + ALLOCATE(ZDTEVR(ICONV)) + ALLOCATE(ZPREF(ICONV)) + ALLOCATE(ZDTEVRF(ICONV, IKS)) + ALLOCATE(ZPRLFLX(ICONV, IKS)) + ALLOCATE(ZPRSFLX(ICONV, IKS)) +! +! closure variables +! + ALLOCATE(ZTIMEA(ICONV)) + ALLOCATE(ZTIMEC(ICONV)) + ALLOCATE(ZTHC(ICONV, IKS)) + ALLOCATE(ZRVC(ICONV, IKS)) + ALLOCATE(ZRCC(ICONV, IKS)) + ALLOCATE(ZRIC(ICONV, IKS)) + ALLOCATE(ZWSUB(ICONV, IKS)) +! +!------------------------------------------------------------------------------- +! +!* 5. Compute downdraft properties +! ---------------------------- +! +!* 5.1 Compute advective time period and precipitation +! efficiency as a function of mean ambient wind (shear) +! -------------------------------------------------------- +! + call CONVECT_TSTEP_PREF(ICONV, KLEV, & + ZU, ZV, ZPRES, ZZ, ZDXDY, ILCL, ICTL, & + ZTIMEA, ZPREF) +! + ! exclude convective downdrafts if desired + if(.not. ODOWN) ZPREF(:) = 1. +! +! Compute the period during which convection is active + ZTIMEC(:) = MAX(1800., MIN(3600., ZTIMEA(:))) + ZTIMEC(:) = REAL(INT(ZTIMEC(:) / PDTCONV)) * PDTCONV + ZTIMEC(:) = MAX(PDTCONV, ZTIMEC(:)) ! necessary if PDTCONV > 1800 + if(OSETTADJ) then + ZTIMEC(:) = MAX(PDTCONV, ZTIMED(:)) + endif +! +! +!* 5.2 Compute melting level +! ---------------------- +! + IML(:) = IKB + do JK = IKE, IKB, -1 + WHERE(ZTT(:, JK) <= XTT) IML(:) = JK + enddo +! + call CONVECT_DOWNDRAFT(ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTH, ZTHES, & + ZRW, ZRC, ZRI, & + ZPREF, ILCL, ICTL, IETL, & + ZUTHL, ZURW, ZURC, ZURI, & + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZMIXF, ZDTEVR, ILFS, IDBL, IML, & + ZDTEVRF) +! +!------------------------------------------------------------------------------- +! +!* 6. Adjust up and downdraft mass flux to be consistent +! with precipitation efficiency relation. +! --------------------------------------------------- +! + call CONVECT_PRECIP_ADJUST(ICONV, KLEV, & + ZPRES, ZUMF, ZUER, ZUDR, ZUPR, ZUTPR, ZURW, & + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZPREF, ZTPR, ZMIXF, ZDTEVR, & + ILFS, IDBL, ILCL, ICTL, IETL, & + ZDTEVRF) +! +!------------------------------------------------------------------------------- +! +!* 7. Determine adjusted environmental values assuming +! that all available buoyant energy must be removed +! within an advective time step ZTIMEC. +! --------------------------------------------------- +! + call CONVECT_CLOSURE(ICONV, KLEV, & + ZPRES, ZDPRES, ZZ, ZDXDY, ZLMASS, & + ZTHL, ZTH, ZRW, ZRC, ZRI, GTRIG1, & + ZTHC, ZRVC, ZRCC, ZRIC, ZWSUB, & + ILCL, IDPL, IPBL, ILFS, ICTL, IML, & + ZUMF, ZUER, ZUDR, ZUTHL, ZURW, & + ZURC, ZURI, ZUPR, & + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZTPR, ZSPR, ZDTEVR, & + ZCAPE, ZTIMEC, & + IFTSTEPS, & + ZDTEVRF, ZPRLFLX, ZPRSFLX) +! +!------------------------------------------------------------------------------- +! +!* 8. Determine the final grid-scale (environmental) convective +! tendencies and set convective counter +! -------------------------------------------------------- +! +! +!* 8.1 Grid scale tendencies +! --------------------- +! +! in order to save memory, the tendencies are temporarily stored +! in the tables for the adjusted grid-scale values +! + do JK = IKB, IKE + ZTHC(:, JK) = (ZTHC(:, JK) - ZTH(:, JK)) / ZTIMEC(:) & + * (ZPRES(:, JK) / XP00)**ZRDOCP ! change theta in temperature + ZRVC(:, JK) = (ZRVC(:, JK) - ZRW(:, JK) + ZRC(:, JK) + ZRI(:, JK)) / ZTIMEC(:) + ZRCC(:, JK) = (ZRCC(:, JK) - ZRC(:, JK)) / ZTIMEC(:) + ZRIC(:, JK) = (ZRIC(:, JK) - ZRI(:, JK)) / ZTIMEC(:) +! + ZPRLFLX(:, JK) = ZPRLFLX(:, JK) / (XRHOLW * ZDXDY(:)) + ZPRSFLX(:, JK) = ZPRSFLX(:, JK) / (XRHOLW * ZDXDY(:)) +! + enddo +! + ZPRLFLX(:, IKB) = ZPRLFLX(:, IKB + 1) + ZPRSFLX(:, IKB) = ZPRSFLX(:, IKB + 1) +! +! +!* 8.2 Apply conservation correction +! ----------------------------- +! + ! Compute vertical integrals +! +! Reproducibility +! JKM = MAXVAL( ICTL(:) ) + JKM = IKE - 1 + ZWORK2(:) = 0. + ZWORK2B(:) = 0. + do JK = IKB + 1, JKM + JKP = JK + 1 + do JI = 1, ICONV + ZW1 = .5 * (ZPRES(JI, JK - 1) - ZPRES(JI, JKP)) / XG + ZWORK2(JI) = ZWORK2(JI) + (ZRVC(JI, JK) + ZRCC(JI, JK) + ZRIC(JI, JK)) * ZW1 ! moisture + ZWORK2B(JI) = ZWORK2B(JI) + ((XCPD + XCPV * ZRW(JI, JK)) * ZTHC(JI, JK) - & + (XLVTT + (XCPV - XCL) * (ZTT(JI, JK) - XTT)) * ZRCC(JI, JK) - & + (XLSTT + (XCPV - XCL) * (ZTT(JI, JK) - XTT)) * ZRIC(JI, JK)) * & + ZW1 ! enthalpy + enddo + enddo +! + ! Budget error (compare integral to surface precip.) +! + do JI = 1, ICONV + if(ZTPR(JI) > 0.) then + ZW1 = XG / (ZPRES(JI, IKB) - ZPRES(JI, JKP) - .5 * ( & + ZDPRES(JI, IKB + 1) - ZDPRES(JI, JKP + 1))) + ZWORK2(JI) = (ZTPR(JI) / ZDXDY(JI) + ZWORK2(JI)) * ZW1 + ZWORK2B(JI) = (ZTPR(JI) / ZDXDY(JI) * & + (XLVTT + (XCPV - XCL) * (ZTT(JI, IKB) - XTT)) - ZWORK2B(JI)) & + * ZW1 + endif + enddo +! + ! Apply uniform correction +! + do JK = JKM, IKB + 1, -1 + do JI = 1, ICONV + if(ZTPR(JI) > 0. .and. JK <= ICTL(JI)) then + ! ZW1 = ABS(ZRVC(JI,JK)) + ABS(ZRCC(JI,JK)) + ABS(ZRIC(JI,JK)) + 1.E-12 + ! ZRVC(JI,JK) = ZRVC(JI,JK) - ABS(ZRVC(JI,JK))/ZW1*ZWORK2(JI) ! moisture + ZRVC(JI, JK) = ZRVC(JI, JK) - ZWORK2(JI) ! moisture + ! ZRCC(JI,JK) = ZRCC(JI,JK) - ABS(ZRCC(JI,JK))/ZW1*ZWORK2(JI) + ! ZRIC(JI,JK) = ZRIC(JI,JK) - ABS(ZRIC(JI,JK))/ZW1*ZWORK2(JI) + ZTHC(JI, JK) = ZTHC(JI, JK) + ZWORK2B(JI) / (XCPD + XCPV * ZRW(JI, JK))! energy + endif + enddo + enddo +! +! +! execute a "scatter"= pack command to store the tendencies in +! the final 2D tables +! + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + PTTEN(JL, JK) = ZTHC(JI, JK) + PRVTEN(JL, JK) = ZRVC(JI, JK) + PRCTEN(JL, JK) = ZRCC(JI, JK) + PRITEN(JL, JK) = ZRIC(JI, JK) +! + PPRLFLX(JL, JK) = ZPRLFLX(JI, JK) + PPRSFLX(JL, JK) = ZPRSFLX(JI, JK) + enddo + enddo +! +! +!* 8.3 Convective rainfall tendency +! ---------------------------- +! + ! liquid and solid surface rainfall tendency in m/s + ZTPR(:) = ZTPR(:) / (XRHOLW * ZDXDY(:)) ! total surf precip + ZSPR(:) = ZSPR(:) / (XRHOLW * ZDXDY(:)) ! solid surf precip + ZTPR(:) = ZTPR(:) - ZSPR(:) ! compute liquid part +! + do JI = 1, ICONV + JL = IJINDEX(JI) + PPRLTEN(JL) = ZTPR(JI) + PPRSTEN(JL) = ZSPR(JI) + enddo +! +! +! Cloud base and top levels +! ------------------------- +! + ILCL(:) = MIN(ILCL(:), ICTL(:)) + do JI = 1, ICONV + JL = IJINDEX(JI) + KCLTOP(JL) = ICTL(JI) + KCLBAS(JL) = ILCL(JI) + enddo +! +! +!* 8.4 Set convective counter +! ---------------------- +! + ! compute convective counter for just activated convective + ! grid points + ! If the advective time period is less than specified + ! minimum for convective period, allow feedback to occur only + ! during advective time +! + ZTIME(:) = 1. + ZWORK2(:) = 0. + do JI = 1, ICONV + JL = IJINDEX(JI) + ZTIME(JL) = ZTIMEC(JI) + ZWORK2(JL) = ZTIMEA(JI) + ZWORK2(JL) = MIN(ZWORK2(JL), ZTIME(JL)) + ZWORK2(JL) = MAX(ZWORK2(JL), PDTCONV) + if(GTRIG(JL)) KCOUNT(JL) = INT(ZWORK2(JL) / PDTCONV) + if(GTRIG(JL) .and. PPRLTEN(JL) < 1.E-14) KCOUNT(JL) = 0 + enddo +! +! +!* 8.7 Compute convective tendencies for Tracers +! ------------------------------------------ +! +! if ( OCH1CONV ) then +!! +! ALLOCATE( ZCH1(ICONV,IKS,KCH1) ) ; ZCH1 = 0.0 +! ALLOCATE( ZCH1C(ICONV,IKS,KCH1) ) ; ZCH1C = 0.0 +! ALLOCATE( ZWORK3(ICONV,KCH1) ) +!! +! ALLOCATE( ZRHODREF(ICONV,IKS) ) +! ZRHODREF=0. +! if ( OCH_CONV_LINOX ) then +! ALLOCATE( ZZZ(ICONV,IKS) ) +! ALLOCATE( ZIC_RATE(ICONV) ) +! ALLOCATE( ZCG_RATE(ICONV) ) +! ALLOCATE( ZWORK4(ICONV,IKS) ) +! ALLOCATE( ZWORK4C(ICONV,IKS) ) +! ZZZ=0. +! ZIC_RATE=0. +! ZCG_RATE=0. +! ZWORK4=0. +! ZWORK4C=0. +! end if +!! +! do JI = 1, ICONV +! do JK = IKB, IKE +! JL = IJINDEX(JI) +! ZCH1(JI,JK,:) = PCH1(JL,JK,:) +! ZRHODREF(JI,JK)=PRHODREF(JL,JK) +! end do +! ZRHODREF(JI,1) = PRHODREF(JL,IKB) +! ZRHODREF(JI,IKS) = PRHODREF(JL,IKE) +! end do +! ZCH1(:,1,:) = ZCH1(:,IKB,:) +! ZCH1(:,IKS,:) = ZCH1(:,IKE,:) +!! +! JN_NO = 0 +! if ( OCH_CONV_LINOX ) then +! do JK = IKB, IKE +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! ZZZ(JI,JK)=PZZ(JL,JK) +! ZIC_RATE(JI)=PIC_RATE(JL) +! ZCG_RATE(JI)=PCG_RATE(JL) +! end do +! end do +! if (OUSECHEM) then +! do JN = NSV_CHEMBEG,NSV_CHEMEND +! if (CNAMES(JN-NSV_CHEMBEG+1)=='NO') JN_NO = JN +! end do +! else +! JN_NO = NSV_LNOXBEG +! end if +! ZWORK4(:,:) = ZCH1(:,:,JN_NO) +! call CH_CONVECT_LINOX( ICONV, KLEV, ZWORK4, ZWORK4C, & +! IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & +! ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & +! ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & +! IFTSTEPS, ZUTT, ZRHODREF, & +! OUSECHEM, ZZZ, ZIC_RATE, ZCG_RATE ) +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! PIC_RATE(JL)=ZIC_RATE(JI) +! PCG_RATE(JL)=ZCG_RATE(JI) +! end do +! end if +!! +! if ((OUSECHEM .and. OCH_CONV_SCAV).OR.(ODUST .and. OCH_CONV_SCAV).OR.& +! (OSALT .and. OCH_CONV_SCAV) ) then +!! +! call CH_CONVECT_SCAVENGING( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & +! IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & +! ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & +! ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & +! IFTSTEPS, & +! ZURC, ZURR, ZURI, ZURS, ZUTT, ZPRES, & +! ZRHODREF, PPABST, ZTHT ) +!! +! if (OCH_CONV_LINOX) then +! ZCH1C(:,:,JN_NO) = ZWORK4C(:,:) +! end if +!! no conservation correction for scavenging +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! if ( ZTPR(JI) > 0. ) then +! do JK = IKB, IKE +! PCH1TEN(JL,JK,:) = (ZCH1C(JI,JK,:)- ZCH1(JI,JK,:)) /ZTIMEC(JI) +! end do +! else +! do JK = IKB, IKE +! PCH1TEN(JL,JK,:) = 0. +! end do +! end if +! end do +! +!! +! else +!! +! call CONVECT_CHEM_TRANSPORT( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & +! IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & +! ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & +! ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & +! IFTSTEPS ) +!! +! if (OCH_CONV_LINOX) then +! ZCH1C(:,:,JN_NO) = ZWORK4C(:,:) +! end if +!! +!!* 8.8 Apply conservation correction +!! ----------------------------- +!! +! ! Compute vertical integrals +!! +!! Reproducibility +!! JKM = MAXVAL( ICTL(:) ) +! JKM = IKE - 1 +! do JN = 1, KCH1 +! if((JN < NSV_LGBEG .OR. JN>NSV_LGEND-1) .and. JN .NE. JN_NO ) then +! ! no correction for Lagrangian and LiNOx variables +! ZWORK3(:,JN) = 0. +! ZWORK2(:) = 0. +! do JK = IKB+1, JKM +! JKP = JK + 1 +! do JI = 1, ICONV +! ZW1 = .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) +! ZWORK3(JI,JN) = ZWORK3(JI,JN) + (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN)) * ZW1 +! ZWORK2(JI) = ZWORK2(JI) + ABS(ZCH1C(JI,JK,JN)) * ZW1 +! end do +! end do +!! +! ! Apply concentration weighted correction +!! +! do JK = JKM, IKB+1, -1 +! do JI = 1, ICONV +! if ( ZTPR(JI) > 0. .and. JK <= ICTL(JI) ) then +! ZCH1C(JI,JK,JN) = ZCH1C(JI,JK,JN) - & +! ZWORK3(JI,JN)*ABS(ZCH1C(JI,JK,JN))/MAX(1.E-30,ZWORK2(JI)) +! ! ZCH1C(JI,JK,JN) = MAX( ZCH1C(JI,JK,JN), -ZCH1(JI,JK,JN)/ZTIMEC(JI) ) +! end if +! end do +! end do +! end if +!! +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! if ( ZTPR(JI) > 0. ) then +! do JK = IKB, IKE +! PCH1TEN(JL,JK,JN) = (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN) ) /ZTIMEC(JI) +! end do +! else +! do JK = IKB, IKE +! PCH1TEN(JL,JK,JN) = 0. +! end do +! end if +! end do +! end do +! end if +! end if +! +!------------------------------------------------------------------------------- +! +!* 9. Write up- and downdraft mass fluxes +! ------------------------------------ +! + do JK = IKB, IKE + ZUMF(:, JK) = ZUMF(:, JK) / ZDXDY(:) ! Mass flux per unit area + ZDMF(:, JK) = ZDMF(:, JK) / ZDXDY(:) + enddo + ZWORK2(:) = 1. + WHERE(PPRLTEN(:) < 1.E-14) ZWORK2(:) = 0. + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + PUMF(JL, JK) = ZUMF(JI, JK) * ZWORK2(JL) + PDMF(JL, JK) = ZDMF(JI, JK) * ZWORK2(JL) + enddo + enddo +! +!------------------------------------------------------------------------------- +! +!* 10. Deallocate all local arrays +! --------------------------- +! +! downdraft variables +! + DEALLOCATE(ZDMF) + DEALLOCATE(ZDER) + DEALLOCATE(ZDDR) + DEALLOCATE(ZDTHL) + DEALLOCATE(ZDRW) + DEALLOCATE(ZLMASS) + DEALLOCATE(ZMIXF) + DEALLOCATE(ZTPR) + DEALLOCATE(ZSPR) + DEALLOCATE(ZDTEVR) + DEALLOCATE(ZPREF) + DEALLOCATE(IML) + DEALLOCATE(ILFS) + DEALLOCATE(IDBL) + DEALLOCATE(ZDTEVRF) + DEALLOCATE(ZPRLFLX) + DEALLOCATE(ZPRSFLX) +! +! closure variables +! + DEALLOCATE(ZTIMEA) + DEALLOCATE(ZTIMEC) + DEALLOCATE(ZTHC) + DEALLOCATE(ZRVC) + DEALLOCATE(ZRCC) + DEALLOCATE(ZRIC) + DEALLOCATE(ZWSUB) +! + if(OCH1CONV) then + DEALLOCATE(ZCH1) + DEALLOCATE(ZCH1C) + DEALLOCATE(ZWORK3) + DEALLOCATE(ZRHODREF) + if(OCH_CONV_LINOX) then + DEALLOCATE(ZZZ) + DEALLOCATE(ZIC_RATE) + DEALLOCATE(ZCG_RATE) + DEALLOCATE(ZWORK4) + DEALLOCATE(ZWORK4C) + endif + endif +! + endif +! +! vertical index +! + DEALLOCATE(IDPL) + DEALLOCATE(IPBL) + DEALLOCATE(ILCL) + DEALLOCATE(ICTL) + DEALLOCATE(IETL) +! +! grid scale variables +! + DEALLOCATE(ZZ) + DEALLOCATE(ZPRES) + DEALLOCATE(ZDPRES) + DEALLOCATE(ZU) + DEALLOCATE(ZV) + DEALLOCATE(ZTT) + DEALLOCATE(ZTH) + DEALLOCATE(ZTHV) + DEALLOCATE(ZTHL) + DEALLOCATE(ZTHES) + DEALLOCATE(ZRW) + DEALLOCATE(ZRV) + DEALLOCATE(ZRC) + DEALLOCATE(ZRI) + DEALLOCATE(ZDXDY) +! +! updraft variables +! + DEALLOCATE(ZUMF) + DEALLOCATE(ZUER) + DEALLOCATE(ZUDR) + DEALLOCATE(ZUTHL) + DEALLOCATE(ZUTHV) + DEALLOCATE(ZUTT) + DEALLOCATE(ZURW) + DEALLOCATE(ZURC) + DEALLOCATE(ZURI) + DEALLOCATE(ZURR) + DEALLOCATE(ZURS) + DEALLOCATE(ZUPR) + DEALLOCATE(ZUTPR) + DEALLOCATE(ZTHLCL) + DEALLOCATE(ZTLCL) + DEALLOCATE(ZRVLCL) + DEALLOCATE(ZWLCL) + DEALLOCATE(ZZLCL) + DEALLOCATE(ZTHVELCL) + DEALLOCATE(ZMFLCL) + DEALLOCATE(ZCAPE) + if(OSETTADJ) DEALLOCATE(ZTIMED) +! +! work arrays +! + DEALLOCATE(IINDEX) + DEALLOCATE(IJINDEX) + DEALLOCATE(IJSINDEX) + DEALLOCATE(GTRIG1) +! +! +ENDsubroutine DEEP_CONVECTION + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! ################# +! + INTERFACE +! + subroutine CONVECT_CLOSURE_ADJUST_SHAL(KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +! + ENDsubroutine CONVECT_CLOSURE_ADJUST_SHAL +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! ################################################################################ +subroutine CONVECT_CLOSURE_ADJUST_SHAL(KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR) +! ################################################################################ +! +!!**** Uses closure adjustment factor to adjust mass flux and to modify +!! precipitation efficiency when necessary. The computations are +!! similar to routine CONVECT_PRECIP_ADJUST. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust the mass flux using the +!! factor PADJ computed in CONVECT_CLOSURE +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! EXTERNAL +!! -------- +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! None +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/11/96 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CONVPAREXT +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUMF ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUER ! initial value of " + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +! +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IKB, IKE ! vert. loop bounds + INTEGER :: JK ! vertical loop index +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute loop bounds +! ------------------- +! + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Adjust mass flux by the factor PADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + do JK = IKB + 1, IKE + PUMF(:, JK) = PZUMF(:, JK) * PADJ(:) + PUER(:, JK) = PZUER(:, JK) * PADJ(:) + PUDR(:, JK) = PZUDR(:, JK) * PADJ(:) + enddo +! +ENDsubroutine CONVECT_CLOSURE_ADJUST_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_CLOSURE_SHAL +! ################# +! + INTERFACE +! + subroutine CONVECT_CLOSURE_SHAL(KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KCTL, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PCAPE, PTIMEC, KFTSTEPS) + +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer + REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy + INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! + ENDsubroutine CONVECT_CLOSURE_SHAL +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_CLOSURE_SHAL +! ############################################################################## +subroutine CONVECT_CLOSURE_SHAL(KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KCTL, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PCAPE, PTIMEC, KFTSTEPS) +! ############################################################################## +! +!!**** Uses modified Fritsch-Chappell closure +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the final adjusted +!! (over a time step PTIMEC) environmental values of THETA_l, R_w, R_c, R_i +!! The final convective tendencies can then be evaluated in the main +!! routine DEEP_CONVECT by (PTHC-PTH)/PTIMEC +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST_SHAL +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! Module MODD_CONVPAR_SHAL +!! XA25 ! reference grid area +!! XSTABT ! stability factor in time integration +!! XSTABC ! stability factor in CAPE adjustment +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE) +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 15/11/96 change for enthalpie, r_c + r_i tendencies +!! Tony Dore 14/10/96 Initialise local variables +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR_SHAL + USE MODD_CONVPAREXT +! + USE MODI_CONVECT_CLOSURE_THRVLCL + USE MODI_CONVECT_SATMIXRATIO + USE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer + REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH ! grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRC ! grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRI ! grid scale r_i + LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy + INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(KLON, KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + INTEGER :: IKS ! vertical dimension + INTEGER :: JK, JKP, JKMAX ! vertical loop index + INTEGER :: JI ! horizontal loop index + INTEGER :: JITER ! iteration loop index + INTEGER :: JSTEP ! fractional time loop index + real :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON, KLEV) :: ZTHLC ! convectively adjusted + ! grid scale enthalpy + REAL, DIMENSION(KLON, KLEV) :: ZOMG ! conv. environm. subsidence (Pa/s) + REAL, DIMENSION(KLON, KLEV) :: ZUMF ! non-adjusted updraft mass flux + REAL, DIMENSION(KLON, KLEV) :: ZUER ! " updraft entrainm. rate + REAL, DIMENSION(KLON, KLEV) :: ZUDR ! " updraft detrainm. rate + REAL, DIMENSION(KLON) :: ZADJ ! mass adjustment factor + REAL, DIMENSION(KLON) :: ZADJMAX ! limit value for ZADJ + REAL, DIMENSION(KLON) :: ZCAPE ! new CAPE after adjustment + REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step + REAL, DIMENSION(KLON, KLEV):: ZTIMC ! 2D work array for ZTIMEC +! + REAL, DIMENSION(KLON) :: ZTHLCL ! new theta at LCL + REAL, DIMENSION(KLON) :: ZRVLCL ! new r_v at LCL + REAL, DIMENSION(KLON) :: ZZLCL ! height of LCL + REAL, DIMENSION(KLON) :: ZTLCL ! temperature at LCL + REAL, DIMENSION(KLON) :: ZTELCL ! envir. temper. at LCL + REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent + REAL, DIMENSION(KLON) :: ZTHES1, ZTHES2! saturation environm. theta_e + REAL, DIMENSION(KLON, KLEV) :: ZTHMFIN, ZTHMFOUT, ZRWMFIN, ZRWMFOUT + REAL, DIMENSION(KLON, KLEV) :: ZRCMFIN, ZRCMFOUT, ZRIMFIN, ZRIMFOUT + ! work arrays for environm. compensat. mass flux + REAL, DIMENSION(KLON) :: ZPI ! (P/P00)**R_d/C_pd + REAL, DIMENSION(KLON) :: ZLV ! latent heat of vaporisation + REAL, DIMENSION(KLON) :: ZLS ! latent heat of sublimation + REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph + INTEGER, DIMENSION(KLON) :: ITSTEP ! fractional convective time step + INTEGER, DIMENSION(KLON) :: ICOUNT ! timestep counter + INTEGER, DIMENSION(KLON) :: ILCL ! index lifting condens. level + INTEGER, DIMENSION(KLON) :: IWORK1 ! work array + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5 + LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK3! work arrays + LOGICAL, DIMENSION(KLON, KLEV) :: GWORK4 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.2 Initialize local variables +! ---------------------------- +! +! + ZTIMC(:, :) = 0. + ZTHES2(:) = 0. + ZWORK1(:) = 0. + ZWORK2(:) = 0. + ZWORK3(:) = 0. + ZWORK4(:) = 0. + ZWORK5(:) = 0. + GWORK1(:) = .false. + GWORK3(:) = .false. + GWORK4(:, :) = .false. + ILCL(:) = KLCL(:) +! + ZCPORD = XCPD / XRD + ZRDOCP = XRD / XCPD +! + ZADJ(:) = 1. + ZWORK5(:) = 1. + WHERE(.not. OTRIG1(:)) ZWORK5(:) = 0. +! +! +!* 0.3 Compute loop bounds +! ------------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKS = KLEV + IKE = KLEV - JCVEXT + JKMAX = MAXVAL(KCTL(:)) +! +! +!* 2. Save initial mass flux values to be used in adjustment procedure +! --------------------------------------------------------------- +! + ZUMF(:, :) = PUMF(:, :) + ZUER(:, :) = PUER(:, :) + ZUDR(:, :) = PUDR(:, :) + ZOMG(:, :) = 0. + PWSUB(:, :) = 0. +! +! +!* 3. Compute limits on the closure adjustment factor so that the +! inflow in convective drafts from a given layer can't be larger +! than the mass contained in this layer initially. +! --------------------------------------------------------------- +! + ZADJMAX(:) = 1000. + IWORK1(:) = ILCL(:) + JKP = MINVAL(KDPL(:)) + do JK = JKP, IKE + do JI = 1, IIE + if(JK > KDPL(JI) .and. JK <= IWORK1(JI)) then + ZWORK1(JI) = PLMASS(JI, JK) / ((PUER(JI, JK) + 1.E-5) * PTIMEC(JI)) + ZADJMAX(JI) = MIN(ZADJMAX(JI), ZWORK1(JI)) + endif + enddo + enddo +! +! + GWORK1(:) = OTRIG1(:) ! logical array to limit adjustment to not definitively + ! adjusted columns +! + do JK = IKB, IKE + ZTHLC(:, JK) = PTHL(:, JK) ! initialize adjusted envir. values + PRWC(:, JK) = PRW(:, JK) + PRCC(:, JK) = PRC(:, JK) + PRIC(:, JK) = PRI(:, JK) + PTHC(:, JK) = PTH(:, JK) + enddo +! +! +! + do JITER = 1, 4 ! Enter adjustment loop to assure that all CAPE is + ! removed within the advective time interval TIMEC +! + ZTIMEC(:) = PTIMEC(:) + GWORK4(:, :) = SPREAD(GWORK1(:), DIM=2, NCOPIES=IKS) + WHERE(GWORK4(:, :)) PWSUB(:, :) = 0. + ZOMG(:, :) = 0. +! + do JK = IKB + 1, JKMAX + JKP = MAX(IKB + 1, JK - 1) + WHERE(GWORK1(:) .and. JK <= KCTL(:)) +! +! +!* 4. Determine vertical velocity at top and bottom of each layer +! to satisfy mass continuity. +! --------------------------------------------------------------- + ! we compute here Domega/Dp = - g rho Dw/Dz = 1/Dt +! + ZWORK1(:) = -(PUER(:, JKP) - PUDR(:, JKP)) / PLMASS(:, JKP) +! + PWSUB(:, JK) = PWSUB(:, JKP) - PDPRES(:, JK - 1) * ZWORK1(:) + ! we use PDPRES(JK-1) and not JKP in order to have zero subsidence + ! at the first layer +! +! +!* 5. Compute fractional time step. For stability or +! mass conservation reasons one must split full time step PTIMEC) +! --------------------------------------------------------------- +! + ZWORK1(:) = XSTABT * PDPRES(:, JKP) / (ABS(PWSUB(:, JK)) + 1.E-10) + ! the factor XSTABT is used for stability reasons + ZTIMEC(:) = MIN(ZTIMEC(:), ZWORK1(:)) +! + ! transform vertical velocity in mass flux units + ZOMG(:, JK) = PWSUB(:, JK) * PDXDY(:) / XG + ENDWHERE + enddo +! +! + WHERE(GWORK4(:, :)) + ZTHLC(:, :) = PTHL(:, :) ! reinitialize adjusted envir. values + PRWC(:, :) = PRW(:, :) ! when iteration criterium not attained + PRCC(:, :) = PRC(:, :) + PRIC(:, :) = PRI(:, :) + PTHC(:, :) = PTH(:, :) + ENDWHERE +! +! +! 6. Check for mass conservation, i.e. ZWORK1 > 1.E-2 +! If mass is not conserved, the convective tendencies +! automatically become zero. +! ---------------------------------------------------- +! + do JI = 1, IIE + JK = KCTL(JI) + ZWORK1(JI) = PUDR(JI, JK) * PDPRES(JI, JK) / (PLMASS(JI, JK) + .1) & + - PWSUB(JI, JK) + enddo + WHERE(GWORK1(:) .and. ABS(ZWORK1(:)) - .01 > 0.) + GWORK1(:) = .false. + PTIMEC(:) = 1.E-1 + ZWORK5(:) = 0. + ENDWHERE + do JK = IKB, IKE + PWSUB(:, JK) = PWSUB(:, JK) * ZWORK5(:) + enddo + GWORK4(:, 1:IKB) = .false. + GWORK4(:, IKE:IKS) = .false. +! + ITSTEP(:) = INT(PTIMEC(:) / ZTIMEC(:)) + 1 + ZTIMEC(:) = PTIMEC(:) / REAL(ITSTEP(:)) ! adjust fractional time step + ! to be an integer multiple of PTIMEC + ZTIMC(:, :) = SPREAD(ZTIMEC(:), DIM=2, NCOPIES=IKS) + ICOUNT(:) = 0 +! +! +! + KFTSTEPS = MAXVAL(ITSTEP(:)) + do JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop here +! + ICOUNT(:) = ICOUNT(:) + 1 +! + GWORK3(:) = ITSTEP(:) >= ICOUNT(:) .and. GWORK1(:) +! +! +!* 7. Assign enthalpy and r_w values at the top and bottom of each +! layer based on the sign of w +! ------------------------------------------------------------ +! + ZTHMFIN(:, :) = 0. + ZRWMFIN(:, :) = 0. + ZRCMFIN(:, :) = 0. + ZRIMFIN(:, :) = 0. + ZTHMFOUT(:, :) = 0. + ZRWMFOUT(:, :) = 0. + ZRCMFOUT(:, :) = 0. + ZRIMFOUT(:, :) = 0. +! + do JK = IKB + 1, JKMAX + do JI = 1, IIE + GWORK4(JI, JK) = GWORK3(JI) .and. JK <= KCTL(JI) + enddo + JKP = MAX(IKB + 1, JK - 1) + do JI = 1, IIE + if(GWORK3(JI)) then +! + ZWORK1(JI) = SIGN(1., ZOMG(JI, JK)) + ZWORK2(JI) = 0.5 * (1.+ZWORK1(JI)) + ZWORK1(JI) = 0.5 * (1.-ZWORK1(JI)) + ZTHMFIN(JI, JK) = -ZOMG(JI, JK) * ZTHLC(JI, JKP) * ZWORK1(JI) + ZTHMFOUT(JI, JK) = ZOMG(JI, JK) * ZTHLC(JI, JK) * ZWORK2(JI) + ZRWMFIN(JI, JK) = -ZOMG(JI, JK) * PRWC(JI, JKP) * ZWORK1(JI) + ZRWMFOUT(JI, JK) = ZOMG(JI, JK) * PRWC(JI, JK) * ZWORK2(JI) + ZRCMFIN(JI, JK) = -ZOMG(JI, JK) * PRCC(JI, JKP) * ZWORK1(JI) + ZRCMFOUT(JI, JK) = ZOMG(JI, JK) * PRCC(JI, JK) * ZWORK2(JI) + ZRIMFIN(JI, JK) = -ZOMG(JI, JK) * PRIC(JI, JKP) * ZWORK1(JI) + ZRIMFOUT(JI, JK) = ZOMG(JI, JK) * PRIC(JI, JK) * ZWORK2(JI) + endif + enddo + do JI = 1, IIE + if(GWORK3(JI)) then + ZTHMFIN(JI, JKP) = ZTHMFIN(JI, JKP) + ZTHMFOUT(JI, JK) * ZWORK2(JI) + ZTHMFOUT(JI, JKP) = ZTHMFOUT(JI, JKP) + ZTHMFIN(JI, JK) * ZWORK1(JI) + ZRWMFIN(JI, JKP) = ZRWMFIN(JI, JKP) + ZRWMFOUT(JI, JK) * ZWORK2(JI) + ZRWMFOUT(JI, JKP) = ZRWMFOUT(JI, JKP) + ZRWMFIN(JI, JK) * ZWORK1(JI) + ZRCMFIN(JI, JKP) = ZRCMFIN(JI, JKP) + ZRCMFOUT(JI, JK) * ZWORK2(JI) + ZRCMFOUT(JI, JKP) = ZRCMFOUT(JI, JKP) + ZRCMFIN(JI, JK) * ZWORK1(JI) + ZRIMFIN(JI, JKP) = ZRIMFIN(JI, JKP) + ZRIMFOUT(JI, JK) * ZWORK2(JI) + ZRIMFOUT(JI, JKP) = ZRIMFOUT(JI, JKP) + ZRIMFIN(JI, JK) * ZWORK1(JI) +! + endif + enddo + enddo +! + WHERE(GWORK4(:, :)) +! +!****************************************************************************** +! +!* 8. Update the environmental values of enthalpy and r_w at each level +! NOTA: These are the MAIN EQUATIONS of the scheme +! ----------------------------------------------------------------- +! +! + ZTHLC(:, :) = ZTHLC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZTHMFIN(:, :) + PUDR(:, :) * PUTHL(:, :) & + - ZTHMFOUT(:, :) - PUER(:, :) * PTHL(:, :)) + PRWC(:, :) = PRWC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRWMFIN(:, :) + PUDR(:, :) * PURW(:, :) & + - ZRWMFOUT(:, :) - PUER(:, :) * PRW(:, :)) + PRCC(:, :) = PRCC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRCMFIN(:, :) + PUDR(:, :) * PURC(:, :) - ZRCMFOUT(:, :) - & + PUER(:, :) * PRC(:, :)) + PRIC(:, :) = PRIC(:, :) + ZTIMC(:, :) / PLMASS(:, :) * ( & + ZRIMFIN(:, :) + PUDR(:, :) * PURI(:, :) - ZRIMFOUT(:, :) - & + PUER(:, :) * PRI(:, :)) +! +! +!****************************************************************************** +! + ENDWHERE +! + enddo ! Exit the fractional time step loop +! +! +!* 10. Compute final linearized value of theta envir. +! ---------------------------------------------- +! + do JK = IKB + 1, JKMAX + do JI = 1, IIE + if(GWORK1(JI) .and. JK <= KCTL(JI)) then + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ZCPH(JI) = XCPD + PRWC(JI, JK) * XCPV + ZWORK2(JI) = PTH(JI, JK) / ZPI(JI) ! first temperature estimate + ZLV(JI) = XLVTT + (XCPV - XCL) * (ZWORK2(JI) - XTT) + ZLS(JI) = XLVTT + (XCPV - XCI) * (ZWORK2(JI) - XTT) + ! final linearized temperature + ZWORK2(JI) = (ZTHLC(JI, JK) + ZLV(JI) * PRCC(JI, JK) + ZLS(JI) * PRIC(JI, JK) & + - (1.+PRWC(JI, JK)) * XG * PZ(JI, JK)) / ZCPH(JI) + ZWORK2(JI) = MAX(180., MIN(340., ZWORK2(JI))) + PTHC(JI, JK) = ZWORK2(JI) * ZPI(JI) ! final adjusted envir. theta + endif + enddo + enddo +! +! +!* 11. Compute new cloud ( properties at new LCL ) +! NOTA: The computations are very close to +! that in routine TRIGGER_FUNCT +! --------------------------------------------- +! + call CONVECT_CLOSURE_THRVLCL(KLON, KLEV, & + PPRES, PTHC, PRWC, PZ, GWORK1, & + ZTHLCL, ZRVLCL, ZZLCL, ZTLCL, ZTELCL, & + ILCL, KDPL, KPBL) +! +! + ZTLCL(:) = MAX(230., MIN(335., ZTLCL(:))) ! set some overflow bounds + ZTELCL(:) = MAX(230., MIN(335., ZTELCL(:))) + ZTHLCL(:) = MAX(230., MIN(345., ZTHLCL(:))) + ZRVLCL(:) = MAX(0., MIN(1., ZRVLCL(:))) +! +! +!* 12. Compute adjusted CAPE +! --------------------- +! + ZCAPE(:) = 0. + ZPI(:) = ZTHLCL(:) / ZTLCL(:) + ZPI(:) = MAX(0.95, MIN(1.5, ZPI(:))) + ZWORK1(:) = XP00 / ZPI(:)**ZCPORD ! pressure at LCL +! + call CONVECT_SATMIXRATIO(KLON, ZWORK1, ZTELCL, ZWORK3, ZLV, ZLS, ZCPH) + ZWORK3(:) = MIN(.1, MAX(0., ZWORK3(:))) +! + ! compute theta_e updraft undilute + ZTHEUL(:) = ZTLCL(:) * ZPI(:)**(1.-0.28 * ZRVLCL(:)) & + * EXP((3374.6525 / ZTLCL(:) - 2.5403) & + * ZRVLCL(:) * (1.+0.81 * ZRVLCL(:))) +! + ! compute theta_e saturated environment at LCL + ZTHES1(:) = ZTELCL(:) * ZPI(:)**(1.-0.28 * ZWORK3(:)) & + * EXP((3374.6525 / ZTELCL(:) - 2.5403) & + * ZWORK3(:) * (1.+0.81 * ZWORK3(:))) +! + do JK = MINVAL(ILCL(:)), JKMAX + JKP = JK - 1 + do JI = 1, IIE + ZWORK4(JI) = 1. + if(JK == ILCL(JI)) ZWORK4(JI) = 0. +! + ! compute theta_e saturated environment and adjusted values + ! of theta +! + GWORK3(JI) = JK >= ILCL(JI) .and. JK <= KCTL(JI) .and. GWORK1(JI) +! + ZPI(JI) = (XP00 / PPRES(JI, JK))**ZRDOCP + ZWORK2(JI) = PTHC(JI, JK) / ZPI(JI) + enddo +! + call CONVECT_SATMIXRATIO(KLON, PPRES(:, JK), ZWORK2, ZWORK3, ZLV, ZLS, ZCPH) +! +! + do JI = 1, IIE + if(GWORK3(JI)) then + ZTHES2(JI) = ZWORK2(JI) * ZPI(JI)**(1.-0.28 * ZWORK3(JI)) & + * EXP((3374.6525 / ZWORK2(JI) - 2.5403) & + * ZWORK3(JI) * (1.+0.81 * ZWORK3(JI))) +! + ZWORK3(JI) = PZ(JI, JK) - PZ(JI, JKP) * ZWORK4(JI) - & + (1.-ZWORK4(JI)) * ZZLCL(JI) ! level thickness + ZWORK1(JI) = (2.*ZTHEUL(JI)) / (ZTHES1(JI) + ZTHES2(JI)) - 1. + ZCAPE(JI) = ZCAPE(JI) + XG * ZWORK3(JI) * MAX(0., ZWORK1(JI)) + ZTHES1(JI) = ZTHES2(JI) + endif + enddo + enddo +! +! +!* 13. Determine mass adjustment factor knowing how much +! CAPE has been removed. +! ------------------------------------------------- +! + WHERE(GWORK1(:)) + ZWORK1(:) = MAX(PCAPE(:) - ZCAPE(:), 0.2 * PCAPE(:)) + ZWORK2(:) = ZCAPE(:) / (PCAPE(:) + 1.E-8) +! + GWORK1(:) = ZWORK2(:) > 0.2 .OR. ZCAPE(:) == 0. ! mask for adjustment + ENDWHERE +! + WHERE(ZCAPE(:) == 0. .and. GWORK1(:)) ZADJ(:) = ZADJ(:) * 0.5 + WHERE(ZCAPE(:) /= 0. .and. GWORK1(:)) & + ZADJ(:) = ZADJ(:) * XSTABC * PCAPE(:) / (ZWORK1(:) + 1.E-8) + ZADJ(:) = MIN(ZADJ(:), ZADJMAX(:)) +! +! +!* 13. Adjust mass flux by the factor ZADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + call CONVECT_CLOSURE_ADJUST_SHAL(KLON, KLEV, ZADJ, & + PUMF, ZUMF, PUER, ZUER, PUDR, ZUDR) +! +! + if(COUNT(GWORK1(:)) == 0) EXIT ! exit big adjustment iteration loop + ! when all columns have reached + ! desired degree of stabilization. +! + enddo ! end of big adjustment iteration loop +! +! + ! skip adj. total water array to water vapor + do JK = IKB, IKE + PRWC(:, JK) = MAX(0., PRWC(:, JK) - PRCC(:, JK) - PRIC(:, JK)) + enddo +! +! +ENDsubroutine CONVECT_CLOSURE_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_TRIGGER_SHAL +! ################# +! + INTERFACE +! + subroutine CONVECT_TRIGGER_SHAL(KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, PTKECLS, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG) +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KLEV ! vertical loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area + REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE CLS + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH, PTHV ! theta, theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! envir. satur. theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PW ! vertical velocity +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +! + ENDsubroutine CONVECT_TRIGGER_SHAL +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_TRIGGER_SHAL +! ######################################################################## +subroutine CONVECT_TRIGGER_SHAL(KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, PTKECLS, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG) +! ######################################################################## +! +!!**** Determine convective columns as well as the cloudy values of theta, +!! and qv at the lifting condensation level (LCL) +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine convective columns +!! +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! What we look for is the undermost unstable level at each grid point. +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! maximum height difference between +!! ! the surface and the DPL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XCDEPTH ! minimum necessary cloud depth +!! XCDEPTH_D ! maximum allowed cloud depth +!! XDTPERT ! add small Temp peturbation +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XAW, XBW, XATPERT, XBTPERT +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 20/03/97 Select first departure level +!! that produces a cloud thicker than XCDEPTH +!! F. Bouyssel 05/11/08 Modifications for reproductibility +!! E. Bazile 05/05/09 Modifications for using really W and the tempe. +!! perturbation function of the TKE. +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR_SHAL + USE MODD_CONVPAREXT + USE MODI_CONVECT_SATMIXRATIO +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal loop index + INTEGER, INTENT(IN) :: KLEV ! vertical loop index + REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area + REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE CLS + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTH, PTHV ! theta, theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! envir. satur. theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRV ! vapor mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of grid point (m) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PW ! vertical velocity +! + REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL + REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +! +!* 0.2 Declarations of local variables : +! + INTEGER :: JKK, JK, JKP, JKM, JKDL, JL, JKT, JT! vertical loop index + INTEGER :: JI ! horizontal loop index + INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds + real :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d + real :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON) :: ZTHLCL, ZTLCL, ZRVLCL, & ! locals for PTHLCL,PTLCL + ZWLCL, ZZLCL, ZTHVELCL ! PRVLCL, .... + INTEGER, DIMENSION(KLON) :: IDPL, IPBL, ILCL ! locals for KDPL, ... + REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL + REAL, DIMENSION(KLON) :: ZZDPL ! height of DPL + REAL, DIMENSION(KLON) :: ZTHVLCL ! theta_v at LCL = mixed layer value + REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature + REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure + REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure + REAL, DIMENSION(KLON) :: ZCAPE ! convective available energy (m^2/s^2/g) + REAL, DIMENSION(KLON) :: ZCAP ! pseudo fro CAPE + REAL, DIMENSION(KLON) :: ZTHEUL ! updraft equiv. pot. temperature (K) + REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air + REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer + REAL, DIMENSION(KLON) :: ZTOP, ZTOPP ! estimated cloud top (m) + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays + LOGICAL, DIMENSION(KLON) :: GTRIG, GTRIG2 ! local arrays for OTRIG + LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! + IIE = KLON + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! + ZEPS = XRD / XRV + ZEPSA = XRV / XRD + ZCPORD = XCPD / XRD + ZRDOCP = XRD / XCPD + OTRIG(:) = .false. + IDPL(:) = KDPL(:) + IPBL(:) = KPBL(:) + ILCL(:) = KLCL(:) + PWLCL(:) = 0. + ZWLCL(:) = 0. + PTHLCL(:) = 1. + PTHVELCL(:) = 1. + PTLCL(:) = 1. + PRVLCL(:) = 0. + PWLCL(:) = 0. + PZLCL(:) = PZ(:, IKB) + ZZDPL(:) = PZ(:, IKB) + GTRIG2(:) = .true. +! +! +! +! 1. Determine highest necessary loop test layer +! ------------------------------------------- +! + JT = IKE - 2 +! FBy +!do JK = IKB + 1, IKE - 2 +! if ( PZ(1,JK) - PZ(1,IKB) < 5.E3 ) JT = JK +!end do +! +! +!* 2. Enter loop for convection test +! ------------------------------ +! + JKP = MINVAL(IDPL(:)) + 1 + JKT = JT + JKT = JKP ! do not allow for looping anymore, test only for surface mixed layer + do JKK = JKP, JKT +! + GWORK1(:) = ZZDPL(:) - PZ(:, IKB) < XZLCL + ! we exit the trigger test when the center of the mixed layer is more + ! than 1500 m above soil level. + WHERE(GWORK1(:)) + ZDPTHMIX(:) = 0. + ZPRESMIX(:) = 0. + ZTHLCL(:) = 0. + ZRVLCL(:) = 0. + ZZDPL(:) = PZ(:, JKK) + IDPL(:) = JKK + ENDWHERE +! +! +!* 3. Construct a mixed layer of at least 50 hPa (XZPBL) +! ------------------------------------------ +! + do JK = JKK, IKE - 1 + JKM = JK + 1 + do JI = 1, IIE + if(GWORK1(JI) .and. ZDPTHMIX(JI) < XZPBL) then + IPBL(JI) = JK + ZWORK1(JI) = PPRES(JI, JK) - PPRES(JI, JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI, JK) * ZWORK1(JI) + ZTHLCL(JI) = ZTHLCL(JI) + PTH(JI, JK) * ZWORK1(JI) + ZRVLCL(JI) = ZRVLCL(JI) + PRV(JI, JK) * ZWORK1(JI) + endif + enddo + if(MINVAL(ZDPTHMIX(:)) >= XZPBL) EXIT + enddo +! +! + WHERE(GWORK1(:)) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:) + & + & (XATPERT * MAX(3., PTKECLS(:)) / XCPD + XBTPERT) * XDTPERT ! add small Temp Perturb. + ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:) + ZTHVLCL(:) = ZTHLCL(:) * (1.+ZEPSA * ZRVLCL(:)) & + / (1.+ZRVLCL(:)) +! +!* 4.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! ---------------------------------------------------- +! +! + ZTMIX(:) = ZTHLCL(:) * (ZPRESMIX(:) / XP00)**ZRDOCP + ZEVMIX(:) = ZRVLCL(:) * ZPRESMIX(:) / (ZRVLCL(:) + ZEPS) + ZEVMIX(:) = MAX(1.E-8, ZEVMIX(:)) + ZWORK1(:) = LOG(ZEVMIX(:) / 613.3) + ! dewpoint temperature + ZWORK1(:) = (4780.8 - 32.19 * ZWORK1(:)) / (17.502 - ZWORK1(:)) + ! adiabatic saturation temperature + ZTLCL(:) = ZWORK1(:) - (.212 + 1.571E-3 * (ZWORK1(:) - XTT) & + - 4.36E-4 * (ZTMIX(:) - XTT)) * (ZTMIX(:) - ZWORK1(:)) + ZTLCL(:) = MIN(ZTLCL(:), ZTMIX(:)) + ZPLCL(:) = XP00 * (ZTLCL(:) / ZTHLCL(:))**ZCPORD +! + ENDWHERE +! +! +!* 4.2 Correct ZTLCL in order to be completely consistent +! with MNH saturation formula +! --------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPLCL, ZTLCL, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(GWORK1(:)) + ZWORK2(:) = ZWORK1(:) / ZTLCL(:) * (XBETAW / ZTLCL(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - ZRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + ZTLCL(:) = ZTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + ENDWHERE +! +! +!* 4.3 If ZRVLCL = PRVMIX is oversaturated set humidity +! and temperature to saturation values. +! --------------------------------------------- +! + call CONVECT_SATMIXRATIO(KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH) + WHERE(GWORK1(:) .and. ZRVLCL(:) > ZWORK1(:)) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * (XBETAW / ZTMIX(:) - XGAMW) ! dr_sat/dT + ZWORK2(:) = (ZWORK1(:) - ZRVLCL(:)) / & + (1.+ZLV(:) / ZCPH(:) * ZWORK2(:)) + ZTLCL(:) = ZTMIX(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) + ZRVLCL(:) = ZRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + ZTHLCL(:) = ZTLCL(:) * (XP00 / ZPLCL(:))**ZRDOCP + ZTHVLCL(:) = ZTHLCL(:) * (1.+ZEPSA * ZRVLCL(:)) & + / (1.+ZRVLCL(:)) + ENDWHERE +! +! +!* 5.1 Determine vertical loop index at the LCL and DPL +! -------------------------------------------------- +! + do JK = JKK, IKE - 1 + do JI = 1, IIE + if(ZPLCL(JI) <= PPRES(JI, JK) .and. GWORK1(JI)) ILCL(JI) = JK + 1 + enddo + enddo +! +! +!* 5.2 Estimate height and environm. theta_v at LCL +! -------------------------------------------------- +! + do JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + ZDP(JI) = LOG(ZPLCL(JI) / PPRES(JI, JKM)) / & + LOG(PPRES(JI, JK) / PPRES(JI, JKM)) + ZWORK1(JI) = PTHV(JI, JKM) + (PTHV(JI, JK) - PTHV(JI, JKM)) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels ILCL and ILCL-1. + ZWORK2(JI) = PZ(JI, JKM) + (PZ(JI, JK) - PZ(JI, JKM)) * ZDP(JI) + enddo + WHERE(GWORK1(:)) + ZTHVELCL(:) = ZWORK1(:) + ZZLCL(:) = ZWORK2(:) + ENDWHERE +! +! +!* 6. Check to see if cloud is bouyant +! -------------------------------- +! +!* 6.1 Compute grid scale vertical velocity perturbation term ZWORK1 +! ------------------------------------------------------------- +! +! ! normalize w grid scale to a 25 km refer. grid +! do JI = 1, IIE +! JK = ILCL(JI) +! JKM = JK - 1 +! ZWORK1(JI) = ( PW(JI,JKM) + ( PW(JI,JK) - PW(JI,JKM) ) * ZDP(JI) ) & +! * SQRT( PDXDY(JI) / XA25 ) +! - 0.02 * ZZLCL(JI) / XZLCL ! avoid spurious convection +! end do +! ! compute sign of normalized grid scale w +! ZWORK2(:) = SIGN( 1., ZWORK1(:) ) +! ZWORK1(:) = XWTRIG * ZWORK2(:) * ABS( ZWORK1(:) ) ** 0.333 & +! * ( XP00 / ZPLCL(:) ) ** ZRDOCP +! +!* 6.2 Compute parcel vertical velocity at LCL +! --------------------------------------- +! +! do JI = 1, IIE +! JKDL = IDPL(JI) +! ZWORK3(JI) = XG * ZWORK1(JI) * ( ZZLCL(JI) - PZ(JI,JKDL) ) & +! / ( PTHV(JI,JKDL) + ZTHVELCL(JI) ) +! end do +! WHERE( GWORK1(:) ) +! ZWLCL(:) = 1. + .5 * ZWORK2(:) * SQRT( ABS( ZWORK3(:) ) ) +! GTRIG(:) = ZTHVLCL(:) - ZTHVELCL(:) + ZWORK1(:) > 0. .and. & +! ZWLCL(:) > 0. +! END WHERE + ZWLCL(:) = XAW * MAX(0., PW(:, IKB)) + XBW +! +! +!* 6.3 Look for parcel that produces sufficient cloud depth. +! The cloud top is estimated as the level where the CAPE +! is smaller than a given value (based on vertical velocity eq.) +! -------------------------------------------------------------- +! + ZTHEUL(:) = ZTLCL(:) * (ZTHLCL(:) / ZTLCL(:)) & + **(1.-0.28 * ZRVLCL(:)) & + * EXP((3374.6525 / ZTLCL(:) - 2.5403) * & + ZRVLCL(:) * (1.+0.81 * ZRVLCL(:))) +! + ZCAPE(:) = 0. + ZCAP(:) = 0. + ZTOP(:) = 0. + ZTOPP(:) = 0. + ZWORK3(:) = 0. + JKM = MINVAL(ILCL(:)) + do JL = JKM, JT + JK = JL + 1 + do JI = 1, IIE + ZWORK1(JI) = (2.*ZTHEUL(JI) / & + (PTHES(JI, JK) + PTHES(JI, JL)) - 1.) * (PZ(JI, JK) - PZ(JI, JL)) + if(JL < ILCL(JI)) ZWORK1(JI) = 0. + ZCAPE(JI) = ZCAPE(JI) + XG * MAX(1., ZWORK1(JI)) + ZCAP(JI) = ZCAP(JI) + ZWORK1(JI) + ZWORK2(JI) = XNHGAM * XG * ZCAP(JI) + 1.05 * ZWLCL(JI) * ZWLCL(JI) + ! the factor 1.05 takes entrainment into account + ZWORK2(JI) = SIGN(1., ZWORK2(JI)) + ZWORK3(JI) = ZWORK3(JI) + MIN(0., ZWORK2(JI)) + ZWORK3(JI) = MAX(-1., ZWORK3(JI)) + ! Nota, the factors ZWORK2 and ZWORK3 are only used to avoid + ! if and goto statements, the difficulty is to extract only + ! the level where the criterium is first fullfilled + ZTOPP(JI) = ZTOP(JI) + ZTOP(JI) = PZ(JI, JL)*.5 * (1.+ZWORK2(JI)) * (1.+ZWORK3(JI)) + & + ZTOP(JI)*.5 * (1.-ZWORK2(JI)) + ZTOP(JI) = MAX(ZTOP(JI), ZTOPP(JI)) + ZTOPP(JI) = ZTOP(JI) + enddo + enddo +! +! + ZWORK2(:) = ZTOP(:) - ZZLCL(:) + ! WHERE( ZWORK2(:) .GE. XCDEPTH .and. ZWORK2(:) < XCDEPTH_D .and. GTRIG2(:) & + WHERE(ZWORK2(:) >= XCDEPTH .and. GTRIG2(:) & + .and. ZCAPE(:) > 10.) + GTRIG2(:) = .false. + OTRIG(:) = .true. + ! OTRIG(:) = GTRIG(:) ! we select the first departure level + PTHLCL(:) = ZTHLCL(:) ! that gives sufficient cloud depth + PRVLCL(:) = ZRVLCL(:) + PTLCL(:) = ZTLCL(:) + PWLCL(:) = ZWLCL(:) + PZLCL(:) = ZZLCL(:) + PTHVELCL(:) = ZTHVELCL(:) + KDPL(:) = IDPL(:) + KPBL(:) = IPBL(:) + KLCL(:) = ILCL(:) + ENDWHERE +! + enddo +! +! +ENDsubroutine CONVECT_TRIGGER_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# +MODULE MODI_CONVECT_UPDRAFT_SHAL +! ################# +! + INTERFACE +! + subroutine CONVECT_UPDRAFT_SHAL(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PCAPE, KCTL, KETL) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHV ! grid scale theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! + INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! + ENDsubroutine CONVECT_UPDRAFT_SHAL +! + ENDINTERFACE +! +ENDMODULE MODI_CONVECT_UPDRAFT_SHAL +! ############################################################################### +subroutine CONVECT_UPDRAFT_SHAL(KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PCAPE, KCTL, KETL) +! ############################################################################### +! +!!**** Compute updraft properties from DPL to CTL. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine updraft properties +!! ( mass flux, thermodynamics, precipitation ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_MIXING_FUNCT +!! Routine CONVECT_CONDENS +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV, XCL ! Cp of dry air, water vapor and liquid water +!! XTT ! triple point temperature +!! XLVTT ! vaporisation heat at XTT +!! +!! +!! Module MODD_CONVPAR_SHAL +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! XCDEPTH ! minimum necessary cloud depth +!! XENTR ! entrainment constant +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! begin of freezing interval +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_UPDRAFT) +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 10/12/97 +!! F. Bouyssel 05/11/08 Modifications for reproductibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAR_SHAL + USE MODD_CONVPAREXT + USE MODI_CONVECT_CONDENS + USE MODI_CONVECT_MIXING_FUNCT +! +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHV ! grid scale theta_v + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPRES ! pressure (P) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL + REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) + REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) + LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection + INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL + INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! + INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL + INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(KLON, KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +!* 0.2 Declarations of local variables : +! + INTEGER :: IIE, IKB, IKE ! horizontal and vertical loop bounds + INTEGER :: JI ! horizontal loop index + INTEGER :: JK, JKP, JKM, JK1, JK2 ! vertical loop index + real :: ZEPSA ! R_v / R_d, C_pv / C_pd + real :: ZRDOCP ! C_pd / R_d, R_d / C_pd +! + REAL, DIMENSION(KLON) :: ZUT ! updraft temperature (K) + REAL, DIMENSION(KLON) :: ZUW1, ZUW2 ! square of updraft vert. + ! velocity at levels k and k+1 + REAL, DIMENSION(KLON) :: ZE1, ZE2, ZD1, ZD2 ! fractional entrainm./detrain + ! rates at levels k and k+1 + REAL, DIMENSION(KLON) :: ZMIXF ! critical mixed fraction + REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph + REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. + REAL, DIMENSION(KLON) :: ZURV ! updraft water vapor at level k+1 + REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) + REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent + REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5, & + ZWORK6 ! work arrays + INTEGER, DIMENSION(KLON) :: IWORK ! wok array + LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK2, GWORK4, GWORK5 + ! work arrays + LOGICAL, DIMENSION(KLON, KLEV) :: GWORK6 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! + IKB = 1 + JCVEXB + IKE = KLEV - JCVEXT + IIE = KLON +! +! +!* 1. Initialize updraft properties and local variables +! ------------------------------------------------- +! + ZEPSA = XRV / XRD + ZRDOCP = XRD / XCPD +! + PUMF(:, :) = 0. + PUER(:, :) = 0. + PUDR(:, :) = 0. + PUTHL(:, :) = 0. + PUTHV(:, :) = 0. + PURW(:, :) = 0. + PURC(:, :) = 0. + PURI(:, :) = 0. + ZUW1(:) = PWLCL(:) * PWLCL(:) + ZUW2(:) = 0. + ZE1(:) = 0. + ZD1(:) = 0. + PCAPE(:) = 0. + KCTL(:) = IKB + KETL(:) = KLCL(:) + GWORK2(:) = .true. + ZPI(:) = 1. + ZWORK3(:) = 0. + ZWORK4(:) = 0. + ZWORK5(:) = 0. + ZWORK6(:) = 0. + GWORK1(:) = .false. + GWORK4(:) = .false. +! +! +!* 1.1 Compute undilute updraft theta_e for CAPE computations +! Bolton (1980) formula. +! Define accurate enthalpy for updraft +! ----------------------------------------------------- +! + ZTHEUL(:) = PTLCL(:) * (PTHLCL(:) / PTLCL(:))**(1.-0.28 * PRVLCL(:)) & + * EXP((3374.6525 / PTLCL(:) - 2.5403) * & + PRVLCL(:) * (1.+0.81 * PRVLCL(:))) +! +! + ZWORK1(:) = (XCPD + PRVLCL(:) * XCPV) * PTLCL(:) & + + (1.+PRVLCL(:)) * XG * PZLCL(:) +! +! +!* 2. Set updraft properties between DPL and LCL +! ------------------------------------------ +! + JKP = MAXVAL(KLCL(:)) + JKM = MINVAL(KDPL(:)) + do JK = JKM, JKP + do JI = 1, IIE + if(JK >= KDPL(JI) .and. JK < KLCL(JI)) then + PUMF(JI, JK) = PMFLCL(JI) + PUTHL(JI, JK) = ZWORK1(JI) + PUTHV(JI, JK) = PTHLCL(JI) * (1.+ZEPSA * PRVLCL(JI)) / & + (1.+PRVLCL(JI)) + PURW(JI, JK) = PRVLCL(JI) + endif + enddo + enddo +! +! +!* 3. Enter loop for updraft computations +! ------------------------------------ +! + do JK = IKB + 1, IKE - 1 + ZWORK6(:) = 1. + JKP = JK + 1 +! + GWORK4(:) = JK >= KLCL(:) - 1 + GWORK1(:) = GWORK4(:) .and. GWORK2(:) ! this mask is used to confine + ! updraft computations between the LCL and the CTL +! + WHERE(JK == KLCL(:) - 1) ZWORK6(:) = 0. ! factor that is used in buoyancy + ! computation at first level above LCL +! +! +!* 4. Estimate condensate, L_v L_i, Cph and theta_v at level k+1 +! ---------------------------------------------------------- +! + ZWORK1(:) = PURC(:, JK) + ZWORK2(:) = PURI(:, JK) + call CONVECT_CONDENS(KLON, KICE, PPRES(:, JKP), PUTHL(:, JK), PURW(:, JK), & + ZWORK1, ZWORK2, PZ(:, JKP), GWORK1, ZUT, ZURV, & + PURC(:, JKP), PURI(:, JKP), ZLV, ZLS, ZCPH) +! +! + ZPI(:) = (XP00 / PPRES(:, JKP))**ZRDOCP + WHERE(GWORK1(:)) +! + PUTHV(:, JKP) = ZPI(:) * ZUT(:) * (1.+ZEPSA * ZURV(:)) & + / (1.+PURW(:, JK)) +! +! +!* 5. Compute square of vertical velocity using entrainment +! at level k +! ----------------------------------------------------- +! + ZWORK3(:) = PZ(:, JKP) - PZ(:, JK) * ZWORK6(:) - & + (1.-ZWORK6(:)) * PZLCL(:) ! level thickness + ZWORK4(:) = PTHV(:, JK) * ZWORK6(:) + & + (1.-ZWORK6(:)) * PTHVELCL(:) + ZWORK5(:) = 2.*ZUW1(:) * PUER(:, JK) / MAX(.1, PUMF(:, JK)) + ZUW2(:) = ZUW1(:) + ZWORK3(:) * XNHGAM * XG * & + ((PUTHV(:, JK) + PUTHV(:, JKP)) / & + (ZWORK4(:) + PTHV(:, JKP)) - 1.) & ! buoyancy term + - ZWORK5(:) ! entrainment term +! +! +!* 6. Update total precipitation: dr_r=(r_c+r_i)*exp(-rate*dz) +! -------------------------------------------------------- +! +! compute level mean vertical velocity + ZWORK2(:) = 0.5 * & + (SQRT(MAX(1.E-2, ZUW2(:))) + & + SQRT(MAX(1.E-2, ZUW1(:)))) +! +! +!* 7. Update r_c, r_i, enthalpy, r_w for precipitation +! ------------------------------------------------------- +! + PURW(:, JKP) = PURW(:, JK) + PURC(:, JKP) = PURC(:, JKP) + PURI(:, JKP) = PURI(:, JKP) + PUTHL(:, JKP) = PUTHL(:, JK) +! + ZUW1(:) = ZUW2(:) +! + ENDWHERE +! +! +!* 8. Compute entrainment and detrainment using conservative +! variables adjusted for precipitation ( not for entrainment) +! ----------------------------------------------------------- +! +!* 8.1 Compute critical mixed fraction by estimating unknown +! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix +! We determine the zero crossing of the linear curve +! evaluating the derivative using ZMIXF=0.1. +! ----------------------------------------------------- +! + ZMIXF(:) = 0.1 ! starting value for critical mixed fraction + ZWORK1(:) = ZMIXF(:) * PTHL(:, JKP) & + + (1.-ZMIXF(:)) * PUTHL(:, JKP) ! mixed enthalpy + ZWORK2(:) = ZMIXF(:) * PRW(:, JKP) & + + (1.-ZMIXF(:)) * PURW(:, JKP) ! mixed r_w +! + call CONVECT_CONDENS(KLON, KICE, PPRES(:, JKP), ZWORK1, ZWORK2, & + PURC(:, JKP), PURI(:, JKP), PZ(:, JKP), GWORK1, ZUT, & + ZWORK3, ZWORK4, ZWORK5, ZLV, ZLS, ZCPH) +! put in enthalpy and r_w and get T r_c, r_i (ZUT, ZWORK4-5) +! + ! compute theta_v of mixture + ZWORK3(:) = ZUT(:) * ZPI(:) * (1.+ZEPSA * ( & + ZWORK2(:) - ZWORK4(:) - ZWORK5(:))) / (1.+ZWORK2(:)) + ! compute final value of critical mixed fraction using theta_v + ! of mixture, grid-scale and updraft + ZMIXF(:) = MAX(0., PUTHV(:, JKP) - PTHV(:, JKP)) * ZMIXF(:) / & + (PUTHV(:, JKP) - ZWORK3(:) + 1.E-10) + ZMIXF(:) = MAX(0., MIN(1., ZMIXF(:))) +! +! +!* 8.2 Compute final midlevel values for entr. and detrainment +! after call of distribution function +! ------------------------------------------------------- +! +! + call CONVECT_MIXING_FUNCT(KLON, ZMIXF, 1, ZE2, ZD2) +! Note: routine MIXING_FUNCT returns fractional entrainm/detrainm. rates +! + ZE2 = MIN(ZD2, MAX(.3, ZE2)) +! +! ZWORK1(:) = XENTR * PMFLCL(:) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + zwork1(:) = xentr * xg / xcrad * pumf(:, jk) * (pz(:, jkp) - pz(:, jk)) +! ZWORK1(:) = XENTR * pumf(:,jk) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + ZWORK2(:) = 0. + WHERE(GWORK1(:)) ZWORK2(:) = 1. + WHERE(PUTHV(:, JKP) > PTHV(:, JKP)) + PUER(:, JKP) = 0.5 * ZWORK1(:) * (ZE1(:) + ZE2(:)) * ZWORK2(:) + PUDR(:, JKP) = 0.5 * ZWORK1(:) * (ZD1(:) + ZD2(:)) * ZWORK2(:) + elseWHERE + PUER(:, JKP) = 0. + PUDR(:, JKP) = ZWORK1(:) * ZWORK2(:) + ENDWHERE +! +!* 8.3 Determine equilibrium temperature level +! -------------------------------------- +! + WHERE(PUTHV(:, JKP) > PTHV(:, JKP) .and. JK > KLCL(:) + 1 & + .and. GWORK1(:)) + KETL(:) = JKP ! equilibrium temperature level + ENDWHERE +! +!* 8.4 If the calculated detrained mass flux is greater than +! the total updraft mass flux, or vertical velocity is +! negative, all cloud mass detrains at previous model level, +! exit updraft calculations - CTL is attained +! ------------------------------------------------------- +! + WHERE(GWORK1(:)) & + GWORK2(:) = PUMF(:, JK) - PUDR(:, JKP) > 10. .and. ZUW2(:) > 0. + WHERE(GWORK2(:)) KCTL(:) = JKP ! cloud top level + GWORK1(:) = GWORK2(:) .and. GWORK4(:) +! + if(COUNT(GWORK2(:)) == 0) EXIT +! +! +!* 9. Compute CAPE for undilute ascent using theta_e and +! theta_es instead of theta_v. This estimation produces +! a significantly larger value for CAPE than the actual one. +! ---------------------------------------------------------- +! + WHERE(GWORK1(:)) +! + ZWORK3(:) = PZ(:, JKP) - PZ(:, JK) * ZWORK6(:) - & + (1.-ZWORK6(:)) * PZLCL(:) ! level thickness + ZWORK2(:) = PTHES(:, JK) + (1.-ZWORK6(:)) * & + (PTHES(:, JKP) - PTHES(:, JK)) / (PZ(:, JKP) - PZ(:, JK)) * & + (PZLCL(:) - PZ(:, JK)) ! linear interpolation for theta_es at LCL + ! ( this is only done for model level just above LCL +! + ZWORK1(:) = (2.*ZTHEUL(:)) / (ZWORK2(:) + PTHES(:, JKP)) - 1. + PCAPE(:) = PCAPE(:) + XG * ZWORK3(:) * MAX(0., ZWORK1(:)) +! +! +!* 10. Compute final values of updraft mass flux, enthalpy, r_w +! at level k+1 +! -------------------------------------------------------- +! + PUMF(:, JKP) = PUMF(:, JK) - PUDR(:, JKP) + PUER(:, JKP) + PUMF(:, JKP) = MAX(PUMF(:, JKP), 0.1) + PUTHL(:, JKP) = (PUMF(:, JK) * PUTHL(:, JK) + & + PUER(:, JKP) * PTHL(:, JK) - PUDR(:, JKP) * PUTHL(:, JK)) & + / PUMF(:, JKP) + PURW(:, JKP) = (PUMF(:, JK) * PURW(:, JK) + & + PUER(:, JKP) * PRW(:, JK) - PUDR(:, JKP) * PURW(:, JK)) & + / PUMF(:, JKP) +! +! + ZE1(:) = ZE2(:) ! update fractional entrainment/detrainment + ZD1(:) = ZD2(:) +! + ENDWHERE +! + enddo +! +!* 12.1 Set OTRIG to False if cloud thickness < 0.5km +! or > 3km (deep convection) or CAPE < 1 +! ------------------------------------------------ +! + do JI = 1, IIE + JK = KCTL(JI) + ZWORK1(JI) = PZ(JI, JK) - PZLCL(JI) + OTRIG(JI) = ZWORK1(JI) >= XCDEPTH .and. ZWORK1(JI) < XCDEPTH_D & + .and. PCAPE(JI) > 1. + enddo + WHERE(.not. OTRIG(:)) + KCTL(:) = IKB + ENDWHERE + KETL(:) = MAX(KETL(:), KLCL(:) + 2) + KETL(:) = MIN(KETL(:), KCTL(:)) +! +! +!* 12.2 If the ETL and CTL are the same detrain updraft mass +! flux at this level +! ------------------------------------------------------- +! + ZWORK1(:) = 0. + WHERE(KETL(:) == KCTL(:)) ZWORK1(:) = 1. +! + do JI = 1, IIE + JK = KETL(JI) + PUDR(JI, JK) = PUDR(JI, JK) + & + (PUMF(JI, JK) - PUER(JI, JK)) * ZWORK1(JI) + PUER(JI, JK) = PUER(JI, JK) * (1.-ZWORK1(JI)) + PUMF(JI, JK) = PUMF(JI, JK) * (1.-ZWORK1(JI)) + JKP = KCTL(JI) + 1 + PUER(JI, JKP) = 0. ! entrainm/detr rates have been already computed + PUDR(JI, JKP) = 0. ! at level KCTL+1, set them to zero + PURW(JI, JKP) = 0. + PURC(JI, JKP) = 0. + PURI(JI, JKP) = 0. + PUTHL(JI, JKP) = 0. + PURC(JI, JKP + 1) = 0. + PURI(JI, JKP + 1) = 0. + enddo +! +!* 12.3 Adjust mass flux profiles, detrainment rates, and +! precipitation fallout rates to reflect linear decrease +! in mass flux between the ETL and CTL +! ------------------------------------------------------- +! + ZWORK1(:) = 0. + JK1 = MINVAL(KETL(:)) + JK2 = MAXVAL(KCTL(:)) + + do JK = JK1, JK2 + do JI = 1, IIE + if(JK > KETL(JI) .and. JK <= KCTL(JI)) then + ZWORK1(JI) = ZWORK1(JI) + PDPRES(JI, JK) + endif + enddo + enddo +! + do JI = 1, IIE + JK = KETL(JI) + ZWORK1(JI) = PUMF(JI, JK) / MAX(1., ZWORK1(JI)) + enddo +! + do JK = JK1 + 1, JK2 + JKP = JK - 1 + do JI = 1, IIE + if(JK > KETL(JI) .and. JK <= KCTL(JI)) then + PUDR(JI, JK) = PDPRES(JI, JK) * ZWORK1(JI) + PUMF(JI, JK) = PUMF(JI, JKP) - PUDR(JI, JK) + endif + enddo + enddo +! +! 12.4 Set mass flux and entrainment in the source layer. +! Linear increase throughout the source layer. +! ------------------------------------------------------- +! +!IWORK(:) = MIN( KPBL(:), KLCL(:) - 1 ) + IWORK(:) = KPBL(:) + do JI = 1, IIE + JK = KDPL(JI) + JKP = IWORK(JI) +! mixed layer depth + ZWORK2(JI) = PPRES(JI, JK) - PPRES(JI, JKP) + PDPRES(JI, JK) + enddo +! + JKP = MAXVAL(IWORK(:)) + do JK = JKM, JKP + do JI = 1, IIE + if(JK >= KDPL(JI) .and. JK <= IWORK(JI)) then + PUER(JI, JK) = PUER(JI, JK) + PMFLCL(JI) * PDPRES(JI, JK) / (ZWORK2(JI) + 0.1) + PUMF(JI, JK) = PUMF(JI, JK - 1) + PUER(JI, JK) + endif + enddo + enddo +! +! +!* 13. If cloud thickness is smaller than .5 km or > 3 km +! no shallow convection is allowed +! Nota: For technical reasons, we stop the convection +! computations in this case and do not go back to +! TRIGGER_FUNCT to look for the next unstable LCL +! which could produce a thicker cloud. +! --------------------------------------------------- +! + GWORK6(:, :) = SPREAD(OTRIG(:), DIM=2, NCOPIES=KLEV) + WHERE(.not. GWORK6(:, :)) + PUMF(:, :) = 0. + PUDR(:, :) = 0. + PUER(:, :) = 0. + PUTHL(:, :) = PTHL(:, :) + PURW(:, :) = PRW(:, :) + PURC(:, :) = 0. + PURI(:, :) = 0. + ENDWHERE +! +ENDsubroutine CONVECT_UPDRAFT_SHAL + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ###################### +MODULE MODI_SHALLOW_CONVECTION +! ###################### +! + INTERFACE +! + subroutine SHALLOW_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OSETTADJ, PTADJS, & + PPABST, PZZ, PTKECLS, & + PTT, PRVT, PRCT, PRIT, PWT, & + PTTEN, PRVTEN, PRCTEN, PRITEN, & + KCLTOP, KCLBAS, PUMF, & + OCH1CONV, KCH1, PCH1, PCH1TEN) +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x + INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x + INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 + INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 + REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user + REAL, INTENT(IN) :: PTADJS ! user defined adjustment time + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTT ! grid scale temperature at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRCT ! grid scale r_c " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRIT ! grid scale r_i " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE in the CLS (m2/s2) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +! + LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport + INTEGER, INTENT(IN) :: KCH1 ! number of species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(IN) :: PCH1! grid scale chemical species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +! + ENDsubroutine SHALLOW_CONVECTION +! + ENDINTERFACE +! +ENDMODULE MODI_SHALLOW_CONVECTION +! ############################################################################### +subroutine SHALLOW_CONVECTION(KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OSETTADJ, PTADJS, & + PPABST, PZZ, PTKECLS, & + PTT, PRVT, PRCT, PRIT, PWT, & + PTTEN, PRVTEN, PRCTEN, PRITEN, & + KCLTOP, KCLBAS, PUMF, & + OCH1CONV, KCH1, PCH1, PCH1TEN) +! ############################################################################### +! +!!**** Monitor routine to compute all convective tendencies by calls +!! of several subroutines. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! tendencies. The routine first prepares all necessary grid-scale +!! variables. The final convective tendencies are then computed by +!! calls of different subroutines. +!! +!! +!!** METHOD +!! ------ +!! We start by selecting convective columns in the model domain through +!! the call of routine TRIGGER_FUNCT. Then, we allocate memory for the +!! convection updraft and downdraft variables and gather the grid scale +!! variables in convective arrays. +!! The updraft and downdraft computations are done level by level starting +!! at the bottom and top of the domain, respectively. +!! All computations are done on MNH thermodynamic levels. The depth +!! of the current model layer k is defined by DP(k)=P(k-1)-P(k) +!! +!! +!! +!! EXTERNAL +!! -------- +!! CONVECT_TRIGGER_SHAL +!! CONVECT_SATMIXRATIO +!! CONVECT_UPDRAFT_SHAL +!! CONVECT_CONDENS +!! CONVECT_MIXING_FUNCT +!! CONVECT_CLOSURE_SHAL +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST_SHAL +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! number Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XRHOLW ! density of liquid water +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! XCL, XCI ! specific heat for liquid water and ice +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! +!! +!! REFERENCE +!! --------- +!! +!! Bechtold, 1997 : Meso-NH scientific documentation (31 pp) +!! Fritsch and Chappell, 1980, J. Atmos. Sci., Vol. 37, 1722-1761. +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. 47, 2784-2801. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. 24, 165-170. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 15/11/96 replace theta_il by enthalpy +!! " 10/12/98 changes for ARPEGE +!! " 01/01/02 Apply conservation correction +!! F Bouyssel 05/11/08 Modifications for reproductibility +!! E. Bazile 20/07/09 Input of TKECLS. +!! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! + USE MODD_CST + USE MODD_CONVPAREXT + USE MODD_CONVPAR_SHAL +!USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND +! + USE MODI_CONVECT_TRIGGER_SHAL + USE MODI_CONVECT_UPDRAFT_SHAL + USE MODI_CONVECT_CLOSURE_SHAL +!USE MODI_CONVECT_CHEM_TRANSPORT +! +!SeBi #ifdef MNH_PGI +!SeBi USE MODE_PACK_PGI +!SeBi #endif +! + implicit none +! +!* 0.1 Declarations of dummy arguments : +! +! + INTEGER, INTENT(IN) :: KLON ! horizontal dimension + INTEGER, INTENT(IN) :: KLEV ! vertical dimension + INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x + INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x + INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 + INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 + REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme + INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) + LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user + REAL, INTENT(IN) :: PTADJS ! user defined adjustment time + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PTT ! grid scale temperature at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRCT ! grid scale r_c " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PRIT ! grid scale r_i " + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t + REAL, DIMENSION(KLON, KLEV), INTENT(IN) :: PZZ ! height of model layer (m) + REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE in the CLS (m2/s2) +! + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level + INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection + REAL, DIMENSION(KLON, KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +! + LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport + INTEGER, INTENT(IN) :: KCH1 ! number of species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(IN) :: PCH1! grid scale chemical species + REAL, DIMENSION(KLON, KLEV, KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +! +! +!* 0.2 Declarations of local fixed memory variables : +! + INTEGER :: ITEST, ICONV ! number of convective columns + INTEGER :: IIB, IIE ! horizontal loop bounds + INTEGER :: IKB, IKE ! vertical loop bounds + INTEGER :: IKS ! vertical dimension + INTEGER :: JI, JL ! horizontal loop index + INTEGER :: JN ! number of tracers + INTEGER :: JK, JKM, JKP ! vertical loop index + INTEGER :: IFTSTEPS ! only used for chemical tracers + real :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d + real :: ZRDOCP ! R_d/C_p +! + LOGICAL, DIMENSION(KLON, KLEV) :: GTRIG3 ! 3D logical mask for convection + LOGICAL, DIMENSION(KLON) :: GTRIG ! 2D logical mask for trigger test + REAL, DIMENSION(KLON, KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, theta_v + REAL, DIMENSION(KLON) :: ZWORK2, ZWORK2B ! work array + real :: ZW1 ! work variable +! +! +!* 0.2 Declarations of local allocatable variables : +! + INTEGER, DIMENSION(:), ALLOCATABLE :: IDPL ! index for parcel departure level + INTEGER, DIMENSION(:), ALLOCATABLE :: IPBL ! index for source layer top + INTEGER, DIMENSION(:), ALLOCATABLE :: ILCL ! index for lifting condensation level + INTEGER, DIMENSION(:), ALLOCATABLE :: IETL ! index for zero buoyancy level + INTEGER, DIMENSION(:), ALLOCATABLE :: ICTL ! index for cloud top level + INTEGER, DIMENSION(:), ALLOCATABLE :: ILFS ! index for level of free sink +! + INTEGER, DIMENSION(:), ALLOCATABLE :: ISDPL ! index for parcel departure level + INTEGER, DIMENSION(:), ALLOCATABLE :: ISPBL ! index for source layer top + INTEGER, DIMENSION(:), ALLOCATABLE :: ISLCL ! index for lifting condensation level + REAL, DIMENSION(:), ALLOCATABLE :: ZSTHLCL ! updraft theta at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSTLCL ! updraft temp. at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSRVLCL ! updraft rv at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSWLCL ! updraft w at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSZLCL ! LCL height + REAL, DIMENSION(:), ALLOCATABLE :: ZSTHVELCL! envir. theta_v at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZSDXDY ! grid area (m^2) +! +! grid scale variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZZ ! height of model layer (m) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZPRES ! grid scale pressure + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDPRES ! pressure difference between + ! bottom and top of layer (Pa) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZW ! grid scale vertical velocity on theta grid + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTT ! temperature + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTH ! grid scale theta + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHV ! grid scale theta_v + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHL ! grid scale enthalpy (J/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHES, ZTHEST ! grid scale saturated theta_e + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRW ! grid scale total water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRV ! grid scale water vapor (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRC ! grid scale cloud water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRI ! grid scale cloud ice (kg/kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZDXDY ! grid area (m^2) +! +! updraft variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUMF ! updraft mass flux (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUER ! updraft entrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUDR ! updraft detrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUTHL ! updraft enthalpy (J/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZUTHV ! updraft theta_v (K) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURW ! updraft total water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURC ! updraft cloud water (kg/kg) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZURI ! updraft cloud ice (kg/kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZMFLCL ! cloud base unit mass flux(kg/s) + REAL, DIMENSION(:), ALLOCATABLE :: ZCAPE ! available potent. energy + REAL, DIMENSION(:), ALLOCATABLE :: ZTHLCL ! updraft theta at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZTLCL ! updraft temp. at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZRVLCL ! updraft rv at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZWLCL ! updraft w at LCL + REAL, DIMENSION(:), ALLOCATABLE :: ZZLCL ! LCL height + REAL, DIMENSION(:), ALLOCATABLE :: ZTHVELCL! envir. theta_v at LCL +! +! downdraft variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDMF ! downdraft mass flux (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDER ! downdraft entrainment (kg/s) + REAL, DIMENSION(:, :), ALLOCATABLE :: ZDDR ! downdraft detrainment (kg/s) +! +! closure variables + REAL, DIMENSION(:, :), ALLOCATABLE :: ZLMASS ! mass of model layer (kg) + REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEC ! advective time period +! + REAL, DIMENSION(:, :), ALLOCATABLE :: ZTHC ! conv. adj. grid scale theta + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRVC ! conv. adj. grid scale r_w + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c + REAL, DIMENSION(:, :), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i + REAL, DIMENSION(:, :), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s) +! + LOGICAL, DIMENSION(:), ALLOCATABLE :: GTRIG1 ! logical mask for convection + LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK ! logical work array + INTEGER, DIMENSION(:), ALLOCATABLE :: IINDEX, IJINDEX, IJSINDEX, IJPINDEX!hor.index + REAL, DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph + REAL, DIMENSION(:), ALLOCATABLE :: ZLV, ZLS! latent heat of vaporis., sublim. + real :: ZES ! saturation vapor mixng ratio +! +! Chemical Tracers: + REAL, DIMENSION(:, :, :), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg) + REAL, DIMENSION(:, :, :), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1 + REAL, DIMENSION(:, :), ALLOCATABLE:: ZWORK3 ! conv. adjust. chemical specy 1 + LOGICAL, DIMENSION(:, :, :), ALLOCATABLE::GTRIG4 ! logical mask +! +!------------------------------------------------------------------------------- +! +! +!* 0.3 Compute loop bounds +! ------------------- +! + IIB = KIDIA + IIE = KFDIA + JCVEXB = MAX(0, KBDIA - 1) + IKB = 1 + JCVEXB + IKS = KLEV + JCVEXT = MAX(0, KTDIA - 1) + IKE = IKS - JCVEXT +! +! +!* 0.5 Update convective counter ( where KCOUNT > 0 +! convection is still active ). +! --------------------------------------------- +! + GTRIG(:) = .false. + GTRIG(IIB:IIE) = .true. + ITEST = COUNT(GTRIG(:)) + if(ITEST == 0) then + RETURN + endif + +! +! +!* 0.7 Reset convective tendencies to zero if convective +! counter becomes negative +! ------------------------------------------------- +! + GTRIG3(:, :) = SPREAD(GTRIG(:), DIM=2, NCOPIES=IKS) + WHERE(GTRIG3(:, :)) + PTTEN(:, :) = 0. + PRVTEN(:, :) = 0. + PRCTEN(:, :) = 0. + PRITEN(:, :) = 0. +! PUTEN(:,:) = 0. +! PVTEN(:,:) = 0. + PUMF(:, :) = 0. + ENDWHERE + WHERE(GTRIG(:)) + KCLTOP(:) = 0 + KCLBAS(:) = 0 + ENDWHERE + if(OCH1CONV) then + ALLOCATE(GTRIG4(KLON, KLEV, KCH1)) + GTRIG4(:, :, :) = SPREAD(GTRIG3(:, :), DIM=3, NCOPIES=KCH1) + WHERE(GTRIG4(:, :, :)) PCH1TEN(:, :, :) = 0. + DEALLOCATE(GTRIG4) + endif +! +! +!* 1. Initialize local variables +! ---------------------------- +! + ZEPS = XRD / XRV + ZEPSA = XRV / XRD + ZRDOCP = XRD / XCPD +! +!------------------------------------------------------------------------------- +! +!* 1.1 Set up grid scale theta, theta_v, theta_es +! ------------------------------------------ +! + ZTHT(:, :) = 300. + ZSTHV(:, :) = 300. + ZSTHES(:, :) = 400. + do JK = IKB, IKE + do JI = IIB, IIE + if(PPABST(JI, JK) > 40.E2) then + ZTHT(JI, JK) = PTT(JI, JK) * (XP00 / PPABST(JI, JK))**ZRDOCP + ZSTHV(JI, JK) = ZTHT(JI, JK) * (1.+ZEPSA * PRVT(JI, JK)) / & + (1.+PRVT(JI, JK) + PRCT(JI, JK) + PRIT(JI, JK)) +! + ! use conservative Bolton (1980) formula for theta_e + ! it is used to compute CAPE for undilute parcel ascent + ! For economical reasons we do not use routine CONVECT_SATMIXRATIO here +! + ZES = EXP(XALPW - XBETAW / PTT(JI, JK) - XGAMW * LOG(PTT(JI, JK))) + ZES = MIN(1., ZEPS * ZES / (PPABST(JI, JK) - ZES)) + ZSTHES(JI, JK) = PTT(JI, JK) * (ZTHT(JI, JK) / PTT(JI, JK))** & + (1.-0.28 * ZES) * EXP((3374.6525 / PTT(JI, JK) - 2.5403) & + * ZES * (1.+0.81 * ZES)) + endif + enddo + enddo +! +!------------------------------------------------------------------------------- +! +!* 2. Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +!* 2.1 Allocate arrays depending on number of model columns that need +! to be tested for convection (i.e. where no convection is present +! at the moment. +! -------------------------------------------------------------- +! + ALLOCATE(ZPRES(ITEST, IKS)) + ALLOCATE(ZZ(ITEST, IKS)) + ALLOCATE(ZW(ITEST, IKS)) + ALLOCATE(ZTH(ITEST, IKS)) + ALLOCATE(ZTHV(ITEST, IKS)) + ALLOCATE(ZTHEST(ITEST, IKS)) + ALLOCATE(ZRV(ITEST, IKS)) + ALLOCATE(ZSTHLCL(ITEST)) + ALLOCATE(ZSTLCL(ITEST)) + ALLOCATE(ZSRVLCL(ITEST)) + ALLOCATE(ZSWLCL(ITEST)) + ALLOCATE(ZSZLCL(ITEST)) + ALLOCATE(ZSTHVELCL(ITEST)) + ALLOCATE(ISDPL(ITEST)) + ALLOCATE(ISPBL(ITEST)) + ALLOCATE(ISLCL(ITEST)) + ALLOCATE(ZSDXDY(ITEST)) + ALLOCATE(GTRIG1(ITEST)) + ALLOCATE(IINDEX(KLON)) + ALLOCATE(IJSINDEX(ITEST)) + do JI = 1, KLON + IINDEX(JI) = JI + enddo + IJSINDEX(:) = PACK(IINDEX(:), MASK=GTRIG(:)) +! + do JK = IKB, IKE + do JI = 1, ITEST + JL = IJSINDEX(JI) + ZPRES(JI, JK) = PPABST(JL, JK) + ZZ(JI, JK) = PZZ(JL, JK) + ZTH(JI, JK) = ZTHT(JL, JK) + ZTHV(JI, JK) = ZSTHV(JL, JK) + ZTHEST(JI, JK) = ZSTHES(JL, JK) + ZRV(JI, JK) = MAX(0., PRVT(JL, JK)) + ZW(JI, JK) = PWT(JL, JK) + enddo + enddo + do JI = 1, ITEST + JL = IJSINDEX(JI) + ZSDXDY(JI) = XA25 + enddo +! +!* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c +! and envir. saturation theta_e +! ------------------------------------------------------------ +! +! +!* 2.3 Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! + ISLCL(:) = MAX(IKB, 2) ! initialize DPL PBL and LCL + ISDPL(:) = IKB + ISPBL(:) = IKB +! + call CONVECT_TRIGGER_SHAL(ITEST, KLEV, & + ZPRES, ZTH, ZTHV, ZTHEST, & + ZRV, ZW, ZZ, ZSDXDY, PTKECLS, & + ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, & + ZSTHVELCL, ISLCL, ISDPL, ISPBL, GTRIG1) +! + DEALLOCATE(ZPRES) + DEALLOCATE(ZZ) + DEALLOCATE(ZTH) + DEALLOCATE(ZTHV) + DEALLOCATE(ZTHEST) + DEALLOCATE(ZRV) + DEALLOCATE(ZW) +! +!------------------------------------------------------------------------------- +! +!* 3. After the call of TRIGGER_FUNCT we allocate all the dynamic +! arrays used in the convection scheme using the mask GTRIG, i.e. +! we do calculus only in convective columns. This corresponds to +! a GATHER operation. +! -------------------------------------------------------------- +! + ICONV = COUNT(GTRIG1(:)) + if(ICONV == 0) then + DEALLOCATE(ZSTHLCL) + DEALLOCATE(ZSTLCL) + DEALLOCATE(ZSRVLCL) + DEALLOCATE(ZSWLCL) + DEALLOCATE(ZSZLCL) + DEALLOCATE(ZSTHVELCL) + DEALLOCATE(ZSDXDY) + DEALLOCATE(ISLCL) + DEALLOCATE(ISDPL) + DEALLOCATE(ISPBL) + DEALLOCATE(GTRIG1) + DEALLOCATE(IINDEX) + DEALLOCATE(IJSINDEX) + RETURN ! no convective column has been found, exit DEEP_CONVECTION + endif +! + ! vertical index variables +! + ALLOCATE(IDPL(ICONV)) + ALLOCATE(IPBL(ICONV)) + ALLOCATE(ILCL(ICONV)) + ALLOCATE(ICTL(ICONV)) + ALLOCATE(IETL(ICONV)) +! + ! grid scale variables +! + ALLOCATE(ZZ(ICONV, IKS)); ZZ = 0.0 + ALLOCATE(ZPRES(ICONV, IKS)); ZPRES = 0.0 + ALLOCATE(ZDPRES(ICONV, IKS)); ZDPRES = 0.0 + ALLOCATE(ZTT(ICONV, IKS)); ZTT = 0.0 + ALLOCATE(ZTH(ICONV, IKS)); ZTH = 0.0 + ALLOCATE(ZTHV(ICONV, IKS)); ZTHV = 0.0 + ALLOCATE(ZTHL(ICONV, IKS)); ZTHL = 0.0 + ALLOCATE(ZTHES(ICONV, IKS)); ZTHES = 0.0 + ALLOCATE(ZRV(ICONV, IKS)); ZRV = 0.0 + ALLOCATE(ZRC(ICONV, IKS)); ZRC = 0.0 + ALLOCATE(ZRI(ICONV, IKS)); ZRI = 0.0 + ALLOCATE(ZRW(ICONV, IKS)); ZRW = 0.0 + ALLOCATE(ZDXDY(ICONV)); ZDXDY = 0.0 +! + ! updraft variables +! + ALLOCATE(ZUMF(ICONV, IKS)) + ALLOCATE(ZUER(ICONV, IKS)) + ALLOCATE(ZUDR(ICONV, IKS)) + ALLOCATE(ZUTHL(ICONV, IKS)) + ALLOCATE(ZUTHV(ICONV, IKS)) + ALLOCATE(ZURW(ICONV, IKS)) + ALLOCATE(ZURC(ICONV, IKS)) + ALLOCATE(ZURI(ICONV, IKS)) + ALLOCATE(ZTHLCL(ICONV)) + ALLOCATE(ZTLCL(ICONV)) + ALLOCATE(ZRVLCL(ICONV)) + ALLOCATE(ZWLCL(ICONV)) + ALLOCATE(ZMFLCL(ICONV)) + ALLOCATE(ZZLCL(ICONV)) + ALLOCATE(ZTHVELCL(ICONV)) + ALLOCATE(ZCAPE(ICONV)) +! + ! work variables +! + ALLOCATE(IJINDEX(ICONV)) + ALLOCATE(IJPINDEX(ICONV)) + ALLOCATE(ZCPH(ICONV)) + ALLOCATE(ZLV(ICONV)) + ALLOCATE(ZLS(ICONV)) +! +! +!* 3.1 Gather grid scale and updraft base variables in +! arrays using mask GTRIG +! --------------------------------------------------- +! + GTRIG(:) = UNPACK(GTRIG1(:), MASK=GTRIG, FIELD=.false.) + IJINDEX(:) = PACK(IINDEX(:), MASK=GTRIG(:)) +! + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + ZZ(JI, JK) = PZZ(JL, JK) + ZPRES(JI, JK) = PPABST(JL, JK) + ZTT(JI, JK) = PTT(JL, JK) + ZTH(JI, JK) = ZTHT(JL, JK) + ZTHES(JI, JK) = ZSTHES(JL, JK) + ZRV(JI, JK) = MAX(0., PRVT(JL, JK)) + ZRC(JI, JK) = MAX(0., PRCT(JL, JK)) + ZRI(JI, JK) = MAX(0., PRIT(JL, JK)) + ZTHV(JI, JK) = ZSTHV(JL, JK) + enddo + enddo +! + do JI = 1, ITEST + IJSINDEX(JI) = JI + enddo + IJPINDEX(:) = PACK(IJSINDEX(:), MASK=GTRIG1(:)) + do JI = 1, ICONV + JL = IJPINDEX(JI) + IDPL(JI) = ISDPL(JL) + IPBL(JI) = ISPBL(JL) + ILCL(JI) = ISLCL(JL) + ZTHLCL(JI) = ZSTHLCL(JL) + ZTLCL(JI) = ZSTLCL(JL) + ZRVLCL(JI) = ZSRVLCL(JL) + ZWLCL(JI) = ZSWLCL(JL) + ZZLCL(JI) = ZSZLCL(JL) + ZTHVELCL(JI) = ZSTHVELCL(JL) + ZDXDY(JI) = ZSDXDY(JL) + enddo + ALLOCATE(GWORK(ICONV)) + GWORK(:) = PACK(GTRIG1(:), MASK=GTRIG1(:)) + DEALLOCATE(GTRIG1) + ALLOCATE(GTRIG1(ICONV)) + GTRIG1(:) = GWORK(:) +! + DEALLOCATE(GWORK) + DEALLOCATE(IJPINDEX) + DEALLOCATE(ISDPL) + DEALLOCATE(ISPBL) + DEALLOCATE(ISLCL) + DEALLOCATE(ZSTHLCL) + DEALLOCATE(ZSTLCL) + DEALLOCATE(ZSRVLCL) + DEALLOCATE(ZSWLCL) + DEALLOCATE(ZSZLCL) + DEALLOCATE(ZSTHVELCL) + DEALLOCATE(ZSDXDY) +! +! +!* 3.2 Compute pressure difference +! --------------------------------------------------- +! + ZDPRES(:, IKB) = 0. + do JK = IKB + 1, IKE + ZDPRES(:, JK) = ZPRES(:, JK - 1) - ZPRES(:, JK) + enddo +! +!* 3.3 Compute environm. enthalpy and total water = r_v + r_i + r_c +! ---------------------------------------------------------- +! + do JK = IKB, IKE, 1 + ZRW(:, JK) = ZRV(:, JK) + ZRC(:, JK) + ZRI(:, JK) + ZCPH(:) = XCPD + XCPV * ZRW(:, JK) + ZLV(:) = XLVTT + (XCPV - XCL) * (ZTT(:, JK) - XTT) ! compute L_v + ZLS(:) = XLSTT + (XCPV - XCI) * (ZTT(:, JK) - XTT) ! compute L_i + ZTHL(:, JK) = ZCPH(:) * ZTT(:, JK) + (1.+ZRW(:, JK)) * XG * ZZ(:, JK) & + - ZLV(:) * ZRC(:, JK) - ZLS(:) * ZRI(:, JK) + enddo +! + DEALLOCATE(ZCPH) + DEALLOCATE(ZLV) + DEALLOCATE(ZLS) +! +!------------------------------------------------------------------------------- +! +!* 4. Compute updraft properties +! ---------------------------- +! +!* 4.1 Set mass flux at LCL ( here a unit mass flux with w = 1 m/s ) +! ------------------------------------------------------------- +! + ZDXDY(:) = XA25 + ZMFLCL(:) = XA25 * 1.E-3 +! +! +! + call CONVECT_UPDRAFT_SHAL(ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTHL, ZTHV, ZTHES, ZRW, & + ZTHLCL, ZTLCL, ZRVLCL, ZWLCL, ZZLCL, ZTHVELCL, & + ZMFLCL, GTRIG1, ILCL, IDPL, IPBL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZUTHV, ZURW, & + ZURC, ZURI, ZCAPE, ICTL, IETL) +! +! +! +!* 4.2 In routine UPDRAFT GTRIG1 has been set to false when cloud +! thickness is smaller than 3 km +! ----------------------------------------------------------- +! +! +! +!* 4.3 Allocate memory for downdraft variables +! --------------------------------------- +! +! downdraft variables +! + ALLOCATE(ZDMF(ICONV, IKS)) + ALLOCATE(ZDER(ICONV, IKS)) + ALLOCATE(ZDDR(ICONV, IKS)) + ALLOCATE(ILFS(ICONV)) + ALLOCATE(ZLMASS(ICONV, IKS)) + ZDMF(:, :) = 0. + ZDER(:, :) = 0. + ZDDR(:, :) = 0. + ILFS(:) = IKB + do JK = IKB, IKE + ZLMASS(:, JK) = ZDXDY(:) * ZDPRES(:, JK) / XG ! mass of model layer + enddo + ZLMASS(:, IKB) = ZLMASS(:, IKB + 1) +! +! closure variables +! + ALLOCATE(ZTIMEC(ICONV)) + ALLOCATE(ZTHC(ICONV, IKS)) + ALLOCATE(ZRVC(ICONV, IKS)) + ALLOCATE(ZRCC(ICONV, IKS)) + ALLOCATE(ZRIC(ICONV, IKS)) + ALLOCATE(ZWSUB(ICONV, IKS)) +! +!------------------------------------------------------------------------------- +! +!* 5. Compute downdraft properties +! ---------------------------- +! + ZTIMEC(:) = XCTIME_SHAL + if(OSETTADJ) ZTIMEC(:) = PTADJS +! +!* 7. Determine adjusted environmental values assuming +! that all available buoyant energy must be removed +! within an advective time step ZTIMEC. +! --------------------------------------------------- +! + call CONVECT_CLOSURE_SHAL(ICONV, KLEV, & + ZPRES, ZDPRES, ZZ, ZDXDY, ZLMASS, & + ZTHL, ZTH, ZRW, ZRC, ZRI, GTRIG1, & + ZTHC, ZRVC, ZRCC, ZRIC, ZWSUB, & + ILCL, IDPL, IPBL, ICTL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZURW, & + ZURC, ZURI, ZCAPE, ZTIMEC, IFTSTEPS) +! +!------------------------------------------------------------------------------- +! +!* 8. Determine the final grid-scale (environmental) convective +! tendencies and set convective counter +! -------------------------------------------------------- +! +! +!* 8.1 Grid scale tendencies +! --------------------- +! + ! in order to save memory, the tendencies are temporarily stored + ! in the tables for the adjusted grid-scale values +! + do JK = IKB, IKE + ZTHC(:, JK) = (ZTHC(:, JK) - ZTH(:, JK)) / ZTIMEC(:) & + * (ZPRES(:, JK) / XP00)**ZRDOCP ! change theta in temperature + ZRVC(:, JK) = (ZRVC(:, JK) - ZRW(:, JK) + ZRC(:, JK) + ZRI(:, JK)) & + / ZTIMEC(:) + + ZRCC(:, JK) = (ZRCC(:, JK) - ZRC(:, JK)) / ZTIMEC(:) + ZRIC(:, JK) = (ZRIC(:, JK) - ZRI(:, JK)) / ZTIMEC(:) +! + enddo +! +! +!* 8.2 Apply conservation correction +! ----------------------------- +! + ! adjustment at cloud top to smooth possible discontinuous profiles at PBL inversions + ! (+ - - tendencies for moisture ) +! +! + if(LLSMOOTH) then + do JI = 1, ICONV + JK = ICTL(JI) + JKM = MAX(2, ICTL(JI) - 1) + JKP = MAX(2, ICTL(JI) - 2) + ZRVC(JI, JKM) = ZRVC(JI, JKM) + .5 * ZRVC(JI, JK) + ZRCC(JI, JKM) = ZRCC(JI, JKM) + .5 * ZRCC(JI, JK) + ZRIC(JI, JKM) = ZRIC(JI, JKM) + .5 * ZRIC(JI, JK) + ZTHC(JI, JKM) = ZTHC(JI, JKM) + .5 * ZTHC(JI, JK) + ZRVC(JI, JKP) = ZRVC(JI, JKP) + .3 * ZRVC(JI, JK) + ZRCC(JI, JKP) = ZRCC(JI, JKP) + .3 * ZRCC(JI, JK) + ZRIC(JI, JKP) = ZRIC(JI, JKP) + .3 * ZRIC(JI, JK) + ZTHC(JI, JKP) = ZTHC(JI, JKP) + .3 * ZTHC(JI, JK) + ZRVC(JI, JK) = .2 * ZRVC(JI, JK) + ZRCC(JI, JK) = .2 * ZRCC(JI, JK) + ZRIC(JI, JK) = .2 * ZRIC(JI, JK) + ZTHC(JI, JK) = .2 * ZTHC(JI, JK) + enddo + endif +! +! + ! Compute vertical integrals - Fluxes +! + JKM = MAXVAL(ICTL(:)) + ZWORK2(:) = 0. + ZWORK2B(:) = 0. + do JK = IKB + 1, JKM + JKP = JK + 1 + do JI = 1, ICONV + if(JK <= ICTL(JI)) then + ZW1 = ZRVC(JI, JK) + ZRCC(JI, JK) + ZRIC(JI, JK) + ZWORK2(JI) = ZWORK2(JI) + ZW1* & ! moisture + .5 * (ZPRES(JI, JK - 1) - ZPRES(JI, JKP)) / XG + ZW1 = (XCPD + XCPV * ZRW(JI, JK)) * ZTHC(JI, JK) - & + (XLVTT + (XCPV - XCL) * (ZTT(JI, JK) - XTT)) * ZRCC(JI, JK) - & + (XLSTT + (XCPV - XCL) * (ZTT(JI, JK) - XTT)) * ZRIC(JI, JK) + ZWORK2B(JI) = ZWORK2B(JI) + ZW1* & ! energy + .5 * (ZPRES(JI, JK - 1) - ZPRES(JI, JKP)) / XG + endif + enddo + enddo +! + ! Budget error (integral must be zero) +! + do JI = 1, ICONV + if(ICTL(JI) > IKB + 1) then + JKP = ICTL(JI) + ZW1 = XG / (ZPRES(JI, IKB) - ZPRES(JI, JKP) - & + .5 * (ZDPRES(JI, IKB + 1) - ZDPRES(JI, JKP + 1))) + ZWORK2(JI) = ZWORK2(JI) * ZW1 + ZWORK2B(JI) = ZWORK2B(JI) * ZW1 + endif + enddo +! + ! Apply uniform correction +! + do JK = JKM, IKB + 1, -1 + do JI = 1, ICONV + if(ICTL(JI) > IKB + 1 .and. JK <= ICTL(JI)) then + ! ZW1 = ABS(ZRVC(JI,JK)) + ABS(ZRCC(JI,JK)) + ABS(ZRIC(JI,JK)) + 1.E-12 + ! ZRVC(JI,JK) = ZRVC(JI,JK) - ABS(ZRVC(JI,JK))/ZW1*ZWORK2(JI) ! moisture + ZRVC(JI, JK) = ZRVC(JI, JK) - ZWORK2(JI) ! moisture + ! ZRCC(JI,JK) = ZRCC(JI,JK) - ABS(ZRCC(JI,JK))/ZW1*ZWORK2(JI) + ! ZRIC(JI,JK) = ZRIC(JI,JK) - ABS(ZRIC(JI,JK))/ZW1*ZWORK2(JI) + ZTHC(JI, JK) = ZTHC(JI, JK) - ZWORK2B(JI) / XCPD ! enthalpy + endif + enddo + enddo +! + ! execute a "scatter"= pack command to store the tendencies in + ! the final 2D tables +! + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + PTTEN(JL, JK) = ZTHC(JI, JK) + PRVTEN(JL, JK) = ZRVC(JI, JK) + PRCTEN(JL, JK) = ZRCC(JI, JK) + PRITEN(JL, JK) = ZRIC(JI, JK) + enddo + enddo +! +! +! Cloud base and top levels +! ------------------------- +! + ILCL(:) = MIN(ILCL(:), ICTL(:)) + do JI = 1, ICONV + JL = IJINDEX(JI) + KCLTOP(JL) = ICTL(JI) + KCLBAS(JL) = ILCL(JI) + enddo +! +! +!* 8.7 Compute convective tendencies for Tracers +! ------------------------------------------ +! +! if ( OCH1CONV ) then +!! +! ALLOCATE( ZCH1(ICONV,IKS,KCH1) ) +! ALLOCATE( ZCH1C(ICONV,IKS,KCH1) ) +! ALLOCATE( ZWORK3(ICONV,KCH1) ) +!! +! do JK = IKB, IKE +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! ZCH1(JI,JK,:) = PCH1(JL,JK,:) +! end do +! end do +!! +! call CONVECT_CHEM_TRANSPORT( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & +! IDPL, IPBL, ILCL, ICTL, ILFS, ILFS, & +! ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & +! ZTIMEC, ZDXDY, ZDMF(:,1), ZLMASS, ZWSUB, & +! IFTSTEPS ) +!! +!! +!!* 8.8 Apply conservation correction +!! ----------------------------- +!! +! ! Compute vertical integrals +!! +! JKM = MAXVAL( ICTL(:) ) +! do JN = 1, KCH1 +! if(JN < NSV_LGBEG .OR. JN>NSV_LGEND-1) then ! no correction for xy lagrangian variables +! ZWORK3(:,JN) = 0. +! ZWORK2(:) = 0. +! do JK = IKB+1, JKM +! JKP = JK + 1 +! do JI = 1, ICONV +! ZW1 = .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) +! ZWORK3(JI,JN) = ZWORK3(JI,JN) + (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN)) * ZW1 +! ZWORK2(JI) = ZWORK2(JI) + ABS(ZCH1C(JI,JK,JN)) * ZW1 +! end do +! end do +!! +! ! Apply concentration weighted correction +!! +! do JK = JKM, IKB+1, -1 +! do JI = 1, ICONV +! if ( ICTL(JI) > IKB+1 .and. JK <= ICTL(JI) ) then +! ZCH1C(JI,JK,JN) = ZCH1C(JI,JK,JN) - & +! ZWORK3(JI,JN)*ABS(ZCH1C(JI,JK,JN))/MAX(1.E-30,ZWORK2(JI)) +! end if +! end do +! end do +! end if +!! +! do JK = IKB, IKE +! do JI = 1, ICONV +! JL = IJINDEX(JI) +! PCH1TEN(JL,JK,JN) = (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN) ) / ZTIMEC(JI) +! end do +! end do +! end do +! end if +! +!------------------------------------------------------------------------------- +! +!* 9. Write up- and downdraft mass fluxes +! ------------------------------------ +! + do JK = IKB, IKE + ZUMF(:, JK) = ZUMF(:, JK) / ZDXDY(:) ! Mass flux per unit area + enddo + ZWORK2(:) = 1. + do JK = IKB, IKE + do JI = 1, ICONV + JL = IJINDEX(JI) + if(KCLTOP(JL) <= IKB + 1) ZWORK2(JL) = 0. + PUMF(JL, JK) = ZUMF(JI, JK) * ZWORK2(JL) + enddo + enddo +! +!------------------------------------------------------------------------------- +! +!* 10. Deallocate all local arrays +! --------------------------- +! +! downdraft variables +! + DEALLOCATE(ZDMF) + DEALLOCATE(ZDER) + DEALLOCATE(ZDDR) + DEALLOCATE(ILFS) + DEALLOCATE(ZLMASS) +! +! closure variables +! + DEALLOCATE(ZTIMEC) + DEALLOCATE(ZTHC) + DEALLOCATE(ZRVC) + DEALLOCATE(ZRCC) + DEALLOCATE(ZRIC) + DEALLOCATE(ZWSUB) +! + if(OCH1CONV) then + DEALLOCATE(ZCH1) + DEALLOCATE(ZCH1C) + DEALLOCATE(ZWORK3) + endif +! +! vertical index +! + DEALLOCATE(IDPL) + DEALLOCATE(IPBL) + DEALLOCATE(ILCL) + DEALLOCATE(ICTL) + DEALLOCATE(IETL) +! +! grid scale variables +! + DEALLOCATE(ZZ) + DEALLOCATE(ZPRES) + DEALLOCATE(ZDPRES) + DEALLOCATE(ZTT) + DEALLOCATE(ZTH) + DEALLOCATE(ZTHV) + DEALLOCATE(ZTHL) + DEALLOCATE(ZTHES) + DEALLOCATE(ZRW) + DEALLOCATE(ZRV) + DEALLOCATE(ZRC) + DEALLOCATE(ZRI) + DEALLOCATE(ZDXDY) +! +! updraft variables +! + DEALLOCATE(ZUMF) + DEALLOCATE(ZUER) + DEALLOCATE(ZUDR) + DEALLOCATE(ZUTHL) + DEALLOCATE(ZUTHV) + DEALLOCATE(ZURW) + DEALLOCATE(ZURC) + DEALLOCATE(ZURI) + DEALLOCATE(ZTHLCL) + DEALLOCATE(ZTLCL) + DEALLOCATE(ZRVLCL) + DEALLOCATE(ZWLCL) + DEALLOCATE(ZZLCL) + DEALLOCATE(ZTHVELCL) + DEALLOCATE(ZMFLCL) + DEALLOCATE(ZCAPE) +! +! work arrays +! + DEALLOCATE(IINDEX) + DEALLOCATE(IJINDEX) + DEALLOCATE(IJSINDEX) + DEALLOCATE(GTRIG1) +! +! +ENDsubroutine SHALLOW_CONVECTION + +! /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ +! ************************************************************************************************** +! \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ + diff --git a/MAR/code_mar/dynadv_dlf.f90 b/MAR/code_mar/dynadv_dlf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5bfebeecab6743b823ec240b49afbb7c6732bef0 --- /dev/null +++ b/MAR/code_mar/dynadv_dlf.f90 @@ -0,0 +1,176 @@ +subroutine DYNadv_dLF_mp(nordAV, ffx, ffy, advffx, advffy) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FAST 07-04-2021 MAR | + ! | subroutine DYNadv_dLF generates Advection Contribution | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT/ ffx(mx,my,mz): Advected Variable | + ! | ^^^^^^ | + ! | | + ! | INPUT/ (via common block) | + ! | ^^^^^^ uairDY(mx,my,mz): Advection Vector: x-----Direction | + ! | vairDY(mx,my,mz): Advection Vector: y-----Direction | + ! | wsigDY(mx,my,mz): Advection Vector: sigma-Direction | + ! | | + ! | OUTPUT advffx(mx,my,mz): Advection Contribution | + ! | ^^^^^^ | + ! | | + ! | METHOD: 2th order accurate Time Scheme (leapfrog backw.) .and.| + ! | ^^^^^^ (2th order accurate Horizontal Scheme on Arakawa A grid .OR. | + ! | 4th order accurate Horizontal Scheme on Arakawa A grid )| + ! | 2th order Vertical Scheme | + ! | | + ! | REFER.: Use of A grid: Purser & Leslie, 1988, MWR 116, p.2069 | + ! | ^^^^^^ Time Scheme: Haltiner & Williams, 1980, 5-2, p.152 | + ! | Spatial Scheme: Haltiner & Williams, 1980, 5-6-5, p.135 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use mardim + use margrd + use mar_dy + use mar_wk + + implicit none + + integer i, j, k, m + integer nordAV + + real ffx(mx, my, mz) ! uairdy + real advffx(mx, my, mz) + + real ffy(mx, my, mz) ! vairdy + real advffy(mx, my, mz) + + ! +--Contribution to Advection + ! + ========================= + !$OMP PARALLEL do private (i,j,k) + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz8(i, j, k) = ffx(i, j, k) + WPxyz8(i, j, k) = ffy(i, j, k) + enddo + enddo + ! end do + + ! +--2th centered Differences / x-----Direction + ! + ------------------------------------------ + + if(nordAV == 2) then + + ! do k=1,mz + do i = 1, mx + do j = 1, my + WTxyz1(i, j, k) = uairDY(i, j, k) * dxinv3(i, j) * ( & + WTxyz8(im1(i), j, k) - WTxyz8(ip1(i), j, k)) + WPxyz1(i, j, k) = uairDY(i, j, k) * dxinv3(i, j) * ( & + WPxyz8(im1(i), j, k) - WPxyz8(ip1(i), j, k)) + enddo + enddo + !c #vL end do + + ! +--2th centered Differences / y-----Direction + ! + ------------------------------------------ + + !c #vL do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz2(i, j, k) = vairDY(i, j, k) * dyinv3(i, j) * ( & + WTxyz8(i, jm1(j), k) - WTxyz8(i, jp1(j), k)) + WPxyz2(i, j, k) = vairDY(i, j, k) * dyinv3(i, j) * ( & + WPxyz8(i, jm1(j), k) - WPxyz8(i, jp1(j), k)) + enddo + enddo + ! end do + + else + ! +--4th centered Differences / x-----Direction + ! + ------------------------------------------ + + ! do k=1,mz + do i = 1, mx + do j = 1, my + WTxyz1(i, j, k) = uairDY(i, j, k) * dxinv3(i, j) * fac43 * ( & + 0.125 * (WTxyz8(ip2(i), j, k) - WTxyz8(im2(i), j, k)) & + - WTxyz8(ip1(i), j, k) + WTxyz8(im1(i), j, k)) + WPxyz1(i, j, k) = uairDY(i, j, k) * dxinv3(i, j) * fac43 * ( & + 0.125 * (WPxyz8(ip2(i), j, k) - WPxyz8(im2(i), j, k)) & + - WPxyz8(ip1(i), j, k) + WPxyz8(im1(i), j, k)) + enddo + enddo + !c #vL end do + + ! +--4th centered Differences / y-----Direction + ! + ------------------------------------------ + !c #vL do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz2(i, j, k) = vairDY(i, j, k) * dyinv3(i, j) * fac43 * ( & + 0.125 * (WTxyz8(i, jp2(j), k) - WTxyz8(i, jm2(j), k)) & + - WTxyz8(i, jp1(j), k) + WTxyz8(i, jm1(j), k)) + WPxyz2(i, j, k) = vairDY(i, j, k) * dyinv3(i, j) * fac43 * ( & + 0.125 * (WPxyz8(i, jp2(j), k) - WPxyz8(i, jm2(j), k)) & + - WPxyz8(i, jp1(j), k) + WPxyz8(i, jm1(j), k)) + enddo + enddo + ! end do + endif + + ! +--2th centered Differences / sigma-Direction / Energy conserving + ! + --- (Haltiner and Williams, 1980, 7.2.2, Eqn. (7-47b) p.220) --- + ! + -------------------------------------------------------- + + ! do k= 1,mz + do j = jp11, my1 + do i = ip11, mx1 + WTxyz6(i, j, k) = ffx(i, j, k) - ffx(i, j, kp1(k)) + WPxyz6(i, j, k) = ffy(i, j, k) - ffy(i, j, kp1(k)) + if(k >= 2) then + WTxyz6(i, j, km1(k)) = ffx(i, j, km1(k)) - ffx(i, j, k) + WPxyz6(i, j, km1(k)) = ffy(i, j, km1(k)) - ffy(i, j, k) + endif + enddo + enddo + ! end do + + if(k == 1) then + do j = jp11, my1 + do i = ip11, mx1 + WTxyz3(i, j, k) = WTxyz6(i, j, k) * wsigDY(i, j, k) & + * 0.5 / dsigm1(1) + WPxyz3(i, j, k) = WPxyz6(i, j, k) * wsigDY(i, j, k) & + * 0.5 / dsigm1(1) + enddo + enddo + else + do j = jp11, my1 + do i = ip11, mx1 + WTxyz3(i, j, k) = (WTxyz6(i, j, k) * wsigDY(i, j, k) & + + WTxyz6(i, j, km1(k)) * wsigDY(i, j, km1(k))) & + * 0.5 / dsigm1(k) + WPxyz3(i, j, k) = (WPxyz6(i, j, k) * wsigDY(i, j, k) & + + WPxyz6(i, j, km1(k)) * wsigDY(i, j, km1(k))) & + * 0.5 / dsigm1(k) + enddo + enddo + endif + + ! +--Sum of the Contributions + ! + ======================== + + do i = ip11, mx1 + do j = jp11, my1 + ! do k= 1,mz + advffx(i, j, k) = WTxyz1(i, j, k) + WTxyz2(i, j, k) + WTxyz3(i, j, k) + advffy(i, j, k) = WPxyz1(i, j, k) + WPxyz2(i, j, k) + WPxyz3(i, j, k) + ! end do + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +end diff --git a/MAR/code_mar/dynadv_hor.f90 b/MAR/code_mar/dynadv_hor.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8f091c357b50379eae4007cc3819794ca043d63f --- /dev/null +++ b/MAR/code_mar/dynadv_hor.f90 @@ -0,0 +1,788 @@ +#include "MAR_pp.def" +subroutine DYNadv_hor(qqmass, ff, fp0, fp1, fu, fv) + ! + + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 27-09-2001 MAR | + ! | subroutine DYNadv_hor includes the Horizontal Advection Contribution | + ! | solved by using a Cubic Spline Technique | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: fp0: mass | + ! | ^^^^^ fu: advection velocity, x-direction, (e.g., uairDY) | + ! | fv: advection velocity, y-direction, (e.g., vairDY) | + ! | | + ! | iterun: Iteration Index | + ! | openLB: Zero-Gradient LBC Switch | + ! | FirstC: First Call at time=t Switch | + ! | qqmass: Mass Conservation Switch | + ! | | + ! | INPUT &/ ff: advected variable, which may be: | + ! | OUTPUT : uairDY,vairDY, pktaDY, qvDY, qwHY,qrHY, qiHY,ccniHY,qsHY | + ! | ^^^^^^^^ uairDY : x-wind speed component (m/s) | + ! | vairDY : y-wind speed component (m/s) | + ! | pktaDY: Potential Temperature divided by 100.[kPa]**(R/Cp) | + ! | qvDY: Air specific Humidity (kg/kg) | + ! | ****HY: Hydrometeor Concentration (kg/kg) | + ! | | + ! | METHOD : The following Contributions may be taken into account: | + ! | ^^^^^^^^ du/dt:=-udu/dx -vdu/dy | + ! | dv/dt:=-udv/dx -vdv/dy | + ! | dP/dt:=-udP/dx -vdP/dy (Potential Temperature) | + ! | dq/dt:=-udq/dx -vdq/dy (Water Species) | + ! | Correction for Mass Conservation (qqmass = .true.) | + ! | is based on the assumption that the meteorological fields | + ! | at Lateral Boundaries (LB) change only through relaxation | + ! | of MAR Fields towards Large Scale Meteorological Fields, | + ! | ==> Total Mass remains constant during "inner" Advection | + ! | (i1,i2) = (1,mx) ==> correction operated at LB's | + ! | ( correction slightly inconsistent ) | + ! | (i1,i2) = (2,mx-1) ==> no correction operated at LB's | + ! | (LB relaxation slightly badly conditioned) | + ! | Inclusion of Mass Flux at the LB's causes a conflict | + ! | with LBC scheme | + ! | This is verified by the onset of spurious waves at LB's | + ! | | + ! | REFER. : Alpert, thesis, 1980 | + ! | ^^^^^^^^ Pielke, Mesoscale Meteorological Modeling, 297--307, 1984 | + ! | (Seibert and Morariu, JAM, p.118, 1991) | + ! | | + ! | # OPTIONS: #MC (Mass Correction) performed | + ! | # ^^^^^^^^ #MD (Mass Difference) Correction preferred | + ! | | + ! +------------------------------------------------------------------------+ + ! + + use marctr + use marphy + use mardim + use margrd + use mar_hy + use mar_CU + use mar_lb + use mar_wk + ! + + implicit none + + ! qqmass : mass conservation switch + logical, intent(in) :: qqmass + + integer i, j, k, m + real fp0(mx, my) + real fp1(mx, my) + real ff(mx, my, mz) + real fu(mx, my, mz) + real fv(mx, my, mz) + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + integer iunPos, junPos, iindex, jindex + ! + + integer i1_adh, i2_adh, j1_adh, j2_adh, k_pdim + parameter(i1_adh=1, i2_adh=mx, j1_adh=1, j2_adh=my) + parameter(k_pdim=mz) +#if(QB) + common / DYNadv_hor_loc / i1_adh, i2_adh, j1_adh, j2_adh +#endif +#if(MC) + real sumMav +#endif + real sumMx + common / DYNadv_horrloc / sumMx(mz) + ! + + real dff + real f0(mx, my, mz) + real sumM0(mz), sumM1(mz) + real sumP0(mz), sumP1(mz) + real sumF0(mz) + real rsum, rsumd, rsumds, rsumda, FlwPos + ! + +#if(SP) + logical log_xx, log_yy +#endif + ! + + logical qqflux + logical NestOK + ! + + ! + + ! +--DATA + ! + ==== + ! + + data qqflux/.false./ + data NestOK/.true./ + ! + + ! + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + + ! + + ! +--Conservation: Mass + ! + ================== + ! + + if(qqmass) then + if(FirstC) then +#if(MC) + ! + + ! +--Interior of the Model Domain + ! + ---------------------------- + ! + + if(qqflux) then + do k = 1, k_pdim + sumM0(k) = 0.0 + sumM1(k) = 0.0 + do j = j1_adh, j2_adh + do i = i1_adh, i2_adh + sumM0(k) = sumM0(k) + fp0(i, j) + sumM1(k) = sumM1(k) + fp1(i, j) + enddo + enddo + enddo + else + do k = 1, k_pdim + sumM0(k) = 0.0 + sumM1(k) = 0.0 + do j = 1, my + do i = 1, mx + sumM0(k) = sumM0(k) + fp0(i, j) + sumM1(k) = sumM1(k) + fp1(i, j) + enddo + enddo + enddo + endif + ! + + ! + + ! +--Mass Inflow / x-Lateral Boundaries + ! + ---------------------------------- + ! + + if(mmx > 1 .and. qqflux) then + ! + + ! +--"x-small" Boundary + ! + ~~~~~~~~~~~~~~~~~~ + i = i1_adh + do k = 1, k_pdim + do j = j1_adh, j2_adh + sumM0(k) = sumM0(k) + fp0(i, j) * fu(i, j, k) * dtx + enddo + ! + + ! +--"x-large" Boundary + ! + ~~~~~~~~~~~~~~~~~~ + i = i2_adh + do j = j1_adh, j2_adh + sumM0(k) = sumM0(k) - fp0(i, j) * fu(i, j, k) * dtx + enddo + enddo + endif + ! + + ! + + ! +--Mass Inflow / y-Lateral Boundaries + ! + ---------------------------------- + ! + + if(mmy > 1 .and. qqflux) then + ! + + ! +--"y-small" Boundary + ! + ~~~~~~~~~~~~~~~~~~ + j = j1_adh + do k = 1, k_pdim + do i = i1_adh, i2_adh + sumM0(k) = sumM0(k) + fp0(i, j) * fv(i, j, k) * dtx + enddo + ! + + ! +--"y-large" Boundary + ! + ~~~~~~~~~~~~~~~~~~ + j = j2_adh + do i = i1_adh, i2_adh + sumM0(k) = sumM0(k) - fp0(i, j) * fv(i, j, k) * dtx + enddo + enddo + endif + sumMav = 0. +#endif + do k = 1, k_pdim + sumMx(k) = 1. +#if(MC) + sumMx(k) = sumM0(k) / sumM1(k) + sumMav = sumMav + sumMx(k) * dsigm1(k) +#endif + enddo +#if(MC) + do j = j1_adh, j2_adh + do i = i1_adh, i2_adh + fp1(i, j) = fp1(i, j) * sumMav + enddo + enddo +#endif + endif + ! + + ! + + ! +--Conservation: Property + ! + ====================== + ! + + ! +--Interior of the Model Domain + ! + ---------------------------- + ! + + if(qqflux) then + do k = 1, k_pdim + sumP0(k) = 0.0 + sumF0(k) = 0.0 + do j = j1_adh, j2_adh + do i = i1_adh, i2_adh + f0(i, j, k) = ff(i, j, k) * fp0(i, j) + sumP0(k) = sumP0(k) + f0(i, j, k) + enddo + enddo + enddo + else + do k = 1, k_pdim + sumP0(k) = 0.0 + do j = 1, my + do i = 1, mx + f0(i, j, k) = ff(i, j, k) * fp0(i, j) + sumP0(k) = sumP0(k) + f0(i, j, k) + enddo + enddo + enddo + endif + ! + + ! + + ! +--Mass Inflow / x-Lateral Boundaries + ! + ---------------------------------- + ! + + if(mmx > 1 .and. qqflux) then + do k = 1, k_pdim + i = i1_adh + do j = j1_adh, j2_adh + sumF0(k) = sumF0(k) & + + ff(i, j, k) * fp0(i, j) * fu(i, j, k) * dtx + enddo + i = i2_adh + do j = j1_adh, j2_adh + sumF0(k) = sumF0(k) & + - ff(i, j, k) * fp0(i, j) * fu(i, j, k) * dtx + enddo + enddo + endif + ! + + ! + + ! +--Mass Inflow / y-Lateral Boundaries + ! + ---------------------------------- + ! + + if(mmy > 1 .and. qqflux) then + do k = 1, k_pdim + j = j1_adh + do i = i1_adh, i2_adh + sumF0(k) = sumF0(k) & + + ff(i, j, k) * fp0(i, j) * fv(i, j, k) * dtx + enddo + j = j2_adh + do i = i1_adh, i2_adh + sumF0(k) = sumF0(k) & + - ff(i, j, k) * fp0(i, j) * fv(i, j, k) * dtx + enddo + enddo + endif + if(qqflux) then + do k = 1, k_pdim + sumP0(k) = sumP0(k) + sumF0(k) + enddo + endif + ! + + ! + + ! +--Positive Definiteness Condition + ! + ------------------------------- + ! + + do k = 1, k_pdim + sumP0(k) = max(sumP0(k), zero) + enddo + ! + + endif + ! + + ! + + ! +--Time Splitting (Alternate Direction) + ! + ==================================== + ! + +#if(SP) + log_xx = .false. + log_yy = .false. +#endif + ! + +300 continue +#if(SP) + if(mod(itexpe, 2) == 0 .and. .not. log_yy) go to 301 +#endif + ! + + ! + + ! +--Advection Contribution following x + ! + ================================== + ! + + if(mmx > 1) then + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz1(i, j, k) = fu(i, j, k) * dtx + enddo + enddo + enddo + ! + + ! + + ! +--First Order Derivative, LBC + ! + --------------------------- + ! + + do k = 1, k_pdim + do j = jp11, my1 + WKxyz2(1, j, k) = 0.0 + WKxyz2(mx, j, k) = 0.0 + enddo + enddo + ! + + ! + + ! +--First Order Derivative, Forward Sweep + ! + -------------------------------------- + ! + + do i = ip11, mx1 + do k = 1, k_pdim + do j = jp11, my1 + WKxyz2(i, j, k) = (3.0 * (ff(i + 1, j, k) - ff(i - 1, j, k)) / dx & + - WKxyz2(i - 1, j, k)) / CUspxh(i) + enddo + enddo + enddo + ! + + ! + + ! +--First Order Derivative, Backward Sweep + ! + -------------------------------------- + ! + + do i = mx2, ip11, -1 + do k = 1, k_pdim + do j = jp11, my1 + WKxyz2(i, j, k) = CUspxb(i) * WKxyz2(i + 1, j, k) + WKxyz2(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--First Order Difference + ! + ---------------------- + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz2(i, j, k) = WKxyz2(i, j, k) * dx + enddo + enddo + enddo + ! + + ! + + ! +--Interpolated Variable + ! + --------------------- + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz3(i, j, k) = WKxyz1(i, j, k) * WKxyz1(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--Direction of Advection + ! + ---------------------- + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz4(i, j, k) = sign(unun, WKxyz1(i, j, k)) + iunPos = WKxyz4(i, j, k) + iindex = max(1, i - iunPos) + iindex = min(mx, iindex) + WKxyz5(i, j, k) = WKxyz2(iindex, j, k) + WKxyz6(i, j, k) = WKxyz4(i, j, k) * (ff(iindex, j, k) - ff(i, j, k)) + enddo + enddo + enddo + ! + + ! + + ! +--Advection + ! + --------- + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz7(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) + WKxyz2(i, j, k) + WKxyz8(i, j, k) = WKxyz7(i, j, k) + WKxyz6(i, j, k) + WKxyz2(i, j, k) + WKxyz6(i, j, k) = ff(i, j, k) - WKxyz1(i, j, k) * WKxyz2(i, j, k) + enddo + enddo + enddo + ! + + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + WKxyz6(i, j, k) = ff(i, j, k) - WKxyz1(i, j, k) * WKxyz2(i, j, k) & + + WKxyz4(i, j, k) * WKxyz3(i, j, k) * (WKxyz8(i, j, k) + WKxyz5(i, j, k)) & + - WKxyz1(i, j, k) * WKxyz3(i, j, k) * (WKxyz7(i, j, k) + WKxyz5(i, j, k)) + enddo + enddo + enddo + ! + + ! + + ! +--Inflow LBC + ! + ---------- + ! + + if(qqflux) then + ! + + ! +--Large Scale Contribution over dt (dff, to be implemented) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(NestOK) then + dff = 0. + ! + + ! +--Host Model Solution is preferred ("outer" solution if inflow included) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do k = 1, k_pdim + do j = 1, my + WKxyz6(1, j, k) = ff(1, j, k) + dff + WKxyz6(mx, j, k) = ff(mx, j, k) + dff + enddo + enddo + ! + + ! +--MAR Solution is preferred ("inner" solution if inflow included) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + else + do k = 1, k_pdim + do j = 1, my + FlwPos = max(zero, sign(unun, WKxyz4(1, j, k))) + WKxyz6(1, j, k) = WKxyz6(1, j, k) * (unun - FlwPos) & + + ff(1, j, k) * FlwPos + FlwPos = max(zero, sign(unun, WKxyz4(mx, j, k))) + WKxyz6(mx, j, k) = WKxyz6(mx, j, k) * FlwPos & + + ff(mx, j, k) * (unun - FlwPos) + enddo + enddo + endif + ! + + ! +--Host Model Solution is preferred + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + else + do k = 1, k_pdim + do j = 1, my + WKxyz6(1, j, k) = ff(1, j, k) + WKxyz6(mx, j, k) = ff(mx, j, k) + enddo + enddo + endif + ! + + ! + + ! +--Finalisation + ! + ------------ + ! + + do i = 1, mx + do k = 1, k_pdim + do j = jp11, my1 + ff(i, j, k) = WKxyz6(i, j, k) + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + endif + ! + +#if(SP) + log_xx = .true. +#endif + ! + + ! + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + + ! + + ! +--Time Splitting (Alternate Direction) + ! + ==================================== + ! + +301 continue +#if(SP) + if(log_yy) go to 302 +#endif + ! + + ! + + ! +--Advection Contribution following y + ! + ================================== + ! + + if(mmy > 1) then + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz1(i, j, k) = fv(i, j, k) * dtx + enddo + enddo + enddo + ! + + ! + + ! +--First Order Derivative, LBC + ! + --------------------------- + ! + + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz2(1, 1, k) = 0.0 + WKxyz2(1, my, k) = 0.0 + enddo + enddo + ! + + ! + + ! +--First Order Derivative, Forward Sweep + ! + -------------------------------------- + ! + + do j = jp11, my1 + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz2(i, j, k) = (3.0 * (ff(i, j + 1, k) - ff(i, j - 1, k)) / dx & + - WKxyz2(i, j - 1, k)) / CUspyh(j) + enddo + enddo + enddo + ! + + ! + + ! +--First Order Derivative, Backward Sweep + ! + -------------------------------------- + ! + + do j = my2, jp11, -1 + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz2(i, j, k) = CUspyb(j) * WKxyz2(i, j + 1, k) + WKxyz2(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--First Order Difference + ! + ---------------------- + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz2(i, j, k) = WKxyz2(i, j, k) * dx + enddo + enddo + enddo + ! + + ! + + ! +--Interpolated Variable + ! + --------------------- + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz3(i, j, k) = WKxyz1(i, j, k) * WKxyz1(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--Direction of Advection + ! + ---------------------- + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz4(i, j, k) = sign(unun, WKxyz1(i, j, k)) + junPos = WKxyz4(i, j, k) + jindex = max(1, j - junPos) + jindex = min(my, jindex) + WKxyz5(i, j, k) = WKxyz2(i, jindex, k) + WKxyz6(i, j, k) = WKxyz4(i, j, k) * (ff(i, jindex, k) - ff(i, j, k)) + enddo + enddo + enddo + ! + + ! + + ! +--Advection + ! + --------- + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + WKxyz7(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) + WKxyz2(i, j, k) + WKxyz8(i, j, k) = WKxyz7(i, j, k) + WKxyz6(i, j, k) + WKxyz2(i, j, k) + WKxyz6(i, j, k) = ff(i, j, k) - WKxyz1(i, j, k) * WKxyz2(i, j, k) + enddo + enddo + enddo + ! + + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + ff(i, j, k) = ff(i, j, k) - WKxyz1(i, j, k) * WKxyz2(i, j, k) & + + WKxyz4(i, j, k) * WKxyz3(i, j, k) * (WKxyz8(i, j, k) + WKxyz5(i, j, k)) & + - WKxyz1(i, j, k) * WKxyz3(i, j, k) * (WKxyz7(i, j, k) + WKxyz5(i, j, k)) + enddo + enddo + enddo + ! + + ! + + ! +--Inflow LBC + ! + ---------- + ! + + if(qqflux) then + ! + + ! +--Large Scale Contribution over dt (dff, to be implemented) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(NestOK) then + dff = 0. + ! + + ! +--Host Model Solution is preferred ("outer" solution if inflow included) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do k = 1, k_pdim + do i = 1, mx + WKxyz6(i, 1, k) = ff(i, 1, k) + WKxyz6(i, my, k) = ff(i, my, k) + enddo + enddo + ! + + ! +--Nested Model Solution is preferred + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! + + ! +--MAR Solution is preferred ("inner" solution if inflow included) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + else + do k = 1, k_pdim + do i = 1, mx + FlwPos = max(zero, sign(unun, WKxyz4(i, 1, k))) + WKxyz6(i, 1, k) = WKxyz6(i, 1, k) * (unun - FlwPos) & + + ff(i, 1, k) * FlwPos + FlwPos = max(zero, sign(unun, WKxyz4(i, my, k))) + WKxyz6(i, my, k) = WKxyz6(i, my, k) * FlwPos & + + ff(i, my, k) * (unun - FlwPos) + enddo + enddo + endif + ! + + ! +--Host Model Solution is preferred + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + else + do k = 1, k_pdim + do i = 1, mx + WKxyz6(i, 1, k) = ff(i, 1, k) + WKxyz6(i, my, k) = ff(i, my, k) + enddo + enddo + endif + ! + + ! + + ! +--Finalisation + ! + ------------ + ! + + do j = 1, my + do k = 1, k_pdim + do i = ip11, mx1 + ff(i, j, k) = WKxyz6(i, j, k) + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + endif + ! + +#if(SP) + log_yy = .true. + if(.not. log_xx) go to 300 +#endif +302 continue + ! + + ! + + ! +--Conservation + ! + ============ + ! + + if(qqmass) then + ! + + ! + + ! +--Fluxes at the Lateral Boundaries through Advection + ! + ------------------------------------------------------- + ! + + if(qqflux) then + do k = 1, k_pdim + sumP1(k) = 0.0 + do j = j1_adh, j2_adh + do i = i1_adh, i2_adh + WKxy1(i, j) = ff(i, j, k) * fp1(i, j) + sumP1(k) = sumP1(k) + WKxy1(i, j) + enddo + enddo + ! + + rsumd = sumP1(k) +#if(MD) + rsumd = sumP1(k) - sumP0(k) +#endif + rsumds = sign(unun, rsumd) + rsumda = abs(rsumd) + rsumd = max(eps9, rsumda) * rsumds + rsum = sumP0(k) / rsumd +#if(MD) + rsum = sumF0(k) / rsumd +#endif + do j = j1_adh, j2_adh + do i = i1_adh, i2_adh + ff(i, j, k) = ff(i, j, k) * rsum +#if(MD) + ff(i, j, k) = (f0(i, j, k) & + + (WKxy1(i, j) - f0(i, j, k)) * rsum) & + / fp1(i, j) +#endif + enddo + enddo + ! + + enddo + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + enddo + enddo + ! + + ! + + ! +--Fluxes at the Lateral Boundaries only through the nudging Procedure + ! + ------------------------------------------------------------------- + ! + + else + ! + + do k = 1, k_pdim + sumP1(k) = 0.0 + do j = 1, my + do i = 1, mx + sumP1(k) = sumP1(k) + ff(i, j, k) * fp1(i, j) + enddo + enddo + ! + + rsumd = sumP1(k) * sumMx(k) + rsumds = sign(unun, rsumd) + rsumda = abs(rsumd) + rsumd = max(eps9, rsumda) * rsumds + rsum = sumP0(k) / rsumd + do j = 1, my + do i = 1, mx + ff(i, j, k) = ff(i, j, k) * rsum + enddo + enddo + ! + + enddo + endif + ! + + endif + ! + + ! + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + + ! + + return +end diff --git a/MAR/code_mar/dynadv_lfb.f90 b/MAR/code_mar/dynadv_lfb.f90 new file mode 100644 index 0000000000000000000000000000000000000000..dbeb0ffd7e2826b85345df89923447d19c18ad38 --- /dev/null +++ b/MAR/code_mar/dynadv_lfb.f90 @@ -0,0 +1,601 @@ +#include "MAR_pp.def" +subroutine DYNadv_LFB(norder) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 08-12-2022 MAR | + ! | subroutine DYNadv_LFB manages Leap-Frog Backward Advection Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT/ (via common block) | + ! | ^^^^^^ iterun : Long Time Step Counter | + ! | ntFast : Time Step Counter Maximum Value | + ! | micphy : Hydrometeors Switch | + ! | | + ! | INPUT/ (via common block) | + ! | OUTPUT pktaDY(mx,my,mzz) Potent. Temperat. / p_0**kappa | + ! | ^^^^^^ qvDY(mx,my,mz): Water Vapor Concentration [kg/kg] | + ! | ccniHY(mx,my,mz): Ice crystals Number [-] | + ! | qiHY(mx,my,mz): Ice crystals Concentration [kg/kg] | + ! | qsHY(mx,my,mz): Snow Flakes Concentration [kg/kg] | + ! | qwHY(mx,my,mz): Cloud Dropl. Concentration [kg/kg] | + ! | qrHY(mx,my,mz): Rain Drops Concentration [kg/kg] | + ! | SEE DYNdgz: uairDY(mx,my,mz): Wind Speed x-Direction [m/s] | + ! | vairDY(mx,my,mz): Wind Speed y-Direction [m/s] | + ! | | + ! | METHOD: 2th order accurate Time Scheme (leapfrog backw.) .and.| + ! | ^^^^^^ (2th order accurate Horizontal Scheme on Arakawa A grid .OR. | + ! | 4th order accurate Horizontal Scheme on Arakawa A grid )| + ! | 2th order Vertical Scheme | + ! | | + ! | CAUTION: This routine must be used | + ! | ^^^^^^^ with a positive definite restoring Procedure | + ! | for positive definite Variables | + ! | (Such a Procedure is setup after digital filtering in MAR) | + ! | | + ! | REFER.: Use of A grid: Purser & Leslie, 1988, MWR 116, p.2069 | + ! | ^^^^^^ Time Scheme: Haltiner & Williams, 1980, 5-2, p.152 | + ! | Spatial Scheme: Haltiner & Williams, 1980, 5-6-5, p.135 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_sl + use mar_hy +#if(TC) + use mar_tc +#endif +#if(iso) + use mariso, only: wiso, niso, Rdefault, & + qvDY_iso, qvapSL_iso, qiHY_iso, & + qsHY_iso, qwHY_iso, qrHY_iso, qsrfHY_iso +#endif + + implicit none + + integer, intent(in) :: norder + ! +--Local Variables + ! + ================ + ! iswater : to activate track_water + logical :: iswater + ! qqmass : mass conservation switch + logical :: qqmass + integer i, j, k, m + ! ntSlow = Time Step Counter Maximum Value + integer ntSlow + integer n + ! ff : Advected Variable + real ff(mx, my, mzz) +#if(iso) + ! ff_Riso : isotopic ratio of Advected Variable + real ff_Riso(niso, mx, my, mzz) +#endif + + ! +--DATA + ! + ==== + ntSlow = ntFast + + ! +--Advection of x-Momentum (uairDY) + ! + ================================ + qqmass = .false. + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! ff(i,j,k) = uairDY(i,j,k) + ! end do + ! end do + ! end do + ! k= mzz + ! do j=1,my + ! do i=1,mx + ! ff(i,j,k) = 0. + ! end do + ! end do + !c #NV if (no_vec) then + !C + ************* + !c #NV call DYNadv_LFB_2s(ntSlow,norder,ff) + !C + ************* + !c #NV else + !C + ************* + ! call DYNadv_LFB_2v(ntSlow,norder,ff) + !C + ************* + !c #NV end if + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! uairDY(i,j,k) = ff(i,j,k) + ! end do + ! end do + ! end do + + !C +--Advection of y-Momentum (vairDY) + !C + ================================ + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! ff(i,j,k) = vairDY(i,j,k) + ! end do + ! end do + ! end do + ! k= mzz + ! do j=1,my + ! do i=1,mx + ! ff(i,j,k) = 0. + ! end do + ! end do + + !c #NV if (no_vec) then + !C + ************* + !c #NV call DYNadv_LFB_2s(ntSlow,norder,ff) + !C + ************* + !c #NV else + !C + ************* + ! call DYNadv_LFB_2v(ntSlow,norder,ff) + !C + ************* + !c #NV end if + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! vairDY(i,j,k) = ff(i,j,k) + ! end do + ! end do + ! end do + + ! +--Advection of Heat (pktaDY) + ! + ========================== + qqmass = .false. + ! cCA norder is an input of the routine, already equal to 4 + ! cCA cannot be assigned here because of intent(in) + ! cCA todo : check with XF if norder should be let as an option or not + ! norder = 4 + do k = 1, mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + !cCA ff = pkta -> not water + iswater = .false. + !cCA : At first call of DYNadv_LFB_2p, qqmass = .false. -> setup of dtSlow + ! + ************* + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + ************* + + do k = 1, mz + do j = 1, my + do i = 1, mx + pktaDY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo + + ! +--Advection of Water Vapor (qvDY) + ! + =============================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qvapSL(i, j) + enddo + enddo + +#if(iso) + ! Compute isotopic ratio *before* advection of water vapor + ! Advection of water vapor isotopes, based on LMDZ : dyn3dmem/vlsplt_loc.F/vlz_loc + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qvDY_iso(wiso, i, j, k), qvDY(i, j, k), ff_Riso(wiso, i, j, k)) + enddo + enddo + enddo + enddo + ! k = mzz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qvapSL_iso(wiso, i, j), qvapSL(i, j), ff_Riso(wiso, i, j, mzz)) + enddo + enddo + enddo +#endif + + !cCA Mass conservation of water vapor on the full domain (xyz) + qqmass = .true. + !cCA ff = qvDY -> track water + iswater = .true. + ! + ************* + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + ************* + + do k = 1, mz + do j = 1, my + do i = 1, mx + qvDY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo + +#if(iso) + ! qqmass = .false. because mass conservation is on qvDY + qqmass = .false. + do wiso = 1, niso + ! + ************* + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff_Riso(wiso, :, :, :)) + ! + ************* + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qvDY_iso(wiso, i, j, k) = ff_Riso(wiso, i, j, k) * qvDY(i, j, k) + enddo + enddo + enddo + enddo +#endif + + if(micphy) then + ! +--Advection of Ice Crystals Nb (ccniHY) + ! + ===================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = ccniHY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = 0. + enddo + enddo + + !cCA ff = ccniHY -> do not track water + iswater = .false. + ! + **************** + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + **************** + + do k = 1, mz + do j = 1, my + do i = 1, mx + ccniHY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo + + ! +--Advection of Cloud Crystals (qiHY) + ! + ================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qiHY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = 0. + enddo + enddo + +#if(iso) + ! Compute isotopic ratio *before* advection of cloud ice + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qiHY_iso(wiso, i, j, k), qiHY(i, j, k), ff_Riso(wiso, i, j, k)) + enddo + enddo + enddo + enddo + ! k = mzz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + ff_Riso(wiso, i, j, mzz) = Rdefault(wiso) + enddo + enddo + enddo +#endif + !cCA Mass conservation on the full domain (xyz) + qqmass = .true. + !cCA ff = qiHY -> do not track water + iswater = .false. + ! + **************** + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + **************** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qiHY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo +#if(iso) + ! qqmass = .false. because mass conservation is on qiHY + qqmass = .false. + do wiso = 1, niso + ! + ************* + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff_Riso(wiso, :, :, :)) + ! + ************* + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qiHY_iso(wiso, i, j, k) = ff_Riso(wiso, i, j, k) * qiHY(i, j, k) + enddo + enddo + enddo + enddo +#endif + ! +--Advection of Snow Flakes (qsHY) + ! + =============================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qsHY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qsrfHY(i, j) + enddo + enddo + +#if(iso) + ! Compute isotopic ratio *before* advection of snow flakes + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qsHY_iso(wiso, i, j, k), qsHY(i, j, k), ff_Riso(wiso, i, j, k)) + enddo + enddo + enddo + enddo + ! k = mzz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + ! todo : track qsrfHY -> qsrfHY_iso + call Riso_from_qiso(wiso, qsrfHY_iso(wiso, i, j), qsrfHY(i, j), ff_Riso(wiso, i, j, mzz)) + enddo + enddo + enddo +#endif + !cCA Mass conservation of water vapor on the full domain (xyz) + qqmass = .true. + !cCA ff = qsHY -> do not track water + iswater = .false. + ! + **************** + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + **************** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qsHY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo +#if(iso) + ! qqmass = .false. because mass conservation is on qsHY + qqmass = .false. + do wiso = 1, niso + ! + ************* + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff_Riso(wiso, :, :, :)) + ! + ************* + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qsHY_iso(wiso, i, j, k) = ff_Riso(wiso, i, j, k) * qsHY(i, j, k) + enddo + enddo + enddo + enddo +#endif + ! +--Advection of Cloud Dropplets (qwHY) + ! + =================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qwHY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = 0. + enddo + enddo +#if(iso) + ! Compute isotopic ratio *before* advection of cloud ice + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qwHY_iso(wiso, i, j, k), qwHY(i, j, k), ff_Riso(wiso, i, j, k)) + enddo + enddo + enddo + enddo + ! k = mzz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + ff_Riso(wiso, i, j, mzz) = Rdefault(wiso) + enddo + enddo + enddo +#endif + !cCA Mass conservation on the full domain (xyz) + qqmass = .true. + !cCA ff = qwHY -> do not track water + iswater = .false. + ! + ************* + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + ************* + + do k = 1, mz + do j = 1, my + do i = 1, mx + qwHY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo +#if(iso) + ! qqmass = .false. because mass conservation is on qwHY + qqmass = .false. + do wiso = 1, niso + ! + ************* + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff_Riso(wiso, :, :, :)) + ! + ************* + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qwHY_iso(wiso, i, j, k) = ff_Riso(wiso, i, j, k) * qwHY(i, j, k) + enddo + enddo + enddo + enddo +#endif + ! +--Advection of Rain Drops (qrHY) + ! + ============================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qrHY(i, j, k) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = 0. + enddo + enddo +#if(iso) + ! Compute isotopic ratio *before* advection of cloud ice + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + call Riso_from_qiso(wiso, qrHY_iso(wiso, i, j, k), qrHY(i, j, k), ff_Riso(wiso, i, j, k)) + enddo + enddo + enddo + enddo + ! k = mzz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + ff_Riso(wiso, i, j, mzz) = Rdefault(wiso) + enddo + enddo + enddo +#endif + !cCA Mass conservation on the full domain (xyz) + qqmass = .true. + !cCA ff = qrHY -> do not track water + iswater = .false. + ! + **************** + call DYNadv_LFB_2p(iswater, qqmass, ntSlow, norder, ff) + ! + **************** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qrHY(i, j, k) = ff(i, j, k) + enddo + enddo + enddo +#if(iso) + ! qqmass = .false. because mass conservation is on qwHY + qqmass = .false. + do wiso = 1, niso + ! + ************* + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff_Riso(wiso, :, :, :)) + ! + ************* + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qrHY_iso(wiso, i, j, k) = ff_Riso(wiso, i, j, k) * qrHY(i, j, k) + enddo + enddo + enddo + enddo +#endif + endif + +#if(TC) + ! +--Advection of Tracers (qxTC) + ! + =========================== + do n = 1, ntrac + do k = 1, mz + do j = 1, my + do i = 1, mx + ff(i, j, k) = qxTC(i, j, k, n) + enddo + enddo + enddo + k = mzz + do j = 1, my + do i = 1, mx + ff(i, j, k) = 0. + enddo + enddo + if(no_vec) then + if(openmp) then + ! + **************** + call DYNadv_LFB_2p(qqmass, ntSlow, norder, ff) + ! + **************** + else + ! + ************* + call DYNadv_LFB_2s(ntSlow, norder, ff) + ! + ************* + endif + else + ! + ************* + !cCA warning, todo : DYNadv_LFB_2v does not exist + call DYNadv_LFB_2v(ntSlow, norder, ff) + ! + ************* + endif + do k = 1, mz + do j = 1, my + do i = 1, mx + qxTC(i, j, k, n) = ff(i, j, k) + enddo + enddo + enddo + enddo +#endif + + return +endsubroutine DYNadv_LFB diff --git a/MAR/code_mar/dynadv_lfb_2p.f90 b/MAR/code_mar/dynadv_lfb_2p.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4d885c6745eaae0bd32e62a8c2a1a83f684bdc65 --- /dev/null +++ b/MAR/code_mar/dynadv_lfb_2p.f90 @@ -0,0 +1,444 @@ +#include "MAR_pp.def" +subroutine DYNadv_LFB_2p(iswater, qqmass, niSlow, nordAV, ffx) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 09-12-2022 MAR | + ! | subroutine DYNadv_LFB_2s solves Advection (LeapFrog Backward Scheme) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT/ nnSlow : Time Step Counter Maximum Value | + ! | ^^^^^^ | + ! | | + ! | INPUT/ (via common block) | + ! | ^^^^^^ qqmass : Mass Conservation Switch (+def.var.) | + ! | iterun : Long Time Step Counter | + ! | dt : Time Step | + ! | opstDY(mx,my) : MASS, Time Step n | + ! | pstDYn(mx,my) : MASS, Time Step n+1 | + ! | uairDY(mx,my,mz): Advection Vector: x-----Direction | + ! | vairDY(mx,my,mz): Advection Vector: y-----Direction | + ! | psigDY(mx,my,mz): Advection Vector: sigma-Direction | + ! | | + ! | INPUT/ ffx(mx,my,mz+1): Advected Variable | + ! | OUTPUT | + ! | ^^^^^^ | + ! | | + ! | METHOD: 2th order accurate Time Scheme (leapfrog backw.) .and.| + ! | ^^^^^^ (2th order accurate Horizontal Scheme on Arakawa A grid .OR. | + ! | 4th order accurate Horizontal Scheme on Arakawa A grid )| + ! | 2th order Vertical Scheme | + ! | | + ! | Robert Time Filter (for minimizing the computational mode) | + ! | | + ! | CAUTION: This routine must be used | + ! | ^^^^^^^ with a positive definite restoring Procedure | + ! | for positive definite Variables | + ! | (Such a Procedure is setup after digital filtering in MAR) | + ! | | + ! | REFER.: Use of A grid: Purser & Leslie, 1988, MWR 116, p.2069 | + ! | ^^^^^^ Time Scheme: Haltiner & Williams, 1980, 5-2, p.152 | + ! | Spatial Scheme: Haltiner & Williams, 1980, 5-6-5, p.135 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use marqqm + use mar_wk + use trackwater, only : track_water_dynadv, jtw, & + delta_qv, j_dynadv_hor, j_dynadv_ver, j_dynadv_sav, & + dqp1_h, dqp1_v, dqm1_h, dqm1_v, delta_qv_tmp + + implicit none + + ! iswater : check if water to activate track_water + logical, intent(in) :: iswater + ! qqmass: mass Conservation Switch + logical, intent(in) :: qqmass + ! niSlow : Time Step Counter Initial Value + integer, intent(in) :: niSlow + integer, intent(in) :: nordAV + ! ffx : Advected Variable (t=n) + real, intent(inout) :: ffx(mx, my, mzz) + + integer i, j, k, m + + + ! +--Local Variables + ! + ================ + ! daSlow : Initialization Switch + logical daSlow + common / DYNadv_LFB_2s_log / daSlow + ! dtSlow : Time Step + real dtSlow + common / DYNadv_LFB_2s_rea / dtSlow + real rtSlow + ! itSlow : Time Step Counter + integer itSlow + integer nnSlow, n0Slow + common / DYNadv_LFB_2s_int / nnSlow + ! ffm1 : Advected Variable (t=n-1) + real ffm1 + ! dff : Variable Increment + real dff, dff_h, dff_v,flag + + integer kk + real summ, sumn, summ_tmp + + ! ffo : Advected Variable (t=n) + ! ffp1 : Advected Variable + real, allocatable :: ffp1(:, :, :) + real, allocatable :: ffo(:, :, :) + + logical LFBord, FLhost + data LFBord/.false./ + data FLhost/.true./ + + allocate (ffp1(mx, my, mzz)) + allocate ( ffo(mx, my, mzz)) + + ! +--Start the Leapfrog Backward Scheme + ! + ================================== + + if(.not. qqmass) then + if(.not. daSlow) then + daSlow = .true. + ! n0Slow : previous Nb of Time Steps + n0Slow = niSlow + else + ! n0Slow : previous Nb of Time Steps + n0Slow = nnSlow + endif + ! rtSlow : minimum acceptable Nb of Time Steps in the leap-frog Backward Scheme + rtSlow = CFLzDY + + do k = 1, mz + do j = 1, my + do i = 1, mx + rtSlow = max(rtSlow, abs(uairDY(i, j, k)) * 2.0 * dt / dx) + rtSlow = max(rtSlow, abs(vairDY(i, j, k)) * 2.0 * dt / dx) + enddo + enddo + enddo + nnSlow = rtSlow + 0.5 + nnSlow = max(nnSlow, ntFast) + if(mod(nnSlow, 2) == 0) nnSlow = nnSlow + 1 + dtSlow = dt / (nnSlow + 1) + + if(nnSlow /= n0Slow) then + write(6, 6000) nnSlow, dtSlow +6000 format(/, 'Advection Leap-Frog Backward Properties', & + /, ' ntSlow = ', i6, & + /, ' dtSlow = ', f9.2, /, 1x) + endif + endif + + ! +--Mass Conservation + ! + ================= + ffo = ffx + ! +--Start Leap-Frog Backward + ! + ======================== + sumn = 0. + summ = 0. + + !$OMP PARALLEL DO REDUCTION(+: sumn,summ) & + !$OMP private (i,j,k,kk,dff,ffm1,flag,dff_v,dff_h,itSlow,summ_tmp,WTxy1,WTxy2) & + !$OMP schedule(dynamic) + do k = 1, mz + + flag = 0 + do j = jp11, my1 + do i = ip11, mx1 + if(abs(ffo(i, j, k)) > 1.5 * eps9) flag = 1 + enddo + enddo + + if(flag == 1 ) then + + ! +--Vertical Differences + ! + ~~~~~~~~~~~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + if(k == 1) then + WTxy1(i, j) = ffo(i, j, k) - ffo(i, j, kp1(k)) + !cCA WTxyz3 = diffz_ffo * wsig / dsigm1 = mass flux + WTxyz3(i, j, k) = WTxy1(i, j) * wsigDY(i, j, k) * 0.5 / dsigm1(1) + else + WTxy1(i, j) = ffo(i, j, k) - ffo(i, j, kp1(k)) + kk = km1(k) + WTxy2(i, j) = ffo(i, j,kk) - ffo(i, j, k) + !cCA WTxyz3 = diffz_ffo * wsig / dsigm1 = mass flux + WTxyz3(i, j, k) = (WTxy1(i, j) * wsigDY(i, j, k ) & + + WTxy2(i, j) * wsigDY(i, j, kk)) * 0.5 / dsigm1(k) + endif + enddo + enddo + + + do itSlow = 1, nnSlow + 1 + ! +--Mass Divergence + ! + =============== + + ! +--2th centered Differences / sigma-Direction / Energy conserving + ! + --- (Haltiner and Williams, 1980, 7.2.2, Eqn. (7-47b) p.220) --- + ! + -------------------------------------------------------- + + ! +--Mass Update (Leapfrog-Backward) + ! + =============================== + ! https://en.wikipedia.org/wiki/Finite_difference_coefficient + !cCA -2 -1 0 1 2 + !cCA First derivative, central difference, accuracy=4 : 1/12 −2/3 0 2/3 −1/12 + !cCA 2/3 * (1/8 -1. 0 1. -1/8 ) + !cCA dxinv3 = 1. / (2 dx) + !cCA dtSlow = dt / (1 + nnSlow) (at least 2 1/2 time steps) + if(itSlow == 1) then + if(nordAV == 2) then + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * (ffx(im1(i), j, k) - ffx(ip1(i), j, k)) + & + vairDY(i, j, k) * dyinv3(i, j) * (ffx(i, jm1(j), k) - ffx(i, jp1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffx(i, j, k) = ffx(i, j, k) + dff + ffp1(i, j, k) = ffx(i, j, k) + dff + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + delta_qv(i, j, k, j_dynadv_hor) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + delta_qv(i, j, k, j_dynadv_ver) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + dqp1_h(i, j, k) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + dff_h + dqp1_v(i, j, k) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + dff_v + end if + enddo + enddo + ! end do + else + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * fac43 * (& + 0.125 * (ffx(ip2(i), j, k) - ffx(im2(i), j, k)) & + - ffx(ip1(i), j, k) + ffx(im1(i), j, k)) + & + vairDY(i, j, k) * dyinv3(i, j) * fac43 * (& + 0.125 * (ffx(i, jp2(j), k) - ffx(i, jm2(j), k)) & + - ffx(i, jp1(j), k) + ffx(i, jm1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffx(i, j, k) = ffx(i, j, k) + dff + ffp1(i, j, k) = ffx(i, j, k) + dff + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + delta_qv(i, j, k, j_dynadv_hor) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + delta_qv(i, j, k, j_dynadv_ver) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + dqp1_h(i, j, k) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + dff_h + dqp1_v(i, j, k) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + dff_v + end if + enddo + enddo + ! end do + endif + else + if(itSlow <= nnSlow) then + if(nordAV == 2) then + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * (ffx(im1(i), j, k) - ffx(ip1(i), j, k)) + & + vairDY(i, j, k) * dyinv3(i, j) * (ffx(i, jp1(j), k) - ffx(i, jp1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffm1 = ffx(i, j, k) + ffx(i, j, k) = ffp1(i, j, k) + ffp1(i, j, k) = ffm1 + dff + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + dqm1_h(i, j, k) = delta_qv(i, j, k, j_dynadv_hor) + dqm1_v(i, j, k) = delta_qv(i, j, k, j_dynadv_ver) + delta_qv(i, j, k, j_dynadv_hor) = dqp1_h(i, j, k) + delta_qv(i, j, k, j_dynadv_ver) = dqp1_v(i, j, k) + dqp1_h(i, j, k) = dqm1_h(i, j, k) + dff_h + dff_h + dqp1_v(i, j, k) = dqm1_v(i, j, k) + dff_v + dff_v + end if +#if(rt) + ! +--Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + ffx(i, j, k) = ffx(i, j, k) + & + Robert * (0.5 * (ffp1(i, j, k) + ffm1) - ffx(i, j, k)) +#endif + enddo + enddo + ! end do + else + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * fac43 * (& + 0.125 * (ffx(ip2(i), j, k) - ffx(im2(i), j, k)) & + - ffx(ip1(i), j, k) + ffx(im1(i), j, k)) & + + vairDY(i, j, k) * dyinv3(i, j) * fac43 * ( & + 0.125 * (ffx(i, jp2(j), k) - ffx(i, jm2(j), k)) & + - ffx(i, jp1(j), k) + ffx(i, jm1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffm1 = ffx(i, j, k) + ffx(i, j, k) = ffp1(i, j, k) + ffp1(i, j, k) = ffm1 + dff + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + dqm1_h(i, j, k) = delta_qv(i, j, k, j_dynadv_hor) + dqm1_v(i, j, k) = delta_qv(i, j, k, j_dynadv_ver) + delta_qv(i, j, k, j_dynadv_hor) = dqp1_h(i, j, k) + delta_qv(i, j, k, j_dynadv_ver) = dqp1_v(i, j, k) + dqp1_h(i, j, k) = dqm1_h(i, j, k) + dff_h + dff_h + dqp1_v(i, j, k) = dqm1_v(i, j, k) + dff_v + dff_v + end if +#if(rt) + ! +--Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + ffx(i, j, k) = ffx(i, j, k) + & + Robert * (0.5 * (ffp1(i, j, k) + ffm1) - ffx(i, j, k)) +#endif + enddo + enddo + ! end do + endif + else + if(nordAV == 2) then + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * & + (ffx(im1(i), j, k) - ffx(ip1(i), j, k)) + & + vairDY(i, j, k) * dyinv3(i, j) * & + (ffx(i, jm1(j), k) - ffx(i, jp1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffx(i, j, k) = ffx(i, j, k) + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + delta_qv(i, j, k, j_dynadv_hor) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + delta_qv(i, j, k, j_dynadv_ver) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + end if + enddo + enddo + ! end do + else + ! do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + dff_h = uairDY(i, j, k) * dxinv3(i, j) * fac43 * (& + 0.125 * (ffx(ip2(i), j, k) - ffx(im2(i), j, k)) & + - ffx(ip1(i), j, k) + ffx(im1(i), j, k)) & + + vairDY(i, j, k) * dyinv3(i, j) * fac43 * ( & + 0.125 * (ffx(i, jp2(j), k) - ffx(i, jm2(j), k)) & + - ffx(i, jp1(j), k) + ffx(i, jm1(j), k)) + dff_v = WTxyz3(i, j, k) + dff = (dff_h + dff_v) * dtSlow + ffx(i, j, k) = ffx(i, j, k) + dff + if(iswater.and.track_water_dynadv) then + dff_h = dff_h * dtSlow + dff_v = dff_v * dtSlow + delta_qv(i, j, k, j_dynadv_hor) = delta_qv(i, j, k, j_dynadv_hor) + dff_h + delta_qv(i, j, k, j_dynadv_ver) = delta_qv(i, j, k, j_dynadv_ver) + dff_v + end if + enddo + enddo + ! end do + endif + ! +*** Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + endif + endif + enddo + + if(qqmass) then + ! +--Mass Conservation + ! + ================= + do j = 1, my + do i = 1, mx + if(iswater.and.track_water_dynadv) then + delta_qv_tmp = ffx(i, j, k) + end if + ffx(i, j, k) = max(zero, ffx(i, j, k)) + if(iswater.and.track_water_dynadv) then + delta_qv(i, j, k, j_dynadv_sav) = delta_qv(i, j, k, j_dynadv_sav) + ffx(i, j, k) - delta_qv_tmp + end if + ffo(i, j, k) = max(zero, ffo(i, j, k)) + sumn = sumn + pstDYn(i, j) * dsigm1(k) * ffx(i, j, k) + summ = summ + opstDY(i, j) * dsigm1(k) * ffo(i, j, k) + enddo + enddo + + !cCA fluxes at borders : difference between i = 1 and mx + ! ------------------------------------------------------ + do j = 1, my + ! MARv<3 + ! dtx = dt/dx + summ_tmp = dsigm1(k) * dtx * dsigm1(k) & + * (opstDY(1, j) * ffo(1, j, k) * uairDY(1, j, k) & + - opstDY(mx, j) * ffo(mx, j, k)* uairDY(mx, j, k)) +#if(AC) + ! to uncomment if not enough precipitation + !cCA : debug line above + summ_tmp = summ_tmp / dsigm1(k) +#endif +#if(EU) + ! to uncomment if not enough precipitation + summ_tmp = summ_tmp / dsigm1(k) +#endif + summ = summ + summ_tmp + enddo + !cCA fluxes at borders : difference between j = 1 and my + ! ------------------------------------------------------ + do i = 1, mx + ! MARv<3 + ! dtx = dt/dx + summ_tmp = dsigm1(k) * dtx * dsigm1(k) & + * (opstDY(i, 1) * ffo(i, 1, k) * vairDY(i, 1, k) & + - opstDY(i, my)* ffo(i, my, k)* vairDY(i, my, k)) +#if(AC) + ! to uncomment if not enough precipitation + !cCA debug line above + summ_tmp = summ_tmp / dsigm1(k) +#endif +#if(EU) + ! to uncomment if not enough precipitation + summ_tmp = summ_tmp / dsigm1(k) +#endif + summ = summ + summ_tmp + enddo + endif + endif + enddo + !$OMP END PARALLEL DO + + if(sumn > zero .and. qqmass) then + summ = summ / sumn + do k = 1, mz + do j = 1, my + do i = 1, mx + if(iswater.and.track_water_dynadv) then + delta_qv_tmp = ffx(i, j, k) + end if + ffx(i, j, k) = summ * ffx(i, j, k) + if(iswater.and.track_water_dynadv) then + delta_qv(i, j, k, j_dynadv_sav) = delta_qv(i, j, k, j_dynadv_sav) + ffx(i, j, k) - delta_qv_tmp + end if + enddo + enddo + enddo + endif + + deallocate (ffp1) + deallocate ( ffo) + + + return +endsubroutine DYNadv_LFB_2p diff --git a/MAR/code_mar/dynadv_sal.f90 b/MAR/code_mar/dynadv_sal.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4bae636690c44419fe03bf2dd3551d946cbefa33 --- /dev/null +++ b/MAR/code_mar/dynadv_sal.f90 @@ -0,0 +1,99 @@ +#include "MAR_pp.def" +subroutine DYNadv_sal + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW Tue 10-Jan-2012 MAR | + ! | subroutine DYNadv_sal includes the Horizontal Advection Contribution | + ! | of Saltating Snow | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ iterun: Run Iteration Counter | + ! | micphy: Cloud Microphysics Switch | + ! | openLB: Open Lateral Boundary Condition (LBC) Switch | + ! | | + ! | INPUT / uairDY,vairDY, qsHY, uss_HY | + ! | OUTPUT : snobSL : snow eroded thickness [m w.e.] | + ! | ^^^^^^^^ snohSL : snow precipitation thickness [m w.e.] | + ! | | + ! | METHOD : The following Contributions are taken into account: | + ! | ^^^^^^^^ dq/dt:=-(ud(qp*)/dx -vd(qp*)/dy)/p* | + ! | | + ! | REFER. : Alpert, thesis, 1980 | + ! | ^^^^^^^^ Pielke, Mesoscale Meteorological Modeling, 297--307, 1984 | + ! | Seibert and Morariu, JAM, p.118, 1991 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_hy + use mar_bs + use mar_sl + use mar_wk + + implicit none + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + real facFLX + common / DYNadv_sal_r / facFLX + + if(iterun <= 1) then + ! if (zsigma(mz).LT.1.5) + ! . STOP ' in DYNadv_sal: z_sbl inacceptable' + ! facFLX=0.1+0.8*exp(-(zsigma(mz)-0.5)*0.15) + facFLX = 2.0 + 6.0 * exp(-(zsigma(mz) - 0.4) * 1.50) - 1. + endif + + ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! Additional Snow Particles Horizontal Flux + ! ========================================= + + k = mz + ! k = mz (i.e., Consider SBL only) + + do j = 1, my + do i = 1, mx + WKxy0(i, j) = pstDY(i, j) & + * facFLX * qsHY(i, j, k) * min(unun, sign(unun, zero - uss_HY(i, j))) + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = WKxy0(i, j) * uairDY(i, j, k) + WKxy2(i, j) = WKxy0(i, j) * vairDY(i, j, k) + enddo + enddo + + ! Flux Convergence + ! ================ + + do j = jp11, my1 + do i = ip11, mx1 + qsHY(i, j, k) = qsHY(i, j, k) & + + (dtx * (WKxy1(im1(i), j) - WKxy1(ip1(i), j)) & + + dty * (WKxy2(i, jm1(j)) - WKxy2(i, jp1(j)))) & + / (2.0 * pstDY(i, j)) + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxy0(i, j) = 0. + WKxy1(i, j) = 0. + WKxy2(i, j) = 0. + enddo + enddo + + ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + return +endsubroutine DYNadv_sal diff --git a/MAR/code_mar/dynadv_ver.f90 b/MAR/code_mar/dynadv_ver.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2e7c5a00a1354fc50cbd40bb07d9a8a70a4291b8 --- /dev/null +++ b/MAR/code_mar/dynadv_ver.f90 @@ -0,0 +1,1360 @@ +#include "MAR_pp.def" +subroutine DYNadv_ver + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 18-09-2001 MAR | + ! | subroutine DYNadv_ver includes the Vertical Advection Contribution | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ iterun: Run Iteration Counter | + ! | uairDY, vairDY, pktaDY Values / Time Step n | + ! | uairDY : x-wind speed component (m/s) | + ! | vairDY : y-wind speed component (m/s) | + ! | pktaDY: potential temperature divided by 100.[kPa]**(R/Cp) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ uairDY, vairDY, pktaDY Values / Time Step n+1 | + ! | | + ! | METHOD: Unstaggered Grid: 1st Accurate in Space Upstream Scheme | + ! | ^^^^^^^^ Staggered Grid: 2nd Accurate in Space | + ! | | + ! | # OPTIONS: #VA: Vertical Average preferred in Centered Conserv Scheme | + ! | # ^^^^^^^^ #NS: NO Slip Surface BC used in Centered Conserv Scheme | + ! | # #UR: Upper Radiating Condition (to be corrected, DO'NT USE) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_wk +#if(CA) + use mar_ca +#endif + + implicit none + +#if(UR) + real uairUP, vairUP, pktaUP + common / DYNadv_ver_var / uairUP(mx, my, 0:2), & + vairUP(mx, my, 0:2), & + pktaUP(mx, my, 0:2) +#endif +#if(WA) + integer nadvrd + common / DYNadv_ver_loc / nadvrd +#endif + logical centrL +#if(ZU) + logical adv3rd + real gat(mx, my, mz), ga0(mx, my) + data adv3rd/.true./ +#endif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer itimax, ntimax, nt__UP, nt, kk + real cflmax, cflsig, faccfl, dt__UP, dt_sig, dsgm + real uair_0, uair_c, uair_1, uair_2, uair_d + real vair_0, vair_c, vair_1, vair_2, vair_d + real pkta_0, pkta_c, pkta_1, pkta_2, pkta_d + real old__u, old__v, old__t + + ! +--DATA + ! + ==== + + data centrL/.true./ +#if(UP) + centrL = .false. +#endif + + ! +--Initialization of the Upper Radiating Boundary Condition + ! + ======================================================== +#if(UR) + if(iterun == 1) then + do k = 0, 2 + kk = max(1, k) + do j = jp11, my1 + do i = ip11, mx1 + uairUP(i, j, k) = uairDY(i, j, kk) + vairUP(i, j, k) = vairDY(i, j, kk) + pktaUP(i, j, k) = pktaDY(i, j, kk) + enddo + enddo + enddo + endif +#endif + + ! +--Slip condition for Mountain Wave Experiments + ! + ============================================ +#if(OM) + do j = jp11, my1 + do i = ip11, mx1 + psigDY(i, j, mz) = 0.0 + enddo + enddo +#endif + + ! +--First and Second Order Schemes + ! + ============================== +#if(ZU) + if(.not. adv3rd) then +#endif + + ! +--Courant Number + ! + -------------- + + cflmax = 0.0 + + ! +--Centered second Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL .and. staggr) then + +#if(WA) + write(6, 6001) iterun +6001 format(i6, ' 6001 centrL .and. staggr /CFL Number') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * psigDY(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz7(i, j, k) + WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = 0.00 +#if(UR) + WKxyz8(i, j, 1) = dt * psigDY(i, j, 1) * 0.33 & + / (pstDYn(i, j) * dsigm1(1) * 2.) + ! WKxyz8(i,j,1)<--"psigDY(i,j,0)" + cflsig = abs(WKxyz8(i, j, k) + WKxyz8(i, j, k)) + cflmax = max(cflsig, cflmax) +#endif + enddo + enddo + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = dt * psigDY(i, j, km1(k)) & + / (pstDYn(i, j) * dsigm1(k) * 2.) + cflsig = abs(WKxyz8(i, j, k) + WKxyz8(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + else + + ! +--Upstream first Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(staggr) then + +#if(WA) + write(6, 6002) iterun +6002 format(i6, ' 6002 .not. centrL .and. staggr /Wind Speed') +#endif + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = (psigDY(i, j, k - 1) * dsig_1(k - 1) & + + psigDY(i, j, k) * dsig_1(k)) & + / (dsig_1(k - 1) + dsig_1(k)) + enddo + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = psigDY(i, j, 1) * dsig_1(1) & + / (dsig_1(0) + dsig_1(1)) + enddo + enddo + + ! +--Upstream first Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + +#if(WA) + write(6, 6003) iterun +6003 format(i6, ' 6003 (.not.)centrL.and. .not. staggr /Wind Speed') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = psigDY(i, j, k) + enddo + enddo + enddo + + endif + + ! +--Centered second Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL) then + +#if(WA) + write(6, 6004) iterun +6004 format(i6, ' 6004 centrL.and. .not. staggr /CFL Number') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * WKxyz8(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.) + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + ! +--Upstream first Order Scheme on a (non) staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + +#if(WA) + write(6, 6005) iterun +6005 format(i6, ' 6005 .not. centrL.and.(.not.)staggr /CFL Number') +#endif + + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxyz7(i, j, 1) = 0.0 + enddo + enddo + + ! +--Work Array Reset + ! + ~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + + endif + + endif + + ! +--Set Up of the Local Split Time Differencing + ! + ---------------------------------------------- + + cflmax = 2.0 * cflmax + ! +... restricted CFL Criterion + + ntimax = cflmax + if(centrL) then + ntimax = max(2, ntimax) +#if(WA) + write(6, 6006) ntimax +6006 format(i6, ' 6006 centrL.and.(.not.)staggr /Nb Iterat.') +#endif + else + ntimax = max(1, ntimax) +#if(WA) + write(6, 6007) ntimax +6007 format(i6, ' 6007 .not. centrL.and.(.not.)staggr /Nb Iterat.') +#endif + endif + + ! +--Update of CFL Number + ! + ~~~~~~~~~~~~~~~~~~~~ + if(ntimax > 1) then + faccfl = 1.0 / ntimax + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = WKxyz7(i, j, k) * faccfl + WKxyz8(i, j, k) = WKxyz8(i, j, k) * faccfl + enddo + enddo + enddo + endif + + ! +--OUTPUT for Verification + ! + ~~~~~~~~~~~~~~~~~~~~~~~ +#if(WA) + nadvrd = nadvrd + 1 + write(6, 6000) nadvrd, cflmax, ntimax +6000 format(i6, ' CFLmax ', 3x, ' ', 3x, ' =', f7.4, & + 6x, ' ntimax ', 8x, ' =', i4) +#endif + + ! +--2nd Order Centered Energy conserving: Local Split Time Differencing + ! + --------- (Haltiner & Williams 1980 7.2.2, (7-47b) p.220) ---------- + ! + ----------------------------------------------- + + if(centrL) then + + if(staggr) then + +#if(WA) + write(6, 6008) +6008 format(6x, ' 6008 centrL.and. staggr /A Contrib.') +#endif + + do itimax = 1, ntimax + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + + do j = jp11, my1 + + ! +--Vertical Differences + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = uairDY(i, j, k) + WKxzq(i, k) = vairDY(i, j, k) + WKxzx(i, k) = pktaDY(i, j, k) +#if(VA) + WKxzp(i, k) = (uairDY(i, j, k) * dsigm1(k) * 2.0 & + + uairDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (vairDY(i, j, k) * dsigm1(k) * 2.0 & + + vairDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (pktaDY(i, j, k) * dsigm1(k) * 2.0 & + + pktaDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + uair_0 = WKxzp(i, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + WKxza(i, k) = (WKxzp(i, k) - uair_0) + vair_0 = WKxzq(i, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + WKxzb(i, k) = (WKxzq(i, k) - vair_0) + pkta_0 = WKxzx(i, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + WKxzc(i, k) = (WKxzx(i, k) - pkta_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = uairDY(i, j, k) + WKxzq(i, k) = vairDY(i, j, k) + WKxzx(i, k) = pktaDY(i, j, k) +#if(VA) + WKxzp(i, k) = (uairDY(i, j, k - 1) * dsigm1(k - 1) & + + uairDY(i, j, k) * dsigm1(k) * 2.0 & + + uairDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (vairDY(i, j, k - 1) * dsigm1(k - 1) & + + vairDY(i, j, k) * dsigm1(k) * 2.0 & + + vairDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (pktaDY(i, j, k - 1) * dsigm1(k - 1) & + + pktaDY(i, j, k) * dsigm1(k) * 2.0 & + + pktaDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = uairDY(i, j, k) + WKxzq(i, k) = vairDY(i, j, k) + WKxzx(i, k) = pktaDY(i, j, k) +#if(VA) + WKxzp(i, k) = (uairDY(i, j, k - 1) * dsigm1(k - 1) & + + uairDY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (vairDY(i, j, k - 1) * dsigm1(k - 1) & + + vairDY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (pktaDY(i, j, k - 1) * dsigm1(k - 1) & + + pktaDY(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (pktaDY(i, j, k) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Advection Contribution + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = uairDY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = uairDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = vairDY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = vairDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = pktaDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = pktaDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = uairDY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = uairDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = vairDY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = vairDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = pktaDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = pktaDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + + enddo + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + + ! +--Vertical Differences + + do j = jp11, my1 + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + uair_0 = WKxzp(i, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + WKxza(i, k) = (WKxzp(i, k) - uair_0) + vair_0 = WKxzq(i, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + WKxzb(i, k) = (WKxzq(i, k) - vair_0) + pkta_0 = WKxzx(i, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + WKxzc(i, k) = (WKxzx(i, k) - pkta_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (pktaDY(i, j, k) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Advection Contribution + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + + enddo + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + + do j = jp11, my1 + + ! +--Vertical Differences + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + uair_0 = WKxzp(i, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + WKxza(i, k) = (WKxzp(i, k) - uair_0) + vair_0 = WKxzq(i, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + WKxzb(i, k) = (WKxzq(i, k) - vair_0) + pkta_0 = WKxzx(i, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + WKxzc(i, k) = (WKxzx(i, k) - pkta_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (pktaDY(i, j, k) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Wind Advection + + do k = 1, mmz1 + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k)) + vairDY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k)) + vairDY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + enddo + + ! +--Pot.Temp.Advect.avoids double Counting in case of convective Adjustment + + do k = 1, mmz1 + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + pktaDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + enddo + + k = mmz + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + pktaDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + + enddo + + endif + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + + enddo + + ! +--2nd Order Centered Leap-Frog Backward: Local Split Time Differencing + ! + -------------------------------------------------------------------- + + else + +#if(WA) + write(6, 6009) +6009 format(6x, ' 6009 centrL.and. .not. staggr /A Contrib.') +#endif + + do itimax = 1, ntimax + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + + do j = jp11, my1 + + ! +--Advection Increment + + k = 1 + do i = ip11, mx1 + uair_0 = uairDY(i, j, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + WKxza(i, k) = (uairDY(i, j, k + 1) - uair_0) & + * WKxyz7(i, j, k) + vair_0 = vairDY(i, j, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + WKxzb(i, k) = (vairDY(i, j, k + 1) - vairDY(i, j, k)) & + * WKxyz7(i, j, k) + pkta_0 = pktaDY(i, j, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + WKxzc(i, k) = (pktaDY(i, j, k + 1) - pktaDY(i, j, k)) & + * WKxyz7(i, j, k) + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (uairDY(i, j, k + 1) - uairDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (vairDY(i, j, k + 1) - vairDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (pktaDY(i, j, k + 1) - pktaDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -uairDY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -vairDY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (pktaDY(i, j, k + 1) - pktaDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + + ! +--Advection Contribution + + do k = 1, mmz + do i = ip11, mx1 + WKxyz1(i, j, k) = uairDY(i, j, k) - WKxza(i, k) + WKxyz4(i, j, k) = uairDY(i, j, k) - (WKxza(i, k) + WKxza(i, k)) + WKxyz2(i, j, k) = vairDY(i, j, k) - WKxzb(i, k) + WKxyz5(i, j, k) = vairDY(i, j, k) - (WKxzb(i, k) + WKxzb(i, k)) + WKxyz3(i, j, k) = pktaDY(i, j, k) - WKxzc(i, k) + WKxyz6(i, j, k) = pktaDY(i, j, k) - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + enddo + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + + ! +--Advection Increment + + do j = jp11, my1 + + k = 1 + do i = ip11, mx1 + uair_0 = WKxyz4(i, j, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + vair_0 = WKxyz5(i, j, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + pkta_0 = WKxyz6(i, j, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - uair_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - vair_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - pkta_0) & + * WKxyz7(i, j, k) + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (pktaDY(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + + ! +--Advection Contribution + + do k = 1, mmz + do i = ip11, mx1 + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxza(i, k) + WKxza(i, k)) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzb(i, k) + WKxzb(i, k)) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + + enddo + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + + do j = jp11, my1 + + ! +--Advection Increment + + k = 1 + do i = ip11, mx1 + uair_0 = WKxyz4(i, j, k) +#if(UR) + uair_0 = uairUP(i, j, 0) +#endif + vair_0 = WKxyz5(i, j, k) +#if(UR) + vair_0 = vairUP(i, j, 0) +#endif + pkta_0 = WKxyz6(i, j, k) +#if(UR) + pkta_0 = pktaUP(i, j, 0) +#endif + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - uair_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - vair_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - pkta_0) & + * WKxyz7(i, j, k) + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (pktaDY(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + + ! +--Wind Advection + + do k = 1, mmz + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz1(i, j, k) - WKxza(i, k) + vairDY(i, j, k) = WKxyz2(i, j, k) - WKxzb(i, k) + enddo + + ! +--Pot.Temp.Advect.avoids double Counting in case of convective Adjustment + + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + pktaDY(i, j, k) = WKxyz3(i, j, k) - WKxzc(i, k) +#if(cA) + endif +#endif + enddo + enddo + + enddo + + endif + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + + enddo + + endif + + ! +--First Order Upstream Scheme: Local Split Time Differencing + ! + -------------------------------------------------------------------- + + else + +#if(WA) + write(6, 6010) +6010 format(6x, ' 6010 .not. centrL.and.(.not.)staggr /A Contrib.') +#endif + + do itimax = 1, ntimax + + ! +--Auxiliary Variables + ! + ~~~~~~~~~~~~~~~~~~~ +#if(WA) + write(6, 6011) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , uairDY(imez, jmez, mz1), uairDY(imez, jmez, mz) +6011 format(6x, ' 6011 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = uairDY(i, j, k) + WKxyz2(i, j, k) = vairDY(i, j, k) + WKxyz3(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + + ! +--Vertical Differences + ! + ~~~~~~~~~~~~~~~~~~~~ + k = 1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = 0.0d+0 + WKxyz5(i, j, k) = 0.0d+0 + WKxyz6(i, j, k) = 0.0d+0 +#if(UR) + WKxyz4(i, j, k) = WKxyz1(i, j, k) - uairUP(i, j, 0) + WKxyz5(i, j, k) = WKxyz2(i, j, k) - vairUP(i, j, 0) + WKxyz6(i, j, k) = WKxyz3(i, j, k) - pktaUP(i, j, 0) +#endif + enddo + enddo + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz1(i, j, k) - WKxyz1(i, j, k - 1) + WKxyz5(i, j, k) = WKxyz2(i, j, k) - WKxyz2(i, j, k - 1) + WKxyz6(i, j, k) = WKxyz3(i, j, k) - WKxyz3(i, j, k - 1) + enddo + enddo + enddo + + k = mzz + do j = jp11, my1 + do i = ip11, mx1 + WKxy1(i, j) = -WKxyz1(i, j, k - 1) + WKxy2(i, j) = -WKxyz2(i, j, k - 1) + WKxy3(i, j) = pktaDY(i, j, k) - WKxyz3(i, j, k - 1) + enddo + enddo + ! + + ! +--Advection Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = uairDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k + 1) + WKxyz2(i, j, k) = vairDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k + 1) + WKxyz3(i, j, k) = pktaDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k + 1) + enddo + enddo + enddo + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = uairDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy1(i, j) + WKxyz2(i, j, k) = vairDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy2(i, j) + WKxyz3(i, j, k) = pktaDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy3(i, j) + enddo + enddo + + ! +--Wind Update + ! + ~~~~~~~~~~~~~~ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz1(i, j, k) + vairDY(i, j, k) = WKxyz2(i, j, k) + enddo + + ! +--Pot.Temp.Update avoids double Counting in case of convective Adjustment + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + pktaDY(i, j, k) = WKxyz3(i, j, k) +#if(cA) + endif +#endif + enddo + enddo + enddo + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- +#if(WA) + write(6, 6012) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , uairDY(imez, jmez, mz1), uairDY(imez, jmez, mz) +6012 format(6x, ' 6012 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) +#endif + enddo + + endif + +#if(UR) + ! Upper Radiating Boundary Condition + ! ---------------------------------- + do j = jp11, my1 + do i = ip11, mx1 + uair_c = zero + uair_1 = (uairDY(i, j, 1) + uairUP(i, j, 1)) * 0.5 + uair_2 = (uairDY(i, j, 2) + uairUP(i, j, 2)) * 0.5 + uair_d = uair_2 - uair_1 + if(uair_d /= zero) & + uair_c = -(uairDY(i, j, 1) - uairUP(i, j, 1)) * dsig_1(1) / (dt * uair_d) + if(uair_c < zero) then + dt__UP = -sigma(1) / uair_c + nt__UP = dt / dt__UP + nt__UP = max(1, nt__UP) + dt__UP = dt / nt__UP + dt_sig = dt__UP * uair_c / sigma(1) + do nt = 1, nt__UP + uairUP(i, j, 0) = uairUP(i, j, 0) & + - (uair_1 - uairUP(i, j, 0)) * dt_sig + enddo + endif + do k = 1, 2 + uairUP(i, j, k) = uairDY(i, j, k) + enddo + vair_c = zero + vair_1 = (vairDY(i, j, 1) + vairUP(i, j, 1)) * 0.5 + vair_2 = (vairDY(i, j, 2) + vairUP(i, j, 2)) * 0.5 + vair_d = vair_2 - vair_1 + if(vair_d /= zero) & + vair_c = -(vairDY(i, j, 1) - vairUP(i, j, 1)) * dsig_1(1) / (dt * vair_d) + if(vair_c < zero) then + dt__UP = -sigma(1) / vair_c + nt__UP = dt / dt__UP + nt__UP = max(1, nt__UP) + dt__UP = dt / nt__UP + dt_sig = dt__UP * vair_c / sigma(1) + do nt = 1, nt__UP + vairUP(i, j, 0) = vairUP(i, j, 0) & + - (vair_1 - vairUP(i, j, 0)) * dt_sig + enddo + endif + do k = 1, 2 + vairUP(i, j, k) = vairDY(i, j, k) + enddo + pkta_c = zero + pkta_1 = (pktaDY(i, j, 1) + pktaUP(i, j, 1)) * 0.5 + pkta_2 = (pktaDY(i, j, 2) + pktaUP(i, j, 2)) * 0.5 + pkta_d = pkta_2 - pkta_1 + if(pkta_d /= zero) & + pkta_c = -(pktaDY(i, j, 1) - pktaUP(i, j, 1)) * dsig_1(1) / (dt * pkta_d) + if(pkta_c < zero) then + dt__UP = -sigma(1) / pkta_c + nt__UP = dt / dt__UP + nt__UP = max(1, nt__UP) + dt__UP = dt / nt__UP + dt_sig = dt__UP * pkta_c / sigma(1) + do nt = 1, nt__UP + pktaUP(i, j, 0) = pktaUP(i, j, 0) & + - (pkta_1 - pktaUP(i, j, 0)) * dt_sig + enddo + endif + do k = 1, 2 + pktaUP(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo +#endif + + ! +--Work Arrays Reset + ! + ----------------- + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + enddo + enddo + + do k = 1, mz + do i = 1, mx + WKxza(i, k) = 0.0 + WKxzb(i, k) = 0.0 + WKxzc(i, k) = 0.0 + WKxzd(i, k) = 0.0 + WKxzp(i, k) = 0.0 + WKxzq(i, k) = 0.0 + WKxzx(i, k) = 0.0 + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + + ! +--Third Order Vertical Scheme + ! + =========================== +#if(ZU) + else + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = 0.0 +#endif +#if(ZO) + ga0(i, j) = uairDY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = uairDY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + uairDY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo +#endif +#if(ZO) + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = vairDY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = vairDY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + vairDY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = pktaDY(i, j, mzz) +#endif +#if(ZO) + ga0(i, j) = pktaDY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + pktaDY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + endif +#endif + return +endsubroutine DYNadv_ver diff --git a/MAR/code_mar/dynadv_verq.f90 b/MAR/code_mar/dynadv_verq.f90 new file mode 100644 index 0000000000000000000000000000000000000000..99a93d125515ace3e2e9acf22de4e14a3603bfde --- /dev/null +++ b/MAR/code_mar/dynadv_verq.f90 @@ -0,0 +1,985 @@ +#include "MAR_pp.def" +subroutine DYNadv_verq + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 18-09-2001 MAR | + ! | subroutine DYNadv_verq includes the Vertical Advection Contribution | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ iterun, Run Iteration Counter | + ! | qvDY, Air Vap. Water Values / Time Step n | + ! | qvapSL, SBC Vap. Water Values / Time Step n | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ qvDY, Air Vap. Water Values / Time Step n+1 | + ! | | + ! | METHOD: Unstaggered Grid: 1st Accurate in Space Upstream Scheme | + ! | ^^^^^^^^ Staggered Grid: 2nd Accurate in Space | + ! | | + ! | # OPTIONS: #VA: Vertical Average preferred in Centered Conserv Scheme | + ! | # ^^^^^^^^ #NS: NO Slip Surface BC used in Centered Conserv Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_sl + use mar_wk +#if(cA) + use mar_ca +#endif + ! + + implicit none + ! + +#if(WA) + integer nadvrd + common / DYNadv_ver_loc / nadvrd + ! + +#endif + logical centrL +#if(ZU) + logical adv3rd + real gat(mx, my, mz), ga0(mx, my) + data adv3rd/.true./ +#endif + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + integer i, j, k, m + integer itimax, ntimax + real cflmax, cflsig, faccfl, dsgm, qv_0 + real old__u, old__v, old__t, qw_0, qr_0 + ! + + ! + + ! +--DATA + ! + ==== + ! + + ! + + data centrL/.true./ +#if(UP) + centrL = .false. +#endif + ! + + ! + + ! +--Slip condition for Mountain Wave Experiments + ! + ============================================ + ! + +#if(OM) + do j = jp11, my1 + do i = ip11, mx1 + psigDY(i, j, mz) = 0.0 + enddo + enddo +#endif + ! + + ! + + ! +--First and Second Order Schemes + ! + ============================== + ! + +#if(ZU) + if(.not. adv3rd) then +#endif + ! + + ! + + ! +--Courant Number + ! + -------------- + ! + + cflmax = 0.0 + ! + + ! +--Centered second Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL .and. staggr) then + ! + +#if(WA) + write(6, 6001) iterun +6001 format(i6, ' 6001 centrL .and. staggr /CFL Number') +#endif + ! + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * psigDY(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz7(i, j, k) + WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + ! + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = 0.0 + enddo + enddo + ! + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = dt * psigDY(i, j, km1(k)) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz8(i, j, k) + WKxyz8(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + ! + + else + ! + + ! +--Upstream first Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(staggr) then + ! + +#if(WA) + write(6, 6002) iterun +6002 format(i6, ' 6002 .not. centrL .and. staggr /Wind Speed') +#endif + ! + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = (psigDY(i, j, k - 1) * dsig_1(k - 1) & + + psigDY(i, j, k) * dsig_1(k)) & + / (dsig_1(k - 1) + dsig_1(k)) + enddo + enddo + enddo + ! + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = psigDY(i, j, 1) * dsig_1(1) & + / (dsig_1(0) + dsig_1(1)) + enddo + enddo + ! + + ! +--Upstream first Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + +#if(WA) + write(6, 6003) iterun +6003 format(i6, ' 6003 (.not.)centrL.and. .not. staggr /Wind Speed') +#endif + ! + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = psigDY(i, j, k) + enddo + enddo + enddo + ! + + endif + ! + + ! +--Centered second Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL) then + ! + +#if(WA) + write(6, 6004) iterun +6004 format(i6, ' 6004 centrL.and. .not. staggr /CFL Number') +#endif + ! + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * WKxyz8(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + ! + + ! +--Upstream first Order Scheme on a (non) staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + +#if(WA) + write(6, 6005) iterun +6005 format(i6, ' 6005 .not. centrL.and.(.not.)staggr /CFL Number') +#endif + ! + + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + ! + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + ! + + do j = 1, my + do i = 1, mx + WKxyz7(i, j, 1) = 0.0 + enddo + enddo + ! + + ! +--Work Array Reset + ! + ~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + ! + + endif + ! + + endif + ! + + ! + + ! +--Set Up of the Local Split Time Differencing + ! + ---------------------------------------------- + ! + + cflmax = 2.0 * cflmax + ! +... restricted CFL Criterion + ! + + ntimax = cflmax + if(centrL) then + ntimax = max(2, ntimax) +#if(WA) + write(6, 6006) ntimax +6006 format(i6, ' 6006 centrL.and.(.not.)staggr /Nb Iterat.') +#endif + else + ntimax = max(1, ntimax) +#if(WA) + write(6, 6007) ntimax +6007 format(i6, ' 6007 .not. centrL.and.(.not.)staggr /Nb Iterat.') +#endif + endif + ! + + ! +--Update of CFL Number + ! + ~~~~~~~~~~~~~~~~~~~~ + if(ntimax > 1) then + faccfl = 1.0d+0 / ntimax + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = WKxyz7(i, j, k) * faccfl + WKxyz8(i, j, k) = WKxyz8(i, j, k) * faccfl + enddo + enddo + enddo + endif + ! + + ! +--OUTPUT for Verification + ! + ~~~~~~~~~~~~~~~~~~~~~~~ +#if(WA) + nadvrd = nadvrd + 1 + write(6, 6000) nadvrd, cflmax, ntimax +6000 format(i6, ' CFLmax ', 3x, ' ', 3x, ' =', f7.4, & + 6x, ' ntimax ', 8x, ' =', i4) +#endif + ! + + ! + + ! +--2nd Order Centered Energy conserving: Local Split Time Differencing + ! + --------- (Haltiner & Williams 1980 7.2.2, (7-47b) p.220) ---------- + ! + ----------------------------------------------- + ! + + if(centrL) then + ! + + if(staggr) then + ! + +#if(WA) + write(6, 6008) +6008 format(6x, ' 6008 centrL.and. staggr /A Contrib.') +#endif + ! + + do itimax = 1, ntimax + ! + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + ! + + do j = jp11, my1 + ! + + ! +--Vertical Differences + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = qvDY(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (qvDY(i, j, k) * dsigm1(k) * 2.0 & + + qvDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = qvDY(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (qvDY(i, j, k - 1) * dsigm1(k - 1) & + + qvDY(i, j, k) * dsigm1(k) * 2.0d+0 & + + qvDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzx(i, k) = qvDY(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (qvDY(i, j, k - 1) * dsigm1(k - 1) & + + qvDY(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy3(i, j) = 0.0 +#if(NS) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + ! + + enddo + ! + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + ! + + ! +--Vertical Differences + ! + + do j = jp11, my1 + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0d+0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + ! + + enddo + ! + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + + do j = jp11, my1 + ! + + ! +--Vertical Differences + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Wat.Vapr.Advect.avoids double Counting in case of convective Adjustment + ! + + do k = 1, mmz1 + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + ! + + ! +--2nd Order Centered Leap-Frog Backward: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + +#if(WA) + write(6, 6009) +6009 format(6x, ' 6009 centrL.and. .not. staggr /A Contrib.') +#endif + ! + + do itimax = 1, ntimax + ! + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qv_0 = qvDY(i, j, k) + WKxzc(i, k) = (qvDY(i, j, k + 1) - qvDY(i, j, k)) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxzc(i, k) = (qvDY(i, j, k + 1) - qvDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxzc(i, k) = (qvapSL(i, j) - qvDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzc(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + enddo + ! + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + ! + + ! +--Advection Increment + ! + + do j = jp11, my1 + ! + + k = 1 + do i = ip11, mx1 + qw_0 = WKxyz4(i, j, k) + qr_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qw_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - qr_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvapSL(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxza(i, k) + WKxza(i, k)) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzb(i, k) + WKxzb(i, k)) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + ! + + enddo + ! + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qw_0 = WKxyz4(i, j, k) + qr_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qw_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - qr_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvapSL(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Wat.Vapr.Advect.avoids double Counting in case of convective Adjustment + ! + + do k = 1, mmz + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) - WKxzc(i, k) +#if(cA) + endif +#endif + enddo + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + endif + ! + + ! + + ! +--First Order Upstream Scheme: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + +#if(WA) + write(6, 6010) +6010 format(6x, ' 6010 .not. centrL.and.(.not.)staggr /A Contrib.') +#endif + ! + + do itimax = 1, ntimax + ! + + ! +--Auxiliary Variables + ! + ~~~~~~~~~~~~~~~~~~~ +#if(WA) + write(6, 6011) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , qvDY(imez, jmez, mz1), qvDY(imez, jmez, mz) +#endif +6011 format(6x, ' 6011 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) + ! + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz3(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + ! + + ! +--Vertical Differences + ! + ~~~~~~~~~~~~~~~~~~~~ + k = 1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = 0.0d+0 + WKxyz5(i, j, k) = 0.0d+0 + WKxyz6(i, j, k) = 0.0d+0 + enddo + enddo + ! + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz1(i, j, k) - WKxyz1(i, j, k - 1) + WKxyz5(i, j, k) = WKxyz2(i, j, k) - WKxyz2(i, j, k - 1) + WKxyz6(i, j, k) = WKxyz3(i, j, k) - WKxyz3(i, j, k - 1) + enddo + enddo + enddo + ! + + k = mzz + do j = jp11, my1 + do i = ip11, mx1 + WKxy1(i, j) = -WKxyz1(i, j, k - 1) + WKxy2(i, j) = -WKxyz2(i, j, k - 1) + WKxy3(i, j) = qvapSL(i, j) - WKxyz3(i, j, k - 1) + enddo + enddo + ! + + ! +--Advection Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz3(i, j, k) = qvDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k + 1) + enddo + enddo + enddo + ! + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz3(i, j, k) = qvDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy3(i, j) + enddo + enddo + ! + + ! +--Wat.Vapr.Update avoids double Counting in case of convective Adjustment + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) +#if(cA) + endif +#endif + enddo + enddo + enddo + ! + + ! + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + +#if(WA) + write(6, 6012) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , qvDY(imez, jmez, mz1), qvDY(imez, jmez, mz) +6012 format(6x, ' 6012 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) +#endif + enddo + ! + + endif + ! + + ! + + ! +--Work Arrays Reset + ! + ----------------- + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do i = 1, mx + WKxza(i, k) = 0.0 + WKxzb(i, k) = 0.0 + WKxzc(i, k) = 0.0 + WKxzd(i, k) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + ! + + ! + + ! +--Third Order Vertical Scheme + ! + =========================== + ! + +#if(ZU) + else + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = qvapSL(i, j) +#endif +#if(ZO) + ga0(i, j) = qvDY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qvDY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + endif +#endif + return +endsubroutine DYNadv_verq diff --git a/MAR/code_mar/dyndgz.f90 b/MAR/code_mar/dyndgz.f90 new file mode 100644 index 0000000000000000000000000000000000000000..076dc0ccac19e7ce17c978f0f7ba4180281c7bd9 --- /dev/null +++ b/MAR/code_mar/dyndgz.f90 @@ -0,0 +1,672 @@ +#include "MAR_pp.def" +subroutine dyndgz_mp(norder) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FAST 15-04-2021 MAR | + ! | subroutine DYNdgz includes in the Horizontal Momentum Equations | + ! | the terms representing the Pressure Gradient Force (PGF) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ brocam: Brown and Campana Time Scheme Switch | + ! | itFast: Short Time Step Counter | + ! | | + ! | uairDY, vairDY, pktaDY : u, v, and P / Time Step n | + ! | ubefDY, vbefDY, ddux,ddvx: u, v / Time Step n-1, n-2 | + ! | uairDY: x-wind speed component (m/s) | + ! | vairDY: y-wind speed component (m/s) | + ! | pktaDY: potential temperature divided by 100.[kPa]**(R/Cp) | + ! | virDY: Contribution from Air Loading (kg/kg) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ uairDY, vairDY, pktaDY: u, v, and P Values / Time Step n+1 | + ! | gpmiDY(i,j,k) = g * z (i,j,k-1/2), (Geopotential) (m2/s2) | + ! | | + ! | METHOD: 1) Solves the Hydrostatic Relation: | + ! | ^^^^^^ 0 =- 1 /rho -dPHI/dp | + ! | => gives the Geopotential PHI between Sigma Levels| + ! | 2) Solves the Contributions : | + ! | du/dt:= -dPHI/dx | + ! | dv/dt:= -dPHI/dy | + ! | 3) Spatial Numerical Scheme : | + ! | Spatial Discretisation on Arakawa A Grid | + ! | norder.EQ.2 2th Order Accurate Horizontal Spatial Differencing .OR. | + ! | norder.NE.2 4th Order Accurate Horizontal Spatial Differencing | + ! | dPHI/dx and dPHI/dy are computed on p**(R/Cp) Surfaces | + ! | 4) Temporal Numerical Scheme : | + ! | Time Split (i.e. each contribution computed separately) | + ! | Split Time Differencing, i.e. pressure Evolution and | + ! | PGF are computed on Short Time Step dtfast=dt/(ntFast+1)| + ! | Advection and Diffusion are Computed on a Longer One) | + ! | Brown and Campana Time Scheme used over Short Time Step | + ! | | + ! | REFER.: 1) Purser and Leslie, MWR 116, 2069--2080, 1988 (A Grid)| + ! | ^^^^^^ 2) Marchuk, Numer.Meth.in Weath.Predict., 1974 (Time Split)| + ! | 3) Gadd, QJRMS 104, 569--582, 1978 (Split Time Differencing)| + ! | 4) Brown and Campana, MWR 106, 1125--1136, 1978 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_ub + use mar_wk + use marvec + + use trackwind, only : track_dgz, delta_u_dgz, delta_v_dgz, & + i_dgzadv, i_dgzpgf, itw, ntrackdgz, & + dudt_t, dudt_tm1, c1a_t, c1a_tm1, c1a_tm2 + + implicit none + + integer norder + integer i, j, k, m + + ! +--Local Variables + ! + ================ + + ! WTxyz1 : Advected u-Momentum + !real WTxyz1(mx, my, mz) + ! WTxyz2 : Advected v-Momentum + !real WTxyz2(mx, my, mz) + + real bca, bcb, c1a, c1b, ddux, ddvx, fraCLS, sigCLS + real Raylei + + ! +--DATA + ! + ==== + ! +...Parameters of the Brown-Campana (1978, MWR, p.1125) scheme + ! + WARNING : scheme is unstable for bca maximum value (0.25) + data bca/0.245e0/, bcb/0.510e0/ + + ! +--Contributions from Momentum Advection + ! + ===================================== + + ! + ********** + call DYNadv_dLF_mp(norder, uairDY, vairDY, WTxyz1, WTxyz2) + ! + ********** + + ! +--Integration of the Hydrostatic Equation + ! + ======================================= + + ! +--EXNER Potential + ! + --------------- + + if(brocam) then + do j = 1, my + do i = 1, mx + WKxy4(i, j) = exp(cap * log(pstDYn(i, j) + ptopDY)) + WKxy1(i, j) = cp * WKxy4(i, j) + enddo + enddo + else + do j = 1, my + do i = 1, mx + WKxy4(i, j) = exp(cap * log(pstDY(i, j) + ptopDY)) + WKxy1(i, j) = cp * WKxy4(i, j) + enddo + enddo + + endif + + ! +--Surface Contribution to Exner Function + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! fraCLS : CLS Fraction where Temperature~Surface Temperature + ! 0<fraCLS<1 and generally close to zero + ! fraCLS = 0.5 ==> linear variation of potential Temperature + ! is assumed beween levels k=mz and k=mzz + fraCLS = 0.0d+0 +#if(IL) + fraCLS = 0.5d+0 +#endif + ! + + sigCLS = (1.0d+0 - fraCLS) + fraCLS * sigma(mz) + + if(brocam) then + do j = 1, my + do i = 1, mx + WKxy5(i, j) = cp * exp(cap * log(pstDYn(i, j) * sigCLS + ptopDY)) + enddo + enddo + else + do j = 1, my + do i = 1, mx + WKxy5(i, j) = cp * exp(cap * log(pstDY(i, j) * sigCLS + ptopDY)) + enddo + enddo + endif + + ! +--Atmospheric Contribution to Exner Function + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + !$OMP PARALLEL do private (i,j,k) + do j = 1, my + do k = 1, mz + if(k >= mz .and. ptopDY <= 0.0) then + ! do j=1,my + do i = 1, mx + WKxy3(i, j) = 0.0 + enddo + ! end do + else + if(brocam) then + ! do j=1,my + do i = 1, mx + WKxy3(i, j) = exp(cap * log(pstDYn(i, j) * sigmid(mzz - k) + ptopDY)) + enddo + ! end do + else + ! do j=1,my + do i = 1, mx + WKxy3(i, j) = exp(cap * log(pstDY(i, j) * sigmid(mzz - k) + ptopDY)) + enddo + ! end do + endif + endif + + ! do j=1,my + do i = 1, mx + WKxy2(i, j) = cp * WKxy3(i, j) + ! WKxyz4 : p ** (R/Cp) + WKxyz4(i, j, mzz - k) = WKxy3(i, j) + enddo + ! end do + + ! +--GEO---Potential (Mid Layer k-1/2) + ! + --------------- + + if (k==1) then + ! +--Of the Surface Layer + ! + ~~~~~~~~~~~~~~~~~~~~ + ! do j=1,my + do i = 1, mx + ! REMARK : It is assumed that the Geopotential Difference + ! in Lower Layer depends only on pktaDY at 1st Sigma Lev. + ! gpmiDY(mz) = gplvDY(mzz) + Cp * Delta[P**(R/Cp)] * [Theta/P0**(R/Cp)] + ! = gpmiDY_surf + Cp * Delta T + gpmiDY(i, j, mz) = gplvDY(i, j, mzz) & + + ((WKxy5(i, j) - WKxy2(i, j)) * pktaDY(i, j, mz) & + + (WKxy1(i, j) - WKxy5(i, j)) * pktaDY(i, j, mzz)) & + * (1.0 + virDY(i, j, mz)) + enddo + ! end do + else + ! +--Above the Surface Layer + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + ! do j=1,my + do i = 1, mx + gpmiDY(i, j, mzz - k) = gpmiDY(i, j, mzz + 1 - k) & + + (WKxy1(i, j) - WKxy2(i, j)) * pktaDY(i, j, mzz - k) & + * (1.0 + virDY(i, j, mzz - k)) + enddo + ! end do + endif + ! do j=1,my + do i = 1, mx + WKxy1(i, j) = WKxy2(i, j) + enddo + ! end do + enddo + enddo + !$OMP END PARALLEL DO + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Update of u and v at the Lateral Boundaries + ! + =========================================== + + !$OMP PARALLEL do private(i,j,k,c1a,c1b,dudt_t,c1a_t,ddux,ddvx) + do k = 1, mz + do j = 1, my + ubefDY(1, j, k) = uairDY(1, j, k) + ubefDY(mx, j, k) = uairDY(mx, j, k) + vbefDY(1, j, k) = vairDY(1, j, k) + vbefDY(mx, j, k) = vairDY(mx, j, k) + enddo + ! end do + if(mmy > 1) then + ! do k=1,mz + do i = 1, mx + ubefDY(i, 1, k) = uairDY(i, 1, k) + ubefDY(i, my, k) = uairDY(i, my, k) + vbefDY(i, 1, k) = vairDY(i, 1, k) + vbefDY(i, my, k) = vairDY(i, my, k) + enddo + ! end do + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Mesoscale Geopotential Gradient + ! + =============================== + + ! do k=1,mz + + ! +--For Hydrostatic Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if (k==mz) then + do j = 1, my + do i = 1, mx + WKxyz7(i, j, k) = WKxy4(i, j) + WKxyz1(i, j, k) = gplvDY(i, j, mzz) + enddo + enddo + else + do j = 1, my + do i = 1, mx + WKxyz7(i, j, k) = WKxyz4(i, j, k + 1) + WKxyz1(i, j, k) = gpmiDY(i, j, k + 1) + enddo + enddo + end if + + do j = 1, my + do i = 1, mx + ! WKxyz8 = P**(R/Cp)(k-1/2) - P**(R/Cp)(k+1/2) + WKxyz8(i, j, k) = WKxyz4(i, j, k) - WKxyz7(i, j, k) + enddo + enddo + + ! +--For Hydrostatic Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! do j = jp11, my1 + ! do i = ip11, mx1 ! i = 1, mx + do j = 1, my + do i = 1, mx + ! WKxyz2 = ( P**(R/Cp)(k-1/2) * gpmiDY(k + 1/2) - P**(R/Cp)(k+1/2) * gpmiDY(i, j, k-1/2) ) / ( P**(R/Cp)(k-1/2) - P**(R/Cp)(k+1/2) ) + WKxyz2(i, j, k) = (WKxyz4(i, j, k) * WKxyz1(i, j, k) - WKxyz7(i, j, k) * gpmiDY(i, j, k)) / WKxyz8(i, j, k) + ! WKxyz3 = ( gpmiDY(i, j, k-1/2) - gpmiDY(k + 1/2) ) / ( P**(R/Cp)(k-1/2) - P**(R/Cp)(k+1/2) ) (later : * P**(R/Cp)(k)) + WKxyz3(i, j, k) = (gpmiDY(i, j, k) - WKxyz1(i, j, k)) / WKxyz8(i, j, k) + ! P2 = P**(R/Cp)(k-1/2) | P1 = P**(R/Cp)(k+1/2) | Phi2 = gpmiDY(i, j, k-1/2) | Phi2 = gpmiDY(i, j, k+1/2) + ! Phi = (Phi1 + Phi2) / 2. + ! (P2 - P1) * (Phi1 + Phi2) = P2 * Phi1 + P2 * Phi2 - P1 * Phi1 - P1 * Phi2 + ! = (P2 * Ph1 - P1 * Phi2) + (P2 * Phi2 - P1 * Phi1) + ! = (P2 * Ph1 - P1 * Phi2) + P * (Phi2 - Phi1) + ! = WKxyz2 * (P2 - P1) + P * WKxyz3 * (P2 - P1) + ! = (P2 - P1) * 2 * Phi + enddo + enddo + + ! +--Gradient following x + ! + -------------------- + if(norder == 2) then + do i = 1, mx + do j = jp11, my1 + WKxyz5(i, j, k) = (WKxyz2(ip1(i), j, k) - WKxyz2(im1(i), j, k)) * dxinv3(i, j) + WKxyz6(i, j, k) = (WKxyz3(ip1(i), j, k) - WKxyz3(im1(i), j, k)) * dxinv3(i, j) + enddo + enddo + else + do i = 1, mx + do j = jp11, my1 + WKxyz5(i, j, k) = & + fac43 * (WKxyz2(ip1(i), j, k) - WKxyz2(im1(i), j, k) & + - 0.125 * (WKxyz2(ip2(i), j, k) - WKxyz2(im2(i), j, k))) * dxinv3(i, j) + WKxyz6(i, j, k) = & + fac43 * (WKxyz3(ip1(i), j, k) - WKxyz3(im1(i), j, k) & + - 0.125 * (WKxyz3(ip2(i), j, k) - WKxyz3(im2(i), j, k))) * dxinv3(i, j) + enddo + enddo + endif + + ! +--Contribution to u Wind Speed Component + ! + -------------------------------------- + if (itFast==1) then + ! +- First Step + ! + ~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz1(i, j, k) + + c1b = dtfast * c1a + ubefDY(i, j, k) = uairDY(i, j, k) + c1b + uairDY(i, j, k) = uairDY(i, j, k) + c1b + c1b + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! values added to ubefDY = uairDY(n-1) + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz1(i, j, k) + ! u_tm1 = uairDY + dtfast * dudt + ! u_t = uairDY + 2 * dtfast * dudt + ! save previous values + do itw = 1, ntrackdgz + delta_u_dgz(i, j, k, itw) = delta_u_dgz(i, j, k, itw) + 2. * dtfast * c1a_t(itw) + dudt_tm1(i, j, k, itw) = c1a_t(itw) * 0.5 + c1a_tm2(i, j, k, itw) = c1a_t(itw) + c1a_tm1(i, j, k, itw) = c1a_t(itw) + end do + end if + dg1xDY(i, j, k) = c1a ! dudt_tm2 + dgzxDY(i, j, k) = c1a ! dudt_tm1 + enddo + enddo + else + ! +- Next Step + ! + ~~~~~~~~~~ + if(itFast <= ntFast) then + if(brocam) then + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz1(i, j, k) + + ddux = ubefDY(i, j, k) + ubefDY(i, j, k) = uairDY(i, j, k) + uairDY(i, j, k) = ddux + 2.0 * dtfast & + * (bcb * dgzxDY(i, j, k) & + + bca * (c1a + dg1xDY(i, j, k))) + ! +... U (n+1) = U(n-1) + 2 Dt (Du/Dt) + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz1(i, j, k) + do itw = 1, ntrackdgz + dudt_t = bcb * c1a_tm1(i, j, k, itw) + bca * (c1a_t(itw) + c1a_tm2(i, j, k, itw)) + ! u_tm1 = uairDY - 2 * dtfast * dudt_tm1 + ! uairDY = u_tm1 + 2 * dtfast * dudt_t + ! uairDY = uairDY + 2 * dtfast * (dudt_t - dudt_tm1) + delta_u_dgz(i, j, k, itw) = delta_u_dgz(i, j, k, itw) + & + 2. * dtfast * (dudt_t - dudt_tm1(i, j, k, itw)) + ! save previous values + dudt_tm1(i, j, k, itw) = dudt_t + c1a_tm2(i, j, k, itw) = c1a_tm1(i, j, k, itw) + c1a_tm1(i, j, k, itw) = c1a_t(itw) + end do + end if +#if(rt) + ! +- Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + ubefDY(i, j, k) = ubefDY(i, j, k) & + + Robert * (0.5 * (uairDY(i, j, k) + ddux) - ubefDY(i, j, k)) +#endif + dg1xDY(i, j, k) = dgzxDY(i, j, k) ! dudt_tm2 = dudt_tm1 + dgzxDY(i, j, k) = c1a ! dudt_tm1 = dudt_t + enddo + enddo + else + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz1(i, j, k) + + ddux = ubefDY(i, j, k) + ubefDY(i, j, k) = uairDY(i, j, k) + uairDY(i, j, k) = ddux + 2.0 * dtfast * c1a + ! +... U (n+1) = U(n-1) + 2 Dt (Du/Dt) + + enddo + enddo + endif + else + ! +- Last Step + ! + ~~~~~~~~~~ + if(brocam) then + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz1(i, j, k) + + ddux = ubefDY(i, j, k) + ubefDY(i, j, k) = uairDY(i, j, k) + uairDY(i, j, k) = ddux + dtfast & + * (bcb * dgzxDY(i, j, k) & + + bca * (c1a + dg1xDY(i, j, k))) + ! +... U (n+1) = U(n) + Dt (Du/Dt)' + ! + Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz1(i, j, k) + do itw = 1, ntrackdgz + dudt_t = bcb * c1a_tm1(i, j, k, itw) + bca * (c1a_t(itw) + c1a_tm2(i, j, k, itw)) + ! u_tm1 = uairDY - 2 * dtfast * dudt_tm1 + ! uairDY = u_tm1 + dtfast * dudt_t + ! uairDY = uairDY + dtfast * (dudt_t - 2 * dudt_tm1) + delta_u_dgz(i, j, k, itw) = delta_u_dgz(i, j, k, itw) + & + dtfast * (dudt_t - 2 * dudt_tm1(i, j, k, itw)) + end do + end if + dg1xDY(i, j, k) = dgzxDY(i, j, k) + dgzxDY(i, j, k) = c1a + enddo + enddo + else + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz1(i, j, k) + + ddux = ubefDY(i, j, k) + ubefDY(i, j, k) = uairDY(i, j, k) + uairDY(i, j, k) = ddux + dtfast * c1a + ! +... U (n+1) = U(n) + Dt (Du/Dt)' + ! + Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + + enddo + enddo + endif + endif + endif + + ! +- Gradient following y + ! + -------------------- + + if(mmy > 1) then + ! do j = 1, my + ! WKxyz2(1, j, k) = 0. + ! WKxyz2(mx, j, k) = 0. + ! WKxyz3(1, j, k) = 0. + ! WKxyz3(mx, j, k) = 0. + ! enddo + ! do i = ip11, mx1 + ! WKxyz2(i, 1, k) = (WKxyz4(i, 1, k) * WKxyz1(i, 1, k) - WKxyz7(i, 1, k) * gpmiDY(i, 1, k)) / WKxyz8(i, 1, k) + ! WKxyz3(i, 1, k) = (gpmiDY(i, 1, k) - WKxyz1(i, 1, k)) / WKxyz8(i, 1, k) + ! WKxyz2(i, my, k) = (WKxyz4(i, my, k) * WKxyz1(i, my, k) - WKxyz7(i, my, k) * gpmiDY(i, my, k)) / WKxyz8(i, my, k) + ! WKxyz3(i, my, k) = (gpmiDY(i, my, k) - WKxyz1(i, my, k)) / WKxyz8(i, my, k) + ! end do + ! do j = jp11, my1 + ! do i = 1, mx + + ! +--For Hydrostatic Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! do i = ip11, mx1 + ! do j = 1, my + ! WKxyz2(i, j, k) = (WKxyz4(i, j, k) * WKxyz1(i, j, k) & + ! - WKxyz7(i, j, k) * gpmiDY(i, j, k)) / WKxyz8(i, j, k) + ! WKxyz3(i, j, k) = (gpmiDY(i, j, k) - WKxyz1(i, j, k)) / WKxyz8(i, j, k) + ! enddo + ! enddo + + if(norder == 2) then + do j = 1, my + do i = ip11, mx1 + WKxyz5(i, j, k) = (WKxyz2(i, jp1(j), k) - WKxyz2(i, jm1(j), k)) * dyinv3(i, j) + WKxyz6(i, j, k) = (WKxyz3(i, jp1(j), k) - WKxyz3(i, jm1(j), k)) * dyinv3(i, j) + enddo + enddo + else + do j = 1, my + do i = ip11, mx1 + WKxyz5(i, j, k) = fac43 * (WKxyz2(i, jp1(j), k) - WKxyz2(i, jm1(j), k)& + - 0.125 * (WKxyz2(i, jp2(j), k) - WKxyz2(i, jm2(j), k))) * dyinv3(i, j) + WKxyz6(i, j, k) = fac43 * (WKxyz3(i, jp1(j), k) - WKxyz3(i, jm1(j), k)& + - 0.125 * (WKxyz3(i, jp2(j), k) - WKxyz3(i, jm2(j), k))) * dyinv3(i, j) + enddo + enddo + endif + + ! +--Contribution to v Wind Speed Component + ! + -------------------------------------- + if (itFast==1) then + ! +- First Step + ! + ~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz2(i, j, k) + + c1b = dtfast * c1a + vbefDY(i, j, k) = vairDY(i, j, k) + c1b + vairDY(i, j, k) = vairDY(i, j, k) + c1b + c1b + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! values added to ubefDY = uairDY(n-1) + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz2(i, j, k) + do itw = 1, ntrackdgz + ! u_tm1 = uairDY + dtfast * dudt + ! u_t = uairDY + 2 * dtfast * dudt + delta_v_dgz(i, j, k, itw) = delta_v_dgz(i, j, k, itw) + 2. * dtfast * c1a_t(itw) + ! save previous values + dudt_tm1(i, j, k, itw) = c1a_t(itw) * 0.5 + c1a_tm2(i, j, k, itw) = c1a_t(itw) + c1a_tm1(i, j, k, itw) = c1a_t(itw) + end do + end if + + dg1yDY(i, j, k) = c1a + dgzyDY(i, j, k) = c1a + enddo + enddo + else + ! +- Next Step + ! + ~~~~~~~~~~ + if(itFast <= ntFast) then + if(brocam) then + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz2(i, j, k) + + ddvx = vbefDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + vairDY(i, j, k) = ddvx + 2.0 * dtfast & + * (bcb * dgzyDY(i, j, k) & + + bca * (c1a + dg1yDY(i, j, k))) + ! + V (n+1) = V(n-1) + 2 Dt (Dv/Dt) + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz2(i, j, k) + do itw = 1, ntrackdgz + dudt_t = bcb * c1a_tm1(i, j, k, itw) + bca * (c1a_t(itw) + c1a_tm2(i, j, k, itw)) + ! u_tm1 = uairDY - 2 * dtfast * dudt_tm1 + ! uairDY = u_tm1 + 2 * dtfast * dudt_t + ! uairDY = uairDY + 2 * dtfast * (dudt_t - dudt_tm1) + delta_v_dgz(i, j, k, itw) = delta_v_dgz(i, j, k, itw) + & + 2. * dtfast * (dudt_t - dudt_tm1(i, j, k, itw)) + ! save previous values + dudt_tm1(i, j, k, itw) = dudt_t + c1a_tm2(i, j, k, itw) = c1a_tm1(i, j, k, itw) + c1a_tm1(i, j, k, itw) = c1a_t(itw) + end do + end if +#if(rt) + ! +- Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + vbefDY(i, j, k) = vbefDY(i, j, k) & + + Robert * (0.5 * (vairDY(i, j, k) + ddvx) - vbefDY(i, j, k)) +#endif + dg1yDY(i, j, k) = dgzyDY(i, j, k) + dgzyDY(i, j, k) = c1a + enddo + enddo + else + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz2(i, j, k) + + ddvx = vbefDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + vairDY(i, j, k) = ddvx + 2.0 * dtfast * c1a + ! + V (n+1) = V(n-1) + 2 Dt (Dv/Dt) + + enddo + enddo + endif + else + ! +- Last Step + ! + ~~~~~~~~~~ + if(brocam) then + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz2(i, j, k) + + ddvx = vbefDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + vairDY(i, j, k) = ddvx + dtfast & + * (bcb * dgzyDY(i, j, k) & + + bca * (c1a + dg1yDY(i, j, k))) + ! +... V (n+1) = V(n) + Dt (Dv/Dt)' + ! + Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + + if(track_dgz) then + ! cCA value without gradient time scheme + ! cCA in standard configuration, ntFast = 1 => itFast = 1..2 + ! compute new values + c1a_t(i_dgzpgf) = - WKxyz5(i, j, k) - pkDY(i, j, k) * WKxyz6(i, j, k) + c1a_t(i_dgzadv) = WTxyz2(i, j, k) + do itw = 1, ntrackdgz + dudt_t = bcb * c1a_tm1(i, j, k, itw) + bca * (c1a_t(itw) + c1a_tm2(i, j, k, itw)) + ! u_tm1 = uairDY - 2 * dtfast * dudt_tm1 + ! uairDY = u_tm1 + dtfast * dudt_t + ! uairDY = uairDY + dtfast * (dudt_t - 2 * dudt_tm1) + delta_v_dgz(i, j, k, itw) = delta_v_dgz(i, j, k, itw) + & + dtfast * (dudt_t - 2 * dudt_tm1(i, j, k, itw)) + end do + end if + dg1yDY(i, j, k) = dgzyDY(i, j, k) + dgzyDY(i, j, k) = c1a + enddo + enddo + else + do j = jp11, my1 + do i = ip11, mx1 + c1a = -(WKxyz5(i, j, k) + pkDY(i, j, k) * WKxyz6(i, j, k)) & + + WTxyz2(i, j, k) + + ddvx = vbefDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + vairDY(i, j, k) = ddvx + dtfast * c1a + ! +... V (n+1) = V(n) + Dt (Dv/Dt)' + ! + Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + + enddo + enddo + endif + endif + endif + endif + + ! +--Rayleigh Friction (Ref. ARPS 4.0 User's Guide, para 6.4.3 p.152) + ! + ================= + if(k <= mzabso) then + do j = 1, my + do i = 1, mx + uairDY(i, j, k) = (uairDY(i, j, k) + Ray_UB(k) * dtFast * uairUB(i, j, k)) & + / (1.0 + Ray_UB(k) * dtFast) + vairDY(i, j, k) = (vairDY(i, j, k) + Ray_UB(k) * dtFast * vairUB(i, j, k)) & + / (1.0 + Ray_UB(k) * dtFast) + enddo + enddo + endif + enddo + !$OMP END PARALLEL DO + return +end diff --git a/MAR/code_mar/dyndps.f90 b/MAR/code_mar/dyndps.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fb03d07285ce027854edcbec5a8f7a65987b260b --- /dev/null +++ b/MAR/code_mar/dyndps.f90 @@ -0,0 +1,1264 @@ +#include "MAR_pp.def" +subroutine DYNdps_mp(norder) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FAST 15-04-2021 MAR | + ! | subroutine DYNdps solves the Mass Conservation Equation | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT/ (via common block) | + ! | ^^^^^ iterun : long time step counter | + ! | itFast : short time step counter | + ! | norder : numerical scheme: order of precision | + ! | | + ! | INPUT/ (via common block) | + ! | OUTPUT pstDYn(mx,my) : Pressure Depth p*(t) (kPa) | + ! | ^^^^^^ pstDY(mx,my) : Pressure Depth p*(t-dt) | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ uairDY(mx,my,mz): x-Wind Speed (m/s) | + ! | vairDY(mx,my,mz): y-Wind Speed (m/s) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ psigDY: p* X Vertical Wind Speed; Sigma Syst.(i.e. p* Ds/Dt) | + ! | psigDY Computed ON the Sigma Levels (unstaggered) | + ! | IN Layers (staggered) | + ! | | + ! | METHOD: Implicit Time Scheme (pImplc Switch is .true. ) | + ! | ^^^^^^ 2th order accurate Time Scheme (semi-implicit) .and. | + ! | 2th order accurate Space Scheme on Arakawa A grid | + ! | | + ! | Explicit Time Scheme (pImplc Switch is .false.) | + ! | Centered Scheme (center Switch is .true. ) | + ! | 2th order accurate Time Scheme (leapfrog backw.) .and. | + ! | norder.EQ.2 (2th order accurate Space Scheme on Arakawa A grid .OR. | + ! | norder.NE.2 4th order accurate Space Scheme on Arakawa A grid) | + ! | .OR. | + ! | Non-Centered Scheme (center Switch is .false.) | + ! | 0th order accurate Space Scheme (Bott) (norder=0) .OR. | + ! | 4th order accurate Space Scheme (Bott) (norder=4) | + ! | | + ! | Robert Time Filter may be used to remove computational mode | + ! | | + ! | REFER.: Use of A grid: Purser and Leslie, MWR 116, 2069--2080, 1988 | + ! | ^^^^^^ Time Scheme : Lin and Rood MWR 124, 2046--2070, 1996 | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_wk +#if(ON) + use mar_te +#endif + + implicit none + + integer i, j, k, m + integer norder + + logical pImplc, locorr + + integer mxx, myy + parameter(mxx=mx + 1, myy=my + 1) + real vecx(0:mxx), flux(0:mxx) + real aa0x(0:mxx), aa1x(0:mxx), aa2x(0:mxx) + real aa3x(0:mxx), aa4x(0:mxx) + real cnpx(0:mxx), cnmx(0:mxx) + real sipx(0:mxx), simx(0:mxx), sidx(0:mxx) + real vecy(0:myy), fluy(0:myy) + real aa0y(0:myy), aa1y(0:myy), aa2y(0:myy) + real aa3y(0:myy), aa4y(0:myy) + real cnpy(0:myy), cnmy(0:myy) + real sipy(0:myy), simy(0:myy), sidy(0:myy) + + integer it_pst, nt_pst, idir_x, jdir_y + integer i1_dps, i2_dps, j1_dps, j2_dps, k1_dps, k2_dps + real alphpp, betapp, Fp__pp, Fpa_pp, Fpb_pp, facovr + real CorArg, CorrNH, SRes_0, SRes_1, SRes10, pst_n1 + real dtcorr, dtxfas, dtyfas, uuface, vvface + + integer numdps, ntpsig + common / DYNdps_int / numdps, ntpsig + + real psigad(mx, my, mz) + common / DYNdps_rea / psigad + + ! +--DATA + ! + ==== + ! +... pImplc=.true. ==> Implicit Scheme is used to damp Lamb Waves + data pImplc/.false./ + + numdps = numdps + 1 + + ! +--Save Mass at the Lateral Boundaries + ! + =================================== + do j = 1, my + do i = 1, mx + ! + p*(n-1) + WTxy1(i, j) = pstDY(i, j) + ! + p*(n) + WTxy2(i, j) = pstDYn(i, j) + enddo + enddo + + do j = 1, my + pstDY(1, j) = pstDYn(1, j) + pstDY(mx, j) = pstDYn(mx, j) + enddo + + if(mmy > 1) then + do i = 1, mx + pstDY(i, 1) = pstDYn(i, 1) + pstDY(i, my) = pstDYn(i, my) + enddo + endif + + if(pImplc) then + ! ++++++++++++++++++++++++++++ + ! +--IMPLICIT SCHEME (BEGIN) + + ! ++++++++++++++++++++++++++++ + if(it_Mix == 1 .and. itFast == 1) then + ! +--Horizontal Wind Speed: Average along the Vertical + ! + ------------------------------------------------- + do j = 1, my + do i = 1, mx + WTxy3(i, j) = 0.0 + WTxy4(i, j) = 0.0 + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxy3(i, j) = WTxy3(i, j) + uairDY(i, j, k) * dsigm1(k) + WTxy4(i, j) = WTxy4(i, j) + vairDY(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + ! +--Tridiagonal Matrix Coefficients + ! + ------------------------------- + betapp = 0.6 + alphpp = 1.0 - betapp + Fp__pp = dt / dx + Fpa_pp = Fp__pp * alphpp + Fpb_pp = Fp__pp * betapp + do i = ip11, mx1 + do j = jp11, my1 + WTxyz1(i, j, 1) = Fpb_pp * WTxy3(ip1(i), j) ! k=1: 3-Diag Matrix, x-Dir + WTxyz3(i, j, 1) = -Fpb_pp * WTxy3(im1(i), j) ! k=1: 3-Diag Matrix, x-Dir + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WTxyz1(i, j, 2) = Fpb_pp * WTxy4(i, jp1(j)) ! k=2: 3-Diag Matrix, y-Dir + WTxyz3(i, j, 2) = -Fpb_pp * WTxy4(i, jm1(j)) ! k=2: 3-Diag Matrix, y-Dir + enddo + enddo + + ! +--Overrelaxation Starting Block + ! + ----------------------------- + + ! +--Independant Term: constant contribution ! x-Dir + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = ip11, mx1 + do j = jp11, my1 + WTxyz8(i, j, 1) = pstDY(i, j) & + - Fpa_pp * WTxy3(ip1(i), j) * pstDY(ip1(i), j) & + + Fpa_pp * WTxy3(im1(i), j) * pstDY(im1(i), j) + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WTxyz8(i, j, 1) = WTxyz8(i, j, 1) & + - Fpa_pp * WTxy4(i, jp1(j)) * pstDY(i, jp1(j)) & + + Fpa_pp * WTxy4(i, jm1(j)) * pstDY(i, jm1(j)) + enddo + enddo + + ! +--Dirichlet Condition x-LBC ! x-Dir + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + i = mx1 + do j = jp11, my1 + WTxyz8(i, j, 1) = WTxyz8(i, j, 1) - Fpb_pp * WTxy3(ip1(i), j) * pstDY(ip1(i), j) + WTxyz1(i, j, 1) = 0.0 +#if(WR) + write(6, *) ip1(i), ' ', pstDY(ip1(i), j) +#endif + enddo + + i = ip11 + do j = jp11, my1 + WTxyz8(i, j, 1) = WTxyz8(i, j, 1) & + + Fpb_pp * WTxy3(im1(i), j) * pstDY(im1(i), j) + WTxyz3(i, j, 1) = 0.0 +#if(WR) + write(6, *) im1(i), ' ', pstDY(im1(i), j) +#endif + enddo + + ! +--Dirichlet Condition y-LBC + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + if(mmy > 1) then + j = my1 + do i = ip11, mx1 + WTxyz8(i, j, 1) = WTxyz8(i, j, 1) & + - Fpb_pp * WTxy3(i, jp1(j)) * pstDY(i, jp1(j)) + WTxyz1(i, j, 2) = 0.0 +#if(WR) + write(6, *) jp1(j), ' ', pstDY(i, jp1(j)) +#endif + enddo + ! + + j = jp11 + do i = ip11, mx1 + WTxyz8(i, j, 1) = WTxyz8(i, j, 1) & + + Fpb_pp * WTxy3(i, jm1(j)) * pstDY(i, jm1(j)) + WTxyz3(i, j, 2) = 0.0 +#if(WR) + write(6, *) jm1(j), ' ', pstDY(i, jm1(j)) +#endif + enddo + endif + + ! +--First Estimate + ! + ~~~~~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + WTxyz7(i, j, 1) = pstDY(i, j) ! Previous Estimate + WTxyz7(i, j, 2) = 0.0 ! Half-Iteration Estimate + WTxyz7(i, j, 3) = pstDY(i, j) ! Next to update Estimate + enddo + enddo + + ! +--Recurrence + ! + ~~~~~~~~~~ + facovr = 1.1 + nt_pst = 4 + it_pst = 0 + SRes_1 = 0.0 +1000 continue + it_pst = it_pst + 1 + + ! +--Resolution along the x-Direction + ! + -------------------------------- + + ! +--Tridiagonal Matrix Coefficients + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + WTxyz1(i, j, 3) = WTxyz1(i, j, 1) ! Index 1 ==> x-Dir + WTxyz2(i, j, 3) = 1.0d+0 ! + WTxyz3(i, j, 3) = WTxyz3(i, j, 1) ! + enddo + enddo + + ! +--Independant Term + ! + ~~~~~~~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + ! Index 1 ==> ALL-Dir + WTxyz4(i, j, 3) = WTxyz8(i, j, 1) & + - WTxyz1(i, j, 2) * WTxyz7(i, jp1(j), 1) & + - WTxyz3(i, j, 2) * WTxyz7(i, jm1(j), 1) + enddo + enddo + + ! +--Tridiagonal Matrix Inversion ! OUTPUT is WTxyz7(i,j,3) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + i1_dps = ip11 + i2_dps = mx1 + j1_dps = jp11 + j2_dps = my1 + k1_dps = 3 + k2_dps = 3 + + ! + ******** + call MARgau_x(i1_dps, i2_dps, j1_dps, j2_dps, k1_dps, k2_dps) + ! + ******** + + ! +--Resolution along the y-Direction + ! + -------------------------------- + + if(mmy > 1) then + ! +--Tridiagonal Matrix Coefficients ! Index 2 ==> y-Dir + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do j = jp11, my1 + do i = ip11, mx1 + WTxyz1(i, j, 3) = WTxyz1(i, j, 2) + WTxyz2(i, j, 3) = 1. + WTxyz3(i, j, 3) = WTxyz3(i, j, 2) + ! Half-Iteration Estimate + WTxyz7(i, j, 2) = WTxyz7(i, j, 3) + enddo + enddo + + ! +--Independant Term ! y-Dir + ! + ~~~~~~~~~~~~~~~~ + do i = ip11, mx1 + do j = jp11, my1 + ! Index 1 ==> ALL-Dir + WTxyz4(i, j, 3) = WTxyz8(i, j, 1) & + - WTxyz1(i, j, 1) * WTxyz7(ip1(i), j, 2) & + - WTxyz3(i, j, 1) * WTxyz7(im1(i), j, 2) + enddo + enddo + + ! +--Tridiagonal Matrix Inversion ! OUTPUT is WTxyz7(i,j,3) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + i1_dps = ip11 + i2_dps = mx1 + j1_dps = jp11 + j2_dps = my1 + k1_dps = 3 + k2_dps = 3 + + ! + ******** + call MARgau_y(i1_dps, i2_dps, j1_dps, j2_dps, k1_dps, k2_dps) + ! + ******** + + endif + + ! +--Residual is obtained by substracting next from former estimated Equation + ! + ------------------------------------------------------------------------ + + do i = ip11, mx1 + do j = jp11, my1 + WTxyz6(i, j, 1) = WTxyz1(i, j, 1) * WTxyz7(ip1(i), j, 3) & + + WTxyz3(i, j, 1) * WTxyz7(im1(i), j, 3) + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WTxyz6(i, j, 1) = WTxyz6(i, j, 1) & + + WTxyz1(i, j, 2) * WTxyz7(i, jp1(j), 3) & + + WTxyz3(i, j, 2) * WTxyz7(i, jm1(j), 3) & + + WTxyz7(i, j, 3) & + - WTxyz8(i, j, 1) + enddo + enddo + + SRes_1 = 0.0 + do j = jp11, my1 + do i = ip11, mx1 + SRes_1 = SRes_1 + abs(WTxyz6(i, j, 1)) + enddo + enddo + + if(it_pst > 1) then + SRes10 = SRes_1 / SRes_0 + else + SRes_0 = SRes_1 + SRes10 = 1.0 + endif + + ! +--New Estimate + ! + ------------ + + if(SRes10 > 0.1 .and. it_pst < nt_pst & + .and. mmy > 1) then + do j = jp11, my1 + do i = ip11, mx1 + WTxyz7(i, j, 1) = WTxyz7(i, j, 3) & + - facovr * WTxyz6(i, j, 1) / WTxyz2(i, j, 1) + WTxyz7(i, j, 3) = WTxyz7(i, j, 1) + enddo + enddo + endif + ! + +#if(WR) + write(6, 1001) iterun, it_pst, SRes10 +1001 format(2i9, f21.15) +#endif + ! + + if(SRes10 > 1.0d-1 .and. it_pst < nt_pst & + .and. mmy > 1) go to 1000 + + ! +--Final Estimate + ! + -------------- + + do j = jp11, my1 + do i = ip11, mx1 + pstDY(i, j) = WTxyz7(i, j, 3) + pstDYn(i, j) = WTxyz7(i, j, 3) + enddo + enddo + + ! +--Lateral Boundary Conditions + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do j = jp11, my1 + pstDY(1, j) = WTxy1(1, j) + pstDY(mx, j) = WTxy1(mx, j) + pstDYn(1, j) = WTxy1(1, j) + pstDYn(mx, j) = WTxy1(mx, j) + enddo + + if(mmy > 1) then + do i = ip11, mx1 + pstDY(i, 1) = WTxy1(i, 1) + pstDY(i, my) = WTxy1(i, my) + pstDYn(i, 1) = WTxy1(i, 1) + pstDYn(i, my) = WTxy1(i, my) + enddo + endif + + ! +--Contribution to Vertical Material Speed + ! + --------------------------------------- + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz3(i, j, k) = uairDY(i, j, k) * pstDYn(i, j) + WTxyz4(i, j, k) = vairDY(i, j, k) * pstDYn(i, j) + WTxyz8(i, j, k) = 0. + enddo + enddo + + do j = 1, my + do i = 1, mx + WTxyz7(i, j, k) = (WTxyz3(im1(i), j, k) - WTxyz3(ip1(i), j, k) & + ) + enddo + enddo + + do i = 1, mx + do j = 1, my + WTxyz7(i, j, k) = (WTxyz7(i, j, k) & + + WTxyz4(i, jm1(j), k) - WTxyz4(i, jp1(j), k) & + ) * dxinv3(i, j) + enddo + enddo + !! Two previous Loops are the vectorized version of the following Loop + !! do j=1,my + !! do i=1,mx + !! WTxyz7(i,j,k)= -dxinv3(i, j) + !! . *(WTxyz3(ip1(i),j,k)-WTxyz3(im1(i),j,k) + !! . +WTxyz4(i,jp1(j),k)-WTxyz4(i,jm1(j),k)) + !! end do + !! end do + enddo + endif + + ! ++++++++++++++++++++++++++ + ! +--IMPLICIT SCHEME (END) + + ! ++++++++++++++++++++++++++ + else + ! ++++++++++++++++++++++++++++ + ! +--EXPLICIT SCHEME (BEGIN) + + ! ++++++++++++++++++++++++++++ + + ! +++++++++++++++++++++++ + ! +--ERROR TEST (BEGIN) + + ! +++++++++++++++++++++++ + + if(norder < 0) then + stop '++++++++ Horizontal Advection badly conditioned / Order<0 ++' + else + if(center) then + ! ++++++++++++++++++++++++++++++++++ + ! +...Is Centered Scheme (BEGIN) + + ! ++++++++++++++++++++++++++++++++++ + !cCA usual setting go here + locorr = .false. + dtcorr = 1.000 + + ! +--Mass Divergence / First Direction + ! + ================================== + + ! +--Mass Flux Update / x-Direction + ! + ------------------------------ + + !#if(SP) + ! cCA : SP not activated because weird if / else / end if + ! if (mod(numdps,2).eq.0.or.mmy.eq.1) then + !#endif + + do j = 1, my + do i = 1, mx + WTxy3(i, j) = 0.0 + enddo + enddo + + !$OMP PARALLEL do private(i,j,k) + do k = 1, mz + ! +--Mass Flux Update / x-Direction + ! + ------------------------------ + if(norder == 2) then + ! cCA usually norder==4 + ! do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz3(i, j, k) = uairDY(i, j, k) * pstDYn(i, j) +#if(Z2) + WTxyz3(i, j, k) = WTxyz3(i, j, k) * clatGE(i, j) +#endif + enddo + enddo + !c #vL end do + + !c #vL do k=1,mz + do i = 1, mx + do j = 1, my + WTxyz7(i, j, k) = dxinv3(i, j) * ( & + WTxyz3(im1(i), j, k) - WTxyz3(ip1(i), j, k)) +#if(Z2) + WTxyz7(i, j, k) = WTxyz7(i, j, k) / clatGE(i, j) +#endif + enddo + enddo + ! end do + else + ! cCA usual setting go here + ! do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz3(i, j, k) = uairDY(i, j, k) * pstDYn(i, j) +#if(Z2) + WTxyz3(i, j, k) = WTxyz3(i, j, k) * clatGE(i, j) +#endif + enddo + enddo + !c #vL end do + + !c #vL do k=1,mz + do i = 1, mx + do j = 1, my + WTxyz7(i, j, k) = dxinv3(i, j) * fac43 * ( & + 0.125 * (WTxyz3(ip2(i), j, k) - WTxyz3(im2(i), j, k)) & + - WTxyz3(ip1(i), j, k) + WTxyz3(im1(i), j, k)) +#if(Z2) + WTxyz7(i, j, k) = WTxyz7(i, j, k) / clatGE(i, j) +#endif + enddo + enddo + ! end do + endif + ! +--Mass Flux Update / y-Direction + ! + ------------------------------ + !#if(SP) + ! else + !#endif + if(norder == 2) then + ! do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz4(i, j, k) = vairDY(i, j, k) * pstDYn(i, j) + enddo + enddo + !c #vL end do + + !c #vL do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz8(i, j, k) = dyinv3(i, j) * ( & + WTxyz4(i, jm1(j), k) - WTxyz4(i, jp1(j), k)) + enddo + enddo + !#if(SP) + ! do j=1,my + ! do i=1,mx + ! WTxyz7(i,j,k)= WTxyz8(i,j,k) + ! WTxyz8(i,j,k)= 0.0 + ! end do + ! end do + !#endif + else + ! do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz4(i, j, k) = vairDY(i, j, k) * pstDYn(i, j) + enddo + enddo + !c #vL end do + + !c #vL do k=1,mz + do j = 1, my + do i = 1, mx + WTxyz8(i, j, k) = dyinv3(i, j) * fac43 * ( & + 0.125 * (WTxyz4(i, jp2(j), k) - WTxyz4(i, jm2(j), k)) & + - WTxyz4(i, jp1(j), k) + WTxyz4(i, jm1(j), k)) + enddo + enddo + !#if(SP) + ! do j=1,my + ! do i=1,mx + ! WTxyz7(i,j,k)= WTxyz8(i,j,k) + ! WTxyz8(i,j,k)= 0.0 + ! end do + ! end do + !#endif + + endif + !#if(SP) + ! end if + !#endif + enddo + !$OMP END PARALLEL DO + + ! +--Pressure Depth Increment + ! + ------------------------ + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxy3(i, j) = WTxy3(i, j) & + - (WTxyz7(i, j, k) + WTxyz8(i, j, k)) * dsigm1(k) + enddo + enddo + enddo + + ! +--Pressure Depth Update (Leapfrog-Backward) + ! + ----------------------------------------- + if(itFast == 1) then + do j = 1, my + do i = 1, mx + pstDY(i, j) = WTxy2(i, j) - WTxy3(i, j) * dtfast + pstDYn(i, j) = WTxy2(i, j) - WTxy3(i, j) * 2.0 * dtfast + enddo + enddo + else + if(itFast <= ntFast) then + do j = 1, my + do i = 1, mx + pstDY(i, j) = WTxy2(i, j) + pstDYn(i, j) = WTxy1(i, j) - WTxy3(i, j) * 2.0 * dtfast +#if(rt) + ! +--Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + pstDY(i, j) = pstDY(i, j) + & + Robert * (0.5 * (pstDYn(i, j) + WTxy1(i, j)) - pstDY(i, j)) +#endif + enddo + enddo + else + do j = 1, my + do i = 1, mx + pstDY(i, j) = WTxy2(i, j) + pstDYn(i, j) = WTxy1(i, j) - WTxy3(i, j) * dtfast + enddo + enddo + ! +*** Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + endif + endif + + !#if(SP) + ! +--Mass Divergence / Second Direction + ! + ================================== + ! if (mmy.gt.1) then + ! +--Mass Flux Update / x-Direction + ! + ------------------------------ + ! if (mod(numdps,2).eq.1) then + ! if(norder .EQ.2) then + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! WTxyz3(i,j,k)=uairDY(i,j,k) * pstDYn(i,j) + ! end do + ! end do + ! do j=1,my + ! do i=1,mx + ! WTxyz8(i,j,k)= dxinv3(i, j) * ( & + ! WTxyz3(im1(i),j,k)-WTxyz3(ip1(i),j,k) ) + ! end do + ! end do + ! end do + ! else + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! WTxyz3(i,j,k)=uairDY(i,j,k) * pstDYn(i,j) + ! end do + ! end do + ! do j=1,my + ! do i=1,mx + ! WTxyz8(i,j,k)= dxinv3(i, j) * fac43 * ( & + ! 0.125*(WTxyz3(ip2(i),j,k)-WTxyz3(im2(i),j,k)) & + ! -WTxyz3(ip1(i),j,k)+WTxyz3(im1(i),j,k) ) + ! end do + ! end do + ! end do + ! end if + ! +--Mass Flux Update / y-Direction + ! + ------------------------------ + ! else + ! if(norder .EQ.2) then + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! WTxyz4(i,j,k)=vairDY(i,j,k) * pstDYn(i,j) + ! end do + ! end do + ! do j=1,my + ! do i=1,mx + ! WTxyz8(i,j,k)= dyinv3(i, j) * ( & + ! WTxyz4(i,jm1(j),k)-WTxyz4(i,jp1(j),k) ) + ! end do + ! end do + ! end do + ! else + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! WTxyz4(i,j,k)=vairDY(i,j,k) * pstDYn(i,j) + ! end do + ! end do + ! do j=1,my + ! do i=1,mx + ! WTxyz8(i,j,k)= dyinv3(i, j) * fac43 * ( & + ! 0.125*(WTxyz4(i,jp2(j),k)-WTxyz4(i,jm2(j),k)) & + ! -WTxyz4(i,jp1(j),k)+WTxyz4(i,jm1(j),k) ) + ! end do + ! end do + ! end do + ! end if + ! end if + !#endif + + ! +--Pressure Depth Increment + ! + ------------------------ + + do j = 1, my + do i = 1, mx + WTxy4(i, j) = 0.0 + enddo + enddo + !#if(SP) + ! do k=1,mz + ! do j=1,my + ! do i=1,mx + ! WTxy4(i,j)=WTxy4(i,j)-WTxyz8(i,j,k)*dsigm1(k) + ! end do + ! end do + ! end do + ! do j=1,my + ! do i=1,mx + ! WTxy3(i,j)=WTxy3(i,j)+ WTxy4(i,j) + ! end do + ! end do + ! +--Pressure Depth Update (Leapfrog-Backward) + ! + -------------------------------------------- + ! if (itFast.eq.1) then + ! do j=1,my + ! do i=1,mx + ! pstDY( i,j) = pstDY( i,j) - WTxy4(i,j) *dtfast + ! pstDYn(i,j) = pstDYn(i,j) - WTxy4(i,j) *2.0*dtfast + ! end do + ! end do + ! else + ! if (itFast.le.ntFast) then + ! do j=1,my + ! do i=1,mx + ! pstDY( i,j) = WTxy2( i,j) + ! pst_n1 = pstDYn(i,j) + ! pstDYn(i,j) = pstDYn(i,j) - WTxy4(i,j) *2.0*dtfast + !#endif +#if(rt) + ! +--Robert Time Filter + ! + ~~~~~~~~~~~~~~~~~~ + pstDY(i, j) = pstDY(i, j) + & + Robert * (0.5 * (pstDYn(i, j) + pst_n1) - pstDY(i, j)) +#endif + !#if(SP) + ! end do + ! end do + ! else + ! do j=1,my + ! do i=1,mx + ! pstDY( i,j) = WTxy2( i,j) + ! pstDYn(i,j) = pstDYn(i,j) - WTxy4(i,j) *dtfast + ! end do + ! end do + ! +*** Leapfrog-Backward (e.g. Haltiner and Williams, p.152) + ! end if + ! end if + ! end if + !#endif + norder = -1 + + ! ++++++++++++++++++++++++++++++++++ + ! +...Is Centered Scheme (END) + + ! ++++++++++++++++++++++++++++++++++ + else + ! ++++++++++++++++++++++++++++++++++ + ! +...Non Centered Schemes (BEGIN) + + ! ++++++++++++++++++++++++++++++++++ + + locorr = .true. + dtcorr = dtfast + + ! +--Vector for Positive Definite Variables + ! + ====================================== + + dtxfas = dtx / (ntFast + 1) + dtyfas = dty / (ntFast + 1) + + do k = 1, mz + + do j = 1, my + do i = 1, mx + WTxyz1(i, j, k) = -uairDY(i, j, k) * dtxfas + WTxyz2(i, j, k) = -vairDY(i, j, k) * dtyfas + uuface = 0.5 * (uairDY(i, j, k) + uairDY(ip1(i), j, k)) + vvface = 0.5 * (vairDY(i, j, k) + vairDY(i, jp1(j), k)) + WTxyz3(i, j, k) = 0.5 * (abs(uuface) + uuface) * dtxfas + WTxyz5(i, j, k) = 0.5 * (abs(uuface) - uuface) * dtxfas + WTxyz4(i, j, k) = 0.5 * (abs(vvface) + vvface) * dtyfas + WTxyz6(i, j, k) = 0.5 * (abs(vvface) - vvface) * dtyfas + enddo + enddo + + enddo + + ! +--Advection (Time Splitting) + ! + ========================== + + ! +--Mass and Mass Flux + ! + ~~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + WTxy5(i, j) = pstDY(i, j) + WTxy1(i, j) = WTxy5(i, j) + WTxy2(i, j) = WTxy5(i, j) + WTxy3(i, j) = 0. + enddo + enddo + + ! +--Conservative Scheme Order 0 + ! + =========================== + ! + + if(norder == 0) then + norder = -1 + + ! +--Time Splitting + ! + -------------- + + ! +--x-Direction First + ! + ~~~~~~~~~~~~~~~~~ + if(mod(numdps, 2) == 0) then + + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz7(i, j, k) = & + -WTxyz3(i, j, k) * WTxy5(i, j) & + + WTxyz5(i, j, k) * WTxy5(ip1(i), j) & + + WTxyz3(im1(i), j, k) * WTxy5(im1(i), j) & + - WTxyz5(im1(i), j, k) * WTxy5(i, j) + + WTxy3(i, j) = WTxy3(i, j) & + + WTxyz7(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz8(i, j, k) = & + -WTxyz4(i, j, k) * WTxy3(i, j) & + + WTxyz6(i, j, k) * WTxy3(i, jp1(j)) & + + WTxyz4(i, jm1(j), k) * WTxy3(i, jm1(j)) & + - WTxyz6(i, jm1(j), k) * WTxy3(i, j) + + WTxy3(i, j) = WTxy3(i, j) & + + WTxyz8(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + ! +--y-Direction First + ! + ~~~~~~~~~~~~~~~~~ + else + + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz7(i, j, k) = & + -WTxyz4(i, j, k) * WTxy5(i, j) & + + WTxyz6(i, j, k) * WTxy5(i, jp1(j)) & + + WTxyz4(i, jm1(j), k) * WTxy5(i, jm1(j)) & + - WTxyz6(i, jm1(j), k) * WTxy5(i, j) + + WTxy3(i, j) = WTxy3(i, j) & + + WTxyz7(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WTxyz8(i, j, k) = & + -WTxyz3(i, j, k) * WTxy3(i, j) & + + WTxyz5(i, j, k) * WTxy3(ip1(i), j) & + + WTxyz3(im1(i), j, k) * WTxy3(im1(i), j) & + - WTxyz5(im1(i), j, k) * WTxy3(i, j) + + WTxy3(i, j) = WTxy3(i, j) & + + WTxyz8(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + endif + + endif + + ! +--Conservative Scheme order 4 + ! + =========================== + + if(norder == 4) then + norder = -1 + + ! +--Time Splitting + ! + -------------- + + ! +--Parameters + ! + ~~~~~~~~~~ + if(mod(numdps, 2) == 0) then + idir_x = 2 + jdir_y = 3 + else + idir_x = 3 + jdir_y = 2 + endif + + ! +--Auxiliary Variables + ! + ~~~~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + WTxy3(i, j) = WTxy5(i, j) + WTxy4(i, j) = WTxy5(i, j) + enddo + enddo + + ! +--1D Computation + ! + -------------- + +401 continue + + if(idir_x == 0 .or. & + jdir_y == 3) go to 402 + + ! +--x-Direction here + ! + ~~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + cnpx(i) = WTxyz3(i, j, k) + cnmx(i) = WTxyz5(i, j, k) + vecx(i) = WTxy2(i, j) + enddo + cnpx(0) = WTxyz3(1, j, k) + cnpx(mxx) = WTxyz3(mx, j, k) + cnmx(0) = WTxyz5(1, j, k) + cnmx(mxx) = WTxyz5(mx, j, k) + vecx(0) = WTxy2(1, j) + vecx(mxx) = WTxy2(mx, j) + + ! + ******** + call ADVbot_4(flux, vecx, aa0x, aa1x, aa2x, aa3x, aa4x, & + cnpx, cnmx, sipx, simx, sidx, mxx, 1) + ! + ******** + + do i = 1, mx + WTxyz7(i, j, k) = -flux(i) + flux(im1(i)) + enddo + + do i = 1, mx + WTxy3(i, j) = WTxy3(i, j) + WTxyz7(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + ! +--Assignation in case of Time Splitting + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(idir_x > 1 .or. & + jdir_y > 1) then + do j = 1, my + do i = 1, mx + WTxy1(i, j) = WTxy3(i, j) + WTxy4(i, j) = WTxy3(i, j) + enddo + enddo + endif + + idir_x = 0 + +402 continue + + if(idir_x == 0 .and. & + jdir_y == 0) go to 403 + + ! +--y-Direction here + ! + ~~~~~~~~~~~~~~~~~ + do k = 1, mz + do i = 1, mx + do j = 1, my + cnpy(j) = WTxyz4(i, j, k) + cnmy(j) = WTxyz6(i, j, k) + vecy(j) = WTxy1(i, j) + enddo + cnpy(0) = WTxyz4(i, 1, k) + cnpy(myy) = WTxyz4(i, my, k) + cnmy(0) = WTxyz6(i, 1, k) + cnmy(myy) = WTxyz6(i, my, k) + vecy(0) = WTxy1(i, 1) + vecy(myy) = WTxy1(i, my) + + ! + ******** + call ADVbot_4(fluy, vecy, aa0y, aa1y, aa2y, aa3y, aa4y, & + cnpy, cnmy, sipy, simy, sidy, myy, 1) + ! + ******** + + do j = 1, my + WTxyz8(i, j, k) = -fluy(j) + fluy(jm1(j)) + enddo + + do j = 1, my + WTxy4(i, j) = WTxy4(i, j) + WTxyz8(i, j, k) * dsigm1(k) + enddo + enddo + enddo + + ! +--Assignation in case of Time Splitting + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(idir_x > 1 .or. & + jdir_y > 1) then + do j = 1, my + do i = 1, mx + WTxy2(i, j) = WTxy4(i, j) + WTxy3(i, j) = WTxy4(i, j) + enddo + enddo + endif + + jdir_y = 0 + + go to 401 +403 continue + endif + + ! +--Update + ! + ====== + do j = 1, my + do i = 1, mx + ! New Pressure Thickness + pstDYn(i, j) = WTxy3(i, j) + + ! New Pressure Thickness Increment + WTxy3(i, j) = pstDY(i, j) - WTxy3(i, j) + + enddo + enddo + ! ++++++++++++++++++++++++++++++++++ + ! +...Non Centered Schemes (END) + + ! ++++++++++++++++++++++++++++++++++ + endif + ! +++++++++++++++++++++ + ! +--ERROR TEST (END) + + ! +++++++++++++++++++++ + endif + if(norder >= 0) & + stop '++++++++ Horizontal Advection badly conditioned ++++++++++++' + ! ++++++++++++++++++++++++++ + ! +--EXPLICIT SCHEME (END) + + ! ++++++++++++++++++++++++++ + endif + + ! +--Vertical Wind Speed (sigma coordinate) + ! + ====================================== + + ! +--Staggered Vertical Grid + ! + ----------------------- + + if(itFast == 1) ntpsig = 0 + + ntpsig = 1 + ntpsig + + CFLzDY = 0.0 + + !$OMP PARALLEL do private (i,j,k) reduction (+:CFLzDY) + do j = 1, my + if(itFast == 1) then + do k = 1, mz + ! do j=1,my + do i = 1, mx + psigad(i, j, k) = 0. + enddo + ! end do + enddo + endif + + if(staggr) then + ! cCA usual setting go here + ! do j=1,my + do i = 1, mx + WTxyz3(i, j, 1) = sigmid(2) * WTxy3(i, j) & + + dsigm1(1) * (WTxyz7(i, j, 1) + WTxyz8(i, j, 1)) + enddo + ! end do + + do k = kp1(1), mmz + ! do j=1,my + do i = 1, mx + ! +... Computation of p*Sigma. BETWEEN Sigma Levels + WTxyz3(i, j, k) = dsigm1(k) * ( & + WTxy3(i, j) + (WTxyz7(i, j, k) + WTxyz8(i, j, k))) + WTxyz3(i, j, k - 1) + enddo + ! end do + enddo + else + ! +--Unstaggered Vertical Grid + ! + ------------------------- + ! do j=1,my + do i = 1, mx + ! +... Open Upper Boundary Condition: WTxyz7(i,j,0)=WTxyz7(i,j,1) + ! + WTxyz8(i,j,0)=WTxyz8(i,j,1) + WTxyz3(i, j, 1) = sigma(1) * WTxy3(i, j) & + + sigma(1) * (WTxyz7(i, j, 1) + WTxyz8(i, j, 1)) + enddo + ! end do + + do k = kp1(1), mz + ! do j=1,my + do i = 1, mx + WTxyz3(i, j, k) = dsig_1(k - 1) * (WTxy3(i, j) & + + 0.50 * (WTxyz7(i, j, k) + WTxyz7(i, j, k - 1) & + + WTxyz8(i, j, k) + WTxyz8(i, j, k - 1))) & + + WTxyz3(i, j, k - 1) + ! +... Computation of p*Sigma. ON Sigma Levels + + enddo + ! end do + enddo + endif + + do k = 1, mz + ! do j=1,my + do i = 1, mx + psigad(i, j, k) = psigad(i, j, k) + WTxyz3(i, j, k) + enddo + enddo + ! end do + + if(((itFast == ntFast + 1) .and. .not. pImplc) .OR. & + ((itFast == 1) .and. pImplc)) then + + do k = 1, mz + ! do j=1,my + do i = 1, mx + psigDY(i, j, k) = psigad(i, j, k) / ntpsig + enddo + ! end do + enddo + + if(locorr) then + do k = 1, mz + ! do j=1,my + do i = 1, mx + psigDY(i, j, k) = psigDY(i, j, k) / dtcorr + enddo + ! end do + enddo + endif + endif + +#if(ON) + ! +--Simple non-hydrostatic Correction + ! + ================================= + + ! +--Filtering + ! + ~~~~~~~~~ + do j = 1, my + do i = 1, mx + WTxy4(i, j) = & + zi__TE(im1(i), jp1(j)) + 2.0 * zi__TE(i, jp1(j)) & + + zi__TE(ip1(i), jp1(j)) & + + 2.0 * zi__TE(im1(i), j) + 4.0 * zi__TE(i, j) & + + 2.0 * zi__TE(ip1(i), j) & + + zi__TE(im1(i), jm1(j)) + 2.0 * zi__TE(i, jm1(j)) & + + zi__TE(ip1(i), jm1(j)) + enddo + enddo + do j = 1, my + do i = 1, mx + WTxy4(i, j) = 0.0625 * WTxy4(i, j) + enddo + enddo + + ! +--Correction + ! + ~~~~~~~~~~ + do j = 1, my + do i = 1, mx + ! Weisman et al., 1997, MWR125, p.541 + CorArg = 1.0 + WTxy4(i, j) * WTxy4(i, j) / (4.0 * dx * dx) + CorrNH = 1.0 / sqrt(CorArg) + do k = 1, mz + psigDY(i, j, k) = psigDY(i, j, k) * CorrNH + enddo + enddo + enddo +#endif + + ! +--Vertical Velocity (sigma coordinates) + ! + ===================================== + + if(staggr) then + do k = 1, mz + ! do j=jp11,my1 + do i = ip11, mx1 + wsigDY(i, j, k) = psigDY(i, j, k) / pstDYn(i, j) + enddo + ! end do + enddo + else + do k = 1, mz1 + ! do j=jp11,my1 + do i = ip11, mx1 + wsigDY(i, j, k) = (psigDY(i, j, k) + psigDY(i, j, kp1(k))) * 0.5 & + / pstDYn(i, j) + enddo + ! end do + enddo + k = mz + ! do j=jp11,my1 + do i = ip11, mx1 + wsigDY(i, j, k) = psigDY(i, j, k) * 0.5 & + / pstDYn(i, j) + enddo + ! end do + endif + + ! +--Maximum Vertical Courant Number + ! + =============================== + + do k = 1, mz + ! do j=1,my + do i = 1, mx + CFLzDY = max(CFLzDY & + , abs(wsigDY(i, j, k)) * 2.0 * dt / dsigm1(k)) + enddo + ! end do + enddo + + enddo + !$OMP END PARALLEL DO + +#if(OM) + ! +--Slip condition for Mountain Wave Experiments + ! + ============================================ + do j = 1, my + do i = 1, mx + psigDY(i, j, mz) = 0.0 + enddo + enddo +#endif + return +endsubroutine DYNdps_mp diff --git a/MAR/code_mar/dynfil_1d.f90 b/MAR/code_mar/dynfil_1d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ea5430d4dba0ddb81af7514da84ce087136ef90e --- /dev/null +++ b/MAR/code_mar/dynfil_1d.f90 @@ -0,0 +1,123 @@ +#include "MAR_pp.def" +subroutine DYNfil_1D(f1_fil, e1_fil, k1_fil) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FILTER (1-D) 24-09-2001 MAR | + ! | subroutine DYNfil_1D is used to Filter Horizontal Fields in 2D Code | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: f1_fil : filtered variable | + ! | ^^^^^ e1_fil : value of the selectivity parameter | + ! | k1_fil : vertical dimension of the problem | + ! | | + ! | OUTPUT:(via common block) | + ! | ^^^^^^ f1_fil | + ! | | + ! | LATERAL BOUNDARIES: | + ! | ^^^^^^^^^^^^^^^^^^^ | + ! | 1. The value of the variable is fixed at the Boundary | + ! | 2. Filter Selectivity Parameter may be increased near the Boundary | + ! | (#EP) | + ! | | + ! | REFER. : Alpert (1981), J.Comput.Phys. 44, pp.212--219 | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + ! + + use marphy + use mardim + use marvec + ! + + implicit none + ! + + real f1_fil(mx, my, mz), e1_fil(mz) + integer k1_fil + ! + + ! + + ! +--Local Variables + ! + ================ + integer kindex + integer m, i + integer m1, m2 + real aa, bb +#if(EP) + integer m3, m4 + real delt2, delt3, delt4 +#endif + ! + + ! + + ! +--Initialisation of the Gaussian Elimination Algorithm + ! + ==================================================== + ! + + m = mx + m1 = m - 1 + m2 = m - 2 +#if(EP) + m3 = m - 3 + m4 = m - 4 +#endif + ! + + do kindex = 1, k1_fil + ! + + vecx1(1) = 0.0 + vecx2(1) = 1.0 + vecx1(m) = 0.0 + vecx2(m) = 1.0 + vecx4(1) = f1_fil(1, 1, kindex) + vecx4(m) = f1_fil(m, 1, kindex) + ! + + delta = e1_fil(kindex) + ! + +#if(EP) + delt4 = delta + delta + delt3 = delt4 + delt4 + delt2 = delt3 + delt3 +#endif + ! +.. Filter Selectivity Parameter Increase near the Boundaries + ! + + aa = 1.0 - delta + bb = 2.0 * (1.0 + delta) + ! + + do i = 2, m1 + vecx1(i) = aa + vecx2(i) = bb + vecx4(i) = f1_fil(i - 1, 1, kindex) + 2.0 * f1_fil(i, 1, kindex) & + + f1_fil(i + 1, 1, kindex) + enddo + ! + +#if(EP) + vecx1(2) = 1.0 - delt2 + vecx1(3) = 1.0 - delt3 + vecx1(4) = 1.0 - delt4 + vecx2(2) = 2.0 * (1.0 + delt2) + vecx2(3) = 2.0 * (1.0 + delt3) + vecx2(4) = 2.0 * (1.0 + delt4) + vecx1(m2) = vecx1(2) + vecx1(m3) = vecx1(3) + vecx1(m4) = vecx1(4) + vecx2(m2) = vecx2(2) + vecx2(m3) = vecx2(3) + vecx2(m4) = vecx2(4) +#endif + ! + + do i = 1, m + vecxa(i) = f1_fil(i, 1, kindex) + vecx5(i) = 0. + vecx6(i) = 0. + enddo + ! + + ! + + ! +--Gaussian Elimination Algorithm + ! + ============================== + ! + + ! + ********* + call tlat(vecx1, vecx2, vecx1, vecx4, vecx5, vecx6, m, m, vecxa) + ! + ********* + ! + + do i = 1, m + f1_fil(i, 1, kindex) = vecxa(i) + enddo + ! + + enddo + ! + + return +endsubroutine DYNfil_1D diff --git a/MAR/code_mar/dynfil_3d.f90 b/MAR/code_mar/dynfil_3d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..96af057402a5da7854cb191e8376c9859953d9e4 --- /dev/null +++ b/MAR/code_mar/dynfil_3d.f90 @@ -0,0 +1,256 @@ +#include "MAR_pp.def" +subroutine DYNfil_3D(f3_fil, e3_fil, k3_fil) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FILTER (3-D) 19-11-2012-XF MAR | + ! | subroutine DYNfil_3D is used to Filter Horizontal Fields in 3D Code | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: f3_fil(i,j,k): variable to be filtered (in surface k) | + ! | ^^^^^ e3_fil( k): value of the selectivity parameter | + ! | k3_fil : vertical dimension of the variable | + ! | | + ! | OUTPUT: f3_fil(i,j,k) | + ! | ^^^^^^^ | + ! | | + ! | LATERAL BOUNDARIES: | + ! | ^^^^^^^^^^^^^^^^^^^ | + ! | 1. The value of the variable is fixed at the Boundary | + ! | 2. Filter Selectivity Parameter may be increased near the Boundary | + ! | (#EP) | + ! | | + ! | REFER. : Raymond and Garder, MWR 116, Jan 1988, p209 | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_wk + + implicit none + + integer i, j, k, m + real f3_fil(mx, my, mz), e3_fil(mz) + integer k3_fil + + ! +--Local Variables + ! + ================ + + real eps2(mz) + real eps3(mz) + real eps4(mz) + real eps5(mz) + real a1_fil(1:mx, mz), b1_fil(1:mx, mz), aa_fil(mz) + real a2_fil(1:my, mz), b2_fil(1:my, mz), bb_fil(mz) + + ! +--Initialisation + ! + ============== + + m = mx + m1 = mx1 + m2 = mx2 +#if(EP) + m3 = mx - 3 + m4 = mx - 4 +#endif + mn = my + mn1 = my1 + mn2 = my2 +#if(EP) + mn3 = my - 3 + mn4 = my - 4 +#endif + + ! +--1st Matrix Initialisation + ! + ------------------------- + + do k = 1, k3_fil + a1_fil(1, k) = 0.0 + b1_fil(1, k) = 1.0 + a1_fil(mx, k) = 0.0 + b1_fil(mx, k) = 1.0 +#if(EP) + ! Pour diminution de la sectivite du filtre vers les bords + ! (augmentation --X 2-- parametre selectivite a chaque pas spatial) + eps5(k) = e3_fil(k) + e3_fil(k) + eps4(k) = eps5(k) + eps5(k) + eps3(k) = eps4(k) + eps4(k) + eps2(k) = eps3(k) + eps3(k) +#endif + + aa_fil(k) = 1.0 - e3_fil(k) + bb_fil(k) = 2.0 * (1.0 + e3_fil(k)) + + do i = ip11, mx1 + a1_fil(i, k) = aa_fil(k) + b1_fil(i, k) = bb_fil(k) + enddo +#if(EP) + a1_fil(2, k) = 1.0 - eps2(k) + a1_fil(3, k) = 1.0 - eps3(k) + a1_fil(4, k) = 1.0 - eps4(k) + a1_fil(5, k) = 1.0 - eps5(k) + b1_fil(2, k) = 2.0 * (1.0 + eps2(k)) + b1_fil(3, k) = 2.0 * (1.0 + eps3(k)) + b1_fil(4, k) = 2.0 * (1.0 + eps4(k)) + b1_fil(5, k) = 2.0 * (1.0 + eps5(k)) + a1_fil(m1, k) = a1_fil(2, k) + a1_fil(m2, k) = a1_fil(3, k) + a1_fil(m3, k) = a1_fil(4, k) + a1_fil(m4, k) = a1_fil(5, k) + b1_fil(m1, k) = b1_fil(2, k) + b1_fil(m2, k) = b1_fil(3, k) + b1_fil(m3, k) = b1_fil(4, k) + b1_fil(m4, k) = b1_fil(5, k) +#endif + + ! +--2th Matrix Initialisation + ! + ------------------------- + + a2_fil(1, k) = 0.0 + b2_fil(1, k) = 1.0 + a2_fil(my, k) = 0.0 + b2_fil(my, k) = 1.0 + + do j = jp11, my1 + a2_fil(j, k) = aa_fil(k) + b2_fil(j, k) = bb_fil(k) + enddo +#if(EP) + a2_fil(2, k) = a1_fil(2, k) + a2_fil(3, k) = a1_fil(3, k) + a2_fil(4, k) = a1_fil(4, k) + a2_fil(5, k) = a1_fil(5, k) + b2_fil(2, k) = b1_fil(2, k) + b2_fil(3, k) = b1_fil(3, k) + b2_fil(4, k) = b1_fil(4, k) + b2_fil(5, k) = b1_fil(5, k) + a2_fil(mn1, k) = a1_fil(2, k) + a2_fil(mn2, k) = a1_fil(3, k) + a2_fil(mn3, k) = a1_fil(4, k) + a2_fil(mn4, k) = a1_fil(5, k) + b2_fil(mn1, k) = b1_fil(2, k) + b2_fil(mn2, k) = b1_fil(3, k) + b2_fil(mn3, k) = b1_fil(4, k) + b2_fil(mn4, k) = b1_fil(5, k) +#endif + + enddo + + ! +--1st Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + do k = 1, k3_fil + do j = jp11, my1 + + WTxyz4(1, j, k) = & + f3_fil(1, jm1(j), k) + 2.0 * f3_fil(1, j, k) + & + f3_fil(1, jp1(j), k) + WTxyz4(mx, j, k) = & + f3_fil(mx, jm1(j), k) + 2.0 * f3_fil(mx, j, k) + & + f3_fil(mx, jp1(j), k) + + do i = ip11, mx1 + WTxyz4(i, j, k) = & + f3_fil(im1(i), jp1(j), k) + 2.0 * f3_fil(i, jp1(j), k) & + + f3_fil(ip1(i), jp1(j), k) + & + 2.0 * f3_fil(im1(i), j, k) + 4.0 * & + f3_fil(i, j, k) & + + 2.0 * f3_fil(ip1(i), j, k) + & + f3_fil(im1(i), jm1(j), k) + 2.0 * & + f3_fil(i, jm1(j), k) & + + f3_fil(ip1(i), jm1(j), k) + enddo + + enddo + enddo + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxyz7 + ! + ---------------------------------------------------- + ! + + do k = 1, k3_fil + do j = 1, my + + ! +--Forward Sweep + + WTxyz6(1, j, k) = -a1_fil(1, k) / b1_fil(1, k) + WTxyz7(1, j, k) = WTxyz4(1, j, k) / b1_fil(1, k) + do i = ip11, mx + WTxyz6(i, j, k) = -a1_fil(i, k) & + / (a1_fil(i, k) * WTxyz6(i - 1, j, k) + b1_fil(i, k)) + WTxyz7(i, j, k) = (WTxyz4(i, j, k) - a1_fil(i, k) * & + WTxyz7(i - 1, j, k)) & + / (a1_fil(i, k) * WTxyz6(i - 1, j, k) + b1_fil(i, k)) + enddo + + ! +--Backward Sweep + + do i = mx1, 1, -1 + WTxyz7(i, j, k) = WTxyz6(i, j, k) * WTxyz7(i + 1, j, k) + & + WTxyz7(i, j, k) + enddo + + enddo + enddo + + ! +--2th Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + do k = 1, k3_fil + do i = ip11, mx1 + WTxyz4(i, 1, k) = f3_fil(i, 1, k) + WTxyz4(i, my, k) = f3_fil(i, my, k) + do j = jp11, my1 + WTxyz4(i, j, k) = WTxyz7(i, j, k) + enddo + enddo + enddo + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxyz7 + ! + ---------------------------------------------------- + + do k = 1, k3_fil + do i = 1, mx + + ! +--Forward Sweep + + WTxyz6(i, 1, k) = -a2_fil(1, k) / b2_fil(1, k) + WTxyz7(i, 1, k) = WTxyz4(i, 1, k) / b2_fil(1, k) + do j = jp11, my + WTxyz6(i, j, k) = -a2_fil(j, k) & + / (a2_fil(j, k) * WTxyz6(i, j - 1, k) + b2_fil(j, k)) + WTxyz7(i, j, k) = (WTxyz4(i, j, k) - a2_fil(j, k) * & + WTxyz7(i, j - 1, k)) & + / (a2_fil(j, k) * WTxyz6(i, j - 1, k) + b2_fil(j, k)) + enddo + + ! +--Backward Sweep + + do j = my1, 1, -1 + WTxyz7(i, j, k) = WTxyz6(i, j, k) * WTxyz7(i, j + 1, k) + & + WTxyz7(i, j, k) + enddo + + enddo + enddo + + ! +--Result + ! + ====== + + do k = 1, k3_fil + do j = jp11, my1 + do i = ip11, mx1 + f3_fil(i, j, k) = WTxyz7(i, j, k) + enddo + enddo + enddo + + return +endsubroutine DYNfil_3D diff --git a/MAR/code_mar/dynfil_3d_mp.f90 b/MAR/code_mar/dynfil_3d_mp.f90 new file mode 100644 index 0000000000000000000000000000000000000000..aa0467d21e24ef72a0da5d9766ebcfc5db8e8c04 --- /dev/null +++ b/MAR/code_mar/dynfil_3d_mp.f90 @@ -0,0 +1,260 @@ +#include "MAR_pp.def" +subroutine DYNfil_3D_mp(f3_fil, e3_fil, k3_fil) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FILTER (3-D) 08-12-2022 MAR | + ! | subroutine DYNfil_3D_mp is used to Filter Horizontal Fields in 3DCode| + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: f3_fil(i,j,k): variable to be filtered (in surface k) | + ! | ^^^^^ e3_fil( k): value of the selectivity parameter | + ! | k3_fil : vertical dimension of the variable | + ! | | + ! | OUTPUT: f3_fil(i,j,k) | + ! | ^^^^^^^ | + ! | | + ! | LATERAL BOUNDARIES: | + ! | ^^^^^^^^^^^^^^^^^^^ | + ! | 1. The value of the variable is fixed at the Boundary | + ! | 2. Filter Selectivity Parameter may be increased near the Boundary | + ! | (#EP) | + ! | | + ! | REFER. : Raymond and Garder, MWR 116, Jan 1988, p209 | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_wk + + implicit none + + integer i, j, k, m + real f3_fil(mx, my, mz), e3_fil(mz),flag + integer k3_fil + + real eps2(mz) + real eps3(mz) + real eps4(mz) + real eps5(mz) + real a1_fil(1:mx, mz), b1_fil(1:mx, mz), aa_fil(mz) + real a2_fil(1:my, mz), b2_fil(1:my, mz), bb_fil(mz) + + ! +--Initialisation + ! + ============== + + m = mx + m1 = mx1 + m2 = mx2 +#if(EP) + m3 = mx - 3 + m4 = mx - 4 +#endif + mn = my + mn1 = my1 + mn2 = my2 +#if(EP) + mn3 = my - 3 + mn4 = my - 4 +#endif + + ! +--1st Matrix Initialisation + ! + ------------------------- + +!$OMP PARALLEL DO default(shared) & +!$OMP private(a1_fil,b1_fil,a2_fil,b2_fil,flag,WTxy4,WTxy6,WTxy7,i,j,k) & +!$OMP schedule(dynamic) + do k = 1, k3_fil + + + flag = 0 + do j = jp11, my1 + do i = ip11, mx1 + if(abs(f3_fil(i, j, k)) > 1.5 * eps9) flag = 1 + enddo + enddo + + if(flag == 1) then + + a1_fil(1, k) = 0.0 + b1_fil(1, k) = 1.0 + a1_fil(mx, k) = 0.0 + b1_fil(mx, k) = 1.0 +#if(EP) + ! Pour diminution de la sectivite du filtre vers les bords + ! (augmentation --X 2-- parametre selectivite a chaque pas spatial) + eps5(k) = e3_fil(k) + e3_fil(k) + eps4(k) = eps5(k) + eps5(k) + eps3(k) = eps4(k) + eps4(k) + eps2(k) = eps3(k) + eps3(k) +#endif + aa_fil(k) = 1.0 - e3_fil(k) + bb_fil(k) = 2.0 * (1.0 + e3_fil(k)) + + do i = ip11, mx1 + a1_fil(i, k) = aa_fil(k) + b1_fil(i, k) = bb_fil(k) + enddo +#if(EP) + a1_fil(2, k) = 1.0 - eps2(k) + a1_fil(3, k) = 1.0 - eps3(k) + a1_fil(4, k) = 1.0 - eps4(k) + a1_fil(5, k) = 1.0 - eps5(k) + b1_fil(2, k) = 2.0 * (1.0 + eps2(k)) + b1_fil(3, k) = 2.0 * (1.0 + eps3(k)) + b1_fil(4, k) = 2.0 * (1.0 + eps4(k)) + b1_fil(5, k) = 2.0 * (1.0 + eps5(k)) + a1_fil(m1, k) = a1_fil(2, k) + a1_fil(m2, k) = a1_fil(3, k) + a1_fil(m3, k) = a1_fil(4, k) + a1_fil(m4, k) = a1_fil(5, k) + b1_fil(m1, k) = b1_fil(2, k) + b1_fil(m2, k) = b1_fil(3, k) + b1_fil(m3, k) = b1_fil(4, k) + b1_fil(m4, k) = b1_fil(5, k) +#endif + + ! +--2th Matrix Initialisation + ! + ------------------------- + + a2_fil(1, k) = 0.0 + b2_fil(1, k) = 1.0 + a2_fil(my, k) = 0.0 + b2_fil(my, k) = 1.0 + + do j = jp11, my1 + a2_fil(j, k) = aa_fil(k) + b2_fil(j, k) = bb_fil(k) + enddo +#if(EP) + a2_fil(2, k) = a1_fil(2, k) + a2_fil(3, k) = a1_fil(3, k) + a2_fil(4, k) = a1_fil(4, k) + a2_fil(5, k) = a1_fil(5, k) + b2_fil(2, k) = b1_fil(2, k) + b2_fil(3, k) = b1_fil(3, k) + b2_fil(4, k) = b1_fil(4, k) + b2_fil(5, k) = b1_fil(5, k) + a2_fil(mn1, k) = a1_fil(2, k) + a2_fil(mn2, k) = a1_fil(3, k) + a2_fil(mn3, k) = a1_fil(4, k) + a2_fil(mn4, k) = a1_fil(5, k) + b2_fil(mn1, k) = b1_fil(2, k) + b2_fil(mn2, k) = b1_fil(3, k) + b2_fil(mn3, k) = b1_fil(4, k) + b2_fil(mn4, k) = b1_fil(5, k) +#endif + + ! end do + + ! +--1st Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + ! do k=1,k3_fil + do j = jp11, my1 + + WTxy4(1, j) = & + f3_fil(1, jm1(j), k) + 2.0 * f3_fil(1, j, k) + f3_fil(1, jp1(j), k) + WTxy4(mx, j) = & + f3_fil(mx, jm1(j), k) + 2.0 * f3_fil(mx, j, k) + f3_fil(mx, jp1(j), k) + + do i = ip11, mx1 + WTxy4(i, j) = & + f3_fil(im1(i), jp1(j), k) + 2.0 * f3_fil(i, jp1(j), k) + & + f3_fil(ip1(i), jp1(j), k) + & + 2.0 * f3_fil(im1(i), j, k) + 4.0 * f3_fil(i, j, k) + & + 2.0 * f3_fil(ip1(i), j, k) + & + f3_fil(im1(i), jm1(j), k) + 2.0 * f3_fil(i, jm1(j), k) + & + f3_fil(ip1(i), jm1(j), k) + enddo + + enddo + ! end do + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxy7 + ! + ---------------------------------------------------- + ! + + ! do k=1,k3_fil + do j = 1, my + + ! +--Forward Sweep + + WTxy6(1, j) = -a1_fil(1, k) / b1_fil(1, k) + WTxy7(1, j) = WTxy4(1, j) / b1_fil(1, k) + do i = ip11, mx + WTxy6(i, j) = -a1_fil(i, k) & + / (a1_fil(i, k) * WTxy6(i - 1, j) + b1_fil(i, k)) + WTxy7(i, j) = (WTxy4(i, j) - a1_fil(i, k) * WTxy7(i - 1, j)) & + / (a1_fil(i, k) * WTxy6(i - 1, j) + b1_fil(i, k)) + enddo + + ! +--Backward Sweep + + do i = mx1, 1, -1 + WTxy7(i, j) = WTxy6(i, j) * WTxy7(i + 1, j) + WTxy7(i, j) + enddo + + enddo + ! end do + + ! +--2th Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + ! do k=1,k3_fil + do i = ip11, mx1 + WTxy4(i, 1) = f3_fil(i, 1, k) + WTxy4(i, my) = f3_fil(i, my, k) + do j = jp11, my1 + WTxy4(i, j) = WTxy7(i, j) + enddo + enddo + ! end do + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxy7 + ! + ---------------------------------------------------- + + ! do k=1,k3_fil + do i = 1, mx + + ! +--Forward Sweep + + WTxy6(i, 1) = -a2_fil(1, k) / b2_fil(1, k) + WTxy7(i, 1) = WTxy4(i, 1) / b2_fil(1, k) + do j = jp11, my + WTxy6(i, j) = -a2_fil(j, k) & + / (a2_fil(j, k) * WTxy6(i, j - 1) + b2_fil(j, k)) + WTxy7(i, j) = (WTxy4(i, j) - a2_fil(j, k) * WTxy7(i, j - 1)) & + / (a2_fil(j, k) * WTxy6(i, j - 1) + b2_fil(j, k)) + enddo + + ! +--Backward Sweep + + do j = my1, 1, -1 + WTxy7(i, j) = WTxy6(i, j) * WTxy7(i, j + 1) + WTxy7(i, j) + enddo + + enddo + ! end do + + ! +--Result + ! + ====== + + ! do k=1,k3_fil + do j = jp11, my1 + do i = ip11, mx1 + f3_fil(i, j, k) = WTxy7(i, j) + enddo + enddo + endif + enddo +!$OMP END PARALLEL DO + + return +endsubroutine DYNfil_3D_mp diff --git a/MAR/code_mar/dynfil_3d_mp2.f90 b/MAR/code_mar/dynfil_3d_mp2.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f26e5418f51bf5aec1c087a6b4229b9ea775a5f2 --- /dev/null +++ b/MAR/code_mar/dynfil_3d_mp2.f90 @@ -0,0 +1,291 @@ +#include "MAR_pp.def" +subroutine DYNfil_3D_mp2(f3_fil, v3_fil, e3_fil, k3_fil) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FILTER (3-D) 07-09-2017-XF MAR | + ! | subroutine DYNfil_3D_mp is used to Filter Horizontal Fields in 3DCode| + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: f3_fil(i,j,k): variable to be filtered (in surface k) | + ! | ^^^^^ e3_fil( k): value of the selectivity parameter | + ! | k3_fil : vertical dimension of the variable | + ! | | + ! | OUTPUT: f3_fil(i,j,k) | + ! | ^^^^^^^ | + ! | | + ! | LATERAL BOUNDARIES: | + ! | ^^^^^^^^^^^^^^^^^^^ | + ! | 1. The value of the variable is fixed at the Boundary | + ! | 2. Filter Selectivity Parameter may be increased near the Boundary | + ! | (#EP) | + ! | | + ! | REFER. : Raymond and Garder, MWR 116, Jan 1988, p209 | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_wk + + implicit none + + integer i, j, k, m + real f3_fil(mx, my, mz), e3_fil(mz), v3_fil(mx, my, mz) + integer k3_fil + + real WVxy4(mx, my), WVxy6(mx, my), WVxy7(mx, my) + + real eps2(mz) + real eps3(mz) + real eps4(mz) + real eps5(mz) + real a1_fil(1:mx, mz), b1_fil(1:mx, mz), aa_fil(mz) + real a2_fil(1:my, mz), b2_fil(1:my, mz), bb_fil(mz) + + ! +--Initialisation + ! + ============== + + m = mx + m1 = mx1 + m2 = mx2 +#if(EP) + m3 = mx - 3 + m4 = mx - 4 +#endif + mn = my + mn1 = my1 + mn2 = my2 +#if(EP) + mn3 = my - 3 + mn4 = my - 4 +#endif + + ! +--1st Matrix Initialisation + ! + ------------------------- + +!$OMP PARALLEL do default(shared) & +!$OMP private(a1_fil,b1_fil,a2_fil,b2_fil, & +!$OMP WTxy4,WTxy6,WTxy7,i,j,k,WVxy4,WVxy6,WVxy7) + do k = 1, k3_fil + a1_fil(1, k) = 0.0 + b1_fil(1, k) = 1.0 + a1_fil(mx, k) = 0.0 + b1_fil(mx, k) = 1.0 +#if(EP) + ! Pour diminution de la sectivite du filtre vers les bords + ! (augmentation --X 2-- parametre selectivite a chaque pas spatial) + eps5(k) = e3_fil(k) + e3_fil(k) + eps4(k) = eps5(k) + eps5(k) + eps3(k) = eps4(k) + eps4(k) + eps2(k) = eps3(k) + eps3(k) +#endif + + aa_fil(k) = 1.0 - e3_fil(k) + bb_fil(k) = 2.0 * (1.0 + e3_fil(k)) + + do i = ip11, mx1 + a1_fil(i, k) = aa_fil(k) + b1_fil(i, k) = bb_fil(k) + enddo +#if(EP) + a1_fil(2, k) = 1.0 - eps2(k) + a1_fil(3, k) = 1.0 - eps3(k) + a1_fil(4, k) = 1.0 - eps4(k) + a1_fil(5, k) = 1.0 - eps5(k) + b1_fil(2, k) = 2.0 * (1.0 + eps2(k)) + b1_fil(3, k) = 2.0 * (1.0 + eps3(k)) + b1_fil(4, k) = 2.0 * (1.0 + eps4(k)) + b1_fil(5, k) = 2.0 * (1.0 + eps5(k)) + a1_fil(m1, k) = a1_fil(2, k) + a1_fil(m2, k) = a1_fil(3, k) + a1_fil(m3, k) = a1_fil(4, k) + a1_fil(m4, k) = a1_fil(5, k) + b1_fil(m1, k) = b1_fil(2, k) + b1_fil(m2, k) = b1_fil(3, k) + b1_fil(m3, k) = b1_fil(4, k) + b1_fil(m4, k) = b1_fil(5, k) +#endif + + ! +--2th Matrix Initialisation + ! + ------------------------- + + a2_fil(1, k) = 0.0 + b2_fil(1, k) = 1.0 + a2_fil(my, k) = 0.0 + b2_fil(my, k) = 1.0 + + do j = jp11, my1 + a2_fil(j, k) = aa_fil(k) + b2_fil(j, k) = bb_fil(k) + enddo +#if(EP) + a2_fil(2, k) = a1_fil(2, k) + a2_fil(3, k) = a1_fil(3, k) + a2_fil(4, k) = a1_fil(4, k) + a2_fil(5, k) = a1_fil(5, k) + b2_fil(2, k) = b1_fil(2, k) + b2_fil(3, k) = b1_fil(3, k) + b2_fil(4, k) = b1_fil(4, k) + b2_fil(5, k) = b1_fil(5, k) + a2_fil(mn1, k) = a1_fil(2, k) + a2_fil(mn2, k) = a1_fil(3, k) + a2_fil(mn3, k) = a1_fil(4, k) + a2_fil(mn4, k) = a1_fil(5, k) + b2_fil(mn1, k) = b1_fil(2, k) + b2_fil(mn2, k) = b1_fil(3, k) + b2_fil(mn3, k) = b1_fil(4, k) + b2_fil(mn4, k) = b1_fil(5, k) +#endif + + ! end do + + ! +--1st Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + ! do k=1,k3_fil + do j = jp11, my1 + + WTxy4(1, j) = & + f3_fil(1, jm1(j), k) + 2.0 * f3_fil(1, j, k) + f3_fil(1, jp1(j), k) + WTxy4(mx, j) = & + f3_fil(mx, jm1(j), k) + 2.0 * f3_fil(mx, j, k) + f3_fil(mx, jp1(j), k) + + WVxy4(1, j) = & + v3_fil(1, jm1(j), k) + 2.0 * v3_fil(1, j, k) + v3_fil(1, jp1(j), k) + WVxy4(mx, j) = & + v3_fil(mx, jm1(j), k) + 2.0 * v3_fil(mx, j, k) + v3_fil(mx, jp1(j), k) + + do i = ip11, mx1 + WTxy4(i, j) = & + f3_fil(im1(i), jp1(j), k) + 2.0 * f3_fil(i, jp1(j), k) & + + f3_fil(ip1(i), jp1(j), k) + & + 2.0 * f3_fil(im1(i), j, k) + 4.0 * f3_fil(i, j, k) & + + 2.0 * f3_fil(ip1(i), j, k) + & + f3_fil(im1(i), jm1(j), k) + 2.0 * f3_fil(i, jm1(j), k) & + + f3_fil(ip1(i), jm1(j), k) + + WVxy4(i, j) = & + v3_fil(im1(i), jp1(j), k) + 2.0 * v3_fil(i, jp1(j), k) & + + v3_fil(ip1(i), jp1(j), k) + & + 2.0 * v3_fil(im1(i), j, k) + 4.0 * v3_fil(i, j, k) & + + 2.0 * v3_fil(ip1(i), j, k) + & + v3_fil(im1(i), jm1(j), k) + 2.0 * v3_fil(i, jm1(j), k) & + + v3_fil(ip1(i), jm1(j), k) + + enddo + + enddo + ! end do + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxy7 + ! + ---------------------------------------------------- + ! + + ! do k=1,k3_fil + do j = 1, my + + ! +--Forward Sweep + + WTxy6(1, j) = -a1_fil(1, k) / b1_fil(1, k) + WTxy7(1, j) = WTxy4(1, j) / b1_fil(1, k) + + WVxy6(1, j) = -a1_fil(1, k) / b1_fil(1, k) + WVxy7(1, j) = WVxy4(1, j) / b1_fil(1, k) + + do i = ip11, mx + WTxy6(i, j) = -a1_fil(i, k) & + / (a1_fil(i, k) * WTxy6(i - 1, j) + b1_fil(i, k)) + WTxy7(i, j) = (WTxy4(i, j) - a1_fil(i, k) * WTxy7(i - 1, j)) & + / (a1_fil(i, k) * WTxy6(i - 1, j) + b1_fil(i, k)) + + WVxy6(i, j) = -a1_fil(i, k) & + / (a1_fil(i, k) * WVxy6(i - 1, j) + b1_fil(i, k)) + WVxy7(i, j) = (WVxy4(i, j) - a1_fil(i, k) * WVxy7(i - 1, j)) & + / (a1_fil(i, k) * WVxy6(i - 1, j) + b1_fil(i, k)) + + enddo + + ! +--Backward Sweep + + do i = mx1, 1, -1 + WTxy7(i, j) = WTxy6(i, j) * WTxy7(i + 1, j) + WTxy7(i, j) + WVxy7(i, j) = WVxy6(i, j) * WVxy7(i + 1, j) + WVxy7(i, j) + enddo + + enddo + ! end do + + ! +--2th Equations System + ! + ==================== + + ! +--Gaussian Elimination Algorithm: Set Up + ! + -------------------------------------- + + ! do k=1,k3_fil + do i = ip11, mx1 + WTxy4(i, 1) = f3_fil(i, 1, k) + WTxy4(i, my) = f3_fil(i, my, k) + WVxy4(i, 1) = v3_fil(i, 1, k) + WVxy4(i, my) = v3_fil(i, my, k) + do j = jp11, my1 + WTxy4(i, j) = WTxy7(i, j) + WVxy4(i, j) = WVxy7(i, j) + enddo + enddo + ! end do + + ! +--Gaussian Elimination Algorithm: F-B Sweep ==> WTxy7 + ! + ---------------------------------------------------- + + ! do k=1,k3_fil + do i = 1, mx + + ! +--Forward Sweep + + WTxy6(i, 1) = -a2_fil(1, k) / b2_fil(1, k) + WTxy7(i, 1) = WTxy4(i, 1) / b2_fil(1, k) + + WVxy6(i, 1) = -a2_fil(1, k) / b2_fil(1, k) + WVxy7(i, 1) = WVxy4(i, 1) / b2_fil(1, k) + + do j = jp11, my + WTxy6(i, j) = -a2_fil(j, k) & + / (a2_fil(j, k) * WTxy6(i, j - 1) + b2_fil(j, k)) + WTxy7(i, j) = (WTxy4(i, j) - a2_fil(j, k) * WTxy7(i, j - 1)) & + / (a2_fil(j, k) * WTxy6(i, j - 1) + b2_fil(j, k)) + + WVxy6(i, j) = -a2_fil(j, k) & + / (a2_fil(j, k) * WVxy6(i, j - 1) + b2_fil(j, k)) + WVxy7(i, j) = (WVxy4(i, j) - a2_fil(j, k) * WVxy7(i, j - 1)) & + / (a2_fil(j, k) * WVxy6(i, j - 1) + b2_fil(j, k)) + + enddo + + ! +--Backward Sweep + + do j = my1, 1, -1 + WTxy7(i, j) = WTxy6(i, j) * WTxy7(i, j + 1) + WTxy7(i, j) + WVxy7(i, j) = WVxy6(i, j) * WVxy7(i, j + 1) + WVxy7(i, j) + enddo + + enddo + ! end do + + ! +--Result + ! + ====== + + ! do k=1,k3_fil + do j = jp11, my1 + do i = ip11, mx1 + f3_fil(i, j, k) = WTxy7(i, j) + v3_fil(i, j, k) = WVxy7(i, j) + enddo + enddo + enddo +!$OMP END PARALLEL DO + + return +endsubroutine DYNfil_3D_mp2 diff --git a/MAR/code_mar/dyngpo.f90 b/MAR/code_mar/dyngpo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..14352484dfc60beabe57ad0e8e74c3f5c406baee --- /dev/null +++ b/MAR/code_mar/dyngpo.f90 @@ -0,0 +1,87 @@ +subroutine dyngpo_mp + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FAST 16-12-2000 MAR | + ! | subroutine DYNgpo contains the Integration of Hydrostatic Relation | + ! | and the Computation of Real Temperature t [K] | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ pktaDY(mx,my,mzz): Reduced Potential Temperature | + ! | gplvDY(mx,my,mzz): Surface Geopotential (i.e. for k=mzz) | + ! | virDY(mx,my,mz) : Air Loading by water vapor & hydrometeors | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ pkDY(mx,my,mz) : Exner Potential | + ! | tairDY(mx,my,mz) : Temperature [K] | + ! | gplvDY(mx,my,mzz): Geopotential [m2/s2] | + ! | | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + use mar_dy + use mar_wk + + implicit none + + integer i, j, k, m + real ab + + ! +--EXNER Potential and Temperature + ! + =============================== + ab = 0.5 * (1.0 - sigmid(mz)) / (1.0 - sigmid(mmz1)) + +!$OMP PARALLEL DO private(i,j,k) + do j = 1, my + do k = 1, mz + do i = 1, mx + pkDY(i, j, k) = exp(cap * log(pstDYn(i, j) * sigma(k) + ptopDY)) + tairDY(i, j, k) = pktaDY(i, j, k) * pkDY(i, j, k) + WTxyz1(i, j, k) = cp * pkDY(i, j, k) + enddo + ! end do + enddo + + do k = 1, mmz1 + ! do j=1,my + do i = 1, mx + WTxyz2(i, j, k) = cp * pkDY(i, j, kp1(k)) + enddo + ! end do + enddo + + ! do j=1,my + do i = 1, mx + WTxyz2(i, j, mz) = cp * & + exp(cap * log(pstDYn(i, j) + ptopDY)) + enddo + ! end do + + ! +--Integration of the Hydrostatic Equation / Work Arrays Reset + ! + =========================================================== + + ! do j=1,my + do i = 1, mx + gplvDY(i, j, mz) = gplvDY(i, j, mzz) + (WTxyz2(i, j, mz) - WTxyz1(i, j, mz)) & + * ((1.0 + ab) * pktaDY(i, j, mz) * (1.0 + virDY(i, j, mz)) & + - ab * pktaDY(i, j, mmz1) * (1.0 + virDY(i, j, mmz1))) + WTxyz1(i, j, mz) = 0.0 + WTxyz2(i, j, mz) = 0.0 + enddo + ! end do + + do k = mmz1, 1, -1 + ! do j=1,my + do i = 1, mx + gplvDY(i, j, k) = gplvDY(i, j, kp1(k)) + (WTxyz2(i, j, k) - WTxyz1(i, j, k)) & + * (pktaDY(i, j, k) * (1.0 + virDY(i, j, k)) & + + pktaDY(i, j, kp1(k)) * (1.0 + virDY(i, j, kp1(k)))) * 0.5 + + enddo + enddo + enddo +!$OMP END PARALLEL DO + + return +endsubroutine dyngpo_mp diff --git a/MAR/code_mar/dynloa.f90 b/MAR/code_mar/dynloa.f90 new file mode 100644 index 0000000000000000000000000000000000000000..89b85340a6b4bfa1bc2e7375a6da3e72f5397381 --- /dev/null +++ b/MAR/code_mar/dynloa.f90 @@ -0,0 +1,146 @@ +#include "MAR_pp.def" +subroutine dynloa + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS Mon 11-Apr-2011 MAR | + ! | subroutine dynloa computes the Air Loading due to the Precipitation | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ qvDY(mx,my,mz) : Air Specific Humidity [kg/kg] | + ! | qwHY(mx,my,mz) : Cloud Droplets Concentration [kg/kg] | + ! | qiHY(mx,my,mz) : Cloud ice Crystals Concentration [kg/kg] | + ! | qrHY(mx,my,mz) : Rain Drops Concentration [kg/kg] | + ! | qsHY(mx,my,mz) : Snow Flakes Concentration [kg/kg] | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ virDY(mx,my,mz) : Air Loading by Water Vapor & Hydrometeors | + ! | virSL(mx,my) : Air Loading by Water Vapor & Hydrometeors | + ! | (in the Surface Layer) | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_hy + use mar_sl +#if(TC) + use mar_tc +#endif +#if(BV) + use marvec +#endif + + implicit none + + integer i, j, k, m +#if(BV) + integer kdim + real deltav + data deltav/0.20/ +#endif + + ! +--Air Loading including Specific Humidity (Level 0) + ! + ================================================= + ! cCAiso qvDY is initialized to 0 with the compiler + do k = 1, mz + do j = 1, my + do i = 1, mx + virDY(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + + ! +--Air Loading including all Hydrometeors (Level 1) + ! + ================================================= + do k = 1, mz + do j = 1, my + do i = 1, mx + virDY(i, j, k) = qvDY(i, j, k) & + - 1.64 * min(demi, qwHY(i, j, k) + qiHY(i, j, k) + & + qrHY(i, j, k) + qsHY(i, j, k)) + enddo + enddo + enddo + + ! +--Air Loading including Correction Factor (Level 2) + ! + ================================================= + do k = 1, mz + do j = 1, my + do i = 1, mx + virDY(i, j, k) = 0.850 * virDY(i, j, k) + enddo + enddo + enddo + + ! +--Lateral Boundary Conditions + ! + =========================== + do k = 1, mz + do j = 1, my + virDY(1, j, k) = virDY(ip11, j, k) + virDY(mx, j, k) = virDY(mx1, j, k) + enddo + do i = 1, mx + virDY(i, 1, k) = virDY(i, jp11, k) + virDY(i, my, k) = virDY(i, my1, k) + enddo + enddo + +#if(BV) + ! +--Air Loading for SBL Parameterization + ! + ==================================== + dumeps(1) = deltav + do j = 1, my + do i = 1, mx + dumy3D(i, j, 1) = fracSL * 0.715 * virDY(i, j, mz) & + + (1.0 - fracSL) * virSL(i, j) + enddo + enddo + kdim = 1 + ! +--Filtering + ! + --------- + if(mmx > 1) then + if(mmy == 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + if(no_vec) then + if(openmp) then + ! ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! ********** + else + ! ********** + call DYNfil_3D(dumy3D, dumeps, kdim) + ! ********** + endif + else + ! cCA : DYNfilv3D does not exist + ! ! + ********* + ! call DYNfilv3D (dumy3D, dumeps, kdim) + ! ! + ********* + endif + endif + endif + do j = 1, my + do i = 1, mx + virSL(i, j) = dumy3D(i, j, 1) + enddo + enddo +#endif +#if(OM) + ! +--NO Loading included in case of Mountain Waves Tests + ! + =================================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + virDY(i, j, k) = 0.0d+0 + enddo + enddo + enddo +#endif + return +endsubroutine dynloa diff --git a/MAR/code_mar/dynqqm.f90 b/MAR/code_mar/dynqqm.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b15f63ee861972b192f6b15af42650402f7d617a --- /dev/null +++ b/MAR/code_mar/dynqqm.f90 @@ -0,0 +1,280 @@ +#include "MAR_pp.def" +subroutine DYNqqm(specQt, kk, eval_s, eval_p) + !--------------------------------------------------------------------------+ + ! MAR DYNAMICS SLOW Wed 08-09-2017 MAR | + ! | + ! subroutine DYNqqm restaures Water Mass | + ! | + !--------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_fi + use marqqm + use mar_wk + use marmagic + + implicit none + + logical RetroD + logical Set_MM + logical logqqm + common / DYNqqm_log / logqqm + real specQt(mx, my, mz) + character * 3 eval_s + character * 6 eval_p + + ! Local Variables + ! ================ + + integer i, j, k, m + character * 6 eval0p + common / DYNqqm_cha / eval0p + + real fac_mm, summmm, sum_mm, countr + real sumnew, qqnmin(mz), qqnmax(mz) + real sumbak(mz), qqxmin(mz), qqxmax(mz) & + , qqnFil(mx, my, mz) + common / DYNqqm_rea / sumbak, qqxmin, qqxmax & + , qqnFil + + data RetroD/.false./ + data Set_MM/.false./ + data logqqm/.false./ + real FacFIk + integer kk + + ! FacFIk=humidity_magic*max(0.8,min(1.2,(25000./dx)**0.25)) + + FacFIk = max(1., min(humidity_magic, 25.)) + + ! Conservation Constraint Boundary + ! ================================ + + if(.not. logqqm) then + logqqm = .true. + ! write(6,6) lb + !6 format(/,'*** DYNqqm: lb =',i3,' ***',/,' ******',/) + endif + + ! Retro-diffusion (Before Process) + ! ================================ + + !$OMP PARALLEL do private (i,j,k, fac_mm,summmm,sum_mm,countr,sumnew) + do k = kk, mz + if(RetroD) then + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = (FIsloQ / FIslou) & + * FIkhmn * (specQt(i - 1, j, k) - 4. & + *specQt(i, j, k) + specQt(i + 1, j, k) & + + specQt(i, j - 1, k) + specQt(i, j + 1, k)) & + * dtx / dx + enddo + enddo + ! end do + ! do k=1,mz + do j = 1, my + do i = 1, mx + specQt(i, j, k) = specQt(i, j, k) - WKxyz1(i, j, k) + WKxyz1(i, j, k) = 0. + enddo + enddo + ! end do + endif + + ! Mass Evaluation (Before Process) + ! ================================ + + if(eval_s == 'BAK') then + eval0p = eval_p + ! do k=1,mz + qqxmax(k) = 0.0 + qqxmin(k) = 1.e20 + do j = 1, my + do i = 1, mx + qqnFil(i, j, k) = specQt(i, j, k) * pstDYn(i, j) & + / (SFm_DY(i, j) * SFm_DY(i, j)) + qqxmax(k) = max(qqxmax(k), qqnFil(i, j, k)) + qqxmin(k) = min(qqxmin(k), qqnFil(i, j, k)) + enddo + enddo + ! end do + + if(FIBord) then + ! do k=1,mz + sumbak(k) = 0.0 + do j = lgy, ldy + do i = lgx, ldx + sumbak(k) = sumbak(k) + qqnFil(i, j, k) + enddo + enddo + ! end do + + if(eval_p(1:3) == 'FIL') then + + ! do k=1,mz + do j = lgy, ldy + sumbak(k) = sumbak(k) + dtx & + * (FIkhmn * FacFIk * & + (specQt(lgx1, j, k) * pstDYn(lgx1, j) & + - specQt(lgx, j, k) * pstDYn(lgx, j) & + + specQt(ldx1, j, k) * pstDYn(ldx1, j) & + - specQt(ldx, j, k) * pstDYn(ldx, j))) / & + dx + enddo + + do i = lgx, ldx + sumbak(k) = sumbak(k) + dtx & + * (FIkhmn * FacFIk * & + (specQt(i, lgy1, k) * pstDYn(i, lgy1) & + - specQt(i, lgy, k) * pstDYn(i, lgy) & + + specQt(i, ldy1, k) * pstDYn(i, ldy1) & + - specQt(i, ldy, k) * pstDYn(i, ldy))) / & + dx + enddo + ! end do + endif + else + ! do k=1,mz + sumbak(k) = 0.0 + do j = 1, my + do i = 1, mx + sumbak(k) = sumbak(k) + qqnFil(i, j, k) + enddo + enddo + ! end do + endif + + else if(eval_s == 'SET') then + ! Mass Reset (After Process) + ! =========================== + if(eval_p /= eval0p) then + write(6, 6010) eval_p, eval0p +6010 format('Problem in Mass Reset, Process', a7, ' .NE. ', a6) + STOP + endif + ! do k=1,mz + qqnmax(k) = 0.0 + qqnmin(k) = 1.e20 + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = specQt(i, j, k) * pstDYn(i, j) & + / (SFm_DY(i, j) * SFm_DY(i, j)) + enddo + enddo + ! end do +#if(VQ) + summmm = 0.0 +#endif + if(FIBord) then + ! do k=1,mz + sumnew = 0.0 + do j = lgy, ldy + do i = lgx, ldx + sumnew = WKxyz1(i, j, k) + sumnew + enddo + enddo + sumnew = max(eps9, sumnew) + countr = (ldx - lgx + 1) * (ldy - lgy + 1) + fac_mm = sumbak(k) / sumnew +#if(VQ) + summmm = summmm + dsigm1(k) * fac_mm +#endif + do j = 1, my + do i = 1, mx + specQt(i, j, k) = specQt(i, j, k) * fac_mm + WKxyz1(i, j, k) = WKxyz1(i, j, k) * fac_mm + qqnmax(k) = max(WKxyz1(i, j, k), qqnmax(k)) + qqnmin(k) = min(WKxyz1(i, j, k), qqnmin(k)) + enddo + enddo + sumbak(k) = sumbak(k) / countr + ! end do + else + ! do k=1,mz + sumnew = 0.0 + do j = 1, my + do i = 1, mx + sumnew = WKxyz1(i, j, k) + sumnew + enddo + enddo + sumnew = max(eps9, sumnew) + countr = mx * my + fac_mm = sumbak(k) / sumnew +#if(VQ) + summmm = summmm + dsigm1(k) * fac_mm +#endif + do j = 1, my + do i = 1, mx + specQt(i, j, k) = specQt(i, j, k) * fac_mm + WKxyz1(i, j, k) = WKxyz1(i, j, k) * fac_mm + qqnmax(k) = max(WKxyz1(i, j, k), qqnmax(k)) + qqnmin(k) = min(WKxyz1(i, j, k), qqnmin(k)) + enddo + enddo + sumbak(k) = sumbak(k) / countr + ! end do + endif + + ! Maximorum/Minimorum RESET (water vapor only) + ! ============================================ + + if(eval_p == 'FIL_Qv' .and. Set_MM) then +#if(VQ) + sum_mm = 0. +#endif + ! do k=1,mz + fac_mm = (qqxmax(k) - sumbak(k)) & + / (max(epsi, qqnmax(k) - sumbak(k))) + fac_mm = min((sumbak(k) - sigma(k) * 103.5 * epsq) & + / (sumbak(k) - qqnmin(k)), fac_mm) + fac_mm = max(1.0, fac_mm) +#if(VQ) + sum_mm = sum_mm + dsigm1(k) * fac_mm +#endif + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = sumbak(k) + fac_mm * (WKxyz1(i, j, k) - sumbak(k)) + specQt(i, j, k) = WKxyz1(i, j, k) * SFm_DY(i, j) * SFm_DY(i, j) & + / pstDYn(i, j) + enddo + enddo + ! end do + + ! Output of Statistics + ! ==================== +#if(VQ) + if(mod(jhurGE, 3) == 0 .and. minuGE == 0 .and. jsecGE == 0) write(24, 240) +240 format(21x, 'RESTORE MASS ... EXTREMA') + write(24, 241) jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, jsecGE & + , summmm, sum_mm +241 format(i3, '-', a3, '-', i4, i3, 'h', i2, ':', i2, 2f12.6) +#endif + endif + + ! Work Array(s) reset + ! =================== + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0. + enddo + enddo + ! end do + + else + write(6, 6020) eval_s +6020 format('Problem in Mass Reset, Type ', a4) + STOP + ENDif + enddo + !$OMP END PARALLEL DO + + return +endsubroutine DYNqqm diff --git a/MAR/code_mar/dynrho.f90 b/MAR/code_mar/dynrho.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0abc6f0e37ee5c17b8236870498a1f46b3cc4dc6 --- /dev/null +++ b/MAR/code_mar/dynrho.f90 @@ -0,0 +1,67 @@ +subroutine dynrho + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS 16-12-2000 MAR | + ! | subroutine dynrho computes the Air Specific Mass | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ pstDY(mx,my) : Atmosphere Thickness [kPa] | + ! | tairDY(mx,my,mz): Air Temperature [K] | + ! | virDY(mx,my,mz): Air Loading by Water Vapor and Hydrometeors | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ rolvDY(mx,my,mz): Air Specific Mass at Sigma Levels [T/m3] | + ! | romiDY(mx,my,mz): Air Specific Mass in Sigma Layers [T/m3] | + ! | pstDY2(mx,my) : Atmosphere Thickness Squared [kPa2] | + ! | | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + use mar_dy + use mar_sl + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m + real sigmmz + ! + + ! +--Perfect Gas Law Relationship + ! + ---------------------------- + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + ! rolvDY(i,j,k) : Air Specific Mass at grid point (i,j,k) + ! 0.715 allows to include vir by 0.715=0.608/0.850 + rolvDY(i, j, k) = (pstDYn(i, j) * sigma(k) + ptopDY) & + / (RDryAi * tairDY(i, j, k) * (1.0 + 0.715 * virDY(i, j, k))) + enddo + enddo + enddo + ! + + do k = 1, mmz1 + do j = 1, my + do i = 1, mx + ! romiDY(i,j,k) : Air Specific Mass at grid point (i,j,k+1/2) + romiDY(i, j, k) = (pstDYn(i, j) * sigmid(kp1(k)) + ptopDY) & + / (RDryAi * 0.5 * (tairDY(i, j, k) * (1.0 + 0.715 * virDY(i, j, k)) & + + tairDY(i, j, kp1(k)) * (1.0 + 0.715 * virDY(i, j, kp1(k))))) + enddo + enddo + enddo + ! + + sigmmz = 0.500 * (1.0 + sigma(mz)) + do j = 1, my + do i = 1, mx + romiDY(i, j, mz) = (pstDYn(i, j) * sigmmz + ptopDY) & + / (RDryAi * 0.50 * (tairDY(i, j, mz) + TairSL(i, j)) & + * (1.0 + 0.715 * virDY(i, j, mz))) + pstDY2(i, j) = pstDY(i, j) * pstDY(i, j) + enddo + enddo + return +endsubroutine dynrho diff --git a/MAR/code_mar/dynwww.f90 b/MAR/code_mar/dynwww.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1637135f83b4f191840f154ef4ccaca28b7edeb1 --- /dev/null +++ b/MAR/code_mar/dynwww.f90 @@ -0,0 +1,75 @@ +#include "MAR_pp.def" +subroutine dynwww + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS DIAGNOSTICS 06-21-2022 MAR | + ! | subroutine dynwww computes Vertical Wind Speed wairDY (z Coordinate) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ psigDY(i,j,k): Vertical Wind Speed (Sigma Coordinate system) | + ! | on Level k | + ! | uairDY(i,j,k): k Sigma Level Wind (x-direction) [m/s] | + ! | vairDY(i,j,k): k Sigma Level Wind (y-direction) [m/s] | + ! | gplvDY(i,j,k): k Sigma Level Geopotential [m2/s2] | + ! | tairDY(i,j,k): k Sigma Level Temperature [K] | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ wairDY(i,j,k)= -(R T /p) g dSigma /dt + (u dz /dx +v dz /dy) | + ! | [cm/s] | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_dy + use mar_wk + use marvec + + implicit none + + integer i, j, k, m + + !$OMP PARALLEL do default(shared) private(i,j,k) + do j = 1, my + do i = 1, mx + do k = 1, mz + ! +--u d(phi)/d(x) + ! + ============= + + WKxyz2(i, j,k) = & + fac43 * (gplvDY(ip1(i), j, k) - gplvDY(im1(i), j, k) & + - 0.125 * (gplvDY(ip2(i), j, k) - gplvDY(im2(i), j, k))) * dyinv3(i, j) + + WKxyz1(i, j, k) = WKxyz2(i, j,k) * uairDY(i, j, k) + + ! +--v d(phi)/d(y) + ! + ============= + if(mmy > 1) then + + WKxyz2(i, j, k) = & + fac43 * (gplvDY(i, jp1(j), k) - gplvDY(i, jm1(j), k) & + - 0.125 * (gplvDY(i, jp2(j), k) - gplvDY(i, jm2(j), k))) * dyinv3(i, j) + + WKxyz1(i, j, k) = WKxyz1(i, j, k) & + + WKxyz2(i, j, k) * vairDY(i, j, k) + + endif + + ! +--Vertical Wind Speed (cm/s) + ! + ========================== + + wairDY(i, j, k) = -RDryAi * tairDY(i, j, k) * psigDY(i, j, k) * grvinv & + / (pstDY(i, j) * sigma(k) + ptopDY) * 100. & + +WKxyz1(i, j, k) * grvinv * 100. + + WKxyz2(i, j, k) = 0.0 + WKxyz1(i, j, k) = 0.0 + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +endsubroutine dynwww diff --git a/MAR/code_mar/filatmo.f90 b/MAR/code_mar/filatmo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..90a8ce511517451bbcb8ed8c5e7046651b7c0d55 --- /dev/null +++ b/MAR/code_mar/filatmo.f90 @@ -0,0 +1,142 @@ +#include "MAR_pp.def" +subroutine filatmo + ! +------------------------------------------------------------------------+ + ! | MAR Filtering 14-03-2018-XF MAR | + ! +------------------------------------------------------------------------+ + + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + use mardsv + + implicit none + integer i, j, k, m + real min_tt_sea, min_tt_land, diff_max +#if(AC) + data min_tt_sea/-80./ !degree C + data min_tt_land/-90./ !degree C +#endif + data min_tt_sea/-70./ !degree C + data min_tt_land/-75./ !degree C + data diff_max/35./ !degree C + + real :: min_tt, tt, diff, ww, w + real :: pk, ua, va, wa, gp, ps + real :: force_filtering(mx, my) + + integer :: n, ii, jj, step + + if(iterun <= 1) then + write(6, 11) min_tt_sea, min_tt_land +11 format(' WARNING: filatmo min Temp. over sea=', f5.0, & + ' min Temp. over land=', f5.0) + else + force_filtering = 0 + step = 0 +999 continue + !$OMP PARALLEL do default(shared) & + !$OMP private(i,j,k,min_tt,diff,pk,ua,va,wa,gp,ps,ww,ii,jj) & + !$OMP schedule(dynamic) + do k = mz / 3, mz + do i = 2, mx - 1 + do j = 2, my - 1 + if(isolSL(i, j) <= 2) then + min_tt = min_tt_sea + else + min_tt = min_tt_land + endif + + if(isnan(uairDY(i, j, k)) .or. isnan(tairDY(i, j, k)) & + .or. isnan(vairDY(i, j, k)) .or. tairDY(i, j, k) < 173.15) then + call time_steps + print *, "STOP in filatmo.f: NaN on pixel(i,j,k)", i, j, k + print *, tairDY(i, j, k), uairDY(i, j, k), vairDY(i, j, k) + stop + endif + + diff = 0 + + if(tairdy(i, j, k) - 273.15 < min(-30., min_tt + 30.)) then + diff = max(diff, abs(tairdy(i, j, k) - tairdy(i - 1, j, k))) + diff = max(diff, abs(tairdy(i, j, k) - tairdy(i + 1, j, k))) + diff = max(diff, abs(tairdy(i, j, k) - tairdy(i, j - 1, k))) + diff = max(diff, abs(tairdy(i, j, k) - tairdy(i, j + 1, k))) + endif + + if(tairdy(i, j, k) - 273.15 < min_tt .or. diff > diff_max .or. & + isnan(pktaDY(i, j, k)) .or. & + force_filtering(i, j) > 0) then + pk = 0 + ua = 0 + va = 0 + wa = 0 + gp = 0 + ps = 0 + ww = 0 + do ii = -1, 1 + do jj = -1, 1 + w = 1 + if(ii == 0 .or. jj == 0) w = 2 + if(ii == 0 .and. jj == 0) w = 0 + if(tairdy(i + ii, j + jj, k) > tairdy(i, j, k) + 20. .and. & + .not. isnan(pktaDY(i + ii, j + jj, k))) then + pk = pk + w * pktaDY(i + ii, j + jj, k) + ! ua = ua + w * uairDY(i+ii, j+jj, k) + ! va = va + w * vairDY(i+ii, j+jj, k) + ! wa = wa + w * wairDY(i+ii, j+jj, k) + gp = gp + w * gplvDY(i + ii, j + jj, k) + ps = ps + w * pstDY(i + ii, j + jj) + ww = ww + w + else + force_filtering(i + ii, j + jj) = 1 + endif + enddo + enddo + + if(ww > 2) then + pktaDY(i, j, k) = pk / ww + ! uairDY(i, j, k) = ua / ww + ! vairDY(i, j, k) = va / ww + ! wairDY(i, j, k) = wa / ww + gplvDY(i, j, k) = gp / ww + pstDY(i, j) = ps / ww + tt = -273.15 + pktaDY(i, j, k) * ((pstDY(i, j) * sigma(k) + ptopDY)**cap) + !$OMP CRITICAL + write(6, 12) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, & + i, j, k, tairdy(i, j, k) - 273.15, tt +12 format('ERROR filatmo', & + i5, 4i3, ' for (', i3, ','i3, ',', i2, ')', f6.0, '=>', f6.0) + write(6, *) + !$OMP END CRITICAL + tairdy(i, j, k) = pktaDY(i, j, k) * ((pstDY(i, j) * sigma(k) + ptopDY)**cap) + force_filtering(i, j) = 1 + endif + endif + enddo + enddo + enddo + !$OMP END PARALLEL DO + + do i = 2, mx - 1 + do j = 2, my - 1 + if(force_filtering(i, j) > 0 .and. step <= 1) then + step = step + 1 + goto 999 + endif + enddo + enddo + + endif + +endsubroutine filatmo diff --git a/MAR/code_mar/grdgeo.f90 b/MAR/code_mar/grdgeo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ffbdee0aae265543f381f5aaf68bd83b250c38fb --- /dev/null +++ b/MAR/code_mar/grdgeo.f90 @@ -0,0 +1,379 @@ +#include "MAR_pp.def" +subroutine grdgeo + ! +------------------------------------------------------------------------+ + ! | MAR GRID Tue 14-04-2021 MAR | + ! | subroutine grdgeo computes the Latitudes, Longitudes and | + ! | the Time Zone of each Grid Point | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: abs(maptyp)=0: Polar Stereogr. Project. (ALL LATITUDES) | + ! | ^^^^^ 1: Oblique Stereogr. Project. (ALL LATITUDES | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ imez,jmez : Indices of the MAR Domain Center | + ! | GEddxx : (2-D): x-Axis Direction | + ! | (3-D): South-North Direction along | + ! | 90E, 180E, 270E or 360E Meridians | + ! | GElat0 : Latitude of (0,0) in MAR (deg) | + ! | GElon0 : Longitude of (0,0) in MAR (deg) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ GElatr(mx,my): Latitude of the (x,y) MAR coordinate (rad) | + ! | GElonh(mx,my): Longitude of the (x,y) MAR coordinate (h) | + ! | itizGE(mx,my): Time Zone | + ! | fcorDY(mx,my): Coriolis Parameter (may be variable) | + ! | | + ! | MODIF. 3 Nov 2009 : Map Scaling Factor SFm_DY computed only | + ! | ^^^^^ for a domain which is North/South Pole | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m + integer i1_gg, i2_gg, id10, jd10 + real GElon, GElat, RadLat, clat_s + real argrot, cosrot, sinrot + real xxmar0, yymar0, x0, y0 + real ddista, xdista, ydista + real lon2, lat2, lon1, lat1, distance, d1, d2 + + ! +--GEOGRAPHIC Coordinates + ! + ====================== + if(.not. geoNST) then + ! +--1-D and 2-D Cases + ! + ----------------- + if(mmy == 1) then + argrot = (GEddxx - 90.0) * degrad + cosrot = cos(argrot) + sinrot = sin(argrot) + do j = 1, my + do i = 1, mx + xxmar0 = cosrot * (i - imez) * dx + sinrot * (j - jmez) * dx + yymar0 = cosrot * (j - jmez) * dx - sinrot * (i - imez) * dx + ! + ****** + call grdstr(xxmar0, yymar0, GElon0, GElat0, GElon, GElat, GEtrue) + ! + ****** + GElatr(i, j) = GElat + GElonh(i, j) = GElon + enddo + enddo + else + ! +--3-D Cases + ! + --------- + + ! +- ANTARCTICA (Polar Stereographic Projection is assumed) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(maptyp == 0) then + call stereosouth_inverse(GElon0, GElat0, GEddxx, x0, y0) + xxkm = xxkm + x0 + yykm = yykm + y0 + do j = 1, my + do i = 1, mx + xxmar0 = (i - imez) * dx / 1000.+x0 + yymar0 = (j - jmez) * dy / 1000.+y0 + ! + *********** + call StereoSouth(xxmar0, yymar0, GEddxx, GElon, GElat, GElat0) + ! + *********** + ! Conversion: degrees->hour + GElonh(i, j) = GElon / 15. + ! Conversion: rad ->degrees + GElatr(i, j) = GElat * degrad + enddo + enddo + endif + +#if(PP) + if(maptyp == 0) then + ! transformation stereographic coordinates (center = South Pole) + ! -> spherical coordinates + ddista = earthr * 2.0 * tan((45.0 + GElat0 * 0.50) * degrad) + xdista = ddista * cos((90.0 - GElon0) * degrad) + ydista = ddista * sin((90.0 - GElon0) * degrad) + do j = 1, my + do i = 1, mx + if(abs(GEddxx - 90.0) < epsi) then + xxmar0 = (i - imez) * dx + yymar0 = (j - jmez) * dy + endif + if(abs(GEddxx) < epsi) then + xxmar0 = (j - jmez) * dy + yymar0 = -(i - imez) * dx + endif + if(abs(GEddxx - 270.0) < epsi) then + xxmar0 = -(i - imez) * dx + yymar0 = -(j - jmez) * dy + endif + if(abs(GEddxx - 180.0) < epsi) then + xxmar0 = -(j - jmez) * dy + yymar0 = (i - imez) * dx + endif + + xxmar0 = xxmar0 + xdista + yymar0 = yymar0 + ydista + + ddista = sqrt(xxmar0 * xxmar0 + yymar0 * yymar0) + GElatr(i, j) = -0.5 * pi + 2.*atan(ddista * 0.5 / earthr) + if(abs(xxmar0) > zero) then + GElonh(i, j) = atan(yymar0 / xxmar0) + if(xxmar0 < zero) then + GElonh(i, j) = GElonh(i, j) + pi + endif + GElonh(i, j) = 0.50 * pi - GElonh(i, j) + if(GElonh(i, j) > pi) then + GElonh(i, j) = -2.00 * pi + GElonh(i, j) + endif + if(GElonh(i, j) < -pi) then + GElonh(i, j) = 2.00 * pi + GElonh(i, j) + endif + else + if(yymar0 > zero) then + GElonh(i, j) = 0.00 + else + GElonh(i, j) = pi + endif + endif + ! Conversion : radian -> Hour + GElonh(i, j) = GElonh(i, j) / hourad + enddo + enddo + endif +#endif + ! +- OTHERS (Oblique Stereographic Projection is assumed) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(abs(maptyp) == 1) then + do j = 1, my + do i = 1, mx + argrot = (GEddxx - 90.0) * degrad + cosrot = cos(argrot) + sinrot = sin(argrot) + xxmar0 = cosrot * (i - imez) * dx + sinrot * (j - jmez) * dy + yymar0 = cosrot * (j - jmez) * dy - sinrot * (i - imez) * dx + ! + *********** + call grdstr(xxmar0, yymar0, GElon0, GElat0, GElon, GElat, GEtrue) + ! + *********** + GElatr(i, j) = GElat + GElonh(i, j) = GElon + enddo + enddo + endif + endif + endif + + do i = 1, mx + lon2 = GElonh(i, jmez) * 15. + lat2 = GElatr(i, jmez) / degrad + lon1 = GElonh(imez, jmez) * 15. + lat1 = GElatr(imez, jmez) / degrad + xxkm2(i) = distance(lon2, lat2, lon1, lat1) + if(i <= imez) xxkm2(i) = -1.*xxkm2(i) + enddo + + do j = 1, my + lon2 = GElonh(imez, j) * 15. + lat2 = GElatr(imez, j) / degrad + lon1 = GElonh(imez, jmez) * 15. + lat1 = GElatr(imez, jmez) / degrad + yykm2(j) = distance(lon2, lat2, lon1, lat1) + if(j <= jmez) yykm2(j) = -1.*yykm2(j) + enddo + + do i = 2, mx - 1 + do j = 2, my - 1 + d1 = 0; d2 = 0 + do k = -1, 1, 2 + lon1 = GElonh(i, j) * 15. + lon2 = GElonh(i + k, j) * 15. + lat1 = GElatr(i, j) / degrad + lat2 = GElatr(i + k, j) / degrad + d1 = d1 + distance(lon2, lat2, lon1, lat1) / 2. + enddo + do k = -1, 1, 2 + lon1 = GElonh(i, j) * 15. + lon2 = GElonh(i, j + k) * 15. + lat1 = GElatr(i, j) / degrad + lat2 = GElatr(i, j + k) / degrad + d2 = d2 + distance(lon2, lat2, lon1, lat1) / 2. + enddo + area(i, j) = d1 * d2 + d1 = 0; d2 = 0 + do k = -1, 1, 2 + lon1 = GElonh(i, j) * 15. + lon2 = GElonh(i + k, j) * 15. + lat1 = GElatr(i, j) / degrad + lat2 = GElatr(i + k, j) / degrad + d1 = d1 + distance(lon2, lat2, lon1, lat1) / 2. + enddo + do k = -1, 1, 2 + lon1 = GElonh(i, j) * 15. + lon2 = GElonh(i, j + k) * 15. + lat1 = GElatr(i, j) / degrad + lat2 = GElatr(i, j + k) / degrad + d2 = d2 + distance(lon2, lat2, lon1, lat1) / 2. + enddo + dx3(i, j) = d1 * 1000. + dy3(i, j) = d2 * 1000. + dxy3(i, j) = (dx3(i, j) + dy3(i, j)) / 2. + dxinv3(i, j) = 1./(dx3(i, j) * 2.) + dyinv3(i, j) = 1./(dy3(i, j) * 2.) + enddo + enddo + + do i = 1, mx + area(i, 1) = area(i, 2) + area(i, my) = area(i, my - 1) + dx3(i, 1) = dx3(i, 2) + dx3(i, my) = dx3(i, my - 1) + dy3(i, 1) = dy3(i, 2) + dy3(i, my) = dy3(i, my - 1) + enddo + + do j = 1, my + area(1, j) = area(2, j) + area(mx, j) = area(mx - 1, j) + dx3(1, j) = dx3(2, j) + dx3(mx, j) = dx3(mx - 1, j) + dy3(1, j) = dy3(2, j) + dy3(mx, j) = dy3(mx - 1, j) + enddo + + ! +--Sine, Cosine of Latitude + ! + ======================== + do j = 1, my + do i = 1, mx + clatGE(i, j) = cos(GElatr(i, j)) + slatGE(i, j) = sin(GElatr(i, j)) + enddo + enddo + + ! +--Scaling Map Factor + ! + ================== + if(abs(GElat0) >= 90.-epsi) then + clat_s = 1.+sin((90.-GEtrue) * degrad) + do j = 1, my + do i = 1, mx + SFm_DY(i, j) = clat_s / (1.+abs(slatGE(i, j))) + enddo + enddo + else + do j = 1, my + do i = 1, mx + SFm_DY(i, j) = 1.0 + enddo + enddo + endif + + ! +--Numerical Equator + ! + ~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + if(abs(GElatr(i, j)) < epsi) then + RadLat = epsi + slatGE(i, j) = sin(RadLat) + clatGE(i, j) = cos(RadLat) + endif + + ! +--Numerical North Pole + ! + ~~~~~~~~~~~~~~~~~~~~ + if(GElatr(i, j) > demi * pi - epsi) then + RadLat = demi * pi - epsi + !XF slatGE(i,j) = sin(RadLat ) + !XF clatGE(i,j) = cos(RadLat ) + slatGE(i, j) = 1. + clatGE(i, j) = 0. + endif + + ! +--Numerical South Pole + ! + ~~~~~~~~~~~~~~~~~~~~ + if(GElatr(i, j) < epsi - demi * pi) then + RadLat = epsi - demi * pi + !XF slatGE(i,j) = sin(RadLat ) + !XF clatGE(i,j) = cos(RadLat ) + slatGE(i, j) = -1. + clatGE(i, j) = 0. + endif + enddo + enddo + + ! +--Coriolis Parameter + ! + ================== + do j = 1, my + do i = 1, mx + fcorDY(i, j) = 2.0 * earthv * sin(GElatr(i, j)) +#if(CC) + ! fcorDY: Coriolis Parameter + fcorDY(i, j) = 2.0 * earthv * sin(GElatr(imez, jmez)) +#endif + enddo + enddo + + ! +--Time Zone + ! + ========= + do j = 1, my + do i = 1, mx + itizGE(i, j) = GElonh(i, j) + if(itizGE(i, j) > 12) itizGE(i, j) = itizGE(i, j) - 24 + if(itizGE(i, j) < -12) itizGE(i, j) = itizGE(i, j) + 24 + enddo + enddo + + ! +--OUTPUT + ! + ====== + i1_gg = imez - 50 + i2_gg = imez + 50 + i1_gg = max(i1_gg, 1) + i2_gg = min(i2_gg, mx) + id10 = 1 + min(mx - 1, 10) + jd10 = 1 + min(my - 1, 10) + + write(4, 990)(i, i=i1_gg, i2_gg, id10) +990 format(/, ' LATITUDES / LONGITUDES / TOPOGRAPHY: x -> y ^ ', & + /, ' ===================================', /, 9x, 13i9) + do j = my, 1, -jd10 + do i = i1_gg, i2_gg, id10 + write(4, 991) j,(GElatr(i, j) / degrad) +991 format(i9, 11f9.3) + write(4, 992)(GElonh(i, j) * 1.5d+1) +992 format(9x, 11f9.3) + write(4, 993)(sh(i, j) * 1.0d-3) +993 format(9x, 11f9.3) + write(4, 994)(itizGE(i, j)) +994 format(9x, 11i9) + write(4, 995)(fcorDY(i, j)) +995 format(9x, 11f9.6) + enddo + enddo + + return +endsubroutine grdgeo + +function distance(lon2, lat2, lon1, lat1) + use marphy + implicit none + + real, parameter :: R = 6378.1370 + real :: lon1, lat1 + real :: lon2, lat2, distance + real :: dlat, dlon, a, c + + lat2 = lat2 * degrad + lon2 = lon2 * degrad + lat1 = lat1 * degrad + lon1 = lon1 * degrad + + dlat = (lat2 - lat1) + dlon = (lon2 - lon1) + a = sin(dLat / 2.) * sin(dLat / 2.) & + + cos(lat1) * cos(lat2) * sin(dLon / 2.) * sin(dLon / 2.) + c = 2.*atan2(sqrt(a), sqrt(1.-a)) + distance = max(0.0, R * c) +endfunction distance diff --git a/MAR/code_mar/grdmar.f90 b/MAR/code_mar/grdmar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..39c590b883d888dc215f25135368ff8ef8b1991c --- /dev/null +++ b/MAR/code_mar/grdmar.f90 @@ -0,0 +1,414 @@ +#include "MAR_pp.def" +subroutine grdmar + ! +------------------------------------------------------------------------+ + ! | MAR GRID 20-02-2021 MAR | + ! | subroutine grdmar is used to initialize the grid parameters | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ sigma(mz) : Independant Variable on Levels | + ! | FIslot : Implicit Filter Parameter | + ! | (Slow Dynamics / Temperature) | + ! | FIslou : ... (Slow Dynamics / Wind Speed) | + ! | FIslop : ... (Slow Dynamics / Pressure) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ xxkm(mx) : Distance along the x-axis (km) | + ! | yykm(my) : Distance along the y-axis (km) | + ! | | + ! | sigmid(mzz): Independant Variable between Levels (i.e.k-1/2)| + ! | dsigm1(mz ): Difference d(sigma)|k | + ! | qsigm1(mz ): 1 / [Difference d(sigma)|k ] | + ! | dsigm2(mz ): Difference 2d(sigma)|k | + ! | qsigm2(mz ): 1 / [Difference 2d(sigma)|k ] | + ! | dsig_1(mzz): Difference d(sigma)|k+1/2 | + ! | qsig_1(mzz): 1 / [Difference d(sigma)|k+1/2] | + ! | dsig_2(mzz): Difference 2d(sigma)|k+1/2 | + ! | | + ! | Ray_UB(mzabso) : Top Absorbing Layer Contribution to | + ! | Rayleigh Friction (-/s) | + ! | | + ! | TUspon(mzabso) : Top Absorbing Layer Contribution to | + ! | Horizontal Diffusion Coefficient (m2/s) | + ! | | + ! | FIspon(mzabso) : Top Absorbing Layer Contribution | + ! | to Implicit Filter Parameter | + ! | FIk_st(mz): Implicit Filter Parameter | + ! | (Slow Dynamics / Temperature) | + ! | FIk_su(mz): ...(Slow Dynamics / Wind Speed) | + ! | FIfstu, FIk_fu(mz): ...(Fast Dynamics / Wind Speed) | + ! | FIfstu, FIk_fp(mz): ...(Fast Dynamics / Pressure,Velocity) | + ! | | + ! | n6mxLB, n7mxLB : Effective Length of Lateral Sponge (x-Axe) | + ! | n6myLB, n7myLB : Effective Length of Lateral Sponge (y-Axe) | + ! | | + ! | im1(mx),2,..: max(i-1, 1), max(i-2, 1), etc... | + ! | ip1(mx),2,..: min(i+1,mx), min(i+2,mx), etc... | + ! | | + ! | jm1(my),2,..: max(j-1, 1), max(j-2, 1), etc... | + ! | jp1(my),2,..: min(j+1,my), min(j+2,my), etc... | + ! | | + ! | km1(mz),2,..: max(k-1, 1), max(k-2, 1), etc... | + ! | kp1(mz),2,..: min(k+1,mz), min(k+2,mz), etc... | + ! | | + ! | CUspxh(mx) : Cubic Spline Auxiliary Variable (x Direction) | + ! | CUspxb(mx) : idem | + ! | CUspyh(mx) : Cubic Spline Auxiliary Variable (y Direction) | + ! | CUspyb(mx) : idem | + ! | CUspzh(mx) : Cubic Spline Auxiliary Variable (z Direction) | + ! | CUspzb(mx) : idem | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_cu + use mar_lb + use mar_ub + use mar_tu + use mar_fi + use mar_io +#if(NH) + use mar_nh +#endif + + implicit none + + ! +--Local Variables + ! + ================ + ! + + integer i, j, k, m + integer im10, ip10, im20, ip20 + integer jm10, jp10, jm20, jp20 + integer km10, kp10, km20, mzabs + real FIabs + ! + + ! + + ! +--DATA + ! + ==== + ! + + logical DFspon + data DFspon/.true./ +#if(KS) + DFspon = .false. +#endif + ! + + ! +--Entry Checking Point + ! + ==================== + ! + + if(IO_loc >= 2) write(21, 999) +999 format(//, ' --- Initialisation / grdmar ---') + ! + + ! + + ! +--Auxiliary Horizontal Independant Variables + ! + ========================================== + ! + + mmx = mx + mmx1 = mx1 + mmx1 = max(1, mmx1) + mmx2 = mx - 2 + mmx2 = max(1, mmx2) + mmx3 = mx - 3 + mmx3 = max(1, mmx3) + mmx4 = mx - 4 + mmx4 = max(1, mmx4) + mmx5 = mx - 5 + mmx5 = max(1, mmx5) + mmx6 = mx - 6 + mmx6 = max(1, mmx6) + m0x2 = 2 + m0x2 = min(mx, m0x2) + m0x3 = 3 + m0x3 = min(mx, m0x3) + m0x4 = 4 + m0x4 = min(mx, m0x4) + m0x5 = 5 + m0x5 = min(mx, m0x5) + m0x6 = 6 + m0x6 = min(mx, m0x6) + ! + + mmy = my + mmy1 = my1 + mmy1 = max(1, mmy1) + mmy2 = my - 2 + mmy2 = max(1, mmy2) + mmy3 = my - 3 + mmy3 = max(1, mmy3) + mmy4 = my - 4 + mmy4 = max(1, mmy4) + mmy5 = my - 5 + mmy5 = max(1, mmy5) + mmy6 = my - 6 + mmy6 = max(1, mmy6) + m0y2 = 2 + m0y2 = min(my, m0y2) + m0y3 = 3 + m0y3 = min(my, m0y3) + m0y4 = 4 + m0y4 = min(my, m0y4) + m0y5 = 5 + m0y5 = min(my, m0y5) + m0y6 = 6 + m0y6 = min(my, m0y6) + ! + + mmz = mz + mmz1 = mz1 + mmz1 = max(1, mmz1) + mmz2 = mz - 2 + mmz2 = max(1, mmz2) + ! + + dx2 = dx * 2.0 + dy2 = dy * 2.0 + ! + + if(mmx > 1) then + ! + + dtx = dt / dx + dty = dt / dy + ! + + dxinv = 1.0 / dx + dyinv = 1.0 / dy + dxinv2 = 1.0 / dx2 + dyinv2 = 1.0 / dy2 + ! + + do i = 1, mx + ! xxkm : in km + xxkm(i) = (i - imez) * dx / 1000. + enddo + ! + + do j = 1, my + ! yykm : in kms + yykm(j) = (j - jmez) * dy / 1000. + enddo + ! + + endif + ! + + ! + + ! +--4th Order Centered Difference Parameter + ! + --------------------------------------- + ! + + fac43 = 4.0 / 3.0 + ! + + ! + + ! +--Effective Length of the Lateral Sponge + ! + -------------------------------------- + ! + + if(mmx == 1) then + n40xLB = 1 + n50xLB = 1 + n5mxLB = 1 + n6mxLB = 0 + n7mxLB = 1 + n40yLB = 1 + n50yLB = 1 + n5myLB = 1 + n6myLB = 0 + n7myLB = 1 + ! + + else + n40xLB = mx - n6 + 2 + n50xLB = mx - n6 + 1 + n5mxLB = n6 - 1 + n6mxLB = n6 + n7mxLB = n7 + ! + + if(mmy == 1) then + n40yLB = 1 + n50yLB = 1 + n5myLB = 1 + n6myLB = 0 + n7myLB = 1 + else + n40yLB = my - n6 + 2 + n50yLB = my - n6 + 1 + n5myLB = n6 - 1 + n6myLB = n6 + n7myLB = n7 + endif + ! + + endif + ! + + ! + + ! +--Boundaries Masks + ! + ---------------- + ! + + do i = 1, mx + im10 = i - 1 + ip10 = i + 1 + im1(i) = max(im10, 1) + ip1(i) = min(ip10, mx) + im20 = i - 2 + ip20 = i + 2 + im2(i) = max(im20, 1) + ip2(i) = min(ip20, mx) + enddo + ! + + do j = 1, my + jm10 = j - 1 + jp10 = j + 1 + jm1(j) = max(jm10, 1) + jp1(j) = min(jp10, my) + jm20 = j - 2 + jp20 = j + 2 + jm2(j) = max(jm20, 1) + jp2(j) = min(jp20, my) + enddo + ! + + ! + + ! +--Auxiliary Vertical Independant Variables + ! + ========================================== + ! + + ! + + ! +--Boundaries Masks + ! + ---------------- + ! + + do k = 1, mz + km10 = k - 1 + kp10 = k + 1 + km1(k) = max(km10, 1) + kp1(k) = min(kp10, mz) + km20 = k - 2 + km2(k) = max(km20, 1) + enddo + ! + + ! + + ! +--Discretisation + ! + -------------- + ! + + dsig_1(0) = sigma(1) + dsig_1(1) = sigma(kp1(1)) - sigma(1) + dsig_2(1) = sigma(kp1(1)) + sigmid(1) = 0.0 + sigmid(mzz) = 1.0 + ! + + do k = kp1(1), mmz1 + dsig_1(k) = sigma(kp1(k)) - sigma(k) + dsig_2(k) = sigma(kp1(k)) - sigma(km1(k)) + sigmid(k) = (sigma(k) + sigma(km1(k))) / 2.0 + dsigm1(km1(k)) = sigmid(k) - sigmid(km1(k)) + dsigm2(km1(k)) = sigmid(k) - sigmid(km2(k)) + enddo + ! + + ! +--The lowest layer of the model is assumed to be a constant flux layer + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dsig_1(mz) = 1.0 - sigma(mz) + dsig_2(mz) = sigma(mz) - sigma(km1(mz)) + sigmid(mz) = 0.50 * (sigma(mz) + sigma(km1(mz))) + dsigm1(km1(mz)) = sigmid(mz) - sigmid(km1(mz)) + dsigm2(km1(mz)) = sigmid(mz) - sigmid(km2(mz)) + ! + + dsig_1(mzz) = dsig_1(mz) + dsig_2(mzz) = 2.00 * dsig_1(mzz) + dsigm1(mz) = 1.00 - sigmid(mz) + dsigm2(mz) = 1.00 - sigmid(km1(mz)) + ! + + do k = 0, mzz + qsig_1(k) = 1.00 / dsig_1(k) + enddo + ! + + do k = 1, mz + qsigm1(k) = 1.00 / dsigm1(k) + qsigm2(k) = 1.00 / dsigm2(k) + enddo + ! + + ! + + ! +--Filter Parameter Initialisation (rapidly propagating Waves Dynamics) + ! + ======================================================================= + ! + + !XF + ! FIslou=max(FIslou,0.008) ! higher is, smoother the wind is + ! FIslop=max(FIslop,0.008) + ! FIslot=max(FIslot,0.008) ! higher is, colder MAR is + FIslot = 0.007 + FIfstu = FIslou / (ntFast + 1) + FIfstp = FIslop / (ntFast + 1) + ! + + do k = 1, mz + FIk_st(k) = FIslot / max(0.1, sigma(k)) + FIk_su(k) = FIslou / max(0.1, sigma(k)) + FIk_fu(k) = FIfstu / max(0.1, sigma(k)) + FIk_fp(k) = FIfstp / max(0.1, sigma(k)) + enddo + ! + + ! + + ! +--Top Absorbing Layer Initialisation + ! + ================================== + ! + + FIabs = TUkhmx * 4.0 * dtfast / (dx * dx) + ! + + if(mz > 1) then + mzabs = mzabso + 1 + mzabs = min(mz, mzabs) + if(DFspon) then + do k = 1, mzabso + FIspon(k) = FIabs * (sigma(mzabs) - sigma(k)) & + / (sigma(mzabs) - sigma(1)) + FIk_st(k) = FIk_st(k) + FIspon(k) * dt / dtfast + FIk_su(k) = FIk_su(k) + FIspon(k) * dt / dtfast + FIk_fu(k) = FIk_fu(k) + FIspon(k) + FIk_fp(k) = FIk_fp(k) + FIspon(k) + TUspon(k) = zero + enddo + else + do k = 1, mzabso + FIspon(k) = zero + TUspon(k) = TUkhmx * (sigma(mzabs) - sigma(k)) & + / (sigma(mzabs) - sigma(1)) + enddo + endif + endif + + ! +--Rayleigh Friction (Ref. ARPS 4.0 User's Guide, para 6.4.3 p.152) + ! + ================= + do k = 1, mzabso + Ray_UB(k) = 0.5 * (1.-cos(pi * (sigma(mzabso) - sigma(k)) & + / (sigma(mzabso) - sigma(1)))) / (1.5 * dt) +#if(rf) + Ray_UB(k) = (sigma(mzabso) - sigma(k)) / & + (sigma(mzabso) - sigma(1)) / (10.0 * dt) +#endif + enddo + + ! +--Cubic Spline Initialisation + ! + =========================== + ! + + ! + 1) x - Direction + ! + ---------------- + CUspxh(1) = 0.0 + CUspxh(mx) = 0.0 + CUspxb(1) = 0.0 + CUspxb(mx) = 0.0 + do i = ip11, mx1 + CUspxh(i) = CUspxb(im1(i)) + 4.0 + CUspxb(i) = -1.0 / CUspxh(i) + enddo + ! + + ! + 2) y - Direction + ! + ---------------- + CUspyh(1) = 0.0 + CUspyh(my) = 0.0 + CUspyb(1) = 0.0 + CUspyb(my) = 0.0 + if(mmy > 1) then + do j = jp11, my1 + CUspyh(j) = CUspyb(jm1(j)) + 4.0 + CUspyb(j) = -1.0 / CUspyh(j) + enddo + endif + ! + + ! + 3) Sigma - Direction (to be used in routine DYNadv_cubv) + ! + -------------------------------------------------------- +#if(ZU) + CUspzh(1) = dsig_1(1) / (dsig_1(1) + sigma(1)) + CUspzh(mz) = dsig_1(mz) / (dsig_1(mz) + dsig_1(mmz1)) + CUspzb(1) = sigma(1) / (dsig_1(1) + sigma(1)) + CUspzb(mz) = dsig_1(mmz1) / (dsig_1(mz) + dsig_1(mmz1)) + do k = kp1(1), mmz1 + CUspzh(k) = dsig_1(k) / (dsig_1(k) + dsig_1(k - 1)) + CUspzb(k) = dsig_1(k - 1) / (dsig_1(k) + dsig_1(k - 1)) + enddo +#endif + ! + + return +endsubroutine grdmar diff --git a/MAR/code_mar/grdsig.f90 b/MAR/code_mar/grdsig.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fa8a6629353a7c0b639b97d237d919b85e4d670c --- /dev/null +++ b/MAR/code_mar/grdsig.f90 @@ -0,0 +1,234 @@ +#include "MAR_pp.def" +subroutine grdsig(zmin, aavu, bbvu, ccvu, vertic) + ! +------------------------------------------------------------------------+ + ! | MAR GRID 15-02-2008 MAR | + ! | subroutine grdsig is used to initialize the vertical grid | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: zmin : Height above Surface / 1st Sigma Level (m) | + ! | ^^^^^ aavu,bbvu,ccvu : Vertical Discretization Parameters | + ! | vertic : Logical Variable caracteris.vertic.discris.| + ! | | + ! | DATA: sigpar(10) : Parish Model Vertical Discretisation | + ! | ^^^^^ | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ Variable which is initialized is: | + ! | sigma(mz): Independant Variable (Normalized Pressure) | + ! | | + ! | ASSUMPTION: sigma is calculated from initial level height amsl | + ! | ^^^^^^^^^^^ assumig that T(msl) = SST | + ! | dT/dz = -0.0065 K/m | + ! | p_s = 100 hPa | + ! | | + ! | # OPTIONS: #SA Regular Vertical Discretisation | + ! | # ^^^^^^^^ #PA Parish Model Vertical Discretisation | + ! | # #ll LMDZ Model Vertical Discretisation (L. Li) | + ! | # #HE NORLAM Vertical Discretisation (G. Heineman) | + ! | # #L1 Alternate Vertical Discretisation (when very fine) | + ! | | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + use marsnd + use mar_dy + use mar_tu + use mar_sl + use mar_io + use mar_wk + + implicit none + + logical, intent(in) :: vertic + + ! +--Local Variables + ! + ================ + integer i, j, k, m + integer lsf, lvg, kk, km, kn, k1 + real ga0, gaz, zmin, dzz, rz, rzb, zzo, sh_min + real ps_sig, vu, aavu, bbvu, ccvu, ps_max, pstar0 +#if(HE) + real sighei(29) +#endif +#if(lm) + real siglmd(11) +#endif +#if(PA) + real sigpar(10), sigp11, sigp12(11:12), sigp13(10:13) +#endif + + ! +--DATA + ! + ==== + ! data ps_sig/101.3e0/ + data ps_sig/100.0e0/ +#if(HE) + ! sighei: DNMI model Vertical Discretisat. (Heinemann 1996) + data sighei/0.10015, 0.19077, 0.27276, 0.34695, 0.41409, & + 0.47483, 0.52979, 0.57952, 0.62452, 0.66524, 0.70208, & + 0.73542, 0.76558, 0.79288, 0.81757, 0.83992, 0.86014, & + 0.87844, 0.89499, 0.90997, 0.92352, 0.93579, 0.94688, & + 0.95692, 0.96601, 0.97423, 0.98167, 0.98840, 0.99111/ +#endif +#if(lm) + ! siglmd: Vertical Discretisation of LMDZ Model + ! (Laurent LI, personal communication, 5 dec. 2000) + data siglmd/0.014767, 0.071835, 0.150135, 0.270661, 0.410669, & + 0.565832, 0.708390, 0.829996, 0.913837, 0.966484, & + 0.990723/ +#endif +#if(PA) + ! sigpar: Vertical Discretisation of Parish Model + ! (Bromwich, Du and Parish 1994 MWR 122 No 7 p.1418) + data sigpar/0.100, 0.350, 0.600, 0.800, 0.900, & + 0.930, 0.950, 0.970, 0.985, 0.996/ + ! sigp1x: Vertical Discretisation of Parish Model (modified) + data sigp11/0.998/ + data(sigp12(k), k=11, 12) / 0.998, 0.999 / + data(sigp13(k), k=10, 13) / 0.990, 0.996, 0.998, 0.999 / +#endif + data lsf/1/ + ! ga0 : Standard Atmospheric Lapse Rate + data ga0/0.0065e0/ + ! lvg : set to 1 if |Vg(sounding)| .ne. 0 anywhere + lvg = 0 + + ! +--Entry Checking Point + ! + ==================== + if(IO_loc >= 2) write(21, 999) +999 format(//, ' --- Initialisation / grdsig ---') + + ! +--Temperature Vertical Profile + ! + ============================ + gaz = ga0 + + if(IO_loc >= 2) write(21, 1) gaz, sst_SL, ps_sig, gravit, RDryAi +1 format(/, ' dT/dz =', f8.5, ' K/m', & + /, ' SST =', f8.2, ' K', & + /, ' ps_sig =', f8.2, ' kPa', & + /, ' gravit =', f8.2, ' m/s2', & + /, ' RDryAi =', f8.2, ' J/kg/K') + + ! +--Sigma Levels + ! + ============ + + ! +- 1) Coarse Resolution of the Surface Layer + ! + ----------------------------------------- + if(.not. vertic) then + ! Reference : E. Richard, these, 1991, p.29 + ! aa = 0.5 + ! bb = 1.5 + ! cc =-1.0 + vu = 0.0 + do k = 1, mz + vu = vu + 1.0 / dble(mzz) + sigma(k) = aavu * vu + bbvu * vu * vu + ccvu * vu * vu * vu +#if(HE) + ! +- Vertical Discretisation of NORLAM + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + sigma(k) = sighei(k) +#endif + enddo +#if(lm) + do k = 1, 11 + sigma(k) = siglmd(k) + enddo +#endif +#if(PA) + ! +- Vertical Discretisation of Parish Model + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, 10 + sigma(k) = sigpar(k) + enddo + mmz = mz + if(mmz > 10) then + if(mmz == 11) sigma(11) = sigp11 + if(mmz == 12) then + do k = 11, 12 + sigma(k) = sigp12(k) + enddo + endif + if(mmz == 13) then + do k = 10, 13 + sigma(k) = sigp13(k) + enddo + endif + endif +#endif + do k = 1, mz + if(abs(gaz) > 1.d-5) then + zsigma(k) = -(sst_SL / gaz) * ((1.e0 + (sigma(k) - 1.e0) & + * (1.e2 / ps_sig))**(RDryAi * gaz / gravit) - 1.e0) + else + if(IO_loc >= 2 .and. k == 1) write(21, 116) +116 format(/, ' t(z) = CONSTANT') + zsigma(k) = -(RDryAi * sst_SL / gravit) * log((unun + (sigma(k) - unun) & + * (1.d2 / ps_sig))) + endif + enddo + else + ! +- 2) Fine Resolution of the Surface Layer + ! + ----------------------------------------- + gaz = max(gaz, epsi) + km = 2 + km = min(km, mz) + kn = 1 +#if(L1) + kn = 2 +#endif + zsigma(1) = zmin + zsigma(km) = 2.0 * zmin + do k = min(3, mz), mz + rz = zmin * aavu**(k - 1) + rzb = ccvu * bbvu**(k - 1) + if(TUkhmx > 0.0) then + zsigma(k) = rzb * rz / (rz + rzb) + else + zsigma(k) = rz + endif + + zsigma(k) = max(zsigma(k), zsigma(k - 1) + zsigma(kn)) + enddo + ! sh_min_0 : Everest + sh_min = 8807.0 + do j = 1, my + do i = 1, mx + sh_min = min(sh_min, sh(i, j)) + enddo + enddo + ps_max = ps_sig * (1.0 - gaz * sh_min / sst_SL) & + **(gravit / (gaz * RDryAi)) + pstar0 = ps_max - ptopDY + do k = 1, mz + kk = mz + 1 - k + ! sigma(kk): the fine resolution of the surface layer + ! is computed using a geometric progression + sigma(kk) = (ps_sig / pstar0) & + * ((1.0 - gaz * (sh_min + zsigma(k)) / sst_SL) & + **(gravit / (gaz * RDryAi)) & + - 1.0) & + + 1.0 + (ps_sig - ps_max) / pstar0 + enddo + endif + + ! +--Output + ! + ====== + do k = 1, mz + kk = mzz - k + WKxza(1, k) = zsigma(kk) + enddo + + do k = 1, mz + zsigma(k) = WKxza(1, k) + WKxza(1, k) = 0.0 + enddo + + if(IO_loc >= 2) then + write(21, 130)(sigma(k), k=1, mz) +130 format(/, ' Sigma Levels :', /,(1x, 15f8.4)) + write(21, 131)(zsigma(k), k=1, mz) +131 format(/, ' Altitude Levels :', /,(1x, 15f8.1)) + endif + return +endsubroutine grdsig diff --git a/MAR/code_mar/grdstr.f90 b/MAR/code_mar/grdstr.f90 new file mode 100644 index 0000000000000000000000000000000000000000..98c7a8d3e405a35887b8952145948f18818b428d --- /dev/null +++ b/MAR/code_mar/grdstr.f90 @@ -0,0 +1,119 @@ +#include "MAR_pp.def" +subroutine grdstr(xxmar, yymar, GE0lon, GE0lat, GElonM, GElatM, GEtruL) + ! +------------------------------------------------------------------------+ + ! | MAR GRID 19-11-2004 MAR | + ! | subroutine grdstr computes the Latitudes, Longitudes | + ! | of a MAR Domain Grid Point | + ! | assuming Inverse Stereographic Oblique Projection | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: xxmar ,yymar : MAR Coordinates | + ! | ^^^^^^ GE0lon,GE0lat: Geographic Coordinates of MAR Domain Center | + ! | (3-D): South-North Direction along | + ! | 90E, 180E, 270E or 360E Meridians | + ! | | + ! | OUTPUT: GElatM : Latitude of the MAR grid point (radian) | + ! | ^^^^^^^ GElonM : Longitude of the MAR grid point (hour) | + ! | | + ! | REFERENCE: F. Pearson, Map projection methods, CRC Press, 1990. | + ! | ^^^^^^^^^^ | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + + implicit none + + ! +--local Parameters + ! + ================= + integer i, j, k, m + real pidemi, CphiP, SphiP, Sphi + real dGElon, GElonM, GElatM + real GEtruL, GE0lon, GE0lat + real denomi, OBLlon, OBLlat + real ddista, xxmar, yymar + real costru + + pidemi = pi / 2.0 + + CphiP = cos(degrad * GE0lat) + SphiP = sin(degrad * GE0lat) + + costru = cos(degrad * GEtruL) + + ! +--Coordinates relative to a Pole set to the Domain Center + ! + ======================================================= + + ! +--Relative Longitude -OBLlon (0 <= OBLlon < 2pi) + ! + ---------------------------------------------- + if(xxmar > 0.) then + OBLlon = pidemi - atan(yymar / xxmar) + else if(xxmar == 0. .and. yymar < 0.) then + OBLlon = pi + else if(xxmar < 0.) then + OBLlon = 3.00 * pidemi - atan(yymar / xxmar) + else if(xxmar == 0. .and. yymar >= 0.) then + OBLlon = 0.0 + endif + + ! +--Relative Latitude OBLlat + ! + -------------------------- + ddista = sqrt(xxmar * xxmar + yymar * yymar) + OBLlat = 0.50 * pi - 2.0 * atan(ddista / (earthr * (1.+costru))) + + ! +--Coordinates Change (OBLlon,OBLlat) -> (GElonM,GElatM) + ! + / (rotation, Pearson p.57) + ! + ===================================================== + + ! +--Latitude (radians) + ! + ------------------ + Sphi = SphiP * sin(OBLlat) + CphiP * cos(OBLlat) * cos(OBLlon) + GElatM = asin(Sphi) + + ! +--Longitude (hours) + ! + ------------------ + ! +--dGElon = GElonM - GE0lon (-pi < dGElon <= pi) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + denomi = CphiP * tan(OBLlat) - SphiP * cos(OBLlon) + + if(OBLlon > epsi .and. OBLlon < (pi - epsi)) then + ! +--1) OBLlon in trigonometric quadrant 1 or 4 ("right"): + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dGElon = atan(sin(OBLlon) / denomi) + if(dGElon < 0.0) then + ! Go to Quadrant 1 by adding180 degrees + dGElon = dGElon + pi + endif + ! +--2) OBLlon is in trigonometric quadrant 2or3 ("left "): + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(OBLlon > (pi + epsi) .and. OBLlon < (2.0 * pi - epsi)) then + dGElon = atan(sin(OBLlon) / denomi) + if(dGElon > 0.0) then + ! Go to Quadrant 2 by substracting 180 degrees + dGElon = dGElon - pi + endif + else if(OBLlon <= epsi .or. OBLlon >= (2.0 * pi - epsi)) then + ! +--3) OBLlon = 0 -> dGElon = 0 or pi : + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if((pidemi - OBLlat) > (pidemi - degrad * GE0lat)) then + ! North pole crossed ==> add 180 degrees to Longitude + dGElon = pi + else + dGElon = 0.0 + endif + else if(OBLlon >= (pi - epsi) .and. OBLlon <= (pi + epsi)) then + ! +--4) OBLlon = pi -> dGElon = 0 or pi : + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if((pidemi - OBLlat) > (pidemi + degrad * GE0lat)) then + ! South pole crossed ==> add 180 degrees to Longitude + dGElon = pi + else + dGElon = 0.0 + endif + endif + ! +--Longitude (hours) + ! + ~~~~~~~~~ + GElonM = (dGElon + GE0lon * degrad) / hourad + return +endsubroutine grdstr diff --git a/MAR/code_mar/hydadv_ver.f90 b/MAR/code_mar/hydadv_ver.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f5ea1dbc1a0307623ac271e58439f6229c8bab42 --- /dev/null +++ b/MAR/code_mar/hydadv_ver.f90 @@ -0,0 +1,2260 @@ +#include "MAR_pp.def" +subroutine HYDadv_ver + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS SLOW 18-09-2001 MAR | + ! | subroutine HYDadv_ver includes the Vertical Advection Contribution | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ iterun : Run Iteration Counter | + ! | qvDY, qwHY, qrHY, qiHY, ccniHY, qsHY / Time Step n | + ! | qwHY : Cloud Droplets Concentration (kg/kg) | + ! | qrHY : Rain Drops Concentration (kg/kg) | + ! | qvDY : Water Vapor Concentration (kg/kg) | + ! | qiHY : Ice Crystals Concentration (kg/kg) | + ! | ccniHY : Ice Crystals Number | + ! | qsHY : Snow Flakes Concentration (kg/kg) | + ! | | + ! | OUTPUT : qvDY, qwHY, qrHY, qiHY, ccniHY, qsHY / Time Step n+1 | + ! | ^^^^^^^^ | + ! | | + ! | METHOD: Unstaggered Grid: 1st Accurate in Space Upstream Scheme | + ! | ^^^^^^^^ Staggered Grid: 2nd Accurate in Space | + ! | | + ! | # OPTIONS: #VA: Vertical Average preferred in Centered Conserv Scheme | + ! | # ^^^^^^^^ #NS: NO Slip Surface BC used in Centered Conserv Scheme | + ! | # #WF: Water Conservation along the Vertical | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_hy + use mar_sl + use mar_wk +#if(cA) + use mar_ca +#endif + + implicit none + +#if(WA) + integer nadvrd + common / DYNadv_ver_loc / nadvrd +#endif + + logical centrL +#if(ZU) + logical adv3rd + real gat(mx, my, mz), ga0(mx, my) + data adv3rd/.true./ +#endif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer ntimax, itimax + + real cflmax, cflsig, faccfl, dsgm + real old__u, old__v, old__t + real qw_0, qr_0, qv_0, qi_0, ccni_0, qs_0 +#if(WF) + real qwVC, qrVC, qvVC, qiVC, ciVC, qsVC +#endif +#if(BS) + real dh_sno +#endif + + ! +--DATA + ! + ==== + data centrL/.true./ +#if(UP) + centrL = .false. +#endif + + ! +--Slip condition for Mountain Wave Experiments + ! + ============================================ + +#if(OM) + do j = jp11, my1 + do i = ip11, mx1 + psigDY(i, j, mz) = 0.0 + enddo + enddo +#endif + + ! +--First and Second Order Schemes + ! + ============================== + +#if(ZU) + if(.not. adv3rd) then +#endif + + ! +--Courant Number + ! + -------------- + + cflmax = 0.0 + + ! +--Centered second Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL .and. staggr) then + +#if(WA) + write(6, 6001) iterun +6001 format(i6, ' 6001 centrL .and. staggr /CFL Number') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * psigDY(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz7(i, j, k) + WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = 0.00 + enddo + enddo + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = dt * psigDY(i, j, km1(k)) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz8(i, j, k) + WKxyz8(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + else + + ! +--Upstream first Order Scheme on a staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(staggr) then + +#if(WA) + write(6, 6002) iterun +6002 format(i6, ' 6002 .not. centrL .and. staggr /Wind Speed') +#endif + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = (psigDY(i, j, k - 1) * dsig_1(k - 1) & + + psigDY(i, j, k) * dsig_1(k)) & + / (dsig_1(k - 1) + dsig_1(k)) + enddo + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, 1) = psigDY(i, j, 1) * dsig_1(1) & + / (dsig_1(0) + dsig_1(1)) + enddo + enddo + + ! +--Upstream first Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + +#if(WA) + write(6, 6003) iterun +6003 format(i6, ' 6003 (.not.)centrL.and. .not. staggr /Wind Speed') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz8(i, j, k) = psigDY(i, j, k) + enddo + enddo + enddo + + endif + + ! +--Centered second Order Scheme on a non staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(centrL) then + +#if(WA) + write(6, 6004) iterun +6004 format(i6, ' 6004 centrL.and. .not. staggr /CFL Number') +#endif + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = dt * WKxyz8(i, j, k) & + / (pstDYn(i, j) * dsigm1(k) * 2.0) + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + ! +--Upstream first Order Scheme on a (non) staggered Grid + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + +#if(WA) + write(6, 6005) iterun +6005 format(i6, ' 6005 .not. centrL.and.(.not.)staggr /CFL Number') +#endif + + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + enddo + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + if(WKxyz8(i, j, k) > 0.0) then + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k - 1)) + else + WKxyz7(i, j, k) = -dt * WKxyz8(i, j, k) / (pstDYn(i, j) * dsig_1(k)) + endif + cflsig = abs(WKxyz7(i, j, k)) + cflmax = max(cflsig, cflmax) + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxyz7(i, j, 1) = 0.0 + enddo + enddo + + ! +--Work Array Reset + ! + ~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + + endif + + endif + + ! +--Set Up of the Local Split Time Differencing + ! + ---------------------------------------------- + + cflmax = 2.0 * cflmax + ! +... restricted CFL Criterion + + ntimax = cflmax + if(centrL) then + ntimax = max(2, ntimax) +#if(WA) + write(6, 6006) ntimax +6006 format(i6, ' 6006 centrL.and.(.not.)staggr /Nb Iterat.') +#endif + else + ntimax = max(1, ntimax) +#if(WA) + write(6, 6007) ntimax +6007 format(i6, ' 6007 .not. centrL.and.(.not.)staggr /Nb Iterat.') +#endif + endif + + ! +--Update of CFL Number + ! + ~~~~~~~~~~~~~~~~~~~~ + if(ntimax > 1) then + faccfl = 1.0d+0 / ntimax + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz7(i, j, k) = WKxyz7(i, j, k) * faccfl + WKxyz8(i, j, k) = WKxyz8(i, j, k) * faccfl + enddo + enddo + enddo + endif + + ! +--OUTPUT for Verification + ! + ~~~~~~~~~~~~~~~~~~~~~~~ +#if(WA) + nadvrd = nadvrd + 1 + write(6, 6000) nadvrd, cflmax, ntimax +6000 format(i6, ' CFLmax ', 3x, ' ', 3x, ' =', f7.4, & + 6x, ' ntimax ', 8x, ' =', i4) +#endif + + ! +--Warm Water Conservation + ! + ----------------------- +#if(WF) + do j = 1, my + do i = 1, mx + WKxy4(i, j) = 0.0d+0 + WKxy5(i, j) = 0.0d+0 + WKxy6(i, j) = 0.0d+0 + WKxy7(i, j) = 0.0d+0 + WKxy8(i, j) = 0.0d+0 + WKxy9(i, j) = 0.0d+0 + do k = 1, mz + WKxy4(i, j) = WKxy4(i, j) + dsigm1(k) * qvDY(i, j, k) + WKxy5(i, j) = WKxy5(i, j) + dsigm1(k) * qwHY(i, j, k) + WKxy6(i, j) = WKxy6(i, j) + dsigm1(k) * qrHY(i, j, k) + WKxy7(i, j) = max(WKxy7(i, j), qvDY(i, j, k)) + WKxy8(i, j) = max(WKxy8(i, j), qwHY(i, j, k)) + WKxy9(i, j) = max(WKxy9(i, j), qrHY(i, j, k)) + enddo + enddo + enddo +#endif + + ! +--Warm Water + ! +--Start Vertical Advection + ! + ------------------------ + + if(centrL) then + + if(staggr) then + +#if(WA) + write(6, 6008) +6008 format(6x, ' 6008 centrL.and. staggr /A Contrib.') +#endif + + ! +--2nd Order Centered Energy conserving: Local Split Time Differencing + ! + ~~~~~~~~~ (Haltiner & Williams 1980 7.2.2, (7-47b) p.220) ~~~~~~~~~~ + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do itimax = 1, ntimax + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + + do j = jp11, my1 + + ! +--Vertical Differences + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = qwHY(i, j, k) + WKxzq(i, k) = qrHY(i, j, k) + WKxzx(i, k) = qvDY(i, j, k) + +#if(VA) + WKxzp(i, k) = (qwHY(i, j, k) * dsigm1(k) * 2.0 & + + qwHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (qrHY(i, j, k) * dsigm1(k) * 2.0 & + + qrHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (qvDY(i, j, k) * dsigm1(k) * 2.0 & + + qvDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + qw_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qw_0) + qr_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - qr_0) + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = qwHY(i, j, k) + WKxzq(i, k) = qrHY(i, j, k) + WKxzx(i, k) = qvDY(i, j, k) + +#if(VA) + WKxzp(i, k) = (qwHY(i, j, k - 1) * dsigm1(k - 1) & + + qwHY(i, j, k) * dsigm1(k) * 2.0d+0 & + + qwHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (qrHY(i, j, k - 1) * dsigm1(k - 1) & + + qrHY(i, j, k) * dsigm1(k) * 2.0d+0 & + + qrHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (qvDY(i, j, k - 1) * dsigm1(k - 1) & + + qvDY(i, j, k) * dsigm1(k) * 2.0d+0 & + + qvDY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = qwHY(i, j, k) + WKxzq(i, k) = qrHY(i, j, k) + WKxzx(i, k) = qvDY(i, j, k) + +#if(VA) + WKxzp(i, k) = (qwHY(i, j, k - 1) * dsigm1(k - 1) & + + qwHY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (qrHY(i, j, k - 1) * dsigm1(k - 1) & + + qrHY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (qvDY(i, j, k - 1) * dsigm1(k - 1) & + + qvDY(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Advection Contribution + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = qwHY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = qwHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = qrHY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = qrHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = qwHY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = qwHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = qrHY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = qrHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + + enddo + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + + ! +--Vertical Differences + + do j = jp11, my1 + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + qw_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qw_0) + qr_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - qr_0) + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Advection Contribution + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + + enddo + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + + do j = jp11, my1 + + ! +--Vertical Differences + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + + do i = ip11, mx1 + qw_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qw_0) + qr_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - qr_0) + qv_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qv_0) + enddo + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0d+0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0d+0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0d+0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0d+0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0d+0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0d+0) / dsgm +#endif + enddo + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qvapSL(i, j) - WKxzx(i, k - 1)) +#endif + enddo + + ! +--Hydromet.Advection + + do k = 1, mmz1 + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k)) + qrHY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + enddo + enddo + + k = mmz + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k)) + qrHY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + enddo + + ! +--Wat.Vapr.Advect.avoids double Counting in case of convective Adjustment + + do k = 1, mmz1 + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + enddo + + k = mmz + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k)) +#if(cA) + endif +#endif + enddo + ! + + enddo + ! + + endif + + ! +--Warm Water + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + + enddo + + ! +--Warm Water + ! +--2nd Order Centered Leap-Frog Backward: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + +#if(WA) + write(6, 6009) +6009 format(6x, ' 6009 centrL.and. .not. staggr /A Contrib.') +#endif + ! + + do itimax = 1, ntimax + ! + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qw_0 = qwHY(i, j, k) + WKxza(i, k) = (qwHY(i, j, k + 1) - qw_0) & + * WKxyz7(i, j, k) + qr_0 = qrHY(i, j, k) + WKxzb(i, k) = (qrHY(i, j, k + 1) - qrHY(i, j, k)) & + * WKxyz7(i, j, k) + qv_0 = qvDY(i, j, k) + WKxzc(i, k) = (qvDY(i, j, k + 1) - qvDY(i, j, k)) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (qwHY(i, j, k + 1) - qwHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (qrHY(i, j, k + 1) - qrHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvDY(i, j, k + 1) - qvDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -qwHY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -qrHY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvapSL(i, j) - qvDY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + WKxyz1(i, j, k) = qwHY(i, j, k) - WKxza(i, k) + WKxyz4(i, j, k) = qwHY(i, j, k) - (WKxza(i, k) + WKxza(i, k)) + WKxyz2(i, j, k) = qrHY(i, j, k) - WKxzb(i, k) + WKxyz5(i, j, k) = qrHY(i, j, k) - (WKxzb(i, k) + WKxzb(i, k)) + WKxyz3(i, j, k) = qvDY(i, j, k) - WKxzc(i, k) + WKxyz6(i, j, k) = qvDY(i, j, k) - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + enddo + ! + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + ! + + ! +--Advection Increment + ! + + do j = jp11, my1 + ! + + k = 1 + do i = ip11, mx1 + qw_0 = WKxyz4(i, j, k) + qr_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qw_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - qr_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvapSL(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxza(i, k) + WKxza(i, k)) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzb(i, k) + WKxzb(i, k)) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + ! + + enddo + ! + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qw_0 = WKxyz4(i, j, k) + qr_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qw_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - qr_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qvapSL(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Hydromet.Advection + ! + + do k = 1, mmz + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz1(i, j, k) - WKxza(i, k) + qrHY(i, j, k) = WKxyz2(i, j, k) - WKxzb(i, k) + enddo + ! + + ! +--Wat.Vapr.Advect.avoids double Counting in case of convective Adjustment + ! + + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) - WKxzc(i, k) +#if(cA) + endif +#endif + enddo + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--Warm Water + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + endif + ! + + ! + + ! +--Warm Water + ! +--First Order Upstream Scheme: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + +#if(WA) + write(6, 6010) +6010 format(6x, ' 6010 .not. centrL.and.(.not.)staggr /A Contrib.') +#endif + ! + + do itimax = 1, ntimax + ! + + ! +--Auxiliary Variables + ! + ~~~~~~~~~~~~~~~~~~~ +#if(WA) + write(6, 6011) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , qwHY(imez, jmez, mz1), qwHY(imez, jmez, mz) +6011 format(6x, ' 6011 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) +#endif + ! + + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qwHY(i, j, k) + WKxyz2(i, j, k) = qrHY(i, j, k) + WKxyz3(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + ! + + ! +--Vertical Differences + ! + ~~~~~~~~~~~~~~~~~~~~ + k = 1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = 0.0d+0 + WKxyz5(i, j, k) = 0.0d+0 + WKxyz6(i, j, k) = 0.0d+0 + enddo + enddo + ! + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz1(i, j, k) - WKxyz1(i, j, k - 1) + WKxyz5(i, j, k) = WKxyz2(i, j, k) - WKxyz2(i, j, k - 1) + WKxyz6(i, j, k) = WKxyz3(i, j, k) - WKxyz3(i, j, k - 1) + enddo + enddo + enddo + ! + + k = mzz + do j = jp11, my1 + do i = ip11, mx1 + WKxy1(i, j) = -WKxyz1(i, j, k - 1) + WKxy2(i, j) = -WKxyz2(i, j, k - 1) + WKxy3(i, j) = qvapSL(i, j) - WKxyz3(i, j, k - 1) + enddo + enddo + ! + + ! +--Advection Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qwHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k + 1) + WKxyz2(i, j, k) = qrHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k + 1) + WKxyz3(i, j, k) = qvDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k + 1) + enddo + enddo + enddo + ! + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qwHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy1(i, j) + WKxyz2(i, j, k) = qrHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy2(i, j) + WKxyz3(i, j, k) = qvDY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy3(i, j) + enddo + enddo + ! + + ! +--Wind Update + ! + ~~~~~~~~~~~~~~ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz1(i, j, k) + qrHY(i, j, k) = WKxyz2(i, j, k) + enddo + ! + + ! +--Pot.Temp.Update avoids double Counting in case of convective Adjustment + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = ip11, mx1 +#if(cA) + if(adj_CA(i, j) == 0) then +#endif + qvDY(i, j, k) = WKxyz3(i, j, k) +#if(cA) + endif +#endif + enddo + enddo + enddo + ! + + ! + + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + +#if(WA) + write(6, 6012) itimax, WKxyz1(imez, jmez, mz1), WKxyz1(imez, jmez, mz) & + , qwHY(imez, jmez, mz1), qwHY(imez, jmez, mz) +6012 format(6x, ' 6012 .not. centrL.and.(.not.)staggr /A Contrib.', & + 4f9.6) +#endif + enddo + ! + + endif +#if(WF) + ! + + ! + + ! +--Warm Water Conservation + ! + ----------------------- + ! + + do j = 1, my + do i = 1, mx + qvVC = 0.0d+0 + qwVC = 0.0d+0 + qrVC = 0.0d+0 + do k = 1, mz + ! + + ! +--Flux Limitor + ! + ~~~~~~~~~~~~ + qvDY(i, j, k) = max(eps9, qvDY(i, j, k)) + qvDY(i, j, k) = min(WKxy7(i, j), qvDY(i, j, k)) + qwHY(i, j, k) = max(zero, qwHY(i, j, k)) + qwHY(i, j, k) = min(WKxy8(i, j), qwHY(i, j, k)) + qrHY(i, j, k) = max(zero, qrHY(i, j, k)) + qrHY(i, j, k) = min(WKxy9(i, j), qrHY(i, j, k)) + ! + + ! +--Column Average + ! + ~~~~~~~~~~~~~~ + qvVC = qvVC + dsigm1(k) * qvDY(i, j, k) + qwVC = qwVC + dsigm1(k) * qwHY(i, j, k) + qrVC = qrVC + dsigm1(k) * qrHY(i, j, k) + enddo + ! + + ! +--Surface Boundary Flux + ! + ~~~~~~~~~~~~~~~~~~~~~ + qvVC = qvVC - psigDY(i, j, mz) & + * (qvDY(i, j, mz) - qvapSL(i, j)) * dt / pstDYn(i, j) + qwVC = qwVC - psigDY(i, j, mz) & + * qwHY(i, j, mz) * dt / pstDYn(i, j) + qrVC = qrVC - psigDY(i, j, mz) & + * qrHY(i, j, mz) * dt / pstDYn(i, j) + ! + + ! +--Mass Restore + ! + ~~~~~~~~~~~~ + do k = 1, mz + qvDY(i, j, k) = qvDY(i, j, k) * WKxy4(i, j) / max(eps12, qvVC) + qwHY(i, j, k) = qwHY(i, j, k) * WKxy5(i, j) / max(eps12, qwVC) + qrHY(i, j, k) = qrHY(i, j, k) * WKxy6(i, j) / max(eps12, qrVC) + enddo + enddo + enddo +#endif + ! + + ! + + ! +--Warm Water + ! +--Work Arrays Reset + ! + ----------------- + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + WKxy5(i, j) = 0.0 + WKxy6(i, j) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do i = 1, mx + WKxza(i, k) = 0.0 + WKxzb(i, k) = 0.0 + WKxzc(i, k) = 0.0 + WKxzd(i, k) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + enddo + enddo + enddo + ! + +#if(WF) + ! + + ! +--Ice Water Conservation + ! + ----------------------- + ! + + do j = 1, my + do i = 1, mx + WKxy4(i, j) = 0.0d+0 + WKxy5(i, j) = 0.0d+0 + WKxy6(i, j) = 0.0d+0 + WKxy7(i, j) = 0.0d+0 + WKxy8(i, j) = 0.0d+0 + WKxy9(i, j) = 0.0d+0 + do k = 1, mz + WKxy4(i, j) = WKxy4(i, j) + dsigm1(k) * ccniHY(i, j, k) + WKxy5(i, j) = WKxy5(i, j) + dsigm1(k) * qiHY(i, j, k) + WKxy6(i, j) = WKxy6(i, j) + dsigm1(k) * qsHY(i, j, k) + WKxy7(i, j) = max(WKxy7(i, j), ccniHY(i, j, k)) + WKxy8(i, j) = max(WKxy8(i, j), qiHY(i, j, k)) + WKxy9(i, j) = max(WKxy9(i, j), qsHY(i, j, k)) + enddo + enddo + enddo + ! + +#endif + ! + + ! +--Ice Water + ! +--Start Vertical Advection + ! + ------------------------ + ! + + if(centrL) then + ! + + if(staggr) then + ! + + ! +--2nd Order Centered Energy conserving: Local Split Time Differencing + ! + ~~~~~~~~~ (Haltiner & Williams 1980 7.2.2, (7-47b) p.220) ~~~~~~~~~~ + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do itimax = 1, ntimax + ! + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + ! + + do j = jp11, my1 + ! + + ! +--Vertical Differences + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = qiHY(i, j, k) + WKxzq(i, k) = ccniHY(i, j, k) + WKxzx(i, k) = qsHY(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (qiHY(i, j, k) * dsigm1(k) * 2.0 & + + qiHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (ccniHY(i, j, k) * dsigm1(k) * 2.0 & + + ccniHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (qsHY(i, j, k) * dsigm1(k) * 2.0 & + + qsHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qi_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qi_0) + ccni_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - ccni_0) + qs_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qs_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = qiHY(i, j, k) + WKxzq(i, k) = ccniHY(i, j, k) + WKxzx(i, k) = qsHY(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (qiHY(i, j, k - 1) * dsigm1(k - 1) & + + qiHY(i, j, k) * dsigm1(k) * 2.0 & + + qiHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (ccniHY(i, j, k - 1) * dsigm1(k - 1) & + + ccniHY(i, j, k) * dsigm1(k) * 2.0 & + + ccniHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (qsHY(i, j, k - 1) * dsigm1(k - 1) & + + qsHY(i, j, k) * dsigm1(k) * 2.0 & + + qsHY(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = qiHY(i, j, k) + WKxzq(i, k) = ccniHY(i, j, k) + WKxzx(i, k) = qsHY(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (qiHY(i, j, k - 1) * dsigm1(k - 1) & + + qiHY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (ccniHY(i, j, k - 1) * dsigm1(k - 1) & + + ccniHY(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (qsHY(i, j, k - 1) * dsigm1(k - 1) & + + qsHY(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qsrfHY(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = qiHY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = qiHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = ccniHY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = ccniHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qsHY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qsHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + WKxyz1(i, j, k) = qiHY(i, j, k) - WKxzd(i, k) + WKxyz4(i, j, k) = qiHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + WKxyz2(i, j, k) = ccniHY(i, j, k) - WKxzd(i, k) + WKxyz5(i, j, k) = ccniHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + WKxyz3(i, j, k) = qsHY(i, j, k) - WKxzd(i, k) + WKxyz6(i, j, k) = qsHY(i, j, k) - (WKxzd(i, k) + WKxzd(i, k)) + enddo + ! + + enddo + ! + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + ! + + ! +--Vertical Differences + ! + + do j = jp11, my1 + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qi_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qi_0) + ccni_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - ccni_0) + qs_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qs_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0d+0 + WKxy2(i, j) = 0.0d+0 + WKxy3(i, j) = 0.0d+0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qsrfHY(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz1 + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k) + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzd(i, k) + WKxzd(i, k)) + ! + + WKxzd(i, k) = WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzd(i, k) + WKxzd(i, k)) + enddo + ! + + enddo + ! + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + + do j = jp11, my1 + ! + + ! +--Vertical Differences + ! + + k = 1 + dsgm = 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + qi_0 = WKxzp(i, k) + WKxza(i, k) = (WKxzp(i, k) - qi_0) + ccni_0 = WKxzq(i, k) + WKxzb(i, k) = (WKxzq(i, k) - ccni_0) + qs_0 = WKxzx(i, k) + WKxzc(i, k) = (WKxzx(i, k) - qs_0) + enddo + ! + + do k = kp1(1), mmz1 + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + dsigm1(k + 1) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz4(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz5(i, j, k + 1) * dsigm1(k + 1)) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0 & + + WKxyz6(i, j, k + 1) * dsigm1(k + 1)) / dsgm +#endif + enddo + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + enddo + ! + + k = mmz + dsgm = dsigm1(k - 1) + 2.0 * dsigm1(k) + do i = ip11, mx1 + WKxzp(i, k) = WKxyz4(i, j, k) + WKxzq(i, k) = WKxyz5(i, j, k) + WKxzx(i, k) = WKxyz6(i, j, k) + ! + +#if(VA) + WKxzp(i, k) = (WKxyz4(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz4(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzq(i, k) = (WKxyz5(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz5(i, j, k) * dsigm1(k) * 2.0) / dsgm + WKxzx(i, k) = (WKxyz6(i, j, k - 1) * dsigm1(k - 1) & + + WKxyz6(i, j, k) * dsigm1(k) * 2.0) / dsgm +#endif + enddo + ! + + do i = ip11, mx1 + WKxza(i, k) = (WKxzp(i, k) - WKxzp(i, k - 1)) + WKxzb(i, k) = (WKxzq(i, k) - WKxzq(i, k - 1)) + WKxzc(i, k) = (WKxzx(i, k) - WKxzx(i, k - 1)) + enddo + ! + + k = mzz + do i = ip11, mx1 + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 +#if(NS) + WKxy1(i, j) = -WKxzp(i, k - 1) + WKxy2(i, j) = -WKxzq(i, k - 1) + WKxy3(i, j) = (qsrfHY(i, j) - WKxzx(i, k - 1)) +#endif + enddo + ! + + ! +--Hydromet.Advection + ! + + do k = 1, mmz1 + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxza(i, k + 1) & + + WKxyz8(i, j, k) * WKxza(i, k)) + ccniHY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxzb(i, k + 1) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + qsHY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxzc(i, k + 1) & + + WKxyz8(i, j, k) * WKxzc(i, k)) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz1(i, j, k) & + - (WKxyz7(i, j, k) * WKxy1(i, j) & + + WKxyz8(i, j, k) * WKxza(i, k)) + ccniHY(i, j, k) = WKxyz2(i, j, k) & + - (WKxyz7(i, j, k) * WKxy2(i, j) & + + WKxyz8(i, j, k) * WKxzb(i, k)) + qsHY(i, j, k) = WKxyz3(i, j, k) & + - (WKxyz7(i, j, k) * WKxy3(i, j) & + + WKxyz8(i, j, k) * WKxzc(i, k)) + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--Ice Water + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + ! + + ! +--Ice Water + ! +--2nd Order Centered Leap-Frog Backward: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + + do itimax = 1, ntimax + ! + + ! +--First internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itimax == 1) then + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qi_0 = qiHY(i, j, k) + WKxza(i, k) = (qiHY(i, j, k + 1) - qi_0) & + * WKxyz7(i, j, k) + ccni_0 = ccniHY(i, j, k) + WKxzb(i, k) = (ccniHY(i, j, k + 1) - ccniHY(i, j, k)) & + * WKxyz7(i, j, k) + qv_0 = qsHY(i, j, k) + WKxzc(i, k) = (qsHY(i, j, k + 1) - qsHY(i, j, k)) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (qiHY(i, j, k + 1) - qiHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (ccniHY(i, j, k + 1) - ccniHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qsHY(i, j, k + 1) - qsHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -qiHY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -ccniHY(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qsrfHY(i, j) - qsHY(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + WKxyz1(i, j, k) = qiHY(i, j, k) - WKxza(i, k) + WKxyz4(i, j, k) = qiHY(i, j, k) - (WKxza(i, k) + WKxza(i, k)) + WKxyz2(i, j, k) = ccniHY(i, j, k) - WKxzb(i, k) + WKxyz5(i, j, k) = ccniHY(i, j, k) - (WKxzb(i, k) + WKxzb(i, k)) + WKxyz3(i, j, k) = qsHY(i, j, k) - WKxzc(i, k) + WKxyz6(i, j, k) = qsHY(i, j, k) - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + enddo + ! + + ! +--Intermediary internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else if(itimax < ntimax) then + ! + + ! +--Advection Increment + ! + + do j = jp11, my1 + ! + + k = 1 + do i = ip11, mx1 + qi_0 = WKxyz4(i, j, k) + ccni_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qi_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - ccni_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qsrfHY(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Advection Contribution + ! + + do k = 1, mmz + do i = ip11, mx1 + old__u = WKxyz1(i, j, k) + WKxyz1(i, j, k) = WKxyz4(i, j, k) + WKxyz4(i, j, k) = old__u - (WKxza(i, k) + WKxza(i, k)) + old__v = WKxyz2(i, j, k) + WKxyz2(i, j, k) = WKxyz5(i, j, k) + WKxyz5(i, j, k) = old__v - (WKxzb(i, k) + WKxzb(i, k)) + old__t = WKxyz3(i, j, k) + WKxyz3(i, j, k) = WKxyz6(i, j, k) + WKxyz6(i, j, k) = old__t - (WKxzc(i, k) + WKxzc(i, k)) + enddo + enddo + ! + + enddo + ! + + ! +--Last internal Time Step + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + ! + + do j = jp11, my1 + ! + + ! +--Advection Increment + ! + + k = 1 + do i = ip11, mx1 + qi_0 = WKxyz4(i, j, k) + ccni_0 = WKxyz5(i, j, k) + qv_0 = WKxyz6(i, j, k) + ! + + WKxza(i, k) = (WKxyz4(i, j, k + 1) - qi_0) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - ccni_0) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - qv_0) & + * WKxyz7(i, j, k) + enddo + ! + + do k = kp1(1), mmz1 + do i = ip11, mx1 + WKxza(i, k) = (WKxyz4(i, j, k + 1) - WKxyz4(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzb(i, k) = (WKxyz5(i, j, k + 1) - WKxyz5(i, j, k - 1)) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (WKxyz6(i, j, k + 1) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + enddo + ! + + k = mmz + do i = ip11, mx1 + WKxza(i, k) = -WKxyz4(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzb(i, k) = -WKxyz5(i, j, k - 1) & + * WKxyz7(i, j, k) + WKxzc(i, k) = (qsrfHY(i, j) - WKxyz6(i, j, k - 1)) & + * WKxyz7(i, j, k) + enddo + ! + + ! +--Hydromet.Advection + ! + + do k = 1, mmz + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz1(i, j, k) - WKxza(i, k) + ccniHY(i, j, k) = WKxyz2(i, j, k) - WKxzb(i, k) + qsHY(i, j, k) = WKxyz3(i, j, k) - WKxzc(i, k) + enddo + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--Ice Water + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + endif + ! + + ! + + ! +--Ice Water + ! +--First Order Upstream Scheme: Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + else + ! + + do itimax = 1, ntimax + ! + + ! +--Auxiliary Variables + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qiHY(i, j, k) + WKxyz2(i, j, k) = ccniHY(i, j, k) + WKxyz3(i, j, k) = qsHY(i, j, k) + enddo + enddo + enddo + ! + + ! +--Vertical Differences + ! + ~~~~~~~~~~~~~~~~~~~~ + k = 1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = 0.0d+0 + WKxyz5(i, j, k) = 0.0d+0 + WKxyz6(i, j, k) = 0.0d+0 + enddo + enddo + ! + + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz1(i, j, k) - WKxyz1(i, j, k - 1) + WKxyz5(i, j, k) = WKxyz2(i, j, k) - WKxyz2(i, j, k - 1) + WKxyz6(i, j, k) = WKxyz3(i, j, k) - WKxyz3(i, j, k - 1) + enddo + enddo + enddo + ! + + k = mzz + do j = jp11, my1 + do i = ip11, mx1 + WKxy1(i, j) = -WKxyz1(i, j, k - 1) + WKxy2(i, j) = -WKxyz2(i, j, k - 1) + WKxy3(i, j) = qsrfHY(i, j) - WKxyz3(i, j, k - 1) + enddo + enddo + ! + + ! +--Advection Contribution + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do k = 1, mmz1 + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qiHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k + 1) + WKxyz2(i, j, k) = ccniHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k + 1) + WKxyz3(i, j, k) = qsHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k + 1) + enddo + enddo + enddo + ! + + k = mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = qiHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz4(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy1(i, j) + WKxyz2(i, j, k) = ccniHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz5(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy2(i, j) + WKxyz3(i, j, k) = qsHY(i, j, k) & + + min(zero, WKxyz7(i, j, k)) * WKxyz6(i, j, k) & + + max(zero, WKxyz7(i, j, k)) * WKxy3(i, j) + enddo + enddo + ! + + ! +--Hydrom. Update + ! + ~~~~~~~~~~~~~~ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz1(i, j, k) + ccniHY(i, j, k) = WKxyz2(i, j, k) + qsHY(i, j, k) = WKxyz3(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--Ice Water + ! +--End of the Local Split Time Differencing + ! + -------------------------------------------------------------------- + ! + + enddo + ! + + endif + ! + +#if(WF) + ! + + ! +--Ice Water Conservation + ! + ----------------------- + ! + + do j = 1, my + do i = 1, mx + ciVC = 0.0d+0 + qiVC = 0.0d+0 + qsVC = 0.0d+0 + do k = 1, mz + ! + + ! +--Flux Limitor + ! + ~~~~~~~~~~~~ + ccniHY(i, j, k) = max(zero, ccniHY(i, j, k)) + ccniHY(i, j, k) = min(WKxy7(i, j), ccniHY(i, j, k)) + qiHY(i, j, k) = max(zero, qiHY(i, j, k)) + qiHY(i, j, k) = min(WKxy8(i, j), qiHY(i, j, k)) + qsHY(i, j, k) = max(zero, qsHY(i, j, k)) + qsHY(i, j, k) = min(WKxy9(i, j), qsHY(i, j, k)) + ! + + ! +--Column Average + ! + ~~~~~~~~~~~~~~ + ciVC = ciVC + dsigm1(k) * ccniHY(i, j, k) + qiVC = qiVC + dsigm1(k) * qiHY(i, j, k) + qsVC = qsVC + dsigm1(k) * qsHY(i, j, k) + enddo + ! + + ! +--Surface Boundary Flux + ! + ~~~~~~~~~~~~~~~~~~~~~ + ciVC = ciVC - psigDY(i, j, mz) & + * ccniHY(i, j, mz) * dt / pstDYn(i, j) + qiVC = qiVC - psigDY(i, j, mz) & + * qiHY(i, j, mz) * dt / pstDYn(i, j) + qsVC = qsVC - psigDY(i, j, mz) & + * (qsHY(i, j, mz) - qsrfHY(i, j)) * dt / pstDYn(i, j) + ! + + ! +--Mass Restore + ! + ~~~~~~~~~~~~ + do k = 1, mz + ccniHY(i, j, k) = ccniHY(i, j, k) * (WKxy4(i, j) / max(eps12, ciVC)) + qiHY(i, j, k) = qiHY(i, j, k) * WKxy5(i, j) / max(eps12, qiVC) + qsHY(i, j, k) = qsHY(i, j, k) * WKxy6(i, j) / max(eps12, qsVC) + enddo + enddo + enddo +#endif + ! + + ! + + ! +--Work Arrays Reset + ! + ----------------- + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + WKxy5(i, j) = 0.0 + WKxy6(i, j) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do i = 1, mx + WKxza(i, k) = 0.0 + WKxzb(i, k) = 0.0 + WKxzc(i, k) = 0.0 + WKxzd(i, k) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + enddo + enddo + enddo + ! + + ! + + ! +--Courant Number + ! +--Work Arrays Reset + ! + ----------------- + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + ! + + ! + + ! +--Third Order Vertical Scheme + ! + =========================== +#if(ZU) + else + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = 0. +#endif +#if(ZO) + ga0(i, j) = qwHY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qwHY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qwHY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo +#endif +#if(ZO) + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = qrHY(i, j, mz) + enddo + enddo +#endif +#if(ZU) + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qrHY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qrHY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = qvapSL(i, j) +#endif +#if(ZO) + ga0(i, j) = qvDY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qvDY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = 0.0 +#endif +#if(ZO) + ga0(i, j) = qiHY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qiHY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qiHY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo +#endif +#if(ZO) + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = ccniHY(i, j, mz) + enddo + enddo +#endif +#if(ZU) + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = ccniHY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + ccniHY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + ga0(i, j) = qsrfHY(i, j) +#endif +#if(ZO) + ga0(i, j) = qsHY(i, j, mz) +#endif +#if(ZU) + enddo + enddo + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + gat(i, j, k) = qsHY(i, j, k) + enddo + enddo + enddo + ! + **************** + call DYNadv_cubv(gat, ga0) + ! + **************** + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qsHY(i, j, k) = gat(i, j, k) + enddo + enddo + enddo + endif +#endif + ! + +#if(BS) + ! + + ! +--Impact on Snow Erosion/Deposition + ! + ================================= + ! + + do j = jp11, my1 + do i = ip11, mx1 + ! dh_sno contains an implicit factor 1.d3[kPa-->Pa]/ro_Wat[kg/m2-->mWE] + ! > 0 ==> Atmospheric Loss ==> Surface Gain + dh_sno = psigDY(i, j, mz) * (qsHY(i, j, mz) - qsrfHY(i, j)) * dt * grvinv + snohSL(i, j) = snohSL(i, j) + max(zero, dh_sno) + snobSL(i, j) = snobSL(i, j) + min(zero, dh_sno) + snowHY(i, j) = snowHY(i, j) + dh_sno + enddo + enddo +#endif + return +endsubroutine HYDadv_ver diff --git a/MAR/code_mar/hydgen.f90 b/MAR/code_mar/hydgen.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c624b99ec038fecce62b1a1fff6577bb6f27ff5f --- /dev/null +++ b/MAR/code_mar/hydgen.f90 @@ -0,0 +1,764 @@ +#include "MAR_pp.def" +subroutine HYDgen + ! +------------------------------------------------------------------------+ + ! | MAR HYDROLOGIC CYCLE 14-12-2022 MAR | + ! | subroutine HYDgen contains .main. of the EXPLICIT HYDROLOGICAL CYCLE | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT / OUTPUT: qvDY(mx,my,mz) : air specific humidity (kg/kg) | + ! | ^^^^^^^^^^^^^^^ qwHY(mx,my,mz) : cloud drops (kg/kg) | + ! | qrHY(mx,my,mz) : rain drops (kg/kg) | + ! | qiHY(mx,my,mz) : ice crystals concentration(kg/kg) | + ! | qsHY(mx,my,mz) : snow flakes (kg/kg) | + ! | rainHY(mx,my) : rain Precipitation (m) | + ! | snowHY(mx,my) : snow Precipitation (m w.e) | + ! | crysHY(mx,my) : ice Precipitation (m w.e) | + ! | hlatHY(mx,my,mz) : Latent Heat Release (K/s) | + ! | | + ! | OUTPUT: | + ! | ^^^^^^^ | + ! | | + ! | REFER. : 1) Ntezimana, unpubl.thes.LLN, 115 pp, 1993 | + ! | ^^^^^^^^ 2) Lin et al. JCAM 22, 1065--1092, 1983 | + ! | (very similar, except that graupels are represented) | + ! | 3) Emde and Kahlig, An.Geo. 7, 405-- 414, 1989 | + ! | | + ! | # OPTIONS: #WH Additional Output (Each Process is detailed) | + ! | # ^^^^^^^^ #EW Additional Output (Energy and Water Conservation) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_hy + use mar_ca + use mar_te + use mar_tu + use mar_sl + use mar_wk + use mar_io + use mar_sv + use mar_tv +#if(EW) + use mar_ew +#endif + use mar_fi + use mar_ra + use marmagic +#if(iso) + use mariso, only: wiso, niso, qvDY_iso +#endif + + implicit none + ! Local variables + ! =============== +#if(iso) + real :: fac + ! iso_time : number of the output file increment + integer :: iso_time + ! iso_label : label of output increment + character*10 :: iso_label +#endif + integer ioutIO(5) + real :: ccni2D(klon, klev) + real :: ccnw2D(klon, klev) + real :: cfra2D(klon, klev) + real :: crys2D(klon) + real :: dqi2D(klon, klev) + real :: dqw2D(klon, klev) + real :: ect_2D(klon, klev) + real :: enr01D(klon) + real :: enr11D(klon) + real :: enr21D(klon) + real :: gplv2D(klon, klev + 1) + real :: gpmi2D(klon, klev + 1) + real :: hlat2D(klon, klev) + integer :: jhlr2D(klon) + character(len=20) :: mphy2D(klon) + real :: pk2D(klon, klev) + real :: pkta2D(klon, klev) + real :: prec2D(klon) + real :: pst2D(klon) + real :: pst2Dn(klon) + real :: qg2D(klon, klev) + real :: qi2D(klon, klev) + real :: qr2D(klon, klev) + real :: qs2D(klon, klev) + ! qssbl2D : sublimated snow flakes (kg/kg) + real :: qssbl2D(klon, klev) + real :: qv2D(klon, klev) + real :: qvsi2D(klon, klev + 1) + real :: qvsw2D(klon, klev + 1) + real :: qw2D(klon, klev) + real :: rain2D(klon) + real :: rolv2D(klon, klev) + real :: snoh2D(klon) + real :: snow2D(klon) + real :: tair2D(klon, klev) + real :: tsrf2D(klon) + real :: TUkv2D(klon, klev) + real :: uair2D(klon, klev) + real :: vair2D(klon, klev) + real :: wair2D(klon, klev) + real :: wat01D(klon) + real :: wat11D(klon) + real :: wat21D(klon) + real :: watf1D(klon) + real :: snf2D(klon, klev) + real :: sbl2D(klon, klev) + ! dep2D : atm. snow condensation (m w.e.) + real :: dep2D(klon, klev) + real :: rnf2D(klon, klev) + real :: evp2D(klon, klev) + ! smt2D : atm. (integr) snow transport (kg/m) + real :: smt2D(klon, klev) + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + ! common /SISVAT_EV/ iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif + + integer i, j, k, m + character * 3 vecthy + integer klhyOK, io, io___1, io___5, iklon, itPhys, nthyd2 + integer il_mmc, il__mm, i___mm, j___mm, il_mez, kk_pp +#if(wH) + integer i_fvv(klon), j_fvv(klon), klfvv, i0fvv, j0fvv, k0fvv + common / DebuggHy / i_fvv, j_fvv, klfvv, i0fvv, j0fvv, k0fvv +#endif + + real qs99, hrelmx, erosmx, facLHR + real uq1, uq2, vq1, vq2, sq1, sq2 + real uInFlw, uOutFl, pp, pkt0, ta_MAR + real vInFlw, vOutFl + real cloud_magic2, dthyd2, qqp + + ! +--DATA + ! + ==== + + data i___mm/0/ + data j___mm/0/ + data qs99/0.99e+0/ +#if(wH) + i0fvv = 26 ! i ccordinate (detailled output) + j0fvv = 17 ! j ccordinate (detailled output) + k0fvv = 24 ! k ccordinate (detailled output) +#endif + + cloud_magic2 = 0. +#if(EU) + cloud_magic2 = cloud_magic / (10.*real(ntHyd)) +#endif + + ! +--Set UP Verification + ! + =================== +#if(wH) + write(6, 6020) itexpe, jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE +6020 format(/, 'Clouds Microphysics', 2i6, '-', i2, '-', i4, i6, 'h', i2, ':', i2) +#endif + if(itexpe == 0) then + klhyOK = mx2 * my2 + klhyOK = 1 + if(klon /= klhyOK) then + if(klon > 1) then + vecthy = 'NON' + else + vecthy = ' ' + endif + write(6, 6000) klon, klhyOK, vecthy +6000 format(/, '++++++++ klon (mardim_mod.f90) =', i6, ' .NE.', i6, ' ++++++++++++++', & + /, '++++++++ NOT adapted to a ', a3, ' vectorized code ++++++++++++++', & + /, '++++++++ BAD SET UP of #hy or klon parameter ++++++++++++++', & + /, ' ==> !?%@&* Emergency EXIT in HYDgen') + stop + endif + + ! +--Cloud Microphysics Initialization + ! + ================================= + do j = 1, my + do i = 1, mx + rai0HY(i, j) = 0. + rainHY(i, j) = 0. + sno0HY(i, j) = 0. + sfa0HY(i, j) = 0. + snowHY(i, j) = 0. + crysHY(i, j) = 0. + enddo + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + ccniHY(i, j, k) = 0. + qiHY(i, j, k) = 0. + qsHY(i, j, k) = 0. + qwHY(i, j, k) = 0. + qrHY(i, j, k) = 0. + snfHY(i, j, k) = 0. + sblHY(i, j, k) = 0. + depHY(i, j, k) = 0. + rnfHY(i, j, k) = 0. + evpHY(i, j, k) = 0. + smtHY(i, j, k) = 0. + qssblHY(i, j, k) = 0. + enddo + enddo + enddo + + endif + + !XF (not cumulated precip because in real*4) !!!! + if(iterun == 0) then + do i = 1, mx + do j = 1, my + do k = 1, mz + snfHY(i, j, k) = 0. + sblHY(i, j, k) = 0. + depHY(i, j, k) = 0. + rnfHY(i, j, k) = 0. + evpHY(i, j, k) = 0. + smtHY(i, j, k) = 0. + qssblHY(i, j, k) = 0. + enddo + rai0HY(i, j) = 0. + rainHY(i, j) = 0. + rainCA(i, j) = 0. + sno0HY(i, j) = 0. + sfa0HY(i, j) = 0. + snowHY(i, j) = 0. + snowCA(i, j) = 0. + crysHY(i, j) = 0. + runoTV(i, j) = 0. + draiTV(i, j) = 0. + evapTV(i, j) = 0. + enddo + enddo + endif + !XF + + ! +--Cloud Microphysics OFF ==> Reset of the Air Relative Humidity + ! + ============================================================= + if(jhaRUN < tim_HY) then + ! +...Hydrological cycle is inhibited until jhaRUN = tim_HY + do k = 1, mz + do j = 1, my + do i = 1, mx + tairDY(i, j, k) = pktaDY(i, j, k) * pkDY(i, j, k) + enddo + enddo + enddo + ! + ****** + call qsat3d + ! + ****** + do k = 1, mz + do j = 1, my + do i = 1, mx +#if(iso) + fac = qvsiDY(i, j, k) * min(qs99, qvDY(i, j, k) / qvsiDY(i, j, k)) / qvDY(i, j, k) + do wiso = 1, niso + qvDY_iso(wiso, i, j, k) = fac * qvDY_iso(wiso, i, j, k) + enddo +#endif + qvDY(i, j, k) = qvsiDY(i, j, k) * min(qs99, qvDY(i, j, k) / qvsiDY(i, j, k)) + enddo + enddo + enddo + turnHY = .true. + endif + + ! +--Decide to set ON Cloud Microphysics if Air Relative Humidity > Crit. + ! + ==================================================================== + if(.not. turnHY) then +#if(BS) + erosmx = -1.0 +#endif + ! + ****** + call qsat3d + ! + ****** + hrelmx = 0.0 + do j = 1, my + do i = 1, mx + do k = 1, mz + !cCA todo : check here if relevant ? why 2 lines ? why the second ? + hrelmx = max(hrelmx, qvDY(i, j, k) / qvsiDY(i, j, k)) + hrelmx = max(hrelmx, qvDY(i, j, k) / qvswDY(i, j, k)) +#if(BS) + erosmx = max(erosmx, SLuusl(i, j, 1) - SaltSL(i, j)) +#endif + enddo + enddo + enddo + if(hrelmx > rhcrHY) turnHY = .true. +#if(BS) + if(erosmx > 0.0) turnHY = .true. +#endif + endif + +#if(iso) + iso_label = 'hydgen->1 ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + + ! +--Hydrological Cycle Initialization + ! + ================================= + if(turnHY) then + ! +----From 3D to 2D arrays + ! + -------------------- + do io = 1, 5 + ioutIO(io) = igrdIO(io) + mx * (jgrdIO(io) - 1) + enddo +#if(WH) + if(il__mm == 0) then + i___mm = imez + j___mm = jmez + il__mm = imez + (jmez - 1) * mx2 + endif +#endif +#if(EW) + il_mez = imez + (jmez - 1) * mx2 +#endif + ! + + iklon = 0 + + !$OMP PARALLEL DO & + !$OMP private(i,j,k,iklon,facLHR,qqp,dtHyd2,ntHyd2, & + !$OMP io___1,io___5,il__mm,i___mm,j___mm,il_mez,kk_pp, & + !$OMP ccni2D,ccnw2D,cfra2D,crys2D, & + !$OMP dqi2D, dqw2D,ect_2D,enr01D, & + !$OMP enr11D,enr21D,gplv2D, & + !$OMP gpmi2D,hlat2D,jhlr2D,mphy2D, & + !$OMP pk2D,pkta2D,prec2D, pst2D, & + !$OMP pst2Dn, qg2D, qi2D, qr2D, & + !$OMP qs2D, qv2D,qvsi2D,qvsw2D, & + !$OMP qw2D,rain2D,rolv2D,snoh2D, & + !$OMP snow2D,tair2D,tsrf2D,TUkv2D, & + !$OMP uair2D,vair2D,wair2D,wat01D, & + !$OMP wat11D,wat21D,watf1D,qssbl2D, & + !$OMP snf2D,sbl2D,dep2D,rnf2D,evp2D,smt2D) & + !$OMP schedule(dynamic) + + do j = 1, my + do i = 1, mx + 1234 continue + iklon = 1 + qqp = 0 + + if(i > 1 .and. i < mx .and. j > 1 .and. j < my) then + do k = 1, klev + pk2D(iklon, k) = pkDY(i, j, k) + pkta2D(iklon, k) = pktaDY(i, j, k) + tair2D(iklon, k) = tairDY(i, j, k) + uair2D(iklon, k) = uairDY(i, j, k) + vair2D(iklon, k) = vairDY(i, j, k) + wair2D(iklon, k) = wairDY(i, j, k)*.01 + sqrt(2.*ect_TE(i, j, k) / 3.) + rolv2D(iklon, k) = rolvDY(i, j, k) +#if(kk) + ! qv2D(iklon, k) = max(qvDY(i, j, k), epsq) +#endif + qv2D(iklon, k) = & + max(qvDY(i, j, k), epsi) + qw2D(iklon, k) = qwHY(i, j, k) + qr2D(iklon, k) = qrHY(i, j, k) + qi2D(iklon, k) = qiHY(i, j, k) + qs2D(iklon, k) = max(qsHY(i, j, k), zero) + qqp = max(qqp,(qr2D(iklon, k) + qs2D(iklon, k)) / 2.) +#if(qg) + qg2D(iklon, k) = qgHY(i, j, k) +#endif + cfra2D(iklon, k) = cfraHY(i, j, k) + ccnw2D(iklon, k) = ccnwHY(i, j, k) + ccni2D(iklon, k) = ccniHY(i, j, k) + dqi2D(iklon, k) = 0. + dqw2D(iklon, k) = 0. + hlat2D(iklon, k) = hlatHY(i, j, k) + ect_2D(iklon, k) = ect_TE(i, j, k) + TUkv2D(iklon, k) = TUkvh(i, j, k) + snf2D(iklon, k) = snfHY(i, j, k) + sbl2D(iklon, k) = sblHY(i, j, k) + dep2D(iklon, k) = depHY(i, j, k) + rnf2D(iklon, k) = rnfHY(i, j, k) + evp2D(iklon, k) = evpHY(i, j, k) + smt2D(iklon, k) = smtHY(i, j, k) + qssbl2D(iklon, k) = qssblHY(i, j, k) + enddo + + do k = max(1, mzhyd - 1), klev + 1 + gplv2D(iklon, k) = gplvDY(i, j, k) + gpmi2D(iklon, k) = gpmiDY(i, j, k) + qvsw2D(iklon, k) = qvswDY(i, j, k) + qvsi2D(iklon, k) = qvsiDY(i, j, k) + enddo + + kk_pp = klev / 2 + do k = klev, klev / 2, -1 + if(gplvDY(i, j, k) * grvinv - sh(i, j) < 100) kk_pp = k + enddo + + ! do k = max(1, mzhyd - 1), klev + ! if(qvDY(i, j, k)>=qvswDY(i, j, k) .and. tairDY(i, j, k)>=273.15) qqp = 1 + ! if(qvDY(i, j, k)>=qvsiDY(i, j, k) .and. tairDY(i, j, k)<=273.15) qqp = 1 + ! if(qqp>2 * eps9) goto 777 + ! end do + ! 777 continue + + pst2D(iklon) = pstDY(i, j) + pst2Dn(iklon) = pstDYn(i, j) + rain2D(iklon) = rainHY(i, j) + snow2D(iklon) = snowHY(i, j) + crys2D(iklon) = crysHY(i, j) + prec2D(iklon) = precSL(i, j) + snoh2D(iklon) = snohSL(i, j) + tsrf2D(iklon) = TairSL(i, j) +#if(EW) + wat01D(iklon) = wat0EW(i, j) + wat11D(iklon) = wat1EW(i, j) + wat21D(iklon) = wat2EW(i, j) + watf1D(iklon) = watfEW(i, j) + enr01D(iklon) = enr0EW(i, j) + enr11D(iklon) = enr1EW(i, j) + enr21D(iklon) = enr2EW(i, j) + mphy2D(iklon) = mphyEW(i, j) +#endif + jhlr2D(iklon) = jhlrGE(i, j) + + ! +----Call Cloud Microphysics, in case of NO vectorization + ! + ---------------------------------------------------- + + io___1 = 0 + io___5 = 0 + do io = 1, 5 + if(ioutIO(io) == iklon) then + io___1 = io + io___5 = io + endif + enddo + if(i == i___mm .and. j == j___mm) then + il__mm = 1 + else + il__mm = 0 + endif + if(i == imez .and. j == jmez) then + il_mez = 1 + else + il_mez = 0 + endif + + dtHyd2 = dt / real(ntHyd) + ntHyd2 = ntHyd + + if(qqp <= epsi * 100.) then + ntHyd2 = min(2, ntHyd) + dtHyd2 = dt / real(ntHyd2) + endif + if(qqp <= epsi * 10. .or. i <= 10 .or. j <= 10 .or. i >= mx - 9 .or. j >= my - 9) then + ntHyd2 = min(1, ntHyd) + dtHyd2 = dt / real(ntHyd2) + endif + do itPhys = 1, max(1, ntHyd2) + do k = mzhyd, klev + qw2D(iklon, k) = qw2D(iklon, k) + cloud_magic2 * qr2D(iklon, k) + qr2D(iklon, k) = qr2D(iklon, k) * (1.-cloud_magic2) + if(qi2D(iklon, k) < qs2D(iklon, k) * 10e-3 .and. & + gplvDY(i, j, k) * grvinv - sh(i, j) > 200.) then + qi2D(iklon, k) = qi2D(iklon, k) + cloud_magic2 * qs2D(iklon, k) + qs2D(iklon, k) = qs2D(iklon, k) * (1.-cloud_magic2) + endif + enddo + ! + *********** + call HYDmic(io___1, io___5, ioutIO, & + il__mm, i___mm, j___mm, il_mez, kk_pp, & + ccni2D, ccnw2D, cfra2D, crys2D, & + dqi2D, dqw2D, ect_2D, enr01D, & + enr11D, enr21D, gplv2D, & + gpmi2D, hlat2D, jhlr2D, mphy2D, & + pk2D, pkta2D, prec2D, pst2D, & + pst2Dn, qg2D, qi2D, qr2D, & + qs2D, qv2D, qvsi2D, qvsw2D, & + qw2D, rain2D, rolv2D, snoh2D, & + snow2D, tair2D, tsrf2D, TUkv2D, & + uair2D, vair2D, wair2D, wat01D, & + wat11D, wat21D, watf1D, dtHyd2, & + snf2D, sbl2D, dep2D, rnf2D, evp2D, & + smt2D, qssbl2D, itPhys, ntHyd2) + ! + *********** + enddo + + do k = 1, klev + if(isnan(tair2D(iklon, k)).or.isnan(qs2D(iklon, k)).or.isnan(qi2D(iklon, k)))then + print *,"NaN in Hydmic at pixel (i,j,k):",i,j,k + goto 1234 + endif + enddo + + ! +----From 2D to 3D arrays, in case of NO vectorization + ! + ---------------------------------------------------- + + do k = 1, klev + pktaDY(i, j, k) = pkta2D(iklon, k) + tairDY(i, j, k) = tair2D(iklon, k) + rolvDY(i, j, k) = rolv2D(iklon, k) + qvsiDY(i, j, k) = qvsi2D(iklon, k) + qvswDY(i, j, k) = qvsw2D(iklon, k) + qvDY(i, j, k) = qv2D(iklon, k) + qwHY(i, j, k) = qw2D(iklon, k) + qrHY(i, j, k) = qr2D(iklon, k) + qiHY(i, j, k) = qi2D(iklon, k) + qsHY(i, j, k) = qs2D(iklon, k) + snfHY(i, j, k) = snf2D(iklon, k) + sblHY(i, j, k) = sbl2D(iklon, k) + depHY(i, j, k) = dep2D(iklon, k) + rnfHY(i, j, k) = rnf2D(iklon, k) + evpHY(i, j, k) = evp2D(iklon, k) +#if(qg) + qgHY(i, j, k) = qg2D(iklon, k) +#endif + cfraHY(i, j, k) = cfra2D(iklon, k) + ccnwHY(i, j, k) = ccnw2D(iklon, k) + ccniHY(i, j, k) = ccni2D(iklon, k) + dqiHY(i, j, k) = dqi2D(iklon, k) * dsigm1(k) * pstDYn(i, j) + dqwHY(i, j, k) = dqw2D(iklon, k) * dsigm1(k) * pstDYn(i, j) + hlatHY(i, j, k) = hlat2D(iklon, k) + smthy(i, j, k) = smt2D(iklon, k) + qssblHY(i, j, k) = qssbl2D(iklon, k) + enddo + + rainHY(i, j) = rain2D(iklon) + snowHY(i, j) = snow2D(iklon) + crysHY(i, j) = crys2D(iklon) + precSL(i, j) = prec2D(iklon) + snohSL(i, j) = snoh2D(iklon) +#if(ew) + wat0EW(i, j) = wat01D(iklon) + wat1EW(i, j) = wat11D(iklon) + wat2EW(i, j) = wat21D(iklon) + watfEW(i, j) = watf1D(iklon) + enr0EW(i, j) = enr01D(iklon) + enr1EW(i, j) = enr11D(iklon) + enr2EW(i, j) = enr21D(iklon) + mphyEW(i, j) = mphy2D(iklon) +#endif + + ! +----Call Cloud Microphysics, in case of vectorization + ! + ---------------------------------------------------- +#if(hy) + ! if (klon.gt.1) then +#endif + ! io___1 = 1 + ! io___5 = 5 +#if(WH) + ! + *********** + ! call HYDmic(io___1,io___5,il__mm,i___mm,j___mm,il_mez) + ! + *********** + ! + ! il_mmc = il__mm + ! j___mm = 0 + ! 1000 continue + ! il_mmc = il_mmc-(my2-jp11+1) + ! j___mm = j___mm + 1 + ! if (il_mmc.gt.0) go to 1000 + ! i___mm = il_mmc+(my2-jp11+1) + ip11 +#endif + + ! +----From 2D to 3D arrays, in case of vectorization + ! + ---------------------------------------------------- + ! iklon = 0 + ! do j = jp11,my1 + ! do i = ip11,mx1 + ! iklon = iklon + 1 + ! do k=1,klev + ! pktaDY(i,j,k)=pkta2D(iklon,k) + ! tairDY(i,j,k)=tair2D(iklon,k) + ! rolvDY(i,j,k)=rolv2D(iklon,k) + ! qvsiDY(i,j,k)=qvsi2D(iklon,k) + ! qvswDY(i,j,k)=qvsw2D(iklon,k) + ! qvDY(i,j,k)= qv2D(iklon,k) + ! qwHY(i,j,k)= qw2D(iklon,k) + ! qrHY(i,j,k)= qr2D(iklon,k) + ! qiHY(i,j,k)= qi2D(iklon,k) + ! qsHY(i,j,k)= qs2D(iklon,k) + ! snfHY(i,j,k)= snf2D(iklon,k) + ! smthy(i,j,k)= smt2D(iklon,k) + ! sblHY(i,j,k)= sbl2D(iklon,k) + ! rnfHY(i,j,k)= rnf2D(iklon,k) + ! evpHY(i,j,k)= evp2D(iklon,k) + !#if(qg) + ! qgHY(i,j,k)= qg2D(iklon,k) + !#endif + ! cfraHY(i,j,k)=cfra2D(iklon,k) + ! ccnwHY(i,j,k)=ccnw2D(iklon,k) + ! ccniHY(i,j,k)=ccni2D(iklon,k) + ! dqiHY(i,j,k)= dqi2D(iklon,k)*dsigm1(k)*pstDYn(i,j) + ! dqwHY(i,j,k)= dqw2D(iklon,k)*dsigm1(k)*pstDYn(i,j) + ! hlatHY(i,j,k)=hlat2D(iklon,k) + ! end do + ! rainHY(i,j) =rain2D(iklon) + ! snowHY(i,j) =snow2D(iklon) + ! crysHY(i,j) =crys2D(iklon) + ! precSL(i,j) =prec2D(iklon) + ! snohSL(i,j) =snoh2D(iklon) +#if(EW) + ! wat0EW(i, j) = wat01D(iklon) + ! wat1EW(i, j) = wat11D(iklon) + ! wat2EW(i, j) = wat21D(iklon) + ! watfEW(i, j) = watf1D(iklon) + ! enr0EW(i, j) = enr01D(iklon) + ! enr1EW(i, j) = enr11D(iklon) + ! enr2EW(i, j) = enr21D(iklon) + ! mphyEW(i, j) = mphy2D(iklon) +#endif + ! end do + ! end do +#if(hy) + ! end if +#endif + ! +--Isotopes Proxies: Diagnostics + ! + ============================= + WKxy1(i, j) = 0. + WKxy2(i, j) = 0. + WKxy3(i, j) = 0. + WKxy4(i, j) = 0. + WKxy5(i, j) = 0. + WKxy6(i, j) = 0. + do k = 2, klev + WKxy1(i, j) = WKxy1(i, j) & + + dsigm1(k) * max(hlatHY(i, j, k), 0.) + WKxy2(i, j) = WKxy2(i, j) & + - dsigm1(k) * min(hlatHY(i, j, k), 0.) + WKxy3(i, j) = WKxy3(i, j) & + + dsigm1(k) * max(hlatHY(i, j, k), 0.) * tairDY(i, j, k) + WKxy4(i, j) = WKxy4(i, j) & + - dsigm1(k) * min(hlatHY(i, j, k), 0.) * tairDY(i, j, k) + WKxy5(i, j) = WKxy5(i, j) & + + dsigm1(k) * max(hlatHY(i, j, k), 0.) * gplvDY(i, j, k) + WKxy6(i, j) = WKxy6(i, j) & + - dsigm1(k) * min(hlatHY(i, j, k), 0.) * gplvDY(i, j, k) + enddo + facLHR = (cp / Ls_H2O) * pstDYn(i, j) * 1.e3 * grvinv * dt + Hcd_HY(i, j) = Hcd_HY(i, j) + WKxy1(i, j) * facLHR + Hsb_HY(i, j) = Hsb_HY(i, j) + WKxy2(i, j) * facLHR + Tcd_HY(i, j) = Tcd_HY(i, j) + WKxy3(i, j) * facLHR + Tsb_HY(i, j) = Tsb_HY(i, j) + WKxy4(i, j) * facLHR + zcd_HY(i, j) = zcd_HY(i, j) + WKxy5(i, j) * facLHR + zsb_HY(i, j) = zsb_HY(i, j) + WKxy6(i, j) * facLHR + endif + + icntHY = icntHY + 1 + + ! +--Hydrological Cycle Lateral Boundary Conditions + ! + ============================================== + + if(i == 1) then + do k = mzhyd, mz + WKxyz1(1, j, k) = max(0., sign(1., uairDY(1, j, k))) ! u_In_Flow + WKxyz2(1, j, k) = 1.-WKxyz1(1, j, k) ! u_OutFlow + WKxyz3(1, j, k) = (sigma(k) * pstDY(1, j) + ptopDY)**cap ! pp + WKxyz4(1, j, k) = pktaDY(1, j, k) + + WKxyz1(mx, j, k) = max(0., sign(1., uairDY(mx, j, k))) + WKxyz2(mx, j, k) = 1.-WKxyz1(mx, j, k) + WKxyz3(mx, j, k) = (sigma(k) * pstDY(mx, j) + ptopDY)**cap + WKxyz4(mx, j, k) = pktaDY(mx, j, k) + enddo + + do k = mzhyd, mz + qwHY(1, j, k) = qwHY(1, j, k) * WKxyz2(1, j, k) + qiHY(1, j, k) = qiHY(1, j, k) * WKxyz2(1, j, k) + qrHY(1, j, k) = qrHY(1, j, k) * WKxyz2(1, j, k) + qsHY(1, j, k) = qsHY(1, j, k) * WKxyz2(1, j, k) + WKxyz5(1, j, k) = tairDY(1, j, k) * WKxyz2(1, j, k) + + qwHY(mx, j, k) = qwHY(mx, j, k) * WKxyz1(mx, j, k) + qiHY(mx, j, k) = qiHY(mx, j, k) * WKxyz1(mx, j, k) + qrHY(mx, j, k) = qrHY(mx, j, k) * WKxyz1(mx, j, k) + qsHY(mx, j, k) = qsHY(mx, j, k) * WKxyz1(mx, j, k) + WKxyz5(mx, j, k) = tairDY(mx, j, k) * WKxyz1(mx, j, k) + enddo + + do k = mzhyd, mz + pktaDY(1, j, k) = pktaDY(1, j, k) * WKxyz1(1, j, k) & + + WKxyz5(1, j, k) / WKxyz3(1, j, k) + + pktaDY(mx, j, k) = pktaDY(mx, j, k) * WKxyz2(mx, j, k) & + + WKxyz5(mx, j, k) / WKxyz3(mx, j, k) + enddo + + do k = mzhyd, mz + hlatHY(1, j, k) = WKxyz5(1, j, k) & + * (1.0 - WKxyz4(1, j, k) / pktaDY(1, j, k)) / dt + + hlatHY(mx, j, k) = WKxyz5(mx, j, k) & + * (1.0 - WKxyz4(mx, j, k) / pktaDY(mx, j, k)) / dt + enddo + endif + + if(j == 1) then + do k = mzhyd, mz + WKxyz1(i, 1, k) = max(0., sign(1., vairDY(i, 1, k))) ! v_In_Flow + WKxyz2(i, 1, k) = 1.-WKxyz1(i, 1, k) ! v_OutFlow + WKxyz3(i, 1, k) = (sigma(k) * pstDY(i, 1) + ptopDY)**cap ! pp + WKxyz4(i, 1, k) = pktaDY(i, 1, k) + + WKxyz1(i, my, k) = max(0., sign(1., vairDY(i, my, k))) + WKxyz2(i, my, k) = 1.-WKxyz1(i, my, k) + WKxyz3(i, my, k) = (sigma(k) * pstDY(i, my) + ptopDY)**cap + WKxyz4(i, my, k) = pktaDY(i, my, k) + enddo + + do k = mzhyd, mz + qwHY(i, 1, k) = qwHY(i, 1, k) * WKxyz2(i, 1, k) + qiHY(i, 1, k) = qiHY(i, 1, k) * WKxyz2(i, 1, k) + qrHY(i, 1, k) = qrHY(i, 1, k) * WKxyz2(i, 1, k) + qsHY(i, 1, k) = qsHY(i, 1, k) * WKxyz2(i, 1, k) + WKxyz5(i, 1, k) = tairDY(i, 1, k) * WKxyz2(i, 1, k) + + qwHY(i, my, k) = qwHY(i, my, k) * WKxyz1(i, my, k) + qiHY(i, my, k) = qiHY(i, my, k) * WKxyz1(i, my, k) + qrHY(i, my, k) = qrHY(i, my, k) * WKxyz1(i, my, k) + qsHY(i, my, k) = qsHY(i, my, k) * WKxyz1(i, my, k) + WKxyz5(i, my, k) = tairDY(i, my, k) * WKxyz1(i, my, k) + enddo + + do k = mzhyd, mz + pktaDY(i, 1, k) = pktaDY(i, 1, k) * WKxyz1(i, 1, k) & + + WKxyz5(i, 1, k) / WKxyz3(i, 1, k) + + pktaDY(i, my, k) = pktaDY(i, my, k) * WKxyz2(i, my, k) & + + WKxyz5(i, my, k) / WKxyz3(i, my, k) + enddo + + do k = mzhyd, mz + hlatHY(i, 1, k) = WKxyz5(i, 1, k) & + * (1.0 - WKxyz4(i, 1, k) / pktaDY(i, 1, k)) / dt + + hlatHY(i, my, k) = WKxyz5(i, my, k) & + * (1.0 - WKxyz4(i, my, k) / pktaDY(i, my, k)) / dt + enddo + endif + WKxy1(i, j) = 0. + WKxy2(i, j) = 0. + WKxy3(i, j) = 0. + WKxy4(i, j) = 0. + WKxy5(i, j) = 0. + WKxy6(i, j) = 0. + + enddo + enddo + !$OMP END PARALLEL DO + endif +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! if (lSV_v1>0 .and. lSV_v1<=2) then + ! write(6, 6010) ((qsHY(iSV_v1, jSV_v1, k) * 1.e3), k = mz, mz - 4, -1) + ! 6010 format(10x, 'After HYDmic : q [g/kg] =', 5f9.6) + ! end if +#endif + return +endsubroutine HYDgen diff --git a/MAR/code_mar/hydmic.f90 b/MAR/code_mar/hydmic.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e232f9b61dee9c60a988fd974310ecd0691672e7 --- /dev/null +++ b/MAR/code_mar/hydmic.f90 @@ -0,0 +1,4146 @@ +#include "MAR_pp.def" +subroutine HYDmic(io1, io5, ioutIO, & + ilmm, imm, jmm, ilmez, kk_pp, & + ccni2D, ccnw2D, cfra2D, crys2D, & + dqi2D, dqw2D, ect_2D, enr01D, & + enr11D, enr21D, gplv2D, & + gpmi2D, hlat2D, jhlr2D, mphy2D, & + pk2D, pkta2D, prec2D, pst2D, & + pst2Dn, qg2D, qi2D, qr2D, & + qs2D, qv2D, qvsi2D, qvsw2D, & + qw2D, rain2D, rolv2D, snoh2D, & + snow2D, tair2D, tsrf2D, TUkv2D, & + uair2D, vair2D, wair2D, wat01D, & + wat11D, wat21D, watf1D, dtHyd2, & + snf2D, sbl2D, dep2D, rnf2D, evp2D, & + smt2D, qssbl2D, itPhys, ntHyd2) + !------------------------------------------------------------------------+ + ! MAR HYDROLOGIC CYCLE 15-dec-2022 MAR | + ! subroutine HYDmic computes Cloud Microphysical Processes | + ! | + !------------------------------------------------------------------------+ + ! | + ! INPUT / OUTPUT: qv2D(klon,klev): air specific humidity (kg/kg) | + ! ^^^^^^^^^^^^^^ qw2D(klon,klev): cloud drops (kg/kg) | + ! qr2D(klon,klev): rain drops (kg/kg) | + ! qi2D(klon,klev): ice crystals concentration(kg/kg) | + ! qs2D(klon,klev): snow flakes (kg/kg) | + ! qssbl2D(klon,klev): sublimated snow flakes (kg/kg) | + ! (to be added) qg2D(klon,klev): graupels (kg/kg) | + ! ccnw2D(klon,klev): cloud droplets number (Nb/m3) | + ! ccni2D(klon,klev): ice crystals number (Nb/m3) | + ! | + ! cfra2D(klon,klev): cloud fraction | + ! | + ! rain2D(klon) : rain Precipitation (m w.e.) | + ! snow2D(klon) : snow Precipitation (m w.e.) | + ! crys2D(klon) : ice Precipitation (m w.e.) | + ! | + ! Precipitation and sublimation in the atmosphere | + ! snf2D(klon,klev): atm. snow precipitation (m w.e.) | + ! sbl2D(klon,klev): atm. snow sublimation (m w.e.) | + ! dep2D(klon,klev): atm. snow condensation (m w.e.) | + ! rnf2D(klon,klev): atm. rain precipitation (m w.e.) | + ! evp2D(klon,klev): atm. rain evaporation (m w.e.) | + ! smt2D(klon,klev): atm. (integr) snow transport (kg/m) | + ! | + ! hlat2D(klon,klev): Latent Heat Release (K/s) | + ! dqi2D(klon,klev): Ice Water Formation (kg/kg) | + ! dqw2D(klon,klev): Liquid Water Formation (kg/kg) | + ! qvsi2D(klon,klev+1): Saturation Specific Humid.(kg/kg) | + ! qvsw2D(klon,klev+1): Saturation Specific Humid.(kg/kg) | + ! | + ! REFER. : 1) Ntezimana, unpubl.thes.LLN, 115 pp, 1993 | + ! ^^^^^ 2) Lin et al. JCAM 22, 1065--1092, 1983 | + ! (very similar, except that graupels are represented) | + ! 3) Emde and Kahlig, Annal.Geophys. 7, 405-- 414, 1989 | + ! 4) Levkov et al., Contr.Atm.Phys. 65, 35-- 57, 1992 | + ! 5) Meyers et al., JAM 31, 708-- 731, 1992 | + ! (Primary Ice-Nucleation Parameterization) | + ! 6) Delobbe and Gallee, BLM 89, 75-- 107 1998 | + ! (Partial Condensation Scheme) | + ! | + ! CAUTION: Partial Condensation Scheme NOT validated | + ! ^^^^^^^ for SCu -- Cu Transition | + ! erf fonction is erroneous on HP | + ! | + !# OPTIONS: #HM Hallet-Mossop Theory (for Convective Updraft) | + !# ^^^^^^^ #hm idem (non vectorized code) | + !# !#qf Cloud Droplets Heterogeneous Freezing (not included) | + !# !#qg Graupel Conservation Equation (to include) | + !# #hb Snow particles distrib. parameter cnos set to BS value | + !# #hs Emde & Kahlig Homogeneous Sublimation (not in Levkov) | + !# !#pp Emde & Kahlig Ice Crystal Deposition (not included) | + ! | + !# #VW Duynkerke et al. 1995, JAS 52, p.2763 Dropplets Fall | + !# #LI Lin et al (1983,JCAM 22, p.1076(50) Autoconv. Scheme | + !# #LO Liou and Ou (1989, JGR 94, p.8599) Autoconv. Scheme | + ! | + !# #up Snow Particles: Unrimed Side Planes | + !# #ur Snow Particles: Aggregates of unrimed radiat. assembl. | + ! | + !# DEBUG: #WH Additional Output (Each Process is detailed) | + !# ^^^^^ #WQ FULL Output (Each Process is detailed) | + !# #EW Additional Output (Energy and Water Conservation) | + ! | + ! REMARK : the sign '~' indicates that reference must be verified | + ! ^^^^^^^^ | + !------------------------------------------------------------------------+ + + use mardim + use marctr + use marphy + use margrd + use mar_ge + use mar_io + use mar_dy + use mar_hy + use marmagic +#if(EW) + use mar_ew +#endif + + implicit none + + ! Input - Output + ! ============== + ! in + ! -- + integer, intent(in) :: io1 + integer, intent(in) :: io5 + integer, intent(in) :: ioutIO(5) + integer, intent(in) :: imm + integer, intent(in) :: jmm + integer, intent(in) :: ilmez + integer, intent(in) :: kk_pp + integer, intent(in) :: itPhys + integer, intent(in) :: ntHyd2 + real, intent(in) :: dtHyd2 + ! inout + ! ---- + integer, intent(inout) :: ilmm + real, intent(inout) :: ccni2D(klon, klev) + real, intent(inout) :: ccnw2D(klon, klev) + real, intent(inout) :: cfra2D(klon, klev) + real, intent(inout) :: crys2D(klon) + real, intent(inout) :: dqi2D(klon, klev) + real, intent(inout) :: dqw2D(klon, klev) + real, intent(inout) :: ect_2D(klon, klev) + real, intent(inout) :: enr01D(klon) + real, intent(inout) :: enr11D(klon) + real, intent(inout) :: enr21D(klon) + real, intent(inout) :: gplv2D(klon, klev + 1) + real, intent(inout) :: gpmi2D(klon, klev + 1) + real, intent(inout) :: hlat2D(klon, klev) + integer, intent(inout) :: jhlr2D(klon) + character(len = 20), intent(inout) :: mphy2D(klon) + real, intent(inout) :: pk2D(klon, klev) + real, intent(inout) :: pkta2D(klon, klev) + real, intent(inout) :: prec2D(klon) + real, intent(inout) :: pst2D(klon) + real, intent(inout) :: pst2Dn(klon) + real, intent(inout) :: qg2D(klon, klev) + real, intent(inout) :: qi2D(klon, klev) + real, intent(inout) :: qr2D(klon, klev) + real, intent(inout) :: qs2D(klon, klev) + real, intent(inout) :: qv2D(klon, klev) + real, intent(inout) :: qvsi2D(klon, klev + 1) + real, intent(inout) :: qvsw2D(klon, klev + 1) + real, intent(inout) :: qw2D(klon, klev) + real, intent(inout) :: rain2D(klon) + real, intent(inout) :: rolv2D(klon, klev) + real, intent(inout) :: snoh2D(klon) + real, intent(inout) :: snow2D(klon) + real, intent(inout) :: tair2D(klon, klev) + real, intent(inout) :: tsrf2D(klon) + real, intent(inout) :: TUkv2D(klon, klev) + real, intent(inout) :: uair2D(klon, klev) + real, intent(inout) :: vair2D(klon, klev) + real, intent(inout) :: wair2D(klon, klev) + real, intent(inout) :: wat01D(klon) + real, intent(inout) :: wat11D(klon) + real, intent(inout) :: wat21D(klon) + real, intent(inout) :: watf1D(klon) + real, intent(inout) :: snf2D(klon, klev) + real, intent(inout) :: sbl2D(klon, klev) + real, intent(inout) :: dep2D(klon, klev) + real, intent(inout) :: qssbl2D(klon, klev) + real, intent(inout) :: rnf2D(klon, klev) + real, intent(inout) :: evp2D(klon, klev) + real, intent(inout) :: smt2D(klon, klev) + +#if(wH) + ! Debug Variables + ! ~~~~~~~~~~~~~~~ + integer i_fvv(klon), j_fvv(klon), klfvv, i0fvv, j0fvv, k0fvv + common / DebuggHy / i_fvv, j_fvv, klfvv, i0fvv, j0fvv, k0fvv + character * 70 debugH + character * 10 proc_1, proc_2, proc_3, proc_4 + real procv1, procv2, procv3, procv4 + integer kv, nl + real debugV(16, klev) +#endif + + ! Local Variables + ! ================ + + integer k, m + integer il, kl, itc, itmx, it, ii, io, ilmmi + + ! Work variables + real :: W2xyz1(klon, klev) + real :: W2xyz2(klon, klev) + real :: W2xyz3(klon, klev) + real :: W2xyz4(klon, klev) + real :: W2xyz5(klon, klev + 1) + real :: W2xyz6(klon, klev + 1) + real :: W2xyz7(klon, klev + 1) + real :: W2xyz8(klon, klev + 1) + real :: W2xyz9(klon, klev) + real :: W2xyz0(klon, klev) + + real :: qrevp2D(klon, klev) + real :: qssub2D(klon, klev) + real :: hsub2D(klon, klev) + real :: vs2D(klon, klev) + + real argerf, erf, xt + real signQw, signQr, signQi, signQs, signCi, signVR, & + signVS, signHN, Qw0_OK, Qr0_OK, Qi0_OK, Qs0_OK, & + Qi0qOK, Ci0cOK, Ci0_OK, vr__OK, vs__OK, qHoNuc, & + qwOK, dpv, dqv, qHeNu1, qHeNu2, qHeNu3, qHeNuc, & + qicnd1, qisign, qi1_OK, qicnd2, qicnd, qBerge, & + a1, a2, am0, qidep, qvdfci, qSubl1, qSubl2, qSubli, & + demde, sat, ab1, ab2, amf, pisub, qisub, qMelt1, & + qMelt2, qMelt, qxmlt, qimlt, cimlt, qt, tl, pa_hPa, & + es_hPa, qsl, dqt, wqt, ww, coefC2, sig2rh, sigqt, & + err, alpha, t1, t2, signFR, cfraOK, SCuLim, & + qw_new, dqw, signdq, fac_qv, updatw, dpw, signAU, & + AutoOK, signFC, ClouOK, praut, qraut, signCC, qiOK, & + qid, a1saut, c1saut, xtsaut, qsaut, cnsaut, ex1, psaut, & + sign_W, WbyR_w, sign_R, WbyR_r, WbyROK, pracw, & + qracw, WbyS_w, sign_S, WbyS_s, WbySOK, qsacw, & + sign_T, Fact_R, SnoA, sign_C, CbyS_c, CbyS_T, & + CbySOK, efc, psaci, qsaci, cnsaci, CbyR_c, CbyR_r, & + CbyR_T, CbyROK, praci, qraci, CbyS_s, cnraci, & + piacr, qiacr, qsacr, RbyS_r, RbyS_s, RbySOK, flR, & + SbyR_r, SbyR_s, SbyROK, flS, pracs, qracs, qsacrS, & + qracsS, Evap_r, EvapOK, sr, sign_Q, Evap_q, & + qsacrR, almr, ab, prevp, qrevp, Evap_s, alms, si, & + pssub, qssub, dqamx, Depo_s, SnoM_s, SnoM_T, & + SnoMOK, qsmlt, xCoef, ACoef, BCoef, Tc, & + Freezr, FreezT, FrerOK, psfr, akps, psmlt, & + qsfr, Sedi_c, Sedicc, SediOK, vrmx, vsmx, vimx, & + dzmn, xtmn, dwat, dsno, qcloud, pp, pkt0, vmmx, vmmi, & + connw, qwclou, dmed0, dmedv, dmede, dmed5, waterb, & + dmed, dmed2, dw0, dw4, rwbar, signHV, heavi, vwmx + + real dqi, dqi1, dqi2, dqi3 + real relhum, argexp, qvs_wi + real ratio_rfsf, ratio_temp, ratio_prec + + real vi(klon, klev) +#if(VW) + real vw(klon, klev) +#endif + real vr(klon, klev) + real vs(klon, klev) +#if(qg) + real vh(klon, klev) +#endif + real psacw(klon, klev), psacr(klon, klev) + +#if(WH) + real wihm1(klev), wihm2(klev), wicnd(klev) + real widep(klev), wisub(klev), wimlt(klev) + real wwevp(klev) + real wraut(klev), wsaut(klev) + real wracw(klev), wsacw(klev) + real wsaci(klev), wraci(klev), wiacr(klev) + real wsacr(klev), wracs(klev), wrevp(klev) + real wssub(klev), wsmlt(klev), wsfre(klev) + real qiold(klev), qwold(klev) +#endif + + ! rad_ww: Droplet Radius, Meyers et al. (1992), JAM + real rad_ww + +#if(HM) + ! Levkov et al. (1992) CAM + real SplinJ, SplinP +#endif + + ! DATA + ! ==== + + logical, parameter :: Meyers = .true. + logical, parameter :: LevkovAUTO = .true. + ! LevkovAUTX = .true. => Levkov parameterization Bergeron Processes + ! LevkovAUTX = .false. => Emde&Kahlig parameterization Bergeron Processes + logical, parameter :: LevkovAUTX = .true. + + logical, parameter :: EmdeKa = .false. + ! fracSC: SCu Fractional Cloudiness Delobbe + ! fracSC = .true. => Delobbe SCu Fractional Cloudiness Scheme + ! fracSC = .true. => may be setup if fracld = .true. + logical, parameter :: fracSC = .false. + ! fraCEP: SCu Fractional Cloudiness ECMWF + logical, parameter :: fraCEP = .false. + + real, parameter :: thir5 = 1.66e0 ! cCA 5. / 3. + + real, parameter :: eps1 = 1.e-01 + + ! cnor: intercept parameter / rain distribution ! Tuning + ! #if(LA) + ! real, parameter :: cnor = 3.0e06 + ! #else + real, parameter :: cnor = 8.0e06 + ! #endif + + ! cnos: intercept parameter / snow distribution + real :: cnos + + ! cnog: intercept parameter / graupel distribution + ! cnog: Lin et al. 1983, JCAM 22, p.1068 (1,2 and 3) + real, parameter :: cnog = 4.0e04 + + ! cnos2: intercept parameter / snow distribution + real, parameter :: cnos2 = 5.e06 + + real, parameter :: ui50 = 0.1e0 + real, parameter :: ri50 = 5.e-5 + real, parameter :: beta = 0.5e0 + + ! C1_EkM: Partial Condensation Scheme + real, parameter :: C1_EkM = 0.14e-3 + ! C2_EkM: Ek and Mahrt 1991, An.Geoph. 9, 716--724 + real, parameter :: C2_EkM = 9.75e+0 + + ! tsfo: minimum temperature (deg.C) before instant. cloud dropplets freezing + ! tsfo: Levkov et al.1992, C.Atm.Ph.65, p.39 + real, parameter :: tsfo = -35.e0 + + ! WatIce, ExpWat, ExpWa2: Saturation pressure over Water, Dudhia (1989) JAS + real, parameter :: WatIce = 273.16e0 + real, parameter :: ExpWat = 5.138e0 + real, parameter :: ExpWa2 = 6827.e0 + + ! aM_Nid, bM_Nid, TM_Nid: Deposition Condensation-Freezing Nucleation Param. + ! aM_Nid, bM_Nid, TM_Nid: Meyers et al. (1992), p.713 + ! real, parameter :: aM_Nid = -0.639 + ! real, parameter :: bM_Nid = 0.1296 + !XF + real, parameter :: aM_Nid = -1.488 + ! bM_Nid: Prenni et al. (2007), p.545, BAMS + real, parameter :: bM_Nid = 0.0187 + real, parameter :: TM_Nid = -5. + + ! aM_Nic, bM_Nic, TM_Nic: Contact Freezing Nucleation Parameters + ! aM_Nic, bM_Nic, TM_Nic: Meyers et al. (1992), p.713 + real, parameter :: aM_Nic = -2.80 + real, parameter :: bM_Nic = 0.262 + real, parameter :: TM_Nic = -2. + +#if(HM) + ! TmnNhm, TmxNhm, w_svrl: Hallet-Mossop Theory + ! see Levkov et al., (1992), Contr.Atm.Phy. 65, p.40 + real, parameter :: TmnNhm = -8. + real, parameter :: TmxNhm = -3. + real, parameter :: w_svrl = 1. +#endif + + ! qsd0: Smallest Diameter of Particles in the snow Class + ! qsd0: Levkov et al. (1992), Contr. Atm. Phys. 65, p.41, para 1 + real, parameter :: qsd0 = 2.0e-4 + + ! qi00: max. ice crystals concentr. before autoconv. of snow flakes occurs + ! qi00: Lin et al. (1983), JCAM 22, p.1070 (21) + real, parameter :: qi00 = 0.001e0 + ! qi00 = 0.0008: compromise when graupels are not included + ! qi00 = 0.0008: Emde and Kahlig (1989), Ann.Geoph. 7, p.408 (18) + ! _hl data qi00/0.0008/ + + ! qg00: max. ice crystals concentr. before autoconversion of graupels occurs + ! qg00: Lin et al. (1983), JCAM 22, p.1074 (37) + real, parameter :: qg00 = 0.0006e0 + + ! sigmaw = 1/3 ln(1/k), where k=0.8 (dispersion parameter) + ! sigmaw: Martin et al. (1994), JAS 51, p.1823 + real, parameter :: sigmaw = 0.27e+0 + +#if(LO) + ! rcrilo: Autoconversion Critical Radius (Liou and Ou, 1989) + real, parameter :: rcrilo = 10.0e-6 +#endif + +#if(LI) + ! qw00L: maximum cloud droplets concentration before autoconversion occurs + ! qw00L: Lin et al. (1983), JCAM 22, p.1076 (50) + real, parameter :: qw00L = 0.002e0 +#endif + + ! qi0S: critical solid water mixing ratio (tuned Dome C) (FacFIk > 1) + ! qi0S = 0.3e(-3) : critical solid water mixing ratio (standard) + real, parameter :: qi0S = 0.10e-3 + + ! qw00: critical liquid water mixing ratio + ! qw00 = 0.30e-3 -> standard value + ! qw00: Sundqvist (1988) : Physically-Based Modelling and + ! qw00: Simulation of Climate and Climatic Change, + ! qw00: M.E. Schlesinger, Ed., Reidel, 433-461. + real, parameter :: qw00 = 0.10e-3 + +#if(SC) + real, parameter :: camart = 0.8e0 + ! connw : droplets number concentration (m-3) + real, parameter :: connw = 1.2e8 +#endif + + ! csud: charac. time scale for autoconversion (SUND), Sundqvist (1988) + real, parameter :: csud = 1.0e-4 + + ! typww: Typical Cloud Droplet Weight [Ton] (typ. diam.: 32.5 mim) + ! typww: (used with air Density rolv2D [Ton/m3]) + real, parameter :: typww = 18.e-15 + + ! cc1, cc2, dd0: cloud droplets autoconversion parameters + real, parameter :: cc1 = 1.200e-04 + real, parameter :: cc2 = 1.569e-12 + real, parameter :: dd0 = 0.15e0 + + ! ========================================================================== + ! aa1, aa2: Bergeron Process Data (given by Koenig, 1971, J.A.S. 28,p235) == + + real, parameter, dimension(31) :: aa1 = (/ 0.7939e-07, 0.7841e-06, 0.3369e-05, 0.4336e-05, & + 0.5285e-05, 0.3728e-05, 0.1852e-05, 0.2991e-06, & + 0.4248e-06, 0.7434e-06, 0.1812e-05, 0.4394e-05, & + 0.9145e-05, 0.1725e-06, 0.3348e-04, 0.1725e-04, & + 0.9175e-05, 0.4412e-05, 0.2252e-05, 0.9115e-06, & + 0.4876e-06, 0.3473e-06, 0.4758e-06, 0.6306e-06, & + 0.8573e-06, 0.7868e-06, 0.7192e-06, 0.6513e-06, & + 0.5956e-06, 0.5333e-06, 0.4834e-06/) + + real, parameter, dimension(31) :: aa2 = (/ 0.4006e0, 0.4831e0, 0.5320e0, 0.5307e0, 0.5319e0, & + 0.5249e0, 0.4888e0, 0.3894e0, 0.4047e0, 0.4318e0, & + 0.4771e0, 0.5183e0, 0.5463e0, 0.5651e0, 0.5813e0, & + 0.5655e0, 0.5478e0, 0.5203e0, 0.4906e0, 0.4447e0, & + 0.4126e0, 0.3960e0, 0.4149e0, 0.4320e0, 0.4506e0, & + 0.4483e0, 0.4460e0, 0.4433e0, 0.4413e0, 0.4382e0, & + 0.4361e0 /) + + ! === Bergeron Process Data (given by Koenig, 1971, J.A.S. 28,p235) ======== + ! ========================================================================== + + ! Upper Limit for specific Humidity + ! ================================= + + ! SSImax: Maximum Sursaturation % ICE (900 ==> RH=1000%) +#if(kk) + real, parameter :: SSImax = 900. +#else + real, parameter :: SSImax = 101.0 +#endif + + real, parameter :: relCri = 1.0 + !#if(rc) + ! relCri = 0.9 + 0.08 * sqrt(max(0.,100. - dx*0.001) / 95.) + !#endif + + ! ======== end declaration ============ + + ! Define constants + ! ================ + + ! Cloud Droplets Autoconversion Threshold + ! ======================================= + + ! cminHY: Cloud Fraction under which no Autoconversion occurs + cminHY = 1.0e-3 + + ! cnos: intercept parameter / snow distribution + cnos = 1.0e8 +#if(AC) + cnos = 3.0e8 + ! old cnos over ANT + ! cnos = 5.e7 + ! cnos = 3.e6 +#endif +#if(GR) + cnos = 2.0e8 +#endif + ! #if(LA) + ! cnos = 4.0e6 + ! #endif + +#if(LI) + qw00 = qw00L +#endif + +#if(hb) + ! For Blown Snow Particles + ! ======================== + ! do NOT USE unless for specific sensivity experiments + cnos = 0.1e18 + if(itexpe == 0) write(6, 6000) + 6000 format(/, ' ****************************************************', & + /, ' * cnos = 0.1d18 for PURE BLOWING SNOW EXPERIMENTS *', & + /, ' * do not USE OTHERWISE *', & + /, ' ****************************************************', & + /) +#endif + + ! Update of Temperature + ! ===================== + + xt = min(dt, dtHyd) + xt = dtHyd2 + + qHeNu1 = 0 + qHeNu2 = 0 + qHeNu3 = 0 + + psacw = 0 + psacr = 0 + + do kl = mzhyd, klev + do il = 1, klon + tair2D(il, kl) = pkta2D(il, kl) * pk2D(il, kl) +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'HYDmic: Debugged Variables: Initial' + debugH(36:70) = ' ' + proc_1 = 'R.Hum W[%]' + procv1 = 0.1 * qv2D(il, kl) / (rhcrHY * qvsw2D(il, kl)) + proc_2 = 'R.Hum I[%]' + procv2 = 0.1 * qv2D(il, kl) / (rhcrHY * qvsi2D(il, kl)) + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + do kv = 1, 16 + debugV(kv, kl) = 0. + enddo +#endif + enddo + enddo + + ! cCA variables initialization + do kl = 1, klev + do il = 1, klon + qrevp2D(il, kl) = 0.0 + qssub2D(il, kl) = 0.0 + enddo + enddo + +#if(EW) + ! Vertical Integrated Energy and Water Content + ! ============================================ + do il = 1, klon + enr01D(il) = 0.0 + wat01D(il) = 0.0 + do kl = 1, klev + enr01D(il) = enr01D(il) & + + (tair2D(il, kl) & + - (qw2D(il, kl) + qr2D(il, kl)) * r_LvCp & + - (qi2D(il, kl) + qs2D(il, kl)) * r_LsCp) & + * dsigm1(kl) + wat01D(il) = wat01D(il) & + + (qv2D(il, kl) & + + qw2D(il, kl) + qr2D(il, kl) & + + qi2D(il, kl) + qs2D(il, kl)) & + * dsigm1(kl) + enddo + ! mphy2D --> '12345678901234567890' + mphy2D(il) = ' ' +#if(ew) + enr01D(il) = enr01D(il) * pst2Dn(il) * grvinv +#endif + ! wat01D [m] contains an implicit factor (10.**3) [kPa-->Pa] /ro_Wat + wat01D(il) = wat01D(il) * pst2Dn(il) * grvinv + enddo +#endif +#if(WH) + vmmx = 0.0 +#endif + + ! Set lower limit on Hydrometeor Concentration + ! ============================================ + + if(itPhys == 1) then + if(no_vec) then + do kl = mzhyd, klev + do il = 1, klon + + if(qw2D(il, kl) < eps9) then + qv2D(il, kl) = qv2D(il, kl) + qw2D(il, kl) + tair2D(il, kl) = tair2D(il, kl) - qw2D(il, kl) * r_LvCp + dqw2D(il, kl) = dqw2D(il, kl) - qw2D(il, kl) + qw2D(il, kl) = 0.0 + endif + + if(qr2D(il, kl) < eps9) then + qv2D(il, kl) = qv2D(il, kl) + qr2D(il, kl) + tair2D(il, kl) = tair2D(il, kl) - qr2D(il, kl) * r_LvCp + dqw2D(il, kl) = dqw2D(il, kl) - qr2D(il, kl) + qr2D(il, kl) = 0.0 + endif + + if(qi2D(il, kl) < eps9 .or. ccni2D(il, kl) < unun) then + qv2D(il, kl) = qv2D(il, kl) + qi2D(il, kl) + tair2D(il, kl) = tair2D(il, kl) - qi2D(il, kl) * r_LsCp + dqi2D(il, kl) = dqi2D(il, kl) - qi2D(il, kl) + qi2D(il, kl) = 0.0 + ccni2D(il, kl) = 0.0 + endif + + if(qs2D(il, kl) < eps9) then + qv2D(il, kl) = qv2D(il, kl) + qs2D(il, kl) + tair2D(il, kl) = tair2D(il, kl) - qs2D(il, kl) * r_LsCp + dqi2D(il, kl) = dqi2D(il, kl) - qs2D(il, kl) + qs2D(il, kl) = 0.0 + endif + enddo + enddo + else + do kl = mzhyd, klev + do il = 1, klon + signQw = sign(unun, eps9 - qw2D(il, kl)) + Qw0_OK = max(zero, signQw) * qw2D(il, kl) + qw2D(il, kl) = qw2D(il, kl) - Qw0_OK + dqw2D(il, kl) = dqw2D(il, kl) - Qw0_OK + qv2D(il, kl) = qv2D(il, kl) + Qw0_OK + tair2D(il, kl) = tair2D(il, kl) - Qw0_OK * r_LvCp + + signQr = sign(unun, eps9 - qr2D(il, kl)) + Qr0_OK = max(zero, signQr) * qr2D(il, kl) + qr2D(il, kl) = qr2D(il, kl) - Qr0_OK + dqw2D(il, kl) = dqw2D(il, kl) - Qr0_OK + qv2D(il, kl) = qv2D(il, kl) + Qr0_OK + tair2D(il, kl) = tair2D(il, kl) - Qr0_OK * r_LvCp + + signQi = sign(unun, eps9 - qi2D(il, kl)) + Qi0qOK = max(zero, signQi) + signCi = sign(unun, unun - ccni2D(il, kl)) + Ci0cOK = max(zero, signCi) + + Ci0_OK = max(Ci0cOK, Qi0qOK) + Qi0_OK = Ci0_OK * qi2D(il, kl) + + ccni2D(il, kl) = ccni2D(il, kl) * Ci0_OK + qi2D(il, kl) = qi2D(il, kl) - Qi0_OK + dqi2D(il, kl) = dqi2D(il, kl) - Qi0_OK + qv2D(il, kl) = qv2D(il, kl) + Qi0_OK + tair2D(il, kl) = tair2D(il, kl) - Qi0_OK * r_LsCp + + signQs = sign(unun, eps9 - qs2D(il, kl)) + Qs0_OK = max(zero, signQs) * qs2D(il, kl) + qs2D(il, kl) = qs2D(il, kl) - Qs0_OK + dqi2D(il, kl) = dqi2D(il, kl) - Qs0_OK + qv2D(il, kl) = qv2D(il, kl) + Qs0_OK + tair2D(il, kl) = tair2D(il, kl) - Qs0_OK * r_LsCp + enddo + enddo + endif + endif + + ! Update of dummy Variables + ! ========================= + + do kl = mzhyd, klev + do il = 1, klon + W2xyz1(il, kl) = tair2D(il, kl) - TfSnow + ! W2xyz2 : Ice Crystals Number (Fletcher, 1962) + W2xyz2(il, kl) = 1.e-2 * exp(-0.6 * W2xyz1(il, kl)) + + W2xyz3(il, kl) = qr2D(il, kl) + W2xyz4(il, kl) = qs2D(il, kl) +#if(qg) + W2xyz0(il, kl) = qg2D(il, kl) +#endif +#if(WH) + ! old values + if(il == ilmm) then + qwold(kl) = qw2D(il, kl) + qiold(kl) = qi2D(il, kl) + endif +#endif + enddo + enddo + + ! Saturation Specific Humidity + ! ============================ + + ! *********** + call qsat2D(tair2D, pst2D, tsrf2D, qvsi2D, qvsw2D) + ! *********** + + do kl = mzhyd, klev + do il = 1, klon + ! W2xyz5: Saturation Specific Humidity over Ice + W2xyz5(il, kl) = rhcrHY * qvsi2D(il, kl) + + W2xyz6(il, kl) = sqrt((pst2Dn(il) + ptopDY) & + / (rolv2D(il, kl) * RDryAi * tair2D(il, klev))) +#if(VW) + ! Cloud Droplets Fall Velocity + ! (Calcul de la Vitesse Terminale Moyenne) + ! ---------------------------- + if(qw2D(il, kl) >= eps9) then + ! ccnw2D: ASTEX case (Duynkerke et al. 1995, JAS 52, p.2763) + ccnw2D(il, kl) = 1.2d8 + qwclou = qw2D(il, kl) / max(cminHY, cfra2D(il, kl)) + dmed0 = 4.5 * sigmaw * sigmaw + dmedv = 12.5 * sigmaw * sigmaw + dmede = qwclou * rolv2D(il, kl) & + * 6.d0 / (pi * ccnw2D(il, kl) * exp(dmed0)) + dmed5 = exp(thir5 * log(dmede)) + ! dmed = exp(third*log(dmede)) + vw(il, kl) = 1.19d8 * pi * ccnw2D(il, kl) * dmed5 & + * exp(dmedv) / (24.0 * rolv2D(il, kl) * qwclou) + else + vw(il, kl) = 0.00 + endif +#endif + + ! Rain Fall Velocity + ! ------------------ + + ! W2xyz7(il,kl) : lambda_r : Marshall-Palmer Distribution Parameter + ! for Rain + ! Note that a simplification occurs + ! between the 1000. factor of rho, and rho_water=1000. + ! Reference : Emde and Kahlig (1989), Ann.Geoph. 7, p.407 (3) + W2xyz7(il, kl) = exp(0.25 * log((pi * cnor) & + / (rolv2D(il, kl) * max(eps9, qr2D(il, kl))))) + + if(qr2D(il, kl) > eps9) then + ! vr__OK = 1. if qr2D(il,kl) > eps9 + ! vr__OK = 0. otherwise + signVR = sign(unun, qr2D(il, kl) - eps9) + vr__OK = max(zero, signVR) + + ! vr : Terminal Fall Velocity for Rain + ! 392 = a Gamma[4+b] / 6 where a = 842. and b = 0.8 + vr(il, kl) = vr__OK * 392. * W2xyz6(il, kl) & + / exp(0.8 * log(W2xyz7(il, kl))) + else + vr(il, kl) = 0. + endif + + ! Snow Fall Velocity + ! ------------------ + + ! W2xyz8(il,kl) : lambda_s : Marshall-Palmer distribution parameter + ! for Snow Flakes + ! Note that a partial simplification occurs + ! between the 1000. factor of rho, and rho_snow=500. + ! Reference : Emde and Kahlig 1989, Ann.Geoph. 7, p.407 (3) + ! (rho_snow) Levkov et al. 1992, Cont.Atm.Phys. 65(1) p.37 (5) +#if(cn) + cnos = min(2.e8, cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + W2xyz8(il, kl) = exp(0.25 * log((0.50 * pi * cnos) & + / (rolv2D(il, kl) * max(eps9, qs2D(il, kl))))) + + if(qs2D(il, kl) > eps9) then + ! vs__OK = 1. if qs2D(il,kl) > eps9 + ! vs__OK = 0. otherwise + signVS = sign(unun, qs2D(il, kl) - eps9) + vs__OK = max(zero, signVS) + + ! vs: Terminal Fall Velocity for Snow Flakes + ! 2.19 = c Gamma[4+d] / 6 + ! where c = 4.836 = 0.86 *1000.**0.25 + ! and d = 0.25 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Graupellike Snow Flakes of Hexagonal Type) + vs(il, kl) = vs__OK * 2.19 * W2xyz6(il, kl) & + / exp(0.25 * log(W2xyz8(il, kl))) + ! old option #up + ! OR 2976. = c Gamma[4+d] / 6 + ! where c = 755.9 = 0.81 *1000.**0.99 and d = 0.99 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Unrimed Side Planes) + vs(il, kl) = vs__OK * 2976. * W2xyz6(il, kl) & + / exp(0.99 * log(W2xyz8(il, kl))) +#if(ur) + ! OR 2976. = c Gamma[4+d] / 6 + ! where c = 755.9 = 0.69 *1000.**0.41 and d = 0.41 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Aggregates of unrimed radiating assemblages) + vs(il, kl) = vs__OK * 20.06 * W2xyz6(il, kl) & + / exp(0.41 * log(W2xyz8(il, kl))) +#endif + else + vs(il, kl) = 0.0 + endif + +#if(qg) + ! Graupel Fall Velocity + ! --------------------- + if(qg2D(il, kl) >= eps9) then + ! Don't forget "#hy" option ! + ! W2xyz9(il,kl) : lambda_g : Marshall-Palmer distrib. parameter + ! for Graupel + ! Note that a simplification occurs + ! between the 1000. factor of rho, and rho_ice=1000. + W2xyz9(il, kl) = exp(0.250 * log((pi * cnog) & + / (rolv2D(il, kl) * max(eps9, qg2D(il, kl))))) + ! vh: Terminal Fall Velocity for Graupels + ! 25.1 = c Gamma[4+d] / 6 + ! where c = 4.836 = 1.10 *1000.**0.57 and d = 0.57 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Hexagonal Graupel) + vh(il, kl) = 25.1 * W2xyz6(il, kl) & + / exp(0.57 * log(W2xyz9(il, kl))) + else + vh(il, kl) = 0.0 + W2xyz9(il, kl) = 0.0 + endif +#endif + enddo + enddo + + ! =================================================================== + ! Microphysical Processes affecting non Precipitating Cloud Particles + ! =================================================================== + ! Homogeneous Nucleation by Cloud Dropplets Solidification ! BFREWI + ! Ref: Emde and Kahlig 1989, Ann.Geoph. 7, p.407 (11) ! Levkov (24) p.40 + ! --------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qHoNuc = 0. + qHeNuc = 0. + qwOK = 0. +#endif + if(W2xyz1(il, kl) < tsfo) then + ! qHoNuc = 1. if W2xyz1(il,kl) < tsfo + ! qHoNuc = 0. otherwise + signHN = -sign(unun, W2xyz1(il, kl) - tsfo) + qHoNuc = max(zero, signHN) +#if(EW) + if(qHoNuc > epsi) then ! ctr + mauxEW = mphy2D(il) + mauxEW(01:01) = 'i' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif + qwOK = qw2D(il, kl) * qHoNuc + qi2D(il, kl) = qi2D(il, kl) + qwOK + ccni2D(il, kl) = ccni2D(il, kl) + rolv2D(il, kl) * qwOK / typww + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * qwOK +#if(WQ) + write(6, *) 'Qihm1', qw2D(il, kl), & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl + if(il == ilmm) wihm1(kl) = qwOK +#endif + qw2D(il, kl) = qw2D(il, kl) - qwOK + + endif + + ! Heterogeneous Freezing of Cloud Droplets ! BNUFWI + ! Reference: Levkov et al., 1992 (21) p.40 ! Levkov (21) p.40 + ! ---------------------------------------- + + !!#qf #hy if(W2xyz1(il,kl) < 0.00) then + + !!#qf signHN = -sign(unun,W2xyz1(il,kl) - 0.) + ! qHeNuc = 1.0 if W2xyz1(il,kl) < 0.00dgC + ! = 0.0 otherwise + !!#qf qHeNuc = max(zero,signHN) + + !!#qf argexp = min(max(argmin,-W2xyz1(il,kl)),argmax) + !!#qf qHeNuc = qHeNuc*(exp(argexp) - 1. ) & + !!#qf * qw2D(il,kl) * 100.0 *typww + !!#qf qHeNuc = min(qHeNuc, qw2D(il,kl)) + + !!#qf qi2D(il,kl) = qi2D(il,kl) + qHeNuc + !!#qf ccni2D(il,kl) = ccni2D(il,kl) + rolv2D(il,kl)*qHeNuc/typww + !!#qf tair2D(il,kl) = tair2D(il,kl) + r_LcCp *qHeNuc + !!#qf qw2D(il,kl) = qw2D(il,kl) - qHeNuc +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Homo+Hetero Nucleation by Droplets ' + debugH(36:70) = 'Solidification (BFREWI+BNUFWI) ' + proc_1 = 'BFREWI ' + procv1 = qHoNuc + proc_2 = 'BNUFWI ' + procv2 = qHeNuc + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(01, kl) = qwOK + qHeNuc +#endif + !!#qf #hy end if + +#if(EW) + !=================================================================== + ! Homogeneous Sublimation ! XXXXXX + ! Ref: Emde and Kahlig 1989, Ann.Geoph. 7, p.407 (12) ! Levkov + ! --------------------------------------------------------- + if(qHoNuc > epsi) then ! ctr + mauxEW = mphy2D(il) + mauxEW(02:02) = 'I' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif +#if(hs) + ! 1.733e7=Ls*Ls*0.622/Cpa/Ra with Ls = 2833600 J/kg + dpv = (qv2D(il, kl) - W2xyz5(il, kl)) & + / (1.d0 + 1.733e7 * W2xyz5(il, kl) & + / (tair2D(il, kl) * tair2D(il, kl))) + dpv = qHoNuc * max(zero, dpv) + dqv = dpv + qi2D(il, kl) = qi2D(il, kl) + dqv + dqi2D(il, kl) = dqi2D(il, kl) + dqv + ! ccni2D(il,kl) : NO VARIATION + qv2D(il, kl) = qv2D(il, kl) - dqv + tair2D(il, kl) = tair2D(il, kl) + r_LsCp * dqv +#endif +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'Qihm2', dqv, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wihm2(kl) = dqv +#endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Emde and Kahlig: Homogeneous Sublim' + debugH(36:70) = 'ation ' + proc_1 = 'dQv g/kg' + procv1 = dqv + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = 'CCNI/1.e15' + procv4 = ccni2D(il, kl) * 1.e-18 + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(01, kl) = dqv + debugV(01, kl) +#endif + enddo + enddo + + !=========================================================================== + ! Nucleation I: Deposition & Condensation-Freezing Nucleat. + ! Source : Water Vapor ! BNUCVI + ! Reference: Meyers et al., 1992, JAM 31, (2.4) p.712 ! Levkov (20) p.40 + ! ----------------------------------------------------------- + if(Meyers) then + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qHeNuc = 0. + qicnd1 = 0. + dqi1 = 0. + dqi2 = 0. + dqi3 = 0. +#endif + if(W2xyz1(il, kl) < TM_Nid) then + ! qHeNu1 = 1.0 if W2xyz1(il,kl) < TM_Nid + ! qHeNu1 = 0.0 otherwise + signHN = -sign(unun, W2xyz1(il, kl) - TM_Nid) + qHeNu1 = max(zero, signHN) + + ! Sursaturation + dqv = qv2D(il, kl) - W2xyz5(il, kl) + dqv = max(zero, dqv) + + if(dqv > 0.) then + ! qHeNu3 = 1.0 if qv2D(il,kl) > W2xyz5(il,kl) + ! qHeNu3 = 0.0 otherwise + signHN = sign(unun, dqv) + qHeNu3 = max(zero, signHN) + + qHeNuc = qHeNu1 * qHeNu3 + + ! Sursaturation relative to ice + ! Meyers et al. (1992) JAM, 2.4 + qicnd1 = 1.0e2 * dqv / W2xyz5(il, kl) + qicnd1 = min(qicnd1, SSImax) + qicnd1 = 1.0e3 * exp(aM_Nid + bM_Nid * qicnd1) + qicnd1 = max(qicnd1 - ccni2D(il, kl), zero) * qHeNuc + ccni2D(il, kl) = ccni2D(il, kl) + qicnd1 + ! 1.e-15 = 0.001 * Initial Ice Crystal Mass + dqi = 1.0e-15 * qicnd1 / rolv2D(il, kl) + dqi = min(dqi, dqv) + qi2D(il, kl) = qi2D(il, kl) + dqi + dqi2D(il, kl) = dqi2D(il, kl) + dqi + qv2D(il, kl) = qv2D(il, kl) - dqi + tair2D(il, kl) = tair2D(il, kl) + dqi * r_LsCp + dqi1 = dqi + + endif + endif + + ! Nucleation I: Contact -Freezing Nucleat. + ! Source : Cloud Dropplets ! BSPRWI + ! Ref: Meyers et al. (1992), JAM 31, 2.6 p.713 ! Levkov (20) p.40 + ! ----------------------------------------------------------- +#if(wH) + qicnd1 = 0. + qicnd2 = 0. + dqi = 0. +#endif + if(qw2D(il, kl) > 0.) then + ! qHeNu3 = 1.0 if qw2D(il,kl) > 0. + ! qHeNu3 = 0.0 otherwise + signHN = sign(unun, qw2D(il, kl)) + qHeNu3 = max(zero, signHN) + + if(W2xyz1(il, kl) < TM_Nic) then + ! qHeNu2 = 1.0 if W2xyz1(il,kl) < TM_Nic + ! qHeNu2 = 0.0 otherwise + signHN = -sign(unun, W2xyz1(il, kl) - TM_Nic) + qHeNu2 = max(zero, signHN) + + qHeNuc = qHeNu1 * qHeNu3 + + ! Contact-Freez Potent.Nuclei + ! Meyers et al. (1992) JAM, 2.6 + qicnd1 = 1.e3 * qHeNuc & + * exp(aM_Nic - bM_Nic * W2xyz1(il, kl)) + rad_ww = (1.e3 * rolv2D(il, kl) & + * qw2D(il, kl) * .2e-11)**0.33 + ! .2 e-11 = 1. / (1.2e+8 * 1.e3 * 4.19) + ! ccnw2D (ASTEX) ro_w 4 pi /3 + ! Levkov et al. 1992 CAM, (23) + qicnd2 = 603.2e+3 * qicnd1 * rad_ww & + * rolv2D(il, kl) + ! 603.2e3 = 4.0e-7 * 4 pi * 1.2e+8 * 1.e3 + ! DFar ccnw2D fact(rolv) + ccni2D(il, kl) = ccni2D(il, kl) + qicnd2 + dqi = 1.e-15 * qicnd2 / rolv2D(il, kl) + ! 1.e-15 = 1.0e-3 * Ice Crystal Mass + dqi = min(qw2D(il, kl), dqi) + ! XF 09/07/2019,too much qi vs qw + if(dqi > 0) dqi = dqi / 2. + qi2D(il, kl) = qi2D(il, kl) + dqi + qw2D(il, kl) = qw2D(il, kl) - dqi + tair2D(il, kl) = tair2D(il, kl) + dqi * r_LcCp + dqi2 = dqi + endif + endif +#if(HM) + ! Nucleation II: Hallett-Mossop Ice-Multiplication Proc. ! BSPRWI + ! Reference: Levkov et al., 1992, Contr.Atm.Ph.65,(25) p.40 ! Levkov (25) p.40 + ! ----------------------------------------------------------- + if(W2xyz1(il, kl) < TmxNhm .and. & + W2xyz1(il, kl) > TmnNhm .and. & + wair2D(il, kl) > w_svrl) then + ! qHeNu1 = 1.0 if W2xyz1(il,kl) < TmxNhm + ! qHeNu1 = 0.0 otherwise + signHN = -sign(unun, W2xyz1(il, kl) - TmxNhm) + qHeNu1 = max(zero, signHN) + ! qHeNu2 = 1.0 if W2xyz1(il,kl) > TmnNhm + ! qHeNu2 = 0.0 otherwise + signHN = sign(unun, W2xyz1(il, kl) - TmnNhm) + qHeNu2 = max(zero, signHN) + ! qHeNu3 = 1.0 if wair2D(il,kl) > w_svrl + ! qHeNu3 = 0.0 otherwise + signHN = sign(unun, wair2D(il, kl) - w_svrl) + qHeNu3 = max(zero, signHN) +#if(cn) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + SplinJ = 1.358e12 * qw2D(il, kl) * cnos / & + (W2xyz8(il, kl)**.33) + ! 1.358e12=pi *Gamma(3.5) *g *ro_s /(3 *Cd *4.19e-12) + ! [=3.14 *3.3233625 *9.81*0.1 /(3 *0.6 *4.19e-12)] + SplinP = 0.003 * (1. - 0.05 * SplinJ) * qHeNu1 * qHeNu2 & + * qHeNu3 + SplinP = max(zero, SplinP) + dqi = 1.e-15 * SplinP / & + rolv2D(il, kl) + ! 1.e-15 = 1.0e-3 * Ice Crystal Mass + SplinP = (min(1.0, qs2D(il, kl) / max(dqi, eps9))) * SplinP + ccni2D(il, kl) = ccni2D(il, kl) + SplinP + dqi = min(qs2D(il, kl), dqi) + qi2D(il, kl) = qi2D(il, kl) + dqi + dqi2D(il, kl) = dqi2D(il, kl) + dqi + qs2D(il, kl) = qs2D(il, kl) - dqi + dqi3 = dqi + endif +#endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Meyers: Nucl. I, Depot & Cond-Freez' + debugH(36:70) = 'Nucl. / Freez / Nucl. II / Bergeron' + proc_1 = 'dQi1 Meyer' + procv1 = dqi1 + proc_2 = 'dQi2 Meyer' + procv2 = dqi2 + proc_3 = 'dQi Ha-Mos' + procv3 = dqi3 + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(02, kl) = dqi1 + dqi2 + dqi3 +#endif + enddo + enddo + !======================================================================= + else + + !======================================================================= + ! Ice Crystals Nucleation Process between 0.C and -35.C + ! (each crystal has a mass equal or less than 10d-12 kg) + ! Reference: Emde and Kahlig 1989, Ann.Geoph. 7, p.408 (13) + ! --------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qicnd1 = 0. + qicnd2 = 0. + qicnd = 0. +#endif + if(W2xyz1(il, kl) > tsfo) then + + ! qHeNu1 = 1.0 if W2xyz1(il,kl) > tsfo + ! qHeNu1 = 0.0 otherwise + signHN = sign(unun, W2xyz1(il, kl) - tsfo) + qHeNu1 = max(zero, signHN) + + if(W2xyz1(il, kl) < 0.) then + + ! qHeNu2 = 1.0 if W2xyz1(il,kl) < 0. + ! qHeNu2 = 0.0 otherwise + signHN = -sign(unun, W2xyz1(il, kl)) + qHeNu2 = max(zero, signHN) + + if(qv2D(il, kl) > W2xyz5(il, kl)) then + + ! qHeNu3 = 1.0 if qv2D(il,kl) > W2xyz5(il,kl) + ! qHeNu3 = 0.0 otherwise + signHN = sign(unun, qv2D(il, kl) - W2xyz5(il, kl)) + qHeNu3 = max(zero, signHN) + + qHeNuc = qHeNu1 * qHeNu2 * qHeNu3 +#if(EW) + if(qHeNuc > epsi) then ! ctr + mauxEW = mphy2D(il) + mauxEW(03:03) = 'I' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif + ! qicnd1 : amount of nucleated ice crystals + ! (first condition) + qicnd1 = qHeNuc * 1.e-15 * W2xyz2(il, kl) / & + rolv2D(il, kl) + + qisign = sign(unun, qicnd1 - qi2D(il, kl)) + qi1_OK = max(zero, qisign) + qicnd1 = qicnd1 * qi1_OK + + ! qicnd2 : amount of nucleated ice crystals + ! (second condition) + qicnd2 = (qv2D(il, kl) - W2xyz5(il, kl)) / & + (1.d0 + 1.733d7 * W2xyz5(il, kl) / & + (tair2D(il, kl) * tair2D(il, kl))) + qicnd2 = qHeNuc * max(zero, qicnd2) + + qicnd = min(qicnd1, qicnd2) + + qi2D(il, kl) = qi2D(il, kl) + qicnd + dqi2D(il, kl) = dqi2D(il, kl) + qicnd + ccni2D(il, kl) = ccni2D(il, kl) + rolv2D(il, kl) * & + qicnd * 1.e15 + qv2D(il, kl) = qv2D(il, kl) - qicnd + tair2D(il, kl) = tair2D(il, kl) + r_LsCp * qicnd +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QiCnd', qicnd, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wicnd(kl) = qicnd +#endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Emde and Kahlig: Ice Crystals Nucle' + debugH(36:70) = 'ation Process between 0.C and -35.C' + proc_1 = 'Qicnd1 ' + procv1 = qicnd1 + proc_2 = 'Qicnd2 ' + procv2 = qicnd2 + proc_3 = 'Qicnd g/kg' + procv3 = qicnd + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(02, kl) = qicnd +#endif + endif + endif + endif + enddo + enddo + endif + + !=========================================================================== + ! Bergeron Process (water vapor diffusion-deposition on ice crystals) + ! Reference: Koenig 1971, J.A.S. 28, p.235 + ! Emde and Kahlig 1989, Ann.Geoph. 7, p.408 (14) + ! --------------------------------------------------------- + + if(.not. LevkovAUTX) then + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qBerge = 0. + qidep = 0. + qicnd = 0. +#endif + if(qi2D(il, kl) > eps9 .and. W2xyz1(il, kl) < 0.) then + + ! qBerge = 1.0 if qi2D(il,kl) > eps9 + ! qBerge = 0.0 otherwise + signHN = sign(unun, qi2D(il, kl) - eps9) + qBerge = max(zero, signHN) + + ! qHeNuc = 1.0 if W2xyz1(il,kl) < 0. + ! qHeNuc = 0.0 otherwise + signHN = -sign(unun, W2xyz1(il, kl)) + qHeNuc = max(zero, signHN) + + qBerge = qHeNuc * qBerge +#if(EW) + if(qBerge > epsi) then ! ctr + mauxEW = mphy2D(il) + mauxEW(04:04) = 'i' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif + itc = abs(W2xyz1(il, kl) - unun) + itc = min(itc, 31) + itc = max(itc, 1) + a1 = aa1(itc) + a2 = aa2(itc) + + ! amf : analytical integration of + ! (14) p.408 Emde and Kahlig 1989, Ann.Geoph. 7 + am0 = 1.d+3 * rolv2D(il, kl) * qi2D(il, kl) / W2xyz2(il, kl) + amf = (a1 * (1.0 - a2) * xt + am0**(1.0 - a2))**(1.0 / (1.0 - a2)) + qidep = (1.d-3 * W2xyz2(il, kl) / rolv2D(il, kl)) * (amf - am0) + qidep = max(zero, qidep) + + ! qicnd : to avoid the use of qw2D < 0. + qicnd = max(zero, qw2D(il, kl)) + + qidep = qBerge * min(qicnd, qidep) + + ! XF 09/07/2019,too much qi vs qw + if(qidep > 0) qidep = qidep / 2. + + ! ccni2D(il,kl): NO VARIATION + qi2D(il, kl) = qi2D(il, kl) + qidep + + qw2D(il, kl) = qw2D(il, kl) - qidep + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * qidep +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QiDep', qidep, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) widep(kl) = qidep +#endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Bergeron Process (water vapor diffu' + debugH(36:70) = 'sion-deposition on ice crystals) ' + proc_1 = 'qBerge ICE' + procv1 = qBerge + proc_2 = 'Qicnd g/kg' + procv2 = qicnd + proc_3 = 'Qidep g/kg' + procv3 = qidep + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(02, kl) = qidep + debugV(02, kl) +#endif + endif + enddo + enddo + endif + + !=========================================================================== + + ! Ice Crystals Sublimation ! BDEPVI + ! Reference: Emde and Kahlig, 1989 p.408 (15) ! Levkov (27) p.40 + ! ------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qisub = 0. +#endif + if(W2xyz5(il, kl) > qv2D(il, kl)) then + qvdfci = W2xyz5(il, kl) - qv2D(il, kl) + ! qSubl1 = 1.0 if W2xyz5(il,kl) > qv2D(il,kl) + ! = 0.0 otherwise + !!#pp signHN = sign(unun,qvdfci) + !!#pp qSubl1 = max(zero,signHN) + if(qi2D(il, kl) > eps9) then + ! qSubl2 = 1.0 if qi2D(il,kl) > eps9 + ! qSubl2 = 0.0 otherwise + signHN = sign(unun, qi2D(il, kl) - eps9) + qSubl2 = max(zero, signHN) + + qSubli = qSubl2 + !!#pp qSubli = qSubli * qSubl1 +#if(EW) + if(qSubli > epsi) then ! ctr + mauxEW = mphy2D(il) + mauxEW(05:05) = 'V' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif + demde = 1.1d+4 + sat = qv2D(il, kl) / W2xyz5(il, kl) + ab1 = 6.959d+11 / (tair2D(il, kl) * tair2D(il, kl)) + ! 6.959e+11 + != [Ls=2833600J/kg] * Ls / [kT=0.025W/m/K] / [Rv=461.J/kg/K] + ! kT: Air thermal Conductivity + ab2 = 1.d0 / (1.875d-2 * rolv2D(il, kl) * W2xyz5(il, kl)) + ! 1.875d-5: Water Vapor Diffusivity in Air !cCA WARNING + pisub = (1 - sat) * 4.d0 * demde * W2xyz2(il, kl) / (ab1 + ab2) + qisub = pisub * xt + ! H2O deposition limit = H2O content + qisub = max(qisub, -qv2D(il, kl)) + ! qi sublimation limit = qi content + qisub = min(qisub, qi2D(il, kl)) + ! qi sublimation limit = Saturation + qisub = min(qisub, qvdfci) * qSubli + + qi2D(il, kl) = qi2D(il, kl) - qisub + dqi2D(il, kl) = dqi2D(il, kl) - qisub + qv2D(il, kl) = qv2D(il, kl) + qisub + tair2D(il, kl) = tair2D(il, kl) - r_LsCp * qisub + +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QiSub', qisub, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wisub(kl) = qisub +#endif + + endif + endif +#if(wH) + ! +--Debug + ! + ~~~~~ + debugH(1:35) = 'Emde and Kahlig: Ice Crystals Subli' + debugH(36:70) = 'mation ' + proc_1 = 'Qisub g/kg' + procv1 = qisub + proc_2 = 'R.Hum I[%]' + procv2 = 0.1 * sat + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(03, kl) = -qisub +#endif + enddo + enddo + + do kl = mzhyd, klev + do il = 1, klon + if(qi2D(il, kl) <= 0.) then + qi2D(il, kl) = 0. + ccni2D(il, kl) = 0. + endif + enddo + enddo + + !=========================================================================== + + ! Ice Crystals Instantaneous Melting + ! ---------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qimlt = 0. + cimlt = 0. +#endif + if(W2xyz1(il, kl) > 0.) then + + ! qMelt1 = 1.0 if W2xyz1(il,kl) > 0. + ! qMelt1 = 0.0 otherwise + signHN = sign(unun, W2xyz1(il, kl)) + qMelt1 = max(zero, signHN) + + if(qi2D(il, kl) > eps9) then + + ! qMelt2 = 1.0 if qi2D(il,kl) > eps9 + ! qMelt2 = 0.0 otherwise + signHN = sign(unun, qi2D(il, kl) - eps9) + qMelt2 = max(zero, signHN) + + qMelt = qMelt1 * qMelt2 +#if(EW) + ! ctr + if(qMelt > epsi) then + mauxEW = mphy2D(il) + mauxEW(06:06) = 'w' + mphy2D(il) = mauxEW + endif +#endif + qxmlt = W2xyz1(il, kl) / r_LcCp + qimlt = min(qi2D(il, kl), qxmlt) * qMelt + cimlt = ccni2D(il, kl) * qimlt / max(qi2D(il, kl), eps9) + qi2D(il, kl) = qi2D(il, kl) - qimlt + ccni2D(il, kl) = ccni2D(il, kl) - cimlt + qw2D(il, kl) = qw2D(il, kl) + qimlt + tair2D(il, kl) = tair2D(il, kl) - r_LcCp * qimlt +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QiMlt', qimlt, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wimlt(kl) = qimlt +#endif + + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Emde and Kahlig: Ice Crystals Insta' + debugH(36:70) = 'ntaneous Melting ' + proc_1 = 'Qimlt g/kg' + procv1 = qimlt + proc_2 = 'cimlt /e15' + procv2 = cimlt * 1.e-18 + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(04, kl) = -qimlt +#endif + enddo + enddo + + !================================================================ + ! Water Vapor Condensation / Evaporation (Fractional Cloudiness) + ! Reference: Laurent Delobbe Thesis (Ek&Mahrt91) + ! -------------------------------------------------------------- + + ! Zeroing needed since cfra2D build from a maximization process + do kl = mzhyd, klev + do il = 1, klon + ! cfra2D: Cloud Fraction + cfra2D(il, kl) = 0.0 + enddo + enddo + + if(fracld .and. fracSC) then + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + dqw = 0. +#endif + if(W2xyz1(il, kl) >= tsfo) then +#if(EW) + if(W2xyz1(il, kl) >= tsfo) then ! ctr + mauxEW = mphy2D(il) + mauxEW(07:07) = 'W' + mphy2D(il) = mauxEW + ENDif ! ctr +#endif + ! qHeNu1 = 1.0 if W2xyz1(il,kl) > tsfo + ! qHeNu1 = 0.0 otherwise + signHN = sign(unun, W2xyz1(il, kl) - tsfo) + qHeNu1 = max(zero, signHN) + + ! qt : Total Water Mixing Ratio + qt = qv2D(il, kl) + qw2D(il, kl) + + ! tl : Liquid Temperature + tl = tair2D(il, kl) - r_LvCp * qw2D(il, kl) + + ! Saturation specific humidity over water, + ! corresponding to liquid temperature + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Dudhia (1989) JAS, (B1) and (B2) p.3103 + ! See also Pielke (1984), p.234 and Stull (1988), p.276 + pa_hPa = (pst2Dn(il) * sigma(kl) + ptopDY) * 10.d0 + es_hPa = 6.1078d0 * exp(ExpWat * log(WatIce / tl)) & + * exp(ExpWa2 * (unun / WatIce - unun / tl)) + + ! Saturation Vapor Specific Concentration over Water + ! (even for temperatures less than freezing point) + qsl = .622d0 * es_hPa / (pa_hPa - .378d0 * es_hPa) + + ! Partial Condensation/Scheme + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dqt = qv2D(il, MIN(kl + 1, klev)) - qv2D(il, kl) & + + qw2D(il, MIN(kl + 1, klev)) - qw2D(il, kl) + wqt = TUkv2D(il, kl) * dqt & + / (gplv2D(il, kl + 1) - gplv2D(il, kl)) * gravit + + ! ww : Vertical Velocity Variance + ww = 0.66d0 * ect_2D(il, kl) + + ! sig2rh : Relative Humidity Variance + ! (Ek and Mahrt, 1991, An. Geoph., 9, 716--724) + coefC2 = wqt / (sqrt(ww) * qsl) + sig2rh = C1_EkM + C2_EkM * coefC2 * coefC2 + + ! sigqt : Total Water Variance + sigqt = sqrt(sig2rh) * qsl + + argerf = (qt - qsl) / (1.414d0 * sigqt) + err = erf(argerf) + + ! cfra2D: Cloud Fraction + cfra2D(il, kl) = 0.5d0 * (1.d0 + err) + + alpha = 1.d0 / (1.d0 + 1.349d7 * qsl / (tl * tl)) + t1 = sigqt / sqrt(pi + pi) * exp(-min(argerf * argerf & + , argmax)) + t2 = cfra2D(il, kl) * (qt - qsl) + + ! cfraOK = 1.0 if cfra2D(il,kl) > cminHY + ! cfraOK = 0.0 otherwise + signFR = sign(unun, cfra2D(il, kl) - cminHY) + cfraOK = max(zero, signFR) + + ! qw_new : Mesh Averaged Liquid Water Mixing Ratio + cfra2D(il, kl) = cfra2D(il, kl) * cfraOK * qHeNu1 + qw_new = alpha * (t1 + t2) * cfraOK + + dqw = qw_new - qw2D(il, kl) + + ! Vectorisation of the Atmospheric Water Update + ! ~~~+-------------------------------------------+ + ! | if (dqw > 0.) then | + ! | dqw = min(qv2D(il,kl), dqw) | + ! | else | + ! | dqw =-min(qw2D(il,kl),-dqw) | + ! | end if | + ! +-------------------------------------------+ + + signdq = sign(unun, dqw) + fac_qv = max(zero, signdq) + updatw = fac_qv * qv2D(il, kl) & + + (1.d0 - fac_qv) * qw2D(il, kl) +#if(kk) + ! SCu Limitor + SCuLim = exp(min(0., 300. - tair2D(il, kl))) +#endif + dqw = signdq * min(updatw, signdq * dqw) & + * qHeNu1 +#if(kk) + ! SCu Limitor + dqw = dqw * SCuLim + cfra2D(il, kl) = cfra2D(il, kl) * SCuLim +#endif + ! Update of qv2D, qw2D and tair2D + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + qw2D(il, kl) = qw2D(il, kl) + dqw + dqw2D(il, kl) = dqw2D(il, kl) + dqw + qv2D(il, kl) = qv2D(il, kl) - dqw + tair2D(il, kl) = tair2D(il, kl) + r_LvCp * dqw +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QwEvp', dqw, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wwevp(kl) = dqw +#endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Delobbe: Condensation ' + debugH(36:70) = ' ' + proc_1 = 'dQw g/kg' + procv1 = dqw + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(05, kl) = dqw +#endif + enddo + enddo + else + !=========================================================== + ! Water Vapor Condensation / Evaporation + ! Reference: Emde and Kahlig 1989, Ann.Geoph. 7, p.407 (7) + ! -------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + dqw = 0. +#endif + if(W2xyz1(il, kl) >= tsfo) then +#if(EW) + ! ctr + if(W2xyz1(il, kl) > tsfo) then + mauxEW = mphy2D(il) + mauxEW(07:07) = 'W' + mphy2D(il) = mauxEW + endif +#endif + ! qHeNu1 = 1.0 if W2xyz1(il,kl) > tsfo + ! qHeNu1 = 0.0 otherwise + signHN = sign(unun, W2xyz1(il, kl) - tsfo) + qHeNu1 = max(zero, signHN) + + dpw = (qv2D(il, kl) - qvsw2D(il, kl) * rhcrHY) / & + (1.d0 + 1.349d7 * qvsw2D(il, kl) / & + (tair2D(il, kl) * tair2D(il, kl))) + ! 1.349e7=Lv*Lv*0.622/Cpa/Ra with Lv = 2500000 J/kg + + dqw = dpw + + ! Vectorisation of the Atmospheric Water Update + ! ~~+-------------------------------------------+ + ! | if (dqw > 0.) then | + ! | dqw = min(qv2D(il,kl), dqw) | + ! | else | + ! | dqw =-min(qw2D(il,kl),-dqw) | + ! | end if | + ! +-------------------------------------------+ + + signdq = sign(unun, dqw) + fac_qv = max(zero, signdq) + updatw = fac_qv * qv2D(il, kl) & + + (1.d0 - fac_qv) * qw2D(il, kl) + dqw = signdq * min(updatw, signdq * dqw) & + * qHeNu1 + + ! Update of qv2D, qw2D and tair2D + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + qw2D(il, kl) = qw2D(il, kl) + dqw + dqw2D(il, kl) = dqw2D(il, kl) + dqw + qv2D(il, kl) = qv2D(il, kl) - dqw + tair2D(il, kl) = tair2D(il, kl) + r_LvCp * dqw + ! [Ls=2500000J/kg]/[Cp=1004J/kg/K]=2490.04 +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'QwEvp', dqw, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wwevp(kl) = dqw +#endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Emde and Kahlig: Water Vapor Conden' + debugH(36:70) = 'sation / Evaporation ' + proc_1 = 'dQw g/kg' + procv1 = dqw + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(05, kl) = dqw +#endif + enddo + enddo + endif + + !=========================================================================== + + ! Fractional Cloudiness ! Guess may be computed (Ek&Mahrt91 fracSC=.T.) + ! ====================== ! Final value computed below + + !!#sc if (fracld .and..not. fracSC) then + if(fracld) then + if(fraCEP) then + ! ECMWF Large Scale Cloudiness + ! ---------------------------- + do kl = mzhyd, klev + do il = 1, klon + cfra2D(il, kl) = & + (qi2D(il, kl) + qw2D(il, kl) + qs2D(il, kl) * 0.33 & + * (1. - min(1., exp((tair2D(il, kl) - 258.15) * 0.1)))) & + / (0.02 * qvsw2D(il, kl)) + cfra2D(il, kl) = min(1.000, cfra2D(il, kl)) + cfra2D(il, kl) = max(0.001, cfra2D(il, kl)) & + * max(0., sign(1., & + qi2D(il, kl) + qw2D(il, kl) + qs2D(il, kl) - 3.E-9)) + enddo + enddo + else + ! XU and Randall 1996, JAS 21, p.3099 (4) + ! ---------------------------- + do kl = mzhyd, klev + do il = 1, klon + qvs_wi = qvsw2D(il, kl) +#if(wi) + qvs_wi = max(eps9, ((qi2D(il, kl) + qs2D(il, kl)) * qvsi2D(il, kl) & + + qw2D(il, kl) * qvsw2D(il, kl)) / & + max(eps9, qi2D(il, kl) + qs2D(il, kl) + qw2D(il, kl))) +#endif + relhum = min(relCri, max(qv2D(il, kl), qv_MIN) / qvs_wi) + argexp = ((relCri - relhum) * qvs_wi)**0.49 + argexp = min(100. * & + (qi2D(il, kl) + qw2D(il, kl) + qs2D(il, kl) * 0.33 & + * (1. - min(1., exp((tair2D(il, kl) - 258.15) * 0.1)))) & + / max(eps9, argexp), argmax) + + cfra2D(il, kl) = (relhum**0.25) * (1. - exp(-argexp)) + enddo + enddo + endif + + else + !!#sc else if (.not.fracld) then + !!#sc if (fracSC) stop 'fracSC set up when fracld NOT' + do kl = mzhyd, klev + do il = 1, klon + qcloud = qi2D(il, kl) + qw2D(il, kl) + if(qcloud > eps9) then + + ! cfra2D(il,kl) = 1.0 if qcloud > eps9 + ! cfra2D(il,kl) = 0.0 otherwise + signQW = sign(unun, qcloud - eps9) + cfra2D(il, kl) = max(zero, signQW) + + endif + enddo + enddo + + endif + +#if(wH) + ! Debug + ! ~~~~~ + do kl = mzhyd, klev + do il = 1, klon + debugH(1:35) = 'Fractional Cloudiness (XU .OR. CEP)' + debugH(36:70) = ' ' + proc_1 = ' ' + procv1 = 0. + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + enddo + enddo +#endif + + !=========================================================================== + + ! Autoconversion Processes (i.e., generation of precipitating particles) + ! ====================================================================== + + ! Cloud Droplets Autoconversion + ! Reference: Lin et al. (1983), JCAM 22, p.1076 (50) + ! -------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qraut = 0.0 +#endif + if(qw2D(il, kl) > eps9) then + + ! AutoOK = 1.0 if qw2D(il,kl) > eps9 + ! AutoOK = 0.0 otherwise + signAU = sign(unun, qw2D(il, kl) - eps9) + AutoOK = max(zero, signAU) + + if(cfra2D(il, kl) > cminHY) then + + ! ClouOK = 1.0 if cfra2D(il,kl) > cminHY + ! ClouOK = 0.0 otherwise + signFC = sign(unun, cfra2D(il, kl) - cminHY) + ClouOK = max(zero, signFC) + + AutoOK = AutoOK * ClouOK +#if(EW) + ! ctr + if(AutoOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(08:08) = 'r' + mphy2D(il) = mauxEW + endif +#endif + ! Sundqvist (1988, Schlesinger, Reidel, p.433) + ! Autoconversion Scheme + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dqw = AutoOK * qw2D(il, kl) / & + qw00 / max(cminHY, cfra2D(il, kl)) + praut = AutoOK * qw2D(il, kl) * csud * & + (1. - exp(-min(dqw * dqw, argmax))) & + / max(cminHY, cfra2D(il, kl)) +#if(LO) + ! Liou and Ou (1989, JGR 94, p. 8599) Autoconversion Scheme + ! Boucher et al. (1995, JGR 100, p.16395) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! ASTEX (Duynkerke&al.1995, JAS 52, p.2763) + ! (polluted air, Rogers&Yau 89, p.90) + ccnw2D(il, kl) = 1.2e+8 + ccnw2D(il, kl) = 1.e+11 + qwclou = qw2D(il, kl) / cfra2D(il, kl) + dmed0 = 4.5d0 * sigmaw * sigmaw + dmede = qwclou * rolv2D(il, kl) & + * 6.d0 / pi / ccnw2D(il, kl) / exp(dmed0) + dmed = exp(third * log(dmede)) + dmed2 = dmed * dmed + dw0 = 8.d0 * sigmaw * sigmaw + dw4 = exp(dw0) * dmed2 * dmed2 + rwbar = 0.5d0 * sqrt(sqrt(dw4)) + ! heavi : Heaviside Function + signHV = sign(unun, rwbar - rcrilo) + heavi = max(zero, signHV) + praut = AutoOK * cfra2D(il, kl) * heavi * 4.09d6 * pi & + * ccnw2D(il, kl) * dw4 * qwclou +#endif +#if(LI) + ! Lin et al.(1983) Autoconversion Scheme + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dqw = AutoOK * (qw2D(il, kl) - qw00) + praut = dqw * dqw * dqw / & + (cc1 * dqw + 1000.d0 * cc2 / dd0) +#endif + qraut = praut * xt + if(qraut > 0) qraut = qraut * min(0.9, (1. - cloud_magic)) + qraut = min(qraut, qw2D(il, kl)) + qw2D(il, kl) = qw2D(il, kl) - qraut + qr2D(il, kl) = qr2D(il, kl) + qraut + +#if(WQ) + write(6, *) 'QrAut', qraut, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wraut(kl) = qraut +#endif + + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983) Autoconversion Sch' + debugH(36:70) = 'eme ' + proc_1 = 'Qraut g/kg' + procv1 = qraut + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(06, kl) = qraut +#endif + enddo + enddo + + ! Conversion from Cloud Ice Crystals to Snow Flakes + ! Reference: Levkov et al. 1992, Contr.Atm.Phys. 65, p.41 + ! --------------------------------------------------------- + + if(LevkovAUTO) then + + ! Depositional Growth: Ice Crystals => Snow Flakes (BDEPIS) + ! Reference: Levkov et al. 1992, Contr.Atm.Phys. 65, p.41 (28) + ! -------------------------------------------------------------- + + if(LevkovAUTX) then + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsaut = 0.0 +#endif + if(qi2D(il, kl) > eps9) then + + ! AutoOK = 1.0 if qi2D(il,kl) > eps9 + ! AutoOK = 0.0 otherwise + signAU = sign(unun, qi2D(il, kl) - eps9) + AutoOK = max(zero, signAU) + + if(ccni2D(il, kl) > 1.) then + + ! ClouOK = 1.0 if ccni2D(il,kl) > 1. + ! ClouOK = 0.0 otherwise + signCC = sign(unun, ccni2D(il, kl) - 1.) + ClouOK = max(zero, signCC) + + AutoOK = AutoOK * ClouOK + qiOK = AutoOK * qi2D(il, kl) + + ! Pristine Ice Crystals Diameter + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! qid : Pristine Ice Crystals Diameter + ! Levkov et al. 1992, + ! Contr. Atm. Phys. 65, (5) p.37 + ! where 6/(pi*ro_I)**1/3 ~ 0.156 + qid = 0.156 * exp(third * log(thous * rolv2D(il, kl) & + * max(eps9, qi2D(il, kl)) & + / max(unun, ccni2D(il, kl)))) + + ! Deposition Time Scale + ! ~~~~~~~~~~~~~~~~~~~~~ + sat = max(epsq, qv2D(il, kl)) / W2xyz5(il, kl) + ! 0.702e12 ~ 0.702e12 = (2.8345e+6)**2/0.0248/461.5 + ! Ls_H2O **2/Ka /Rw + ! Dv = 2.36e-2 = 2.36e-5 * 10.**3 +#if(a1) + a1saut = max(eps9, sat - 1.) / & + (0.702e12 / (tair2D(il, kl) * tair2D(il, kl)) & + + 1. / (2.36e-2 * rolv2D(il, kl) * qv2D(il, kl) * sat)) +#endif + ! Dv = 2.36e-2 = 2.36e-5 * 10.**3 + xtsaut = 0.125 * (qsd0 * qsd0 - qid * qid) & + * (0.702e12 / (tair2D(il, kl) * tair2D(il, kl)) & + + 1.0 / (2.36e-2 * rolv2D(il, kl) & + * max(epsq, qv2D(il, kl)) * sat)) + + ! Deposition + ! ~~~~~~~~~~ + qsaut = xt * qiOK * (sat - 1.) / xtsaut + qsaut = (1. - cloud_magic) * qsaut + qsaut = min(qi2D(il, kl), qsaut) + qsaut = max(-qs2D(il, kl), qsaut) + + if(.not.isnan(qsaut)) then + qi2D(il, kl) = qi2D(il, kl) - qsaut + qs2D(il, kl) = qs2D(il, kl) + qsaut + endif + + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983) Depositional Growt' + debugH(36:70) = 'h ' + proc_1 = 'Qsaut g/kg' + procv1 = qsaut + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(07, kl) = qsaut +#endif + enddo + enddo + endif + + ! Ice Crystals Aggregation => Snow Flakes (BAGRIS) + ! Reference: Levkov et al. 1992, Contr.Atm.Phys. 65, p.41 (31) + ! -------------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsaut = 0.0 + xtsaut = 0.0 +#endif + if(qi2D(il, kl) > eps9) then + ! AutoOK = 0.0 otherwise + ! AutoOK = 1.0 if qi2D(il,kl) > eps9 + signAU = sign(unun, qi2D(il, kl) - eps9) + AutoOK = max(zero, signAU) + + if(ccni2D(il, kl) > 1.) then + + ! ClouOK = 1.0 if ccni2D(il,kl) > 1. + ! ClouOK = 0.0 otherwise + signCC = sign(unun, ccni2D(il, kl) - 1.) + ClouOK = max(zero, signCC) + + AutoOK = AutoOK * ClouOK + qiOK = AutoOK * qi2D(il, kl) +#if(EW) + if(AutoOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(09:09) = 's' + mphy2D(il) = mauxEW + endif +#endif + ! Pristine Ice Crystals Diameter + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !qid : Pristine Ice Crystals Diameter + ! Levkov et al. 1992 + ! Contr. Atm. Phys. 65, (5) p.37 + ! where [6/(pi*ro_I)]**1/3 ~ 0.156 + qid = 0.156 * exp(third * log(thous * rolv2D(il, kl) & + * max(eps9, qi2D(il, kl)) & + / max(unun, ccni2D(il, kl)))) + + ! Time needed for Ice Crystals Diameter to reach Snow Diameter Threshold + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + c1saut = max(eps9, qiOK) * rolv2D(il, kl) * 35. & + * exp(third * log(rolv2D(il, klev) / & + rolv2D(il, kl))) + + ! qi fully used if xtsaut<xt + xtsaut = -6.d0 * log(qid / qsd0) / c1saut + xtsaut = max(xt, xtsaut) +#if(nt) + ! Time needed for Ice Crystals Diameter + ! to reach Snow Diameter Threshold + ! ~(ALTERNATE PARAMETERIZATION)~ + xtsaut = -2.0 * (3.0 * log(qid / qsd0) & + + log(max(qi2D(il, kl), eps9))) / c1saut + xtsaut = max(eps9, xtsaut) +#endif + ! Aggregation + ! ~~~~~~~~~~~ + qsaut = xt * qiOK / xtsaut + if(qsaut > 0) qsaut = qsaut * (1. - cloud_magic) + qsaut = min(qi2D(il, kl), qsaut) + qsaut = max(-qs2D(il, kl), qsaut) + if(.not.isnan(qsaut)) then + qi2D(il, kl) = qi2D(il, kl) - qsaut + qs2D(il, kl) = qs2D(il, kl) + qsaut + + ! Decrease of Ice Crystals Number (BAGRII) + ! Reference: Levkov et al. 1992 + ! Contr.Atm.Phys. 65, p.41 (34) + ! ---------------------------------------- + ccni2D(il, kl) = ccni2D(il, kl) * exp(-0.5 * c1saut * xt) +#if(WQ) + write(6, *) 'QsAut', qsaut, & + ' Qi', qi2D(il, kl), & + ' CcnI', ccni2D(il, kl), itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsaut(kl) = qsaut +#endif + endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983) Ice Crystals Aggre' + debugH(36:70) = 'gation ' + proc_1 = 'xtsaut sec' + procv1 = xtsaut + proc_2 = 'Qsaut g/kg' + procv2 = qsaut + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(07, kl) = qsaut + debugV(07, kl) +#endif + enddo + enddo + !======================================================================= + else if(EmdeKa) then + ! Ice Crystals Autoconversion => Snow Flakes + ! Reference: Lin et al. 1983, JCAM 22, p.1070 (21) + ! Lin et al. 1983, JCAM 22, p.1074 (38) + ! Emde and Kahlig 1989, Ann.Geoph. 7, p. 408 (18) + ! ---------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsaut = 0.0 + cnsaut = 0.0 +#endif + if(qi2D(il, kl) >= qi00) then +#if(EW) + if(qi2D(il, kl) >= qi00) then + mauxEW = mphy2D(il) + mauxEW(09:09) = 's' + mphy2D(il) = mauxEW + endif +#endif + ex1 = 0.025d0 * W2xyz1(il, kl) ! W2 = t?[K] + psaut = 0.001d0 * (qi2D(il, kl) - qi00) * exp(ex1) + qsaut = psaut * xt + qsaut = qsaut * (1. - cloud_magic) + qsaut = max(qsaut, zero) + qsaut = min(qsaut, qi2D(il, kl)) + cnsaut = ccni2D(il, kl) * qsaut & + / max(qi00, qi2D(il, kl)) + ccni2D(il, kl) = ccni2D(il, kl) - cnsaut + qi2D(il, kl) = qi2D(il, kl) - qsaut + qs2D(il, kl) = qs2D(il, kl) + qsaut +#if(WQ) + write(6, *) 'QsAut', qsaut, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsaut(kl) = qsaut +#endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Emde and Kahlig Ice Crystals Autoc' + debugH(36:70) = 'onversion ' + proc_1 = 'Qsaut g/kg' + procv1 = qsaut + proc_2 = 'cnsaut/e15' + procv2 = cnsaut * 1.e-18 + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(07, kl) = qsaut +#endif + enddo + enddo + else + ! Sundqvist (1988, Schlesinger, Reidel, p. 433) Autoconversion Scheme + ! -------------------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsaut = 0.0 + cnsaut = 0.0 +#endif + if(qi2D(il, kl) > eps9) then + + ! AutoOK = 1.0 if qi2D(il,kl) > eps9 + ! AutoOK = 0.0 otherwise + signAU = sign(unun, qi2D(il, kl) - eps9) + AutoOK = max(zero, signAU) + + dqi = AutoOK * qi2D(il, kl) / qi0S +#if(mf) + dqi = dqi / max(cminHY, cfra2D(il, kl)) +#endif + psaut = AutoOK * qi2D(il, kl) * csud & + * (1. - exp(-dqi * dqi)) +#if(mf) + psaut = psaut * max(cminHY, cfra2D(il, kl)) +#endif + qsaut = psaut * xt + qsaut = (1. - cloud_magic) * qsaut + qsaut = min(qi2D(il, kl), qsaut) + qsaut = max(zero, qsaut) + cnsaut = ccni2D(il, kl) * qsaut & + / max(qi2D(il, kl), eps9) + ccni2D(il, kl) = ccni2D(il, kl) - cnsaut + qi2D(il, kl) = qi2D(il, kl) - qsaut + qs2D(il, kl) = qs2D(il, kl) + qsaut + + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Sundqvist (1988) Ice Crystals Autoc' + debugH(36:70) = 'onversion ' + proc_1 = 'Qsaut g/kg' + procv1 = qsaut + proc_2 = 'cnsaut/e15' + procv2 = cnsaut * 1.e-18 + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(07, kl) = qsaut +#endif + enddo + enddo + endif + +#if(qg) + ! Ice Crystals Autoconversion => Graupels + ! --------------------------------------- + do kl = mzhyd, klev + do il = 1, klon + if(qi2D(il, kl) >= qg00) then + ex1 = 0.090 * W2xyz1(il, kl) + pgaut = 0.001 * (qi2D(il, kl) - qg00) * exp(ex1) + qgaut = pgaut * xt + qgaut = max(qgaut, zero) + qgaut = min(qgaut, qi2D(il, kl)) + qi2D(il, kl) = qi2D(il, kl) - qgaut + qg2D(il, kl) = qg2D(il, kl) + qgaut + endif + enddo + enddo +#endif + !=========================================================================== + + ! Accretion Processes (i.e. increase in size of precipitating particles + ! ==================== through a collision-coalescence process)=== + ! ============================================== + + ! Accretion of Cloud Droplets by Rain + ! Reference: Lin et al. 1983, JCAM 22, p.1076 (51) + ! Emde and Kahlig 1989, Ann.Geoph. 7, p. 407 (10) + ! ---------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qracw = 0.0 +#endif + if(qw2D(il, kl) > eps9) then + + ! WbyR_w = 1.0 if qw2D(il,kl) > eps9 + ! WbyR_w = 0.0 otherwise + sign_W = sign(unun, qw2D(il, kl) - eps9) + WbyR_w = max(zero, sign_W) + + if(W2xyz3(il, kl) > eps9) then + + ! WbyR_r = 1.0 if W2xyz3(il,kl) > eps9 + ! WbyR_r = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - eps9) + WbyR_r = max(zero, sign_R) + + WbyROK = WbyR_w * WbyR_r +#if(EW) + ! ctr + if(WbyROK > epsi) then + mauxEW = mphy2D(il) + mauxEW(10:10) = 'r' + mphy2D(il) = mauxEW + endif +#endif + pracw = 3104.28d0 * cnor * W2xyz6(il, kl) & + * qw2D(il, kl) / exp(3.8d0 * log(W2xyz7(il, kl))) + ! 3104.28 = a pi Gamma[3+b] / 4 + ! where a = 842. and b = 0.8 + qracw = pracw * xt * WbyROK + if(qracw > 0) qracw = qracw * min(0.9, (1. - cloud_magic)) + qracw = min(qracw, qw2D(il, kl)) + + qw2D(il, kl) = qw2D(il, kl) - qracw + qr2D(il, kl) = qr2D(il, kl) + qracw + +#if(WQ) + write(6, *) 'Qracw', qracw, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wracw(kl) = qracw +#endif + + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Accretion of Clou' + debugH(36:70) = 'd Droplets by Rain ' + proc_1 = 'Qracw g/kg' + procv1 = qracw + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(08, kl) = qracw +#endif + enddo + enddo + + ! Accretion of Cloud Droplets by Snow Flakes + ! Reference: Lin et al. 1983, JCAM 22, p.1070 (24) + ! ---------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + snoA = 0.0 +#endif + + if(qw2D(il, kl) > eps9) then + + +#if(cn) + ! psacw : taken into account in the snow melting process + ! (if positive temperatures) + ! 9.682 = c pi Gamma[3+d] / 4 + ! where c = 4.836 and d = 0.25 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Graupellike Snow Flakes of Hexagonal Type) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + psacw(il, kl) = 9.682d0 * cnos * W2xyz6(il, kl) & + * qw2D(il, kl) / exp(3.25d0 * log(W2xyz8(il, kl))) +#if(up) + ! psacw : taken into account in the snow melting process + ! (if positive temperatures) + ! 3517. = c pi Gamma[3+d] / 4 + ! where c = 755.9 and d = 0.99 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Unrimed Side Planes) + psacw(il, kl) = 3517. * cnos * W2xyz6(il, kl) & + * qw2D(il, kl) / exp(3.99d0 * log(W2xyz8(il, kl))) +#endif +#if(ur) + ! psacw : taken into account in the snow melting process + ! (if positive temperatures) + ! 27.73 = c pi Gamma[3+d] / 4 + ! where c = 11.718and d = 0.41 + ! (Locatelli and Hobbs, 1974, JGR: table 1 p.2188: + ! Aggregates of unrimed radiating assemblages) + psacw(il, kl) = 27.73 * cnos * W2xyz6(il, kl) & + * qw2D(il, kl) / exp(3.41d0 * log(W2xyz8(il, kl))) +#endif + + ! WbyS_w = 1.0 if qw2D(il,kl) > eps9 + ! WbyS_w = 0.0 otherwise + sign_W = sign(unun, qw2D(il, kl) - eps9) + WbyS_w = max(zero, sign_W) + + if(W2xyz4(il, kl) > eps9) then + + ! WbyS_s = 1.0 if W2xyz4(il,kl) > eps9 + ! WbyS_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - eps9) + WbyS_s = max(zero, sign_S) + + WbySOK = WbyS_w * WbyS_s +#if(EW) + ! ctr + if(WbySOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(11:11) = 's' + mphy2D(il) = mauxEW + endif +#endif + + qsacw = psacw(il, kl) * xt * WbySOK + if(qsacw > 0) qsacw = qsacw * min(0.9, (1. - cloud_magic)) + qsacw = min(qsacw, qw2D(il, kl)) + + ! Fact_R = 1.0 if tair2D(il,kl) > TfSnow + ! Fact_R = 0.0 otherwise + sign_T = sign(unun, tair2D(il, kl) - TfSnow) + Fact_R = max(zero, sign_T) + if(.not.isnan(qsacw)) then + qw2D(il, kl) = qw2D(il, kl) - qsacw + qr2D(il, kl) = qr2D(il, kl) + Fact_R * qsacw + SnoA = (1.d0 - Fact_R) * qsacw + qs2D(il, kl) = qs2D(il, kl) + SnoA + ! Negative Temp. => Latent Heat is released by Freezing + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * SnoA + + ! Full Debug + ! ~~~~~~~~~~ +#if(WQ) + write(6, *) 'Qsacw', qsacw, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsacw(kl) = qsacw +#endif + endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Accretion of Cloud' + debugH(36:70) = ' Droplets by Snow Particles ' + proc_1 = 'Qsacw g/kg' + procv1 = SnoA + proc_3 = ' ' + procv2 = 0. + proc_2 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(09, kl) = SnoA +#endif + enddo + enddo + +#if(qg) + ! Accretion of Cloud Droplets by Graupels (Dry Growth Mode) + ! Reference: Lin et al. 1983, JCAM 22, p.1075 (40) + ! Emde and Kahlig 1989, Ann.Geoph. 7, p. 407 (~20) + ! ----------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon + if(qw2D(il, kl) > eps9) then + ! WbyG_w = 1.0 if qw2D(il,kl) > eps9 + ! WbyG_w = 0.0 otherwise + sign_W = sign(unun, qw2D(il, kl) - eps9) + WbyG_w = max(zero, sign_W) + if(qg2D(il, kl) > eps9) then + ! WbyG_g = 1.0 if qg2D(il,kl) > eps9 + ! WbyG_g = 0.0 otherwise + sign_G = sign(unun, qg2D(il, kl) - eps9) + WbyG_g = max(zero, sign_G) + WbyGOK = WbyG_w * WbyG_g + if(tair2D(il, kl) < TfSnow) then + ! Fact_G = 1.0 if tair2D(il,kl) > TfSnow + ! Fact_G = 0.0 otherwise + sign_T = -sign(unun, tair2D(il, kl) - TfSnow) + Fact_G = max(zero, sign_T) + ! pgacw = ??? + qgacw = pgacw * xt * WbyGOK + qgacw = min(qgacw, qw2D(il, kl)) + qw2D(il, kl) = qw2D(il, kl) - qgacw + qg2D(il, kl) = qg2D(il, kl) + qgacw + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * gacw + endif + endif + endif + enddo + enddo +#endif + ! Accretion of Cloud Ice by Snow Particles + ! Reference: Lin et al. 1983, JCAM 22, p.1070 (22) + ! ---------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsaci = 0.0 + cnsaci = 0.0 +#endif + if(qi2D(il, kl) > eps9) then + + ! CbyS_c = 1.0 if qi2D(il,kl) > eps9 + ! CbyS_c = 0.0 otherwise + sign_C = sign(unun, qi2D(il, kl) - eps9) + CbyS_c = max(zero, sign_C) + + if(W2xyz4(il, kl) > eps9) then + + ! CbyS_s = 1.0 if W2xyz4(il,kl) > eps9 + ! CbyS_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - eps9) + CbyS_s = max(zero, sign_S) + + if(tair2D(il, kl) < TfSnow) then + + ! CbyS_T = 1.0 if tair2D(il,kl) < TfSnow + ! CbyS_T = 0.0 otherwise + sign_T = -sign(unun, tair2D(il, kl) - TfSnow) + CbyS_T = max(zero, sign_T) + + CbySOK = CbyS_c * CbyS_s * CbyS_T +#if(EW) + ! ctr + if(CbySOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(12:12) = 's' + mphy2D(il) = mauxEW + endif +#endif + ! efc : Collection Efficiency + ! Lin et al. 1983 JCAM 22 p.1070 (23) + efc = exp(0.025d0 * W2xyz1(il, kl)) +#if(cn) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + psaci = efc * 9.682d0 * cnos * W2xyz6(il, kl) & + * qi2D(il, kl) / exp(3.25d0 * log(W2xyz8(il, kl))) +#if(up) + psaci = efc * 3517.d0 * cnos * W2xyz6(il, kl) & + * qi2D(il, kl) / exp(3.99d0 * log(W2xyz8(il, kl))) +#endif +#if(ur) + psaci = efc * 27.73d0 * cnos * W2xyz6(il, kl) & + * qi2D(il, kl) / exp(3.41d0 * log(W2xyz8(il, kl))) +#endif + qsaci = psaci * xt * CbySOK + if(qsaci > 0) qsaci = qsaci * (1. - cloud_magic) + qsaci = min(qsaci, qi2D(il, kl)) + + cnsaci = ccni2D(il, kl) * qsaci / & + max(qi2D(il, kl), eps9) + ccni2D(il, kl) = ccni2D(il, kl) - cnsaci + qi2D(il, kl) = qi2D(il, kl) - qsaci + qs2D(il, kl) = qs2D(il, kl) + qsaci + +#if(WQ) + write(6, *) 'Qsaci', qsaci, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsaci(kl) = qsaci +#endif + + endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Accretion of Clou' + debugH(36:70) = 'd Ice by Snow Particles ' + proc_1 = 'Qsaci g/kg' + procv1 = qsaci + proc_2 = 'CNsaci/e15' + procv2 = cnsaci * 1.e-18 + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(10, kl) = qsaci +#endif + enddo + enddo + +#if(qg) + ! Accretion of Cloud Ice by Graupel (Cloud Ice Sink) + ! Reference: Lin et al. 1983, JCAM 22, p.1075 (41) + ! Emde and Kahlig 1989, Ann.Geoph. 7, p. 407 (~19) + ! ----------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon + if(qw2D(il, kl) > eps9) then + ! CbyG_c = 1.0 if qi2D(il,kl) > eps9 + ! = 0.0 otherwise + sign_C = sign(unun, qi2D(il, kl) - eps9) + CbyG_c = max(zero, sign_C) + if(qg2D(il, kl) > eps9) then + ! CbyG_g = 1.0 if qg2D(il,kl) > eps9 + ! CbyG_g = 0.0 otherwise + sign_G = sign(unun, qg2D(il, kl) - eps9) + CbyG_g = max(zero, sign_G) + if(tair2D(il, kl) < TfSnow) then + ! Fact_G = 1.0 if tair2D(il,kl) < TfSnow + ! Fact_G = 0.0 otherwise + sign_T = -sign(unun, tair2D(il, kl) - TfSnow) + Fact_G = max(zero, sign_T) + CbyGOK = CbyG_c * CbyG_g * Fact_G + ! pgaci = ??? + qgaci = pgaci * xt * CbyGOK + qgaci = min(qgaci, qi2D(il, kl)) + qi2D(il, kl) = qi2D(il, kl) - qgaci + qg2D(il, kl) = qg2D(il, kl) + qgaci + endif + endif + endif + enddo + enddo +#endif + + ! Accretion of Cloud Ice by Rain (Cloud Ice Sink) + ! Reference: Lin et al. 1983, JCAM 22, p.1071 (25) + ! ------------------------------------------------ + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qraci = 0.0 + qiacr = 0.0 +#endif + if(qi2D(il, kl) > eps9) then + ! CbyR_c = 1.0 if qi2D(il,kl) > eps9 + ! CbyR_c = 0.0 otherwise + sign_C = sign(unun, qi2D(il, kl) - eps9) + CbyR_c = max(zero, sign_C) + if(W2xyz3(il, kl) > eps9) then + ! CbyR_r = 1.0 if W2xyz3(il,kl) > eps9 + ! CbyR_r = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - eps9) + CbyR_r = max(zero, sign_R) + if(tair2D(il, kl) < TfSnow) then + ! CbyR_T = 1.0 if tair2D(il,kl) < TfSnow + ! CbyR_T = 0.0 otherwise + sign_T = -sign(unun, tair2D(il, kl) - TfSnow) + CbyR_T = max(zero, sign_T) + + CbyROK = CbyR_c * CbyR_r * CbyR_T +#if(EW) + ! ctr + if(CbyROK > epsi) then + mauxEW = mphy2D(il) + if(mauxEW(13:13) == 's' .or. mauxEW(13:13) == 'A') then + mauxEW(13:13) = 'A' + else + mauxEW(13:13) = 'r' + endif + mphy2D(il) = mauxEW + endif +#endif + praci = 3104.28d0 * cnor * W2xyz6(il, kl) & + * qi2D(il, kl) / exp(3.8d0 * log(W2xyz7(il, kl))) + qraci = praci * xt * CbyROK + if(qraci > 0) qraci = qraci * (1. - cloud_magic) + qraci = min(qraci, qi2D(il, kl)) + cnraci = ccni2D(il, kl) * qraci / & + max(qi2D(il, kl), eps9) + ccni2D(il, kl) = ccni2D(il, kl) - cnraci + qi2D(il, kl) = qi2D(il, kl) - qraci +#if(qg) + ! CAUTION : Graupels Formation is not taken into account + ! This could be a reasonable assumption for Antarctica + ! ctr + if(qr2D(il, kl) > 1.e-4) then + qg2D(il, kl) = qg2D(il, kl) + qraci + else +#endif + qs2D(il, kl) = qs2D(il, kl) + qraci +#if(qg) + endif +#endif + +#if(WQ) + write(6, *) 'Qraci', qraci, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wraci(kl) = qraci +#endif + + ! Accretion of Rain by Cloud Ice (Rain Sink) + ! Reference: Lin et al. 1983, JCAM 22, p.1071 (26) + ! ------------------------------------------------ +#if(EW) + ! ctr + if(CbyROK > epsi) then + mauxEW = mphy2D(il) + if(mauxEW(13:13) == 'r' .or. mauxEW(13:13) == 'A') then + mauxEW(13:13) = 'A' + else + mauxEW(13:13) = 's' + endif + mphy2D(il) = mauxEW + endif +#endif + ! Lin et al, 1983, JAM,p1071: mi:Ice Crystal Mass + piacr = 4.1e20 * cnor * W2xyz6(il, kl) & + * qi2D(il, kl) / exp(6.8d0 * log(W2xyz7(il, kl))) + ! 4.1e20 = a pi**2 rhow/mi Gamma[6+b] / 24 + ! where a=842., rhow=1000, mi=4.19e-13 + ! and b = 0.8 + qiacr = piacr * xt * CbyROK + qiacr = min(qiacr, qr2D(il, kl)) + qr2D(il, kl) = qr2D(il, kl) - qiacr + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * qiacr +#if(qg) + ! CAUTION : Graupels Formation is not taken into account + ! This could be a reasonable assumption for Antarctica + ! ctr + if(qr2D(il, kl) > 1.e-4) then + qg2D(il, kl) = qg2D(il, kl) + qiacr + else +#endif + qs2D(il, kl) = qs2D(il, kl) + qiacr +#if(qg) + endif +#endif +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'Qiacr', qiacr, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wiacr(kl) = qiacr +#endif + endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Accretion of Clou' + debugH(36:70) = 'd Ice by Rain ' + proc_1 = 'Qraci g/kg' + procv1 = qraci + proc_2 = 'qiacr g/kg' + procv2 = qiacr + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(11, kl) = qiacr +#endif + enddo + enddo + + ! Accretion of Rain by Snow Flakes + ! Accretion of Snow Flakes by Rain + ! Reference: Lin et al. 1983, JCAM 22, p.1071 (27) + ! Lin et al. 1983, JCAM 22, p.1071 (28) + ! Emde and Kahlig 1989, Ann.Geoph. 7, p. 408 (~21) + ! ----------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon + psacr(il, kl) = 0.d0 + qsacr = 0.d0 +#if(wH) + qraci = 0.0d0 + qracsS = 0.0d0 + qsacrR = 0.0d0 +#endif + if(W2xyz3(il, kl) > eps9) then + ! RbyS_r = 1.0 if W2xyz3(il,kl) > eps9 + ! RbyS_r = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - eps9) ! W2xyz3: Qr + RbyS_r = max(zero, sign_R) + if(W2xyz4(il, kl) > eps9) then + ! RbyS_s = 1.0 if W2xyz4(il,kl) > eps9 + ! RbyS_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - eps9) ! W2xyz4: Qs + RbyS_s = max(zero, sign_S) + + RbySOK = RbyS_r * RbyS_s +#if(EW) + if(CbyROK > epsi) then + mauxEW = mphy2D(il) + mauxEW(14:14) = 'A' + mphy2D(il) = mauxEW + endif +#endif + ! Accretion of Rain by Snow --> Snow | W2xyz7 : lambda_r + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | W2xyz8 : lambda_s + flS = (5.0d0 / (W2xyz8(il, kl) * W2xyz8(il, kl) * W2xyz7(il, kl)) & + + 2.0d0 / (W2xyz8(il, kl) * W2xyz7(il, kl) * W2xyz7(il, kl)) & + + 0.5d0 / (W2xyz7(il, kl) * W2xyz7(il, kl) * W2xyz7(il, kl))) & + / (W2xyz8(il, kl) * W2xyz8(il, kl) * W2xyz8(il, kl) * W2xyz8(il, kl)) +#if(cn) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + pracs = 986.96d-3 * (cnor * cnos / rolv2D(il, kl)) & + * abs(vr(il, kl) - vs(il, kl)) * flS + ! 986.96: pi**2 * rhos + ! (snow density assumed equal to 100 kg/m3) + qracs = pracs * xt * RbySOK + qracs = min(qracs, qr2D(il, kl)) +#if(WQ) + write(6, *) 'Qracs', qracs, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wracs(kl) = qracs +#endif + ! Accretion of Snow by Rain --> Rain + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! SbyR_r = 1.0 if W2xyz3(il,kl) > 1.e-4 + ! SbyR_r = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - 1.e-4) + SbyR_r = max(zero, sign_R) + + ! SbyR_s = 1.0 if W2xyz4(il,kl) > 1.e-4 + ! SbyR_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - 1.e-4) + SbyR_s = max(zero, sign_S) + + SbyROK = max(SbyR_r, SbyR_s) + + if(SbyROK > epsi) then + flR = (5.d0 / (W2xyz7(il, kl) * W2xyz7(il, kl) * W2xyz8(il, kl)) & + + 2.d0 / (W2xyz7(il, kl) * W2xyz8(il, kl) * W2xyz8(il, kl)) & + + 0.5d0 / (W2xyz8(il, kl) * W2xyz8(il, kl) * W2xyz8(il, kl))) & + / (W2xyz7(il, kl) * W2xyz7(il, kl) * W2xyz7(il, kl) * W2xyz7(il, kl)) + + psacr(il, kl) = 9869.6d-3 * (cnor * cnos / rolv2D(il, kl)) & + * abs(vr(il, kl) - vs(il, kl)) * flR + ! 9869.6: pi**2 * rhow + ! (water density assumed equal to 1000 kg/m3) + qsacr = psacr(il, kl) * xt * RbySOK * SbyROK + qsacr = min(qsacr, qs2D(il, kl)) + +#if(WQ) + write(6, *) 'Qsacr', qsacr, itexpe, il, kl +#endif + +#if(WH) + if(il == ilmm) wsacr(kl) = qsacr +#endif + else + psacr(il, kl) = 0.d0 + qsacr = 0.d0 + endif + + ! CbyR_T = 1.0 if tair2D(il,kl) < TfSnow + ! = 0.0 otherwise + sign_T = -sign(unun, tair2D(il, kl) - TfSnow) + CbyR_T = max(zero, sign_T) + + qracsS = qracs * CbyR_T + qsacrR = qsacr * (1.d0 - CbyR_T) + + qr2D(il, kl) = qr2D(il, kl) - qracsS +#if(qg) + ! CAUTION : Graupel Formation is not taken into Account + if(W2xyz3(il, kl) < 1.e-4 .and. W2xyz4(il, kl) < 1.e-4) then +#endif + qs2D(il, kl) = qs2D(il, kl) + qracsS +#if(qg) + else + qs2D(il, kl) = qs2D(il, kl) - qracsS + qg2D(il, kl) = qg2D(il, kl) + qsacrS + qracsS + endif +#endif + tair2D(il, kl) = tair2D(il, kl) + qracsS * r_LcCp + qr2D(il, kl) = qr2D(il, kl) + qsacrR + qs2D(il, kl) = qs2D(il, kl) - qsacrR + tair2D(il, kl) = tair2D(il, kl) - qsacrR * r_LcCp + endif + endif + +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Accretion of Snow' + debugH(36:70) = '(Rain) by Rain(Snow) ' + proc_1 = 'Qracs g/kg' + procv1 = qracsS + proc_2 = 'Qsacr g/kg' + procv2 = qsacrR + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + include 'MAR_HY.Debug' + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(12, kl) = qracsS - qsacrR +#endif + enddo + enddo + + ! Accretion of Snow by Graupels + ! Reference: Lin et al. 1983, JCAM 22, p.1071 (29) + ! ---------------------------------------------------------- + + ! #if(qg) + ! do il=1,klon + ! do kl=mzhyd,klev + ! + ! if (W2xyz0(il,kl) > eps9) then + ! + ! ! SbyG_g = 1.0 if W2xyz0(il,kl) > eps9 + ! ! SbyG_g = 0.0 otherwise + ! sign_G = sign(unun,W2xyz0(il,kl) - eps9) + ! SbyG_g = max(zero,sign_G) + ! + ! if (W2xyz4(il,kl) > eps9) then + ! + ! ! SbyG_s = 1.0 if W2xyz4(il,kl) > eps9 + ! ! SbyG_s = 0.0 otherwise + ! sign_S = sign(unun,W2xyz4(il,kl) - eps9) + ! SbyG_s = max(zero,sign_S) + ! + ! SbyGOK = SbyG_g * SbyG_s + ! + ! ! efc : Collection Efficiency + ! ! Lin et al. 1983 JCAM 22 p.1072 (30) + ! efc = exp(0.090*W2xyz1(il,kl)) + ! + ! flg=exp(-6.0d0*log(W2xyz8(il,kl)) & + ! *(5.0/W2xyz9(il,kl) & + ! +2.0*W2xyz8(il,kl)/(W2xyz9(il,kl)*W2xyz9(il,kl)) & + ! +0.5*W2xyz8(il,kl)* W2xyz8(il,kl) & + ! /exp(3.0d0*log(W2xyz9(il,kl)))) + ! #if(cn) + ! cnos = min(2.e8 , & + ! cnos2*exp(-.12*min(0.,W2xyz1(il,kl)))) + ! #endif + ! pgacs = 986.96d-3*(cnog*cnos/rolv2D(il,kl)) & + ! * abs(vg(il,kl)-vs(il,kl))*flg*efc + ! ! 986.96: pi**2 * rhog + ! ! (graupel densitity assumed equal to snow density) + ! qgacs = pgacs * xt * SbyGOK + ! qgacs = min(qgacs,qs2D(il,kl)) + ! qg2D(il,kl) = qg2D(il,kl) + qgacs + ! qs2D(il,kl) = qs2D(il,kl) - qgacs + ! + ! end if + ! end if + ! + ! end do + ! end do + ! #endif + + ! Accretion of Rain by Graupels (Dry Growth Mode) + ! Reference: Lin et al. 1983, JCAM 22, p.1075 (42) + ! ------------------------------------------------ + ! #if(qg) + ! do kl=mzhyd,klev + ! do il=1,klon + ! + ! if (W2xyz0(il,kl) > eps9) then + ! + ! ! RbyG_g = 0.0 otherwise + ! ! RbyG_g = 1.0 if W2xyz0(il,kl) > eps9 + ! sign_G = sign(unun,W2xyz0(il,kl) - eps9) + ! RbyG_g = max(zero,sign_G) + ! + ! if (W2xyz3(il,kl) > eps9) then + ! + ! ! RbyG_r = 0.0 otherwise + ! ! RbyG_r = 1.0 if W2xyz3(il,kl) > eps9 + ! sign_R = sign(unun,W2xyz3(il,kl) - eps9) + ! RbyG_r = max(zero,sign_R) + ! + ! if (tair2D(il,kl) < TfSnow) then + ! + ! ! Fact_G = 0.0 otherwise + ! ! Fact_G = 1.0 if tair2D(il,kl) < TfSnow + ! sign_T = -sign(unun,tair2D(il,kl) - TfSnow) + ! Fact_G = max(zero,sign_T) + ! + ! RbyGOK = RbyG_g * RbyG_s * Fact_G + ! + ! flg=exp(-6.0d0*log(W2xyz8(il,kl)) & + ! *(5.0/W2xyz9(il,kl) & + ! +2.0*W2xyz8(il,kl)/(W2xyz9(il,kl)*W2xyz9(il,kl)) & + ! +0.5*W2xyz8(il,kl)* W2xyz8(il,kl)) & + ! /exp(3.0d0*log(W2xyz9(il,kl)))) + ! #if(cn) + ! cnos = min(2.e8 , & + ! cnos2*exp(-.12*min(0.,W2xyz1(il,kl)))) + ! #endif + ! pgacr = 986.96d-3*(cnog*cnos/rolv2D(il,kl)) & + ! * abs(vg(i,kl) - vr(il,kl))*flg + ! qgacr = pgacr * xt * RbyGOK + ! qgacr = min(qgacr,qr2D(il,kl)) + ! qg2D(il,kl) = qg2D(il,kl) + qgacr + ! qr2D(il,kl) = qr2D(il,kl) - qgacr + ! tair2D(il,kl) = tair2D(il,kl) + r_LcCp*qgacr + ! + ! end if + ! end if + ! end if + ! + ! end do + ! end do + ! #endif + +#if(qg) + ! Graupels Wet Growth Mode + ! Reference: Lin et al. 1983, JCAM 22, p.1075 (43) + ! ---------------------------------------------------------- + ! TO BE ADDED ! +#endif + + ! Microphysical Processes affecting Precipitating Cloud Particles + ! =================================================================== + + ! Rain Drops Evaporation ============ + ! Reference: Lin et al. 1983, JCAM 22, p.1077 (52) + ! ---------------------------------------------------------- + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qrevp = 0.0 +#endif + if(W2xyz3(il, kl) > eps9) then + ! W2xyz3 : old Rain Concentration + + ! Evap_r = 1.0 if W2xyz3(il,kl) > eps9 + ! Evap_r = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - eps9) + Evap_r = max(zero, sign_R) + + EvapOK = Evap_r + +#if(EW) + if(EvapOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(15:15) = 'v' + mphy2D(il) = mauxEW + endif +#endif + ! sr : grid scale saturation humidity + sr = qv2D(il, kl) / (rhcrHY * qvsw2D(il, kl)) + + if(sr < unun) then + ! Evap_q = 1.0 if sr < unun + ! Evap_q = 0.0 otherwise + sign_Q = -sign(unun, sr - unun) + Evap_q = max(zero, sign_Q) + + EvapOK = EvapOK * Evap_q + + almr = 0.78d0 / (W2xyz7(il, kl) * W2xyz7(il, kl)) & + + 3940.d0 * sqrt(W2xyz6(il, kl)) & + / exp(2.9d0 * log(W2xyz7(il, kl))) + ab = 5.423d11 / (tair2D(il, kl) * tair2D(il, kl)) & + + 1.d0 / (1.875d-2 * rolv2D(il, kl) * qvsw2D(il, kl)) + + prevp = 2 * pi * (1.d0 - sr) * cnor * almr / ab + qrevp = prevp * xt + qrevp = min(qrevp, qr2D(il, kl)) + + ! supersaturation is not allowed to occur + qrevp = min(qrevp, rhcrHY * qvsw2D(il, kl) - qv2D(il, kl)) + + ! condensation is not allowed to occur + qrevp = max(qrevp, zero) * EvapOK + + qr2D(il, kl) = qr2D(il, kl) - qrevp + dqw2D(il, kl) = dqw2D(il, kl) - qrevp + qv2D(il, kl) = qv2D(il, kl) + qrevp + tair2D(il, kl) = tair2D(il, kl) - r_LvCp * qrevp + qrevp2D(il, kl) = qrevp + ! Full Debug + ! ~~~~~~~~~~ +#if(WQ) + write(6, *) 'Qrevp', qrevp, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wrevp(kl) = qrevp +#endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Rain Drops Evapor' + debugH(36:70) = 'ation ' + proc_1 = 'Qrevp g/kg' + procv1 = qrevp + proc_2 = 'R.Hum [%]' + procv2 = sr * 0.1 + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + include 'MAR_HY.Debug' + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(13, kl) = -qrevp +#endif + enddo + enddo + + ! (Deposition on) Snow Flakes (Sublimation) + ! Reference: Lin et al. 1983, JCAM 22, p.1072 (31) + ! ---------------------------------------------------------- + + ! #if(BS) + ! do il=1,klon + ! hlat2D(il,1) = 0.d0 + ! end do + ! #endif + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qssub = 0.0 +#endif + if(W2xyz4(il, kl) > eps9) then + ! W2xyz4 : old Snow F. Concentration + + ! Evap_s = 1.0 if W2xyz4(il,kl) > eps9 + ! Evap_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - eps9) + Evap_s = max(zero, sign_S) + +#if(EW) + if(Evap_s > epsi) then + mauxEW = mphy2D(il) + mauxEW(16:16) = 'V' + mphy2D(il) = mauxEW + endif +#endif + + si = qv2D(il, kl) / W2xyz5(il, kl) + + alms = 0.78d0 / (W2xyz8(il, kl) * W2xyz8(il, kl)) & + + 238.d0 * sqrt(W2xyz6(il, kl)) & + / exp(2.625d0 * log(W2xyz8(il, kl))) + ab = 6.959d11 / (tair2D(il, kl) * tair2D(il, kl)) & + + 1.d0 / (1.875d-2 * rolv2D(il, kl) * W2xyz5(il, kl)) + +#if(cn) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + pssub = 2 * pi * (1.d0 - si) * cnos * alms / (1.d3 * rolv2D(il, kl) * ab) + qssub = pssub * xt + + dqamx = W2xyz5(il, kl) - qv2D(il, kl) + + ! Depo_s = 1.0 if si > unun + ! Depo_s = 0.0 otherwise + sign_S = sign(unun, si - unun) + Depo_s = max(zero, sign_S) + + ! qssub < 0 ... Deposition + ! qssub > 0 ... Sublimation + qssub = max(qssub, dqamx) * Depo_s & + + min(min(qssub, qs2D(il, kl)), dqamx) * (1.d0 - Depo_s) + + qssub = qssub * Evap_s + + qs2D(il, kl) = qs2D(il, kl) - qssub + dqi2D(il, kl) = dqi2D(il, kl) - qssub + qv2D(il, kl) = qv2D(il, kl) + qssub + tair2D(il, kl) = tair2D(il, kl) - r_LsCp * qssub + qssub2D(il, kl) = qssub + ! #if(BS) + ! hlat2D(il ,1) = hlat2D(il ,1) + qssub * rolv2D(il,kl) & + ! *(gpmi2D(il,kl)-gpmi2D(il,kl+1))*grvinv + ! #endif +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'Qssub', qssub, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wssub(kl) = -qssub +#endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): (Deposition on) S' + debugH(36:70) = 'now Particles (Sublimation) ' + proc_1 = 'Qssub g/kg' + procv1 = qssub + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + include 'MAR_HY.Debug' + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(14, kl) = -qssub +#endif + enddo + enddo + +#if(qg) + ! Graupels Sublimation + ! Reference: Lin et al. 1983, JCAM 22, p.1076 (46) + ! ---------------------------------------------------------- + ! TO BE ADDED ! +#endif + ! Snow Flakes Melting PSMLT + ! Reference: Lin et al. 1983, JCAM 22, p.1072 (32) + ! ---------------------------------------------------------- + + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsmlt = 0.0 +#endif + if(W2xyz4(il, kl) > eps9) then + ! W2xyz4 : old Snow Fl.Concentration + + ! SnoM_s = 1.0 if W2xyz4(il,kl) > eps9 + ! SnoM_s = 0.0 otherwise + sign_S = sign(unun, W2xyz4(il, kl) - eps9) + SnoM_s = max(zero, sign_S) + + if(W2xyz1(il, kl) > 0.) then + ! W2xyz1 : old Celsius Temperature + + ! SnoM_T = 1.0 if W2xyz1(il,kl) > 0. + ! SnoM_T = 0.0 otherwise + sign_T = sign(unun, W2xyz1(il, kl) - 0.) + SnoM_T = max(zero, sign_T) + + SnoMOK = SnoM_s * SnoM_T +#if(EW) + if(SnoMOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(17:17) = 'r' + mphy2D(il) = mauxEW + endif +#endif + alms = 0.78 / (W2xyz8(il, kl) * W2xyz8(il, kl)) & + + 238. * sqrt(W2xyz6(il, kl)) & + / exp(2.625d0 * log(W2xyz8(il, kl))) +#if(cn) + cnos = min(2.e8, & + cnos2 * exp(-.12 * min(0., W2xyz1(il, kl)))) +#endif + xCoef = 1.904d-8 * cnos * alms * r_LcCp / rolv2D(il, kl) + ! 1.904e-8: 2 pi / Lc /[10.**3 =rho Factor] + + ACoef = 0.0250d0 * xCoef & + + (psacw(il, kl) + psacr(il, kl)) * r_LcCp / 78.8d0 + ! 78.8 : Lc /[Cpw=4.187e3 J/kg/K] + + Bcoef = 62.34d+3 * rolv2D(il, kl) * & + (qv2D(il, kl) - W2xyz5(il, kl)) & + * xCoef + Bcoef = min(-eps9, Bcoef) + + Tc = (tair2D(il, kl) - TfSnow - ACoef / Bcoef) * exp(-ACoef * xt) + qsmlt = (tair2D(il, kl) - TfSnow - Tc) / r_LcCp + qsmlt = max(qsmlt, 0.) * SnoMOK + qsmlt = min(qsmlt, qs2D(il, kl)) + + if(tair2D(il,kl)-TfSnow>5) qsmlt=max(qsmlt,qs2D(il,kl)/4.) ! no snow > 5°C + + ! #if(XF) + ! ! this options increases the conversion of Snowfall to rainfall + ! alms = 0.78d0 /(W2xyz8(il,kl)*W2xyz8(il,kl)) & + ! + 238.d0 * sqrt(W2xyz6(il,kl)) & + ! /exp(2.625d0*log(W2xyz8(il,kl))) + ! akps = 0.025d0 *W2xyz1(il,kl) & + ! + 46.875d3 *rolv2D(il,kl) *(qv2D(il,kl)-W2xyz5(il,kl)) + ! ! 46.875 : Lv*[psiv=1.875e-5m2/s] + ! + ! psmlt = 1.904d-8*cnos*akps*alms/rolv2D(il,kl) & + ! -(psacw(il,kl) + psacr(il,kl)) *W2xyz1(il,kl) / 78.8d0 + ! ! 1.904e-8: 2 pi / Lc /[10.**3 =rho Factor] + ! ! Lc /[Cpw=4.187e3 J/kg/K] = 78.8 + ! qsmlt = psmlt * xt * SnoMOK + ! qsmlt = max(qsmlt,zero) + ! qsmlt = min(qsmlt,qs2D(il,kl)) + ! #endif + qs2D(il, kl) = qs2D(il, kl) - qsmlt + qr2D(il, kl) = qr2D(il, kl) + qsmlt + tair2D(il, kl) = tair2D(il, kl) - r_LcCp * qsmlt +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'Qsmlt', qsmlt, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsmlt(kl) = qsmlt +#endif + + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Snow Particles Me' + debugH(36:70) = 'lting ' + proc_1 = 'Qsmlt g/kg' + procv1 = qsmlt + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + include 'MAR_HY.Debug' + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(15, kl) = -qsmlt +#endif + enddo + enddo +#if(qg) + ! Graupels Melting + ! Reference: Lin et al. 1983, JCAM 22, p.1076 (47) + ! ---------------------------------------------------------- + ! TO BE ADDED ! +#endif + ! Rain Freezing + ! Reference: Lin et al. 1983, JCAM 22, p.1075 (45) + ! ---------------------------------------------------------- + ! **CAUTION**: Graupel Formation TO BE ADDED ! + do kl = mzhyd, klev + do il = 1, klon +#if(wH) + qsfr = 0.0 +#endif + if(W2xyz3(il, kl) > eps9) then + ! W2xyz3 : old Rain Concentration + ! Freezr = 1.0 if W2xyz3(il,kl) > eps9 + ! Freezr = 0.0 otherwise + sign_R = sign(unun, W2xyz3(il, kl) - eps9) + Freezr = max(zero, sign_R) + if(W2xyz1(il, kl) < 0.) then + ! W2xyz1 : old Celsius Temperature + ! FreezT = 1.0 if W2xyz1(il,kl) < 0. + ! FreezT = 0.0 otherwise + sign_T = -sign(unun, W2xyz1(il, kl) - 0.) + FreezT = max(zero, sign_T) + FrerOK = Freezr * FreezT +#if(EW) + if(FrerOK > epsi) then + mauxEW = mphy2D(il) + mauxEW(19:19) = 's' + mphy2D(il) = mauxEW + endif +#endif + psfr = 1.974d4 * cnor & + / (rolv2D(il, kl) * exp(7.d0 * log(W2xyz7(il, kl)))) & + * (exp(-0.66d0 * W2xyz1(il, kl)) - 1.d0) + qsfr = psfr * xt * FrerOK + qsfr = min(qsfr, qr2D(il, kl)) + + if(tair2D(il,kl)-TfSnow<-5) qsfr=max(qsfr,qr2D(il,kl)/4.) ! no rain < -5C + + qr2D(il, kl) = qr2D(il, kl) - qsfr + qs2D(il, kl) = qs2D(il, kl) + qsfr + ! CAUTION : graupel production is included into snow production + ! proposed modification in line below. + ! #if(qg) + ! qg2D(il,kl) = qg2D(il,kl) + qsfr + ! #endif + tair2D(il, kl) = tair2D(il, kl) + r_LcCp * qsfr +#if(WQ) + ! Full Debug + ! ~~~~~~~~~~ + write(6, *) 'Qsfre', qsfr, itexpe, il, kl +#endif +#if(WH) + if(il == ilmm) wsfre(kl) = qsfr +#endif + endif + endif +#if(wH) + ! Debug + ! ~~~~~ + debugH(1:35) = 'Lin et al.(1983): Rain Freezing ' + debugH(36:70) = ' ' + proc_1 = 'Qsfr g/kg' + procv1 = qsfr + proc_2 = ' ' + procv2 = 0. + proc_3 = ' ' + procv3 = 0. + proc_4 = ' ' + procv4 = 0. + include 'MAR_HY.Debug' + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) & + debugV(16, kl) = qsfr +#endif + + enddo + enddo + + ! Debug (Summary) + ! ~~~~~~~~~~~~~~~ +#if(wH) + do kl = mzhyd, klev + do il = 1, klon + if(i_fvv(il) == i0fvv .and. j_fvv(il) == j0fvv) then + if(kl == mzhyd) then + write(6, 6022) + 6022 format(/, 'HYDmic STATISTICS=================') + write(6, 6026) + 6026 format(' T_Air Qv Qw g/kg Qi g/kg CLOUDS % '// & + ' Qs g/kg Qr g/kg'// & + ' Qi+ E.K.'// & + ' Qi+ Mey.'// & + ' Qi- Sub.'// & + ' Qi- Mlt.'// & + ' Qw+ Cds.'// & + ' Qraut r+'// & + ' Qsaut s+'// & + ' Qracw r+') + endif + write(6, 6023) kl, & + tair2D(il, kl) - TfSnow, & + 10.**3 * qv2D(il, kl), & + 10.**3 * qw2D(il, kl), & + 10.**3 * qi2D(il, kl), & + 10.**2 * cfra2D(il, kl), & + 10.**3 * qs2D(il, kl), & + 10.**3 * qr2D(il, kl), & + (10.**3 * debugV(kv, kl), kv = 1, 8) + 6023 format(i3, f6.1, f5.2, 2f9.6, f9.1, 2f9.3, 8f9.6) + if(kl == klev) then + write(6, 6026) + write(6, *) ' ' + write(6, 6024) + 6024 format(8x, 'Z [km]'// & + ' RH.w.[%]'// & + ' RH.i.[%]'//9x// & + ' Vss cm/s'// & + ' Vrr cm/s'// & + ' Qsacw s+'// & + ' Qsaci s+'// & + ' Qiacr r+'// & + ' Qracs ds'// & + ' Qrevp w-'// & + ' Qssub s-'// & + ' Qsmlt s-'// & + ' Qsfr s+') + do nl = mzhyd, klev + write(6, 6025) nl, zsigma(nl) * 1.e-3, & + 10.**2 * qv2D(il, nl) / qvsw2D(il, nl), & + 10.**2 * qv2D(il, nl) / qvsi2D(il, nl), & + 10.**2 * vs(il, nl), & + 10.**2 * vr(il, nl), & + (10.**3 * debugV(kv, nl), kv = 9, 16) + 6025 format(i3, f11.3, 2f9.1, 9x, 2f9.1, 8f9.6) + enddo + write(6, 6024) + write(6, *) ' ' + endif + + endif + + enddo + enddo +#endif + +#if(EW) + ! Vertical Integrated Energy and Water Content + ! ============================================ + do il = 1, klon + enr11D(il) = 0.d0 + wat11D(il) = 0.d0 + + do kl = 1, klev + enr11D(il) = enr11D(il) & + + (tair2D(il, kl) & + - (qw2D(il, kl) + qr2D(il, kl)) * r_LvCp & + - (qi2D(il, kl) + qs2D(il, kl)) * r_LsCp) * dsigm1(kl) + wat11D(il) = wat11D(il) & + + (qv2D(il, kl) & + + qw2D(il, kl) + qr2D(il, kl) & + + qi2D(il, kl) + qs2D(il, kl)) * dsigm1(kl) + enddo + enr11D(il) = enr11D(il) * pst2Dn(il) * grvinv + ! wat11D [m] contains implicit factor 10.**3 [kPa-->Pa] /ro_Wat + wat11D(il) = wat11D(il) * pst2Dn(il) * grvinv + + enddo +#endif + + ! Precipitation + ! ============= + + ! Hydrometeors Fall Velocity + ! -------------------------- + + ! Pristine Ice Crystals Diameter and Fall Velocity + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do kl = mzhyd, klev + do il = 1, klon + + if(qi2D(il, kl) > eps9) then + + ! Sedi_c = 1.0 if qi2D(il,kl) > eps9 + ! Sedi_c = 0.0 otherwise + sign_Q = sign(unun, qi2D(il, kl) - eps9) + Sedi_c = max(zero, sign_Q) + + if(ccni2D(il, kl) > 1.) then + + ! Sedicc = 1.0 if ccni2D(il,kl) > 1. + ! Sedi_c = 0.0 otherwise + signCC = sign(unun, ccni2D(il, kl) - 1.) + Sedicc = max(zero, signCC) + + SediOK = Sedi_c * Sedicc + + ! qid : Pristine Ice Crystals Diameter, + ! Levkov et al. 1992, Contr. Atm. Phys. 65, (5) p.37 + ! where 6/(pi*ro_I)**1/3 ~ 0.16 + qid = 0.16d0 * exp(third * log(thous * rolv2D(il, kl) & + * max(eps9, qi2D(il, kl)) / max(ccni2D(il, kl), unun))) + ! vi : Terminal Fall Velocity for Pristine Ice Crystals + ! Levkov et al. 1992, Contr. Atm. Phys. 65, (4) p.37 + vi(il, kl) = SediOK * 7.d2 * qid & + * exp(0.35d0 * log(rolv2D(il, klev) / rolv2D(il, kl))) + else + vi(il, kl) = 0.d0 + endif + endif + + enddo + enddo + + ! Set Up of the Numerical Scheme + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(VW) + vwmx = 0.d0 +#endif + ! vrmx = 0.d0 + ! vsmx = 0.d0 + vimx = 0.d0 +#if(EW) + do il = 1, klon + ! watf1D : Water Flux (Atmosphere --> Surface) + watf1D(il) = 0.d0 + enddo +#endif + + ! Snow and Rain Fall Velocity (Correction) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do kl = mzhyd, klev + do il = 1, klon + vi(il, kl) = vi(il, kl) * qi2D(il, kl) / max(qi2D(il, kl), eps9) + vs(il, kl) = vs(il, kl) * qs2D(il, kl) / max(qs2D(il, kl), eps9) +#if(VW) + vw(il, kl) = vw(il, kl) * qw2D(il, kl) / max(qw2D(il, kl), eps9) +#endif + vr(il, kl) = vr(il, kl) * qr2D(il, kl) / max(qr2D(il, kl), eps9) + vimx = max(vi(il, kl), vimx) + ! vsmx = max(vs(il,kl),vsmx) + ! vrmx = max(vr(il,kl),vrmx) +#if(VW) + vwmx = max(vw(il, kl), vwmx) +#endif +#if(WH) + if(vsmx > vmmx) then + vmmx = vsmx + ilmmi = il + endif + if(vrmx > vmmi) then + vmmi = vrmx + ilmmi = il + endif +#endif + enddo + enddo + + ! dzmn = 10000. + ! do il=1,klon + ! dzmn = min(dzmn,(gplv2D(il,mz1)-gplv2D(il,mz))*grvinv) + ! end do + + ! Rain Drops Precipitation (Implicit Scheme) + ! ------------------------------------------- + + do il = 1, klon + W2xyz8(il, mzhyd - 1) = 0. + enddo + + ! Precipitation Mass & Flux + ! ~~~~~~~~~~~~~~~~~~~~~~~~~ + do kl = mzhyd, klev + do il = 1, klon + ! Air Mass [mWE] + W2xyz1(il, kl) = pst2Dn(il) * dsigm1(kl) * grvinv + ! Flux Fact. [mWE] + W2xyz6(il, kl) = xt * vr(il, kl) * rolv2D(il, kl) + enddo + + do il = 1, klon + ! Rain Mass From abov. + W2xyz5(il, kl) = qr2D(il, kl) * W2xyz1(il, kl) & + + 0.5 * W2xyz8(il, kl - 1) + if(kl < kk_pp) then + ! Corr. Bug + W2xyz7(il, kl) = W2xyz6(il, kl) / W2xyz1(il, kl) + else + ! Var. Fact. Flux Limi. + W2xyz7(il, kl) = min(2., W2xyz6(il, kl) / W2xyz1(il, kl)) + endif + enddo + + do il = 1, klon + ! Mass Loss + W2xyz8(il, kl) = W2xyz5(il, kl) * W2xyz7(il, kl) & + / (1. + W2xyz7(il, kl) * 0.5) + enddo + + do il = 1, klon + ! From abov. + W2xyz5(il, kl) = W2xyz5(il, kl) - W2xyz8(il, kl) & + + 0.5 * W2xyz8(il, kl - 1) + + ! Cooling from above precipitating flux + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + tair2D(il, kl) = (tair2D(il, kl) * W2xyz1(il, kl) & + + tair2D(il, kl - 1) * W2xyz8(il, kl - 1)) & + / (W2xyz1(il, kl) + W2xyz8(il, kl - 1)) + enddo + + do il = 1, klon + qr2D(il, kl) = W2xyz5(il, kl) / W2xyz1(il, kl) + rnf2D(il, kl) = rnf2D(il, kl) + W2xyz8(il, kl) + ! evp2D : Net Evap. Mass [mWE] + evp2D(il, kl) = evp2D(il, kl) + qrevp2D(il, kl) * W2xyz1(il, kl) + enddo + enddo + + ! Precipitation reaching the Surface + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do il = 1, klon + ! dwat contains an implicit factor 10**3 [kPa->Pa]/ro_Wat[kg/m2->m w.e.] + dwat = W2xyz8(il, klev) + ratio_temp = (tair2D(il, klev - 1) + tair2D(il, klev - 2) + & + tair2D(il, klev - 3) + tair2D(il, klev - 4)) / 4. + ratio_prec = dwat + ! ratio_rfsf : -1C => snow ; 0C => rain + ratio_rfsf = max(0., min(1., (ratio_temp - rain_snow_limit) / 2.)) + ! rain2D : rain precipitation height since start of run [m] + rain2D(il) = rain2D(il) + ratio_prec * ratio_rfsf + ! snow2D : snow precipitation height since start of run [m] + snow2D(il) = snow2D(il) + ratio_prec * (1. - ratio_rfsf) +#if(EW) + watf1D(il) = watf1D(il) - dwat +#endif + ! prec2D: rain precipitation height [m] + ! is reset to zero after included in water reservoir + prec2D(il) = prec2D(il) + dwat + enddo + dwat = 0.0 + +#if(VW) + ! Droplets Precipitation + ! ---------------------- + ! normally, 0.5 is sufficient to take into account truncation effect + itmx = int(1.d0 + xt * vwmx / dzmn) + itmx = max(1, itmx) + xtmn = xt / itmx + + ! Precipitation reaching the Surface + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do it = 1, itmx + do il = 1, klon + ! dwat contains an implicit factor 10**3[kPa->Pa]/ro_Wat[kg/m2->m w.e.] + dwat = vw(il, klev) * qw2D(il, klev) * rolv2D(il, klev) * xtmn + + ! rain2D : rain precipitation height since start of run [m] + rain2D(il) = rain2D(il) + dwat + + watf1D(il) = watf1D(il) - dwat + + ! prec2D : rain precipitation height [m] + ! is reset to zero after included in water reservoir + ! (cfr. routine SRFfrm_XXX) + prec2D(il) = prec2D(il) + dwat + enddo + + ! Precipitation elsewhere + ! ~~~~~~~~~~~~~~~~~~~~~~~ + do kl = klev, mzhyd + 1, -1 + do il = 1, klon + W2xyz1(il, kl) = qw2D(il, kl) * pst2Dn(il) * dsigm1(kl) & + + gravit * xtmn * (qw2D(il, kl - 1) * vw(il, kl - 1) * rolv2D(il, kl - 1) & + - qw2D(il, kl) * vw(il, kl) * rolv2D(il, kl)) + enddo + enddo + + do il = 1, klon + W2xyz1(il, mzhyd) = qw2D(il, mzhyd) * pst2Dn(il) * dsigm1(mzhyd) & + - gravit * xtmn * qw2D(il, mzhyd) * vw(il, mzhyd) * rolv2D(il, mzhyd) + enddo + + do kl = mzhyd, klev + do il = 1, klon + qw2D(il, kl) = W2xyz1(il, kl) / (pst2Dn(il) * dsigm1(kl)) + enddo + enddo + + enddo +#endif + + ! Snow Flakes Precipitation (Implicit Scheme) + ! ------------------------------------------- + do il = 1, klon + W2xyz8(il, mzhyd - 1) = 0. + enddo + + ! Precipitation Mass & Flux + ! ~~~~~~~~~~~~~~~~~~~~~~~~~ + do kl = mzhyd, klev + do il = 1, klon + ! Air Mass [mWE] + W2xyz1(il, kl) = pst2Dn(il) * dsigm1(kl) * grvinv + ! Flux Fact. [mWE] + W2xyz6(il, kl) = xt * vs(il, kl) * rolv2D(il, kl) + enddo + + do il = 1, klon + ! Snow Mass From above + W2xyz5(il, kl) = qs2D(il, kl) * W2xyz1(il, kl) & + + 0.5 * W2xyz8(il, kl - 1) + if(kl < kk_pp) then + ! Corr. Bug + W2xyz7(il, kl) = W2xyz6(il, kl) / W2xyz1(il, kl) + else ! for blowing snow + ! Var. Fact. Flux Limit + W2xyz7(il, kl) = & + min(2., W2xyz6(il, kl) / W2xyz1(il, kl)) + ! Var. Fact. Flux Limi. +#if(BS) + W2xyz7(il, kl) = & + min(min(2., 0.5 + (klev - kl) * 0.5), & + W2xyz6(il, kl) / W2xyz1(il, kl)) +#endif + endif + enddo + + do il = 1, klon + ! Mass Loss + W2xyz8(il, kl) = W2xyz5(il, kl) * W2xyz7(il, kl) / & + (1. + W2xyz7(il, kl) * 0.5) + enddo + do il = 1, klon + ! From abov. + W2xyz5(il, kl) = W2xyz5(il, kl) - W2xyz8(il, kl) & + + 0.5 * W2xyz8(il, kl - 1) + + ! Cooling from above precipitating flux + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + tair2D(il, kl) = & + (tair2D(il, kl) * W2xyz1(il, kl) & + + tair2D(il, kl - 1) * W2xyz8(il, kl - 1)) & + / (W2xyz1(il, kl) + W2xyz8(il, kl - 1)) + enddo + + do il = 1, klon + qs2D(il, kl) = W2xyz5(il, kl) / W2xyz1(il, kl) + snf2D(il, kl) = snf2D(il, kl) + W2xyz8(il, kl) + ! sbl2D : Sublimation Mass [mWE] + sbl2D(il, kl) = sbl2D(il, kl) + max(zero, qssub2D(il, kl)) * W2xyz1(il, kl) + ! dep2D : Condensation Mass [mWE] + dep2D(il, kl) = dep2D(il, kl) + max(zero, -qssub2D(il, kl)) * W2xyz1(il, kl) + ! smt2D = UV*Qs*mass_air*dt + ! qs2D * W2xyz1 : Integrated Mass Transp. [ton/m] + smt2D(il, kl) = smt2D(il, kl) + & + qs2D(il, kl) * W2xyz1(il, kl) & + * sqrt((uair2D(il, kl)**2) + (vair2D(il, kl)**2)) & + * xt + !Atm. Sublim. ratio [kg/kg] + qssbl2D(il, kl) = qssbl2D(il, kl) + qssub2D(il, kl) + enddo + enddo + + ! Precipitation reaching the Surface + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do il = 1, klon + ! dsno contains an implicit factor 10**3 [kPa->Pa]/ro_Wat[kg/m2->m w.e.] + dsno = W2xyz8(il, klev) + + ! snow2D : snow precipitation height since start of run [m] + snow2D(il) = snow2D(il) + dsno +#if(EW) + watf1D(il) = watf1D(il) - dsno +#endif + ! snoh2D: snow precipitation height [m] + ! is reset to zero after included in snow cover + ! (cfr. routine SRFfrm_sno) + snoh2D(il) = snoh2D(il) + dsno + enddo + dsno = 0. + + ! Pristine Ice Crystals Precipitation + ! ----------------------------------- + + ! itmx = int(1.d0 + xt * vimx / dzmn) cXF 04/2022 + ! normally, 0.5 is sufficient to take into account truncation effect + !XF itmx = max(1,itmx) + itmx = 1 + ! XF, 20200309: could be very slow with some compilors + xtmn = xt / itmx + + ! Precipitation reaching the Surface + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! XF, 20200309: qi <0 if vimx>> + + if(vimx > eps9) then + do it = 1, itmx + do il = 1, klon + ! dsno contains an implicit factor 10**3 + ! [kPa->Pa]/ro_Wat[kg/m2->m w.e.] + dsno = vi(il, klev) * qi2D(il, klev) * rolv2D(il, klev) * xtmn + + ! snow2D : snow precipitation height since start of run [m] + crys2D(il) = crys2D(il) + dsno + snow2D(il) = snow2D(il) + dsno + +#if(EW) + watf1D(il) = watf1D(il) - dsno +#endif + + ! snoh2D : snow precipitation height [m] + ! is reset to zero after included in snow cover + ! (cfr. routine SRFfrm_sno) + snoh2D(il) = snoh2D(il) + dsno + enddo + + ! Precipitation elsewhere + ! ~~~~~~~~~~~~~~~~~~~~~~~ + do kl = klev, mzhyd + 1, -1 + do il = 1, klon + W2xyz1(il, kl) = qi2D(il, kl) * pst2Dn(il) * dsigm1(kl) & + + gravit * xtmn * (qi2D(il, kl - 1) * & + vi(il, kl - 1) * rolv2D(il, kl - 1) & + - qi2D(il, kl) * vi(il, kl) * rolv2D(il, kl)) + W2xyz5(il, kl) = ccni2D(il, kl) * pst2Dn(il) * dsigm1(kl) & + + gravit * xtmn * (ccni2D(il, kl - 1) * & + vi(il, kl - 1) * rolv2D(il, kl - 1) & + - ccni2D(il, kl) * vi(il, kl) * rolv2D(il, kl)) + enddo + enddo + + do il = 1, klon + W2xyz1(il, mzhyd) = qi2D(il, mzhyd) * & + pst2Dn(il) * dsigm1(mzhyd) & + - gravit * xtmn * qi2D(il, mzhyd) * & + vi(il, mzhyd) * rolv2D(il, mzhyd) + W2xyz5(il, mzhyd) = ccni2D(il, mzhyd) * & + pst2Dn(il) * dsigm1(mzhyd) & + - gravit * xtmn * ccni2D(il, mzhyd) * & + vi(il, mzhyd) * rolv2D(il, mzhyd) + enddo + + do kl = mzhyd, klev + do il = 1, klon + qi2D(il, kl) = max(0., W2xyz1(il, kl) / & + (pst2Dn(il) * dsigm1(kl))) + ccni2D(il, kl) = max(0., W2xyz5(il, kl) / & + (pst2Dn(il) * dsigm1(kl))) + enddo + enddo + + enddo + endif + + ! Fractional Cloudiness ! Guess may be computed (Ek&Mahrt91 fracSC=.T.) + ! ====================== ! Final value computed below + + ! #if(sc) + ! if (fracld.and..not.fracSC) then + ! #endif + if(itPhys == ntHyd2) then + if(fracld) then + if(fraCEP) then + ! ECMWF Large Scale Cloudiness + ! ---------------------------- + do kl = mzhyd, klev + do il = 1, klon + cfra2D(il, kl) = (qi2D(il, kl) + qw2D(il, kl) & + + qs2D(il, kl) * 0.33 & + * (1. - min(1., exp((tair2D(il, kl) - 258.15) * & + 0.1)))) / (0.02 * qvsw2D(il, kl)) + cfra2D(il, kl) = min(1.000, cfra2D(il, kl)) + cfra2D(il, kl) = max(0.001, cfra2D(il, kl)) & + * max(0., sign(1., qi2D(il, kl) + qw2D(il, kl) & + + qs2D(il, kl) - 3.E-9)) + enddo + enddo + else + ! XU and Randall 1996, JAS 21, p.3099 (4) + ! ---------------------------- + do kl = mzhyd, klev + do il = 1, klon + qvs_wi = qvsw2D(il, kl) +#if(wi) + qvs_wi = max(eps9, ((qi2D(il, kl) + qs2D(il, kl)) * qvsi2D(il, kl) & + + qw2D(il, kl) * qvsw2D(il, kl)) / & + max(eps9, qi2D(il, kl) + qs2D(il, kl) + qw2D(il, kl))) +#endif + relhum = min(relCri, max(qv2D(il, kl), qv_MIN) & + / qvs_wi) + argexp = ((relCri - relhum) * qvs_wi)**0.49 + argexp = min(100. * (qi2D(il, kl) + qw2D(il, kl) & + + qs2D(il, kl) * 0.33 & + * (1. - min(1., exp((tair2D(il, kl) - 258.15) * & + 0.1)))) / & + max(eps9, argexp), argmax) + + cfra2D(il, kl) = (relhum**0.25) * (1. - exp(-argexp)) + enddo + enddo + endif + else + ! #if(sc) + ! else if (.not.fracld) then + ! #endif + do kl = mzhyd, klev + do il = 1, klon + qcloud = qi2D(il, kl) + qw2D(il, kl) + if(qcloud > eps9) then + + ! cfra2D(il,kl) = 1.0 if qcloud > eps9 + ! cfra2D(il,kl) = 0.0 otherwise + signQW = sign(unun, qcloud - eps9) + cfra2D(il, kl) = max(zero, signQW) + + endif + enddo + enddo + endif + endif +#if(EW) + ! Vertically Integrated Energy and Water Content + ! ============================================== + do il = 1, klon + ! Vertical Integrated Energy and Water Content + enr21D(il) = 0.d0 + wat21D(il) = 0.d0 + + do kl = 1, klev + enr21D(il) = enr21D(il) & + + (tair2D(il, kl) & + - (qw2D(il, kl) + qr2D(il, kl)) * r_LvCp & + - (qi2D(il, kl) + qs2D(il, kl)) * r_LsCp) * dsigm1(kl) + wat21D(il) = wat21D(il) & + + (qv2D(il, kl) & + + qw2D(il, kl) + qr2D(il, kl) & + + qi2D(il, kl) + qs2D(il, kl)) * dsigm1(kl) + enddo + + ! wat21D [m] contains implicit factor 10**3 [kPa-->Pa] /ro_Wat + enr21D(il) = enr21D(il) * pst2Dn(il) * grvinv + wat21D(il) = wat21D(il) * pst2Dn(il) * grvinv + + enddo +#endif +#if(WH) + ! OUTPUT + ! ====== + if(mod(minuGE, 6) == 0 .and. jsecGE == 0 .and. ilmm > 0) then + write(6, 1030) jhlr2D(ilmm), minuGE, jsecGE, itexpe, imm, jmm + 1030 format(//, i4, 'LT', i2, 'm', i2, 's (iter.', i6, ') / Pt.(', 2i4, ')', & + /, ' ==========================================') + write(6, 1031)(kl, 0.1019d0 * gplv2D(ilmm, kl), qv2D(ilmm, kl), & + (10.**3) * qiold(kl), (10.**3) * qi2D(ilmm, kl), & + (10.**3) * wihm1(kl), (10.**3) * wihm2(kl), (10.**3) * wicnd(kl), & + (10.**3) * widep(kl), (10.**3) * wisub(kl), (10.**3) * wimlt(kl), kl = mzhyd, klev) + 1031 format(/, & + ' | Water Vapor | Cloud Ice, Time n & n+1', & + ' Cloud Ice Nucleation Processes |', & + ' Bergeron Sublimation Melting ', & + /, ' k z[m] | qv [g/kg] | qi_n [g/kg] qi_n+[g/kg]', & + ' QiHm1[g/kg] QiHm2[g/kg] QiCnd[g/kg] |', & + ' QiDep[g/kg] QiSub[g/kg] QiMlt[q/kg]', & + /, '------------+--------------+-------------------------', & + '-------------------------------------+', & + '-------------------------------------', & + /, (i3, f8.1, ' | ', f12.6, ' | ', 2f12.6, 3d12.4, ' | ', 3d12.4)) + + write(6, 1032)(kl, 0.1019d0 * gplv2D(ilmm, kl), & + (10.**3) * W2xyz4(ilmm, kl), (10.**3) * qs2D(ilmm, kl), & + (10.**3) * wsaut(kl), (10.**3) * wsaci(kl), (10.**3) * wsacw(kl), & + (10.**3) * wiacr(kl), (10.**3) * wsacr(kl), (10.**3) * wssub(kl), vs(ilmm, kl), & + kl = mzhyd, klev) + 1032 format(/, & + ' | Snow Flakes, Time n&n+1 Autoconver. |', & + ' Accretion Processes ===> Snow Flakes |', & + ' Sublimation | Term.F.Vel', & + /, ' k z[m] | qs_n [g/kg] qs_n+[g/kg] Qsaut[g/kg] |', & + ' Qsaci[g/kg] Qsacw[g/kg] Qiacr[g/kg] Qsacr[g/kg] |', & + ' QsSub[g/kg] | vs [m/s]', & + /, '------------+--------------------------------------+', & + '--------------------------------------------------+', & + '--------------+-----------', & + /, (i3, f8.1, ' | ', 2f12.6, e12.4, ' | ', 4d12.4, ' | ', e12.4, & + ' | ', f10.6)) + write(6, 1033)(kl, 0.1019d0 * gplv2D(ilmm, kl), tair2D(ilmm, kl), & + (10.**3) * qwold(kl), (10.**3) * qw2D(ilmm, kl), & + (10.**3) * wwevp(kl), 1.d2 * cfra2D(ilmm, kl), kl = mzhyd, klev) + 1033 format(/, & + /, ' | Temperat.| Cloud Water, Time n&n+1', & + ' Condens/Evp | Cloud ', & + /, ' k z[m] | T [K] | qw_n [g/kg] qw_n+[g/kg]', & + ' QwEvp[g/kg] | Fract.', & + /, '------------+----------+-------------------------', & + '-------------+-------', & + /, (i3, f8.1, ' | ', f8.3, ' | ', 2f12.6, e12.4, ' | ', f5.1)) + + write(6, 1034)(kl, 0.1019d0 * gplv2D(ilmm, kl), & + (10.**3) * W2xyz3(ilmm, kl), (10.**3) * qr2D(ilmm, kl), & + (10.**3) * wraut(kl), (10.**3) * wracw(kl), (10.**3) * wraci(kl), & + (10.**3) * wracs(kl), (10.**3) * wrevp(kl), (10.**3) * wsfre(kl), vr(ilmm, kl), & + kl = mzhyd, klev) + 1034 format(/, & + /, ' | Rain Drops, Time n&n+1 Autoconver. |', & + ' Accretion Processes ===> Rain Drops |', & + ' Evaporation Freezing | Term.F.Vel', & + /, ' k z[m] | qr_n [g/kg] qr_n+[g/kg] Qraut[g/kg] |', & + ' Qracw[g/kg] Qraci[g/kg] Qracs[g/kg] |', & + ' QrEvp[g/kg] QsFre[g/kg] | vr [m/s]', & + /, '------------+--------------------------------------+', & + '--------------------------------------+', & + '--------------------------+-----------', & + /, (i3, f8.1, ' | ', 2f12.6, e12.4, ' | ', 3d12.4, ' | ', 2d12.4, & + ' | ', f10.6)) + + do kl = mzhyd, klev + wihm1(kl) = 0.d0 + wihm2(kl) = 0.d0 + wicnd(kl) = 0.d0 + widep(kl) = 0.d0 + wisub(kl) = 0.d0 + wimlt(kl) = 0.d0 + wwevp(kl) = 0.d0 + wraut(kl) = 0.d0 + wsaut(kl) = 0.d0 + wracw(kl) = 0.d0 + wsacw(kl) = 0.d0 + wsaci(kl) = 0.d0 + wraci(kl) = 0.d0 + wiacr(kl) = 0.d0 + wsacr(kl) = 0.d0 + wracs(kl) = 0.d0 + wrevp(kl) = 0.d0 + wssub(kl) = 0.d0 + wsmlt(kl) = 0.d0 + wsfre(kl) = 0.d0 + enddo + endif +#endif + +#if(EW) + ! Vertical Integrated Energy and Water Content: OUTPUT + ! ==================================================== + if(ilmez > 0) then + waterb = wat21D(ilmez) - wat11D(ilmez) - watf1D(ilmez) + write(6, 606) itexpe, & + enr01D(ilmez), (10.**3) * wat01D(ilmez), & + mphy2D(ilmez), & + enr11D(ilmez), (10.**3) * wat11D(ilmez), & + enr21D(ilmez), (10.**3) * wat21D(ilmez), & + (10.**3) * watf1D(ilmez), & + (10.**3) * waterb + 606 format(i9, ' Before mPhy: E0 =', f12.6, ' W0 = ', & + f9.6, 3x, a20, 3x, & + 9x, ' Before Prec: E1 =', f12.6, ' W1 = ', f9.6, & + 9x, ' After Prec: E2 =', f12.6, ' W2 = ', f9.6, & + ' W Flux =', f9.6, & + ' Div(W) =', e9.3) + endif +#endif + if(jmmMAR == 0 .and. jssMAR == 0) then + IO_loc = IO_gen + 2 + do io = io1, io5 + if(io > 0) then + il = ioutIO(io) + if((itexpe > 0 .and. jmmMAR == 0 .and. jssMAR == 0 .and. & + ((IO_loc >= 4 .and. jhurGE == 0) .or. & + (IO_loc >= 5 .and. mod(jhurGE, 3) == 0) .or. & + (IO_loc >= 6))) .or. IO_loc >= 7) then + ! *********** + !cCA call TIMcor(i, j) + ! *********** + !cCA write(4, 1037) jdplus, mmplus, jhlr2D(il), minuGE, & + !cCA igrdIO(io), jgrdIO(io) + !cCA1037 format(' Ice-Crystal mPhy ', & + !cCA i2, '/', i2, 1x, i2, 'h', i2, 'LT', & + !cCA ' -- Grid Point (', i5, ',', i5, ')' // & + !cCA ' =================================' // & + !cCA '=========================' // & + !cCA ' | z [m] | T [K] | qi[g/kg] |' // & + !cCA ' Ni [m-3] | Ni0[m-3] | vi [m/s] | qs[g/kg] |' // & + !cCA '-----+---------+--------+----------+' // & + !cCA '----------+----------+----------+----------+') + do kl = mzhyd, klev + write(4, 1038) kl, gplv2D(il, kl) * grvinv, tair2D(il, kl), & + qi2D(il, kl) * (10.**3), & + ccni2D(il, kl), W2xyz2(il, kl), vi(il, kl), & + qs2D(il, kl) * (10.**3) + enddo + 1038 format((i4, ' |', f8.1, ' |', f7.2, ' |', f9.6, ' |', & + 2(d9.3, ' |'), 2(f9.6, ' |'))) + endif + endif + enddo + IO_loc = IO_gen + endif + +#if(WH) + ilmm = ilmmi +#endif + ! Latent Heat Release + ! =================== + do kl = mzhyd, klev + do il = 1, klon + pkt0 = pkta2D(il, kl) + pkta2D(il, kl) = tair2D(il, kl) / pk2D(il, kl) + hlat2D(il, kl) = tair2D(il, kl) * (1.d0 - pkt0 / pkta2D(il, kl)) & + / xt + enddo + enddo + + ! Limits on Microphysical Variables + ! ================================= + if(itPhys == ntHyd2) then + do kl = 1, max(1, mzhyd - 1) + do il = 1, klon + qr2D(il, mzhyd) = qr2D(il, mzhyd) + qr2D(il, kl) + qw2D(il, kl) +#if(AC) + qs2D(il, mzhyd) = qs2D(il, mzhyd) + qs2D(il, kl) + qi2D(il, kl) +#else + ! cXF BUGBUG 19/08/2022 + qs2D(il, mzhyd) = qs2D(il, mzhyd) + qs2D(il, kl) + qi2D(il, kl) + & + (qv2D(il, kl) - min(qv2D(il, kl), qvsi2D(il, kl))) +#endif + ccni2D(il, mzhyd) = ccni2D(il, mzhyd) + ccni2D(il, kl) + enddo + enddo + + do kl = 1, max(1, mzhyd - 1) + do il = 1, klon + qv2D(il, kl) = max(qv2D(il, kl), qv_MIN) + qv2D(il, kl) = min(qv2D(il, kl), qvsi2D(il, kl)) ! mass loss + qw2D(il, kl) = zero + qi2D(il, kl) = zero + ccni2D(il, kl) = zero + qr2D(il, kl) = zero + qs2D(il, kl) = zero + snf2D(il, kl) = zero + sbl2D(il, kl) = zero + dep2D(il, kl) = zero + rnf2D(il, kl) = zero + evp2D(il, kl) = zero + smt2D(il, kl) = zero + qssbl2D(il, kl) = zero + enddo + enddo + + do kl = mzhyd, klev + do il = 1, klon + qw2D(il, kl) = max(zero, qw2D(il, kl)) + qi2D(il, kl) = max(zero, qi2D(il, kl)) + ccni2D(il, kl) = max(zero, ccni2D(il, kl)) + qr2D(il, kl) = max(zero, qr2D(il, kl)) + qs2D(il, kl) = max(zero, qs2D(il, kl)) + snf2D(il, kl) = max(zero, snf2D(il, kl)) + sbl2D(il, kl) = max(zero, sbl2D(il, kl)) + dep2D(il, kl) = max(zero, dep2D(il, kl)) + rnf2D(il, kl) = max(zero, rnf2D(il, kl)) + evp2D(il, kl) = max(zero, evp2D(il, kl)) + smt2D(il, kl) = max(zero, smt2D(il, kl)) + qssbl2D(il, kl) = max(zero, qssbl2D(il, kl)) + enddo + enddo + + do kl = 1, klev + do il = 1, klon + W2xyz1(il, kl) = 0.d0 + W2xyz2(il, kl) = 0.d0 + W2xyz3(il, kl) = 0.d0 + W2xyz4(il, kl) = 0.d0 + W2xyz5(il, kl) = 0.d0 + W2xyz6(il, kl) = 0.d0 + W2xyz7(il, kl) = 0.d0 + W2xyz8(il, kl) = 0.d0 + enddo + enddo + endif + return +endsubroutine HYDmic diff --git a/MAR/code_mar/inigen.f90 b/MAR/code_mar/inigen.f90 new file mode 100644 index 0000000000000000000000000000000000000000..dd2e32ab48dd42adf730f20f918623f4d2431723 --- /dev/null +++ b/MAR/code_mar/inigen.f90 @@ -0,0 +1,2038 @@ +#include "MAR_pp.def" +subroutine inigen + ! +------------------------------------------------------------------------+ + ! | MAR INPUT 5-10-2020 MAR | + ! | subroutine inigen set up MAR Initialization Procedure | + ! | | + ! +------------------------------------------------------------------------+ + +#if(AO) + use mod_oasis + ! mar_module : TANGO modules + use mar_module +#endif + + ! +--Global Variables + ! + ================ + use marctr + use marphy + use mardim + use margrd + use mar_ge + use marsnd + use mar_dy + use mar_lb + use mar_ub + use marsib + use mar_te + use mar_tu + use mar_fi + use mar_ra + use mar_hy + use mar_ca + use mar_pb + use mar_io + use marssn + use mar_sl +#if(NH) + use mar_nh +#endif +#if(Di) + ! include 'MAR_DI.inc' #cCA +#endif +#if(TC) + use mar_tc +#endif +#if(AO) + use mar_ao + use mar_tv +#endif +#if(PO) + use mar_po +#endif + use mar_sv +#if(BS) + use mar_bs +#endif +#if(OL) + use mar_ol +#endif +#if(iso) + use mariso, only: iso_init_type, qvDY_iso, qvapSL_iso, & + dqv_CA_iso, dqw_CA_iso, dqi_CA_iso, & + drr_CA_iso, dss_CA_iso, dsn_CA_iso, & + rainCA_iso, snowCA_iso, & + qiHY_iso, qsHY_iso, qwHY_iso, & + qrHY_iso, rainHY_iso, rai0HY_iso, & + snowHY_iso, sno0HY_iso, sfa0HY_iso, crysHY_iso, & + SLuqs_iso, SLuqsl_iso +#endif + + implicit none + +#if(AO) + character * 100 filein + character * 3 mxc, myc + logical file_exists +#endif + + ! +--Local Variables and DATA + ! + ======================== + integer i, j, k, m + external zext + integer zext + logical zoro + logical verti0 + integer itever, itexpe2 +#if(NH) + integer iyrONH, mmaONH, jdaONH, jhuONH +#endif + integer iyrCVA, mmaCVA, jdaCVA, jhuCVA + integer iyrHYD, mmaHYD, jdaHYD, jhuHYD +#if(TC) + integer iyrTCA, mmaTCA, jdaTCA, jhuTCA +#endif + integer iyrTUR, mmaTUR, jdaTUR, jhuTUR + integer iyrSOL, mmaSOL, jdaSOL, jhuSOL +#if(PO) + integer iyrPOL, mmaPOL, jdaPOL, jhuPOL +#endif + integer imezdy, jmezdy, mzabs1, itizon + integer lo_CAU, ipri, iv_ini, n, isl + + ! +--Modified Time Step + ! + ~~~~~~~~~~~~~~~~~~ + integer YYtmp, MMtmp, DDtmp + real dtdom, zmin_0, aavu_0, bbvu_0, ccvu_0, ps_sig +#if(HF) + real hham, nham, hhac, thac +#endif + real aladyn, alodyn, gradTz, rhcrit, tstart + real sh2(mx, my), sh3(mx, my, mw - 1) + character * 3 swich(0:1) + data swich/'OFF', 'ON '/ + data ps_sig/100./ + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ INITIALISATION of the DOMAIN characterISTICS +++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + open(unit=1, status='old', file='MARdom.dat') + rewind 1 + read(1, 141) explIO +141 format(a3) + read(1, 145) GElat0, GElon0, GEddxx + read(1, 1425) mma0GE, jda0GE, jhu0GE, itizon, iyr0GE +1425 format(4i4, i4) + read(1, 1426) imez, jmez, maptyp, GEtrue +1426 format(3i4, 28x, e13.6) + read(1, 1427) igrdIO +1427 format(5i4) + read(1, 1427) jgrdIO + read(1, 1427) IO_gen + IO_loc = IO_gen + read(1, 1427) mxw1IO, mxw2IO, ixw_IO + read(1, 1427) myw1IO, myw2IO, iyw_IO + read(1, 1427) mzw1IO, mzw2IO, izw_IO + ! kkatIO, kmidIO : For output on NetCDF Files: + ! Assumed Levels of Bound.Layer / Mid Troposph. + read(1, 1427) kkatIO, kmidIO + read(1, 145) dx, dy, dtdom +145 format(4d13.6) + read(1, 1450) verti0 +1450 format(l3) + ! ptopDY: model top pressure + read(1, 145) ptopDY + read(1, 145) zmin_0, aavu_0, bbvu_0, ccvu_0 + z__SBL = zmin_0 + read(1, 145) FIslot, FIslou, FIslop, FIkhmn + read(1, 145) TUkhff, TUkhmx + TUkhmx = TUkhmx * dtdom / dt + read(1, 145) tequil, dtquil + read(1, 145) zs_SL, zn_SL, zl_SL, cs2SL + read(1, 145) sst_SL + read(1, 145) dtagSL + read(1, 145) w20SL, wg0SL, wk0SL, wx0SL + read(1, 1430) +1430 format(1x) + read(1, 143) isolSL +143 format((10i13)) + read(1, 1430) + read(1, 1432) sh2 + if(itexpe <= 1) then + sh = sh2 + endif +1432 format((10d13.6)) + read(1, 1430) + read(1, 1432) SL_z0 + read(1, 1430) + read(1, 1432) SL_r0 + read(1, 1430) + read(1, 1432) ch0SL + read(1, 1430) + read(1, 1432) rsurSL + read(1, 1430) + + ! +--Underlaying Surface Albedo (to which Surface alb0SL is set, + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~ unless NOT 1st Run, itexpe /= 0) + read(1, 1432) albsSL + alb0SL = albsSL + read(1, 1430) + read(1, 1432) eps0SL + read(1, 1430) + read(1, 1432) d1_SL +#if(po) + read(1, 1430) + read(1, 1432) uocnPO + read(1, 1430) + read(1, 1432) vocnPO + read(1, 1430) + read(1, 1432) aPOlyn +#endif + if(geoNST) then + read(1, 1430) + read(1, 1432)((GElonh(i, j), i=1, mx), j=1, my) + read(1, 1430) + read(1, 1432)((GElatr(i, j), i=1, mx), j=1, my) + read(1, 1430) + read(1, 1432) sigma + + ! degrees --> radians + GElatr = GElatr * degrad + ! degrees --> hours + GElonh = GElonh / 15. + + do k = 1, mz + zsigma(k) = -(sst_SL / 0.0065) * ((1.e0 + (sigma(k) - 1.) & + * (1.e2 / ps_sig))**(RDryAi * 0.0065 / gravit) - 1.) + enddo + + if(IO_gen >= 2) then + write(21, 130)(sigma(k), k=1, mz) +130 format(/, ' Sigma Levels :', /,(1x, 15f8.4)) + write(21, 131)(zsigma(k), k=1, mz) +131 format(/, ' Altitude Levels :', /,(1x, 15f8.1)) + endif + endif + +#if(OR) + ! +--Orography Roughness + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mw + do j = 1, my + do i = 1, mx + SLzoro(i, j, k) = SL_z0(i, j, k) + enddo + enddo + enddo + zoro = .true. + zoro = .false. + if(zoro) STOP '@#! Uses Andreas parameterization of z0_h with z0_oro' +#endif + close(unit=1) + + ! + *** *CL* Read subgrid topography *** + if(mw == 5) then + open(unit=555, status='old', file='MARdom2.dat') + print *, '***************************' + print *, '* Read of MARdom2.dat *' + print *, '***************************' + read(555, '(f12.6)') sh3 + if(itexpe <= 1) then + do i = 1, mx + do j = 1, my + do k = 1, nsx - 1 + sh_int(i, j, k) = sh3(i, j, k) + enddo + sh_int(i, j, nsx) = sh(i, j) + enddo + enddo + endif + close(unit=555) + endif + +#if(AO) + ! + *** AO_CK *** + ! Read Weight file (combine SSC from reanalysis and ocean model) *** + print *, "check if coupling AO:", coupling_ao + if(coupling_ao) then + write(mxc, '(i3)') mx + if(mx < 100) write(mxc, '(i2)') mx + write(myc, '(i3)') my + if(my < 100) write(myc, '(i2)') my + filein = 'TROUPLE-'//trim(mxc)//'x'//trim(myc)//'.cdf' + inquire(file=trim(filein), exist=file_exists) + if(file_exists) then + call CF_READ2D(trim(filein), 'WEIGHT', 1, mx, my, 1, weightao) + print *, 'Read ', trim(filein) + else + print *, 'Define TROUPLE file before coupling!' + stop + endif + do i = 1, mx + do j = 1, my + ! NO NEMO field in the first 3 pixels from the relaxation zone + ! They MUST also be considered as LAND for OASIS + if(i <= 3) weightao(i, j) = 1. + ! even if they are ocean + if(j <= 3) weightao(i, j) = 1. + if(i >= mx - 2) weightao(i, j) = 1. + if(j >= my - 2) weightao(i, j) = 1. + enddo + enddo + ! USING variable from coupling + ! 1 = rean everywhere 0=NEMO everywhere + ! = weightao NEMO/REANALYSIS + ! weightao_sst : sst + weightao_sst = weightao + ! weightao_sic : SIC + weightao_sic = weightao + ! weightao_st : Sea ice/ Snow on ice surface temp + weightao_st = weightao + ! weightao_al : Sea/Snow on ice Albedo + weightao_al = weightao + ! weightao_sit : Sea ice thickness + weightao_sit = weightao + ! weightao_snt : Snow on ice thickness + weightao_snt = weightao + print *, "If doubt(s) on coupling, check weightao definition" + endif +#endif + + ! +--SVAT IO + ! + ------- + if(vegmod .and. .not. reaVAR) then + ! + ****** + call svasav('read') + ! + ****** + endif + + ! +--Time Discretisation + ! + =================== + + ! +--Slow Dynamics + ! + ------------- + idt = dt + jdt = (dt - idt) * 100. + + ! +--Fast Dynamics + ! + ------------- + dtfast = dt / (ntFast + 1) + + ! +--Subgrids + ! + -------- + if(dtDiff < dt) then + if(dtDiff > 0.) then + ! ntDiff : Number of Subgrid Scale Steps for 1 Dynamical Step + ntDiff = dt / dtDiff + ! dtDiff : Calibrated Subgrid Scale Time Step + dtDiff = dt / ntDiff + jtDiff = 1 + else + ntDiff = 1 + jtDiff = nboucl * nprint + 1 + endif + else + ! jtDiff : Number of Dynamical Steps for 1 Subgrid Scale Step + jtDiff = dtDiff / dt + jtDiff = max(jtDiff, 1) + ! dtDiff : Calibrated Subgrid Scale Time Step + dtDiff = dt * jtDiff + ntDiff = 1 + endif + if(dtDiff > 0.) then + !XF + ntDiff = 1 + dtDiff = dt + jtDiff = 1 + !XF + endif + + ! +--Surface Physics + ! + ----------------- + if(dtPhys < dt) then + ! ntPhys : Number of Surface Phys. Steps for 1 Dynamical Step + ntPhys = dt / dtPhys + ! dtPhys : Calibrated Surface Phys. Time Step + dtPhys = dt / ntPhys + jtPhys = 1 + else + ! jtPhys : Number of Dynamical Steps for 1 Surface Phys. Step + jtPhys = dtPhys / dt + jtPhys = max(jtPhys, 1) + ! dtPhys : Calibrated Surface Physics Time Step + dtPhys = dt * jtPhys + ntPhys = 1 + endif + + !XF + ntPhys = 1 + dtPhys = dt + jtPhys = 1 + !XF + + ! +--Radiation Physics + ! + ----------------- + if(dtRadi < dt) then + write(6, *) ' NO Split Time Differ. on dtRadi !!#�@|#@&##!! EMERGENCY EXIT ' + STOP + ! ntRadi : Number of Surface Phys. Steps for 1 Dynamical Step + ntRadi = dt / dtRadi + ! dtRadi : Calibrated Surface Phys. Time Step + dtRadi = dt / ntRadi + jtRadi2 = 1 + else + ! jtRadi : Number of Dynamical Steps for 1 Surface Phys. Step + jtRadi2 = dtRadi / dt + ! dtRadi : Calibrated Surface Physics Time Step + dtRadi = dt * jtRadi2 + ntRadi = 1 + endif + + ! +--Other Constants + ! + --------------- + + t2SLtn = 1.0 / dtPhys - 0.50 / cs2SL + t2SLtd = 1.0 / dtPhys + 0.50 / cs2SL + ! fracSL : Fractional Time (Blowing Snow Srf Flux Computation) + ! Factor 1.8d3 is the Turbulence Time Scale (1/2 h) + ! Factor 0.6d3 is used. + fracSL = dt / 0.6e3 + fracSL = min(unun, fracSL) + + ! +--Coriolis Parameter + ! + ================== + ! fcorDY : Coriolis Parameter (Indicative Value) + fcorDY(imez, jmez) = 2.0 * earthv * sin(GElat0 * degrad) + + ! +--OUTPUT + ! + ====== + if(IO_loc >= 1) then + write(21, 600) explIO, GElat0, GElon0, & + jda0GE, mma0GE, jhu0GE, itizon, & + minuGE, jsecGE, fcorDY(imez, jmez), cz0_GE +600 format(/, ' SIMULATION ', a3, /, ' ++++++++++++++', //, & + ' Lat.', f5.1, 3x, 'Long.', f6.1, 4x, 'Date :', i3, '-', i2, & + ' / ', i2, ' h.UT +(', i3, ')LT', i3, ' min.', i3, ' sec.', & + //, ' f(Coriolis) = ', e12.5, & + /, ' cos(Z) min : ', e12.5) + write(21, *) ' CODE STATUS +++++++++++' +#if(HF) + write(21, *) '#HF Initialisation of Huang and Lynch 1993 (HAMMING Filter)' +#endif +#if(NH) + write(21, *) '#NH DYNAMICS: Non-Hydrost. Code (adapted from Laprise, 1992)' +#endif +#if(ON) + write(21, *) '#ON DYNAMICS: Non-Hydrost. Corr. (Weisman &al.1997 MWR p.541)' +#endif +#if(DD) + write(21, *) '#DD DYNAMICS: Mass Divergence Damper (Skamarock &Klemp, 1992)' +#endif + write(21, *) '#VN DYNAMICS: Variable Number of Leap-Frog Loops (Fast Waves)' +#if(IL) + write(21, *) '#IL DYNAMICS: PGF: SBL Fraction with Air = Surface Temperat.' +#endif +#if(GE) + write(21, *) '#GE DYNAMICS: Geographic Coordinates may be red in MARdom.dat' +#endif +#if(CC) + write(21, *) '#CC DYNAMICS: Constant Coriolis Parameter = fcorDY(imez,jmez)' +#endif +#if(HE) + write(21, *) '#HE DYNAMICS: NORLAM Vertical Discretisation(29 Levels)' +#endif +#if(lm) + write(21, *) '#lm DYNAMICS: LMDZ Model Vertical Discretisation(11 Levels)' +#endif +#if(PA) + write(21, *) '#PA DYNAMICS: Parish Model Vertical Discretisation(10 Levels)' +#endif +#if(PV) + write(21, *) '#PV DYNAMICS: Large Scale Flow conserves Pot. Vort. (2D ONLY)' +#endif +#if(pv) + write(21, *) '#pv DYNAMICS: Large Scale Flow conserves Pot. Temp. (2D ONLY)' +#endif +#if(UW) + write(21, *) '#UW DYNAMICS: Advect. 3rd Accurate in Space Upstream Scheme ' +#endif +#if(UP) + write(21, *) '#UP DYNAMICS: Vertical 1st Accurate in Space Upstream Scheme ' +#endif +#if(ZU) + write(21, *) '#ZU DYNAMICS: Vertical Advection: Cubic Spline (4th accurate)' +#endif +#if(ZO) + write(21, *) '#ZO DYNAMICS: Vertical Advection: Cubic Spline (+Open SrfBC)' +#endif +#if(UR) + write(21, *) '#UR DYNAMICS: Vertical Advection/ Upper Radiating Bound.Cond.' +#endif +#if(EP) + write(21, *) '#EP DYNAMICS: Lateral Sponge included in Horizontal Filter' +#endif +#if(RB) + write(21, *) '#RB DYNAMICS: Lateral BC: Carpenter(1982) Sommerfeld Modified' +#endif + write(21, *) '#DA DYNAMICS: Lateral BC: Davies (1976) BC on Wind // Lat.B. ' +#if(da) + write(21, *) '#da DYNAMICS: Lateral BC: Davies (1976) BC: K, nu computed. ' +#endif +#if(FB) + write(21, *) '#FB DYNAMICS: Lateral BC: Fixed in Horizontal Cubic Spline ' +#endif +#if(OB) + write(21, *) '#OB DYNAMICS: Lateral BC: Zero Gradient ' +#endif +#if(OG) + write(21, *) '#OG DYNAMICS: Lateral BC: (Left) NO Nudging if relaxg=.false.' +#endif +#if(ob) + write(21, *) '#ob DYNAMICS: Lateral BC: Zero Gradient (Subroutine LBC000) ' +#endif + write(21, *) '#RF DYNAMICS: Top BC: Rayleight Friction in the Top Sponge ' +#if(Di) + write(21, *) '#Di DYNAMICS: Top BC: Dirichlet (fixed) ' +#endif +#if(V) + write(21, *) '#V+ DYNAMICS: Top BC: Von Neuman (prescrib.non zero-gradient)' +#endif +#if(PS) + write(21, *) '#PS DYNAMICS: Domain Averaged Pressure Thickness maintained' +#endif +#if(DY) + write(21, *) '#DY DYNAMICS: OUTPUT: Components lowest Level Forces Balance' +#endif +#if(_PE) + write(21, *) '_PE DIFFUSION:(%Grad.) Slope USE+ _HH or (_HH #CR)' +#endif +#if(PE) + write(21, *) '#PE DIFFUSION:(%Deform.) Slope USE+ #DF or (#DF #DC #CR)' +#endif +#if(_HH) + write(21, *) '_HH DIFFUSION:(%Grad.) Vert.Cor. USE+ _PE ' +#endif +#if(DF) + write(21, *) '#DF DIFFUSION:(%Deform.) Vert.Cor. USE+ #PE or (#PE #DC #CR)' +#endif +#if(DC) + write(21, *) '#DC DIFFUSION:(%Deform.) USE+ (#DF #PE #CR)' +#endif +#if(CR) + write(21, *) '#CR DIFFUSION: Cross Corr. USE+ (_PE _HH) or (#DF #PE #DC)' +#endif +#if(FE) + write(21, *) '#FE FILTERING: Digital Filtering of TKE ' +#endif +#if(fe) + write(21, *) '#fe FILTERING: Digital Filtering of TKE is not vectorized ' +#endif +#if(FO) + write(21, *) '#FO FILTERING: Digital Filtering of TKE (zero gradient at LB)' +#endif +#if(KS) + write(21, *) '#KS FILTERING: Upper Sponge is solved by horizontal filtering' +#endif +#if(BR) + write(21, *) '#BR TURBULENCE: 2.5 Level 2nd Order (Brasseur 1997)' +#endif + write(21, *) '#CA CONVECTIVE Adjustment (general Set Up) ' +#if(cA) + write(21, *) '#cA CONVECTIVE Adjustment (no Double Counting Set Up) ' +#endif + write(21, *) '#ca CONVECTIVE Adjustment (no Vector Set Up)NV' +#if(FC) + write(21, *) '#FC CONVECTIVE Adjustment (Fritsch & Chappell 1980 Set Up) ' +#endif +#if(fc) + write(21, *) '#fc CONVECTIVE Adjustment (Fritsch & Chappell 1980 Set Up)NV' +#endif +#if(kf) + write(21, *) '#kf CONVECTIVE Adjustment (Kain & Fritsch 1990 Improvm.)' +#endif +#if(IT) + write(21, *) '#IT CONVECTIVE Adjustment (over 5km Adiabatics Starting Pts)' +#endif +#if(AN) + write(21, *) '#AN CONVECTIVE Adjustment (Subgrid Mountain Breeze included)' +#endif +#if(WD) + write(21, *) '#WD CONVECTIVE Adjustment (Water Detrainment included)' +#endif +#if(CG) + write(21, *) '#CG CONVECTIVE Adjustment (Cloud Glaciation included)' +#endif +#if(ND) + write(21, *) '#ND CONVECTIVE Adjustment (No Precip if LevFSink<LiftCond.L)' +#endif +#if(vT) + write(21, *) '#vT CONVECTIVE Adjustment (Virtual Temperature is computed)' +#endif + write(21, *) '#PB CONVECTIVE Adjustment (Peter Bechtold 2000 Set Up) ' + write(21, *) '#pb CONVECTIVE Adjustment (Peter Bechtold 2000 Set Up)NV' +#if(KE) + write(21, *) '#KE CONVECTIVE Adjustment (Emanuel & Zivkovic 1999 Set Up) ' +#endif +#if(LE) + write(21, *) '#LE TURBULENCE: K : Louis (1979) BLM 17' +#endif +#if(Kl) + write(21, *) '#Kl TURBULENCE: K-l: Therry & Lacarrere (1983) BLM 25' +#endif +#if(PD) + write(21, *) '#PD TURBULENCE: K-e: Original Duynkerke (1988) JAS 45' +#endif + write(21, *) '#TA TURBULENCE: K-e: Dissipation + Advect.Horiz.TKE Transport' + write(21, *) '#TD TURBULENCE: K-e: Dissipation + Diffus.Horiz.TKE Transport' +#if(AV) + write(21, *) '#AV TURBULENCE: K-e: Buoyancy includes Aerosol Loading ' +#endif +#if(HR) + write(21, *) '#HR TURBULENCE: K-e: Huang & Raman (1991) BLM 55' +#endif +#if(KI) + write(21, *) '#KI TURBULENCE: K-e: Kitada (1987) BLM 41' +#endif +#if(BH) + write(21, *) '#BH TURBULENCE: K-e: Kitada (modified) USE with #KI' +#endif +#if(KC) + write(21, *) '#KC TURBULENCE: T.K.E.(mz1) := T.K.E.(mz) ' +#endif + write(21, *) '#KA TURBULENCE: T.K.E. & e(T.K.E.) Filter along the vertical ' +#if(AM) + write(21, *) '#AM TURBULENCE: u* Time Mean (BOX Moving Average) ' +#endif +#if(AT) + write(21, *) '#AT TURBULENCE: u*T* Time Mean (BOX Moving Average) ' +#endif +#if(AS) + write(21, *) '#AS TURBULENCE: u*s* Time Mean (BOX Moving Average) ' +#endif +#if(VX) + write(21, *) '#VX TURBULENCE: u*q* limited to SBL Saturat. Specif. Humidity' +#endif +#if(De) + write(21, *) '#De TURBULENCE: Top BC: Dirichlet (fixed) (ect_TE and eps_TE)' +#endif +#if(WE) + write(21, *) '#WE TURBULENCE: T.K.E. OUTPUT on File MAR.TKE ' +#endif +#if(AE) + write(21, *) '#AE TURBULENCE: Aerosols Erosion / Turbulent Diffusion Coeff.' +#endif + write(21, *) '#SY TURBULENCE: Sea Spray Parameterization (Andreas, 199x) ON' +#if(DU) + write(21, *) '#DU SBL: Univ.Funct.: Duynkerke(1991) ' +#endif +#if(BU) + write(21, *) '#BU SBL: Univ.Funct.: Businger (1973) USE with _NO OR #NO' +#endif +#if(_NO) + write(21, *) '_NO SBL: Univ.Funct.: NO Noilhan (1987) USE with #BU OR #DR' +#endif +#if(NO) + write(21, *) '#NO SBL: Univ.Funct.: Noilhan (1987) USE with #BU ' +#endif +#if(DR) + write(21, *) '#DR SBL: Univ.Funct.: Dyer (1974) USE with _NO ' +#endif +#if(LP) + write(21, *) '#LP SBL: Blowing Snow Fric. Veloc. Thr. (Li and Pomeroy 1997)' +#endif +#if(DS) + write(21, *) '#DS SBL: Blowing Snow SBL Flux (analytical Form of dq/dz)' +#endif + write(21, *) '#ZS SBL: Mom.: Roughn.Length= F(u*) Chamberlain (1983), Sea ' +#if(ZN) + write(21, *) '#ZN SBL: Mom.: Roughn.Length= F(u*) Shao & Lin (1999), Snow ' +#endif +#if(ZA) + write(21, *) '#ZA SBL: Mom.: Roughn.Length= F(u*) Andreas &al.(2004), Snow ' +#endif +#if(RN) + write(21, *) '#RN SBL: Heat: Roughn.Length= F(u*,z0) Andreas (1987) ' +#endif + write(21, *) '#ZM SBL: M/H Roughn.Length: Box Moving Average (in Time) ' +#if(OR) + write(21, *) '#OR SBL: Orography Roughness included from SL_z0 in MARdom ' +#endif +#if(SB) + write(21, *) '#SB Surface Boundary: modified externally (from Campain Data)' +#endif + write(21, *) '#TI Turbul. Heat Surface Flux: Implicit numerical Scheme ' + write(21, *) '#QE Turbul. H2O Surface Flux: Explicit numerical Scheme ' + write(21, *) '#FI Turbul. Mom. Surface Flux: Implicit numerical Scheme ' +#if(BI) + write(21, *) '#BI Blowing Snow Surface Flux: Implicit numerical Scheme ' +#endif +#if(OL) + write(21, *) '#OL TEST: Linear Mountain Wave: Specific IO (2D ONLY)' +#endif +#if(OM) + write(21, *) '#OM TEST: (Non)Linear Mountain Wave: Specific INPUT (2D ONLY)' +#endif +#if(OS) + write(21, *) '#OS TEST: Linear Mountain Wave: Specific IO (2D ONLY)' +#endif +#if(K1) + write(21, *) '#K1 TEST: LBC: Katab. Atmos.Warming (1D ONLY)' +#endif +#if(EK) + write(21, *) '#EK TEST: EKMAN Spiral: Constant Vertical Turbul. Coefficient' +#endif +#if(CL) + write(21, *) '#CL TEST: Convective Mixed Layer Test (HS = 100 W/m2)' +#endif +#if(NL) + write(21, *) '#NL TEST: Nearly Neutral Layer Test (HS = 0 W/m2)' +#endif +#if(TC) + write(21, *) '#TC TraCer Advection-Diffusion Equation is turned ON' +#endif +#if(tc) + write(21, *) '#tc TraCer Filtering is not vectorized ' +#endif +#if(TO) + write(21, *) '#TO TraCer Open Lateral Boundary Conditions on digit.Filter' +#endif +#if(TS) + write(21, *) '#TS TraCer Tracer Deposition diagnostic is turned ON' +#endif +#if(BD) + write(21, *) '#BD TraCer Aeolian Erosion Submodel is turned ON' +#endif +#if(DV) + write(21, *) '#DV TraCer Aeolian Erosion Submodel: Air Loading by Dust ' +#endif +#if(CH) + write(21, *) '#CH Chemical Atmospheric Model may be turned ON' +#endif +#if(MV) + write(21, *) '#MV TraCer Total Mass Verification is turned ON' +#endif + write(21, *) '#HY Explicit Cloud MICROPHYSICS may be turned ON' + write(21, *) '#hy Explicit Cloud MICROPHYSICS: NO Vectorisation Optmization' +#if(HM) + write(21, *) '#HM Explicit Cloud MICROPHYSICS: Hallett-Mossop Ice Multipl. ' +#endif +#if(hm) + write(21, *) '#hm Explicit Cloud MICROPHYSICS: Hallett-Mossop Ice Mult. NV' +#endif +#if(LI) + write(21, *) '#LI Explicit Cloud MICROPHYSICS: Lin et al. (1983) Autoconv. ' +#endif +#if(BS) + write(21, *) '#BS Explicit Cloud MICROPHYSICS: Blow. *(Snow) Model ' +#endif + write(21, *) '#HV Explicit Cloud MICROPHYSICS: Air Loading by Hydrometeors ' +#if(BV) + write(21, *) '#BV Explicit Cloud MICROPHYSICS: SBL Loading by all Water Sp.' +#endif +#if(bv) + write(21, *) '#bv Explicit Cloud MICROPHYSICS: SBL Loading not vectorized ' +#endif +#if(SS) + write(21, *) '#SS Explicit Cloud MICROPHYSICS: Blow. *(Snow) Linear Model ' +#endif +#if(S0) + write(21, *) '#S0 Explicit Cloud MICROPHYSICS: Blow. *(Byrd) Linear Model ' +#endif +#if(EM) + write(21, *) '#EM Explicit Cloud MICROPHYSICS: de Montmollin Parameterizat.' +#endif +#if(BW) + write(21, *) '#BW Explicit Cloud MICROPHYSICS: Blowing Snow Statistics ' +#endif +#if(b2) + write(21, *) '#b2 Explicit Cloud MICROPHYSICS: Blowing Snow Statistics (II)' +#endif +#if(EV) + write(21, *) '#EV Explicit Cloud MICROPHYSICS: Snow Erosion Statistics ' +#endif + write(21, *) '#HW Explicit Cloud MICROPHYSICS: OUTPUT of qr,qs, qw,qi on NC' +#if(EW) + write(21, *) '#EW Explicit Cloud MICROPHYSICS: OUTPUT (Ener./Mass) (Unit 6)' +#endif +#if(WH) + write(21, *) '#WH Explicit Cloud MICROPHYSICS: OUTPUT (Unit 6)' +#endif +#if(WQ) + write(21, *) '#WQ Explicit Cloud MICROPHYSICS: OUTPUT (Full Verif) (Unit 6)' +#endif +#if(WB) + write(21, *) '#WB Explicit Cloud MICROPHYSICS: Water Conservation Controled' +#endif +#if(WW) + write(21, *) '#WW Explicit Cloud MICROPHYSICS: Water Conservation Summary ' +#endif +#if(ww) + write(21, *) '#WW Explicit Cloud MICROPHYSICS: Water Conservation Summary +' +#endif +#if(WF) + write(21, *) '#WF Explicit Cloud MICROPHYSICS: Water Conservation is Forced' +#endif +#if(HO) + write(21, *) '#HO Explicit Cloud MICROPHYSICS: Zero-Gradient Lat.Bound.Cond' +#endif +#if(MR) + write(21, *) '#MR PHYSICS: MARrad: Solar/Infrared (Laurent LI set up) ' +#endif +#if(AZ) + write(21, *) '#AZ PHYSICS: Solar : Direct Radiation: Surface Slope Impact' +#endif +#if(MM) + write(21, *) '#MM PHYSICS: Solar : Direct Radiation: Mountains Mask ON' +#endif +#if(TR) + write(21, *) '#TR PHYSICS: Solarn: Clear Sky, without Underlying Reflection' +#endif + write(21, *) '#EE PHYSICS: radCEP: ECMWF routine (cfr. JJ Morcrette) ' +#if(LL) + write(21, *) '#LL PHYSICS: radLMD: radlwsw routine (Laurent LI set up) ' +#endif +#if(ll) + write(21, *) '#ll PHYSICS: radLMD: radlwsw routine (Laurent LI set up)NV' +#endif +#if(AR) + write(21, *) '#AR PHYSICS: radLMD: radlwsw routine Interactive Terr.Aerosol' +#endif +#if(WL) + write(21, *) '#WL PHYSICS: radLMD: radlwsw routine IO (Laurent LI set up) ' +#endif +#if(SA) + write(21, *) '#SA PHYSICS: MAR Code behaves as a Stand Alone Surface Model' +#endif +#if(FR) + write(21, *) '#FR Surface Model: Force Restore (Deardorff) at least is ON' +#endif +#if(WG) + write(21, *) '#WG Soil Humidity: Force Restore (Deardorff) may be turned ON' +#endif +#if(AO) + write(21, *) '#AO COUPLING with NEMO Ocean-Sea-Ice Model using OASIS ' +#endif +#if(PO) + write(21, *) '#PO POLYNYA Model may be turned ON' +#endif +#if(FD) + write(21, *) '#FD POLYNYA Model: Sea-Ice Velocity is Free Drift ' +#endif +#if(HA) + write(21, *) '#HA POLYNYA Model: POLYNYA Surface Energy Balance: 2000 W/m2' +#endif +#if(HI) + write(21, *) '#HI POLYNYA Model: Hibler (1979) Parameteriz. of Ice Strength' +#endif +#if(CN) + write(21, *) '#CN POLYNYA Model: Prescription of a Local Avective Time Step' +#endif +#if(ST) + write(21, *) '#ST EVOLUTIVE SST (Sea Surface Temperature/Swab Ocean) ' +#endif +#if(RE) + write(21, *) '#RE PRESCRIB. SST (Sea Surface Temperature/Reynolds DATA Set)' +#endif + write(21, *) '#SN SNOW Model may be turned ON' +#if(AB) + write(21, *) '#AB SNOW Model: Interactive Albedo f(Grain) (Brun et al.1991)' +#endif +#if(AG) + write(21, *) '#AG SNOW Model: Snow Aging Col de Porte (Brun et al.1991)' +#endif + write(21, *) '#CZ SNOW Model: Zenithal Angle Correction (Segal et al.1991)' +#if(DG) + write(21, *) '#DG SNOW Model: Snow Settling when Melting | Minimum Density ' +#endif +#if(Se) + write(21, *) '#Se SNOW Model: Energy Conserv. Verific.: Summary, Output ' +#endif +#if(SE) + write(21, *) '#SE SNOW Model: Energy Conserv. Verific.: Summary, Output+ ' +#endif +#if(SF) + write(21, *) '#SF SNOW Model: Energy Conserv. Verific.: Forcing, Conduction' +#endif +#if(SW) + write(21, *) '#SW SNOW Model: Water Conserv. Verific.: Melting, Freezing ' +#endif +#if(HS) + write(21, *) '#HS SNOW Model: Hardened SNOW Pack Initialization ' +#endif +#if(MA) + write(21, *) '#MA SNOW Model: Increased polar B* Mobility (Mann et al.2000)' +#endif +#if(NP) + write(21, *) '#NP SNOW Model: Fallen Snow Density = f(V) (Kotlyakov, 1961)' +#endif + write(21, *) '#SD SNOW Model: Antarct.,Fallen Snow Density (NP must be OFF)' +#if(RU) + write(21, *) '#RU SNOW Model: Slush: Internal Run OFF of Water Excess ' +#endif +#if(GK) + write(21, *) '#GK SNOW Model: Interactive Albedo (Greuell &Konzelmann 1994)' +#endif +#if(SL) + write(21, *) '#SL SNOW Model: Interactive Albedo (Zuo &Oerlemans 1995)' +#endif +#if(SM) + write(21, *) '#SM SNOW Model: Melting/Freezing Diagnostics ' +#endif +#if(SZ) + write(21, *) '#SZ SNOW Model: Z0 Dependance on varying Sastrugi Height ' +#endif +#if(TZ) + write(21, *) '#TZ SNOW Model: Z0 (Momentum) (typical value in polar models)' +#endif +#if(CP) + write(21, *) '#CP SNOW Model: For Validation on Col de Porte Data ' +#endif +#if(GL) + write(21, *) '#GL SNOW Model: ETH-Camp & Greenland 3D simulations ' +#endif +#if(PP) + write(21, *) '#PP PROJECTION: Polar Stereographic Projection ' +#endif + write(21, *) '#TV Soil /Vegetation Variables are used ' +#if(GP) + write(21, *) '#GP Soil /Vegetation Model: LAI, GLF Variations NOT prescrib.' +#endif +#if(LN) + write(21, *) '#LN Soil /Vegetation Model: LAI(x,y,t) prescribed(MARglf.DAT)' +#endif +#if(SV) + write(21, *) '#SV Soil /Vegetation Model (Koen De Ridder) may be turned ON' +#endif +#if(SH) + write(21, *) '#SH Soil /Vegetation Model: Hapex-Sahel Vegetation DATA' +#endif +#if(V1) + write(21, *) '#V1 Soil /Vegetation Model: (KD) Vegetat. IGBP Classification' +#endif +#if(V2) + write(21, *) '#V2 Soil /Vegetation Model: (KD) Vegetat. MAR Classification' +#endif +#if(GA) + write(21, *) '#GA SISVAT: Soil Humidity Geometric Average at Layer Interfac' +#endif +#if(GF) + write(21, *) '#GF SISVAT: Gravitational Saturation Front turned ON' +#endif +#if(GH) + write(21, *) '#GH SISVAT: Gravitational Saturation Front - Horton turned ON' +#endif +#if(OP) + write(21, *) '#OP SISVAT: Interactive Sea Surface Temperature turned ON' +#endif +#if(op) + write(21, *) '#op SISVAT: SST Nudging --> prescribed values turned ON' +#endif + write(21, *) '#IP SISVAT: Sea-Ice Fraction prescribed from SMMR and SSM/I ' + write(21, *) '#SI SISVAT: Sea-Ice Fraction calculated from prescribed SST ' +#if(IA) + write(21, *) '#IA SISVAT: Sea-Ice Bottom accretion and ocean cooling ' +#endif +#if(MT) + write(21, *) '#MT SISVAT: Monin-Obukhov Theory is linearized (Garrat schem)' +#endif +#if(SR) + write(21, *) '#SR SISVAT: traces & OUTPUT a variable among called routines ' +#endif +#if(WV) + write(21, *) '#WV SISVAT: performs OUTPUT on an ASCII File (1 file each pt)' +#endif + write(21, *) '#sa SISVAT: must be pre-processed, except for stand-alone run' +#if(CS) + write(21, *) '#CS INPUT: Constant Sounding during 1st Hours (2-D ONLY)' +#endif + write(21, *) '#IB OUTPUT: Ice-Sheet Surface Mass Balance (on MARphy File )' + write(21, *) '#ID OUTPUT: Main Dependant Variables (on NetCDF File )' + write(21, *) '#UL OUTPUT: Time Dimension is UNLIMITED (on NetCDF File )' +#if(T2) + write(21, *) '#T2 OUTPUT: 2-m Air Temperature (on NetCDF File )' +#endif +#if(W6) + write(21, *) '#W6 OUTPUT, Additional: Simulation Statistics on MAR.log' +#endif +#if(w6) + write(21, *) '#w6 OUTPUT, Additional: Simulation Statistics (NH) on MAR.log' +#endif +#if(WA) + write(21, *) '#WA OUTPUT, Additional: DYNadv_ver' +#endif +#if(WR) + write(21, *) '#WR OUTPUT, Additional: INIsnd, infra, SRFmod_sno, SRFmod_pol' +#endif + write(21, *) '#vL PORTABILITY: Vectorization enhanced ' + write(21, *) '#vN PORTABILITY: Vectorization enhanced: Leap Frog Counter ' + write(21, *) '#vK PORTABILITY: Vectorization enhanced: TKE ' + write(21, *) '#vH PORTABILITY: Vectorization enhanced: Hydrological Cycle ' +#if(vB) + write(21, *) '#vB PORTABILITY: Vectorization enhanced: Blowing Snow * ' +#endif +#if(vD) + write(21, *) '#vD PORTABILITY: Vectorization enhanced: Blowing Dust . ' +#endif +#if(vR) + write(21, *) '#vR PORTABILITY: Vectorization enhanced: Sastrugi Height ' +#endif + write(21, *) '#vS PORTABILITY: Vectorization enhanced: Snow Model ' + write(21, *) '#vV PORTABILITY: Vectorization enhanced: SVAT ' + write(21, *) '#vZ PORTABILITY: Vectorization enhanced: Av.Roughness Length ' + write(21, *) '#HP PORTABILITY: Enables use of own library on Linux Syst.' + write(21, *) '#NV PORTABILITY: Vectorization is turned OFF ' +#if(iso) + write(21, *) '#iso Tracers: Water isotopes ' +#endif + write(21, 602) & + reaVAR, swich(-zext(reaVAR)), reaLBC, swich(-zext(reaLBC)), & + safVAR, swich(-zext(safVAR)), hamfil, swich(-zext(hamfil)) +602 format(//, ' OPTIONS', /, ' +++++++', /, & + /, ' reaVAR=', l2, 4x, ' => Input: Prev.Dyn.Sim.(MAR/GCM) ', a3, & + /, ' reaLBC=', l2, 4x, ' => LBC: Prev.Dyn.Sim.(MAR/GCM) ', a3, & + /, ' safVAR=', l2, 4x, ' => Saving on Files MARxxx.DAT ', a3, & + /, ' hamfil=', l2, 4x, ' => Diabatic Initialisation ', a3) +#if(HF) + if(hamfil) write(21, 603) hham, nham, hhac, thac +603 format( & + ' Hamming Filter Characteristics:', & + /, ' Time =', f11.4, '=> N(Hamming)= ', i12, & + /, ' Cutoff =', f11.4, '=> Frequency = ', f12.4, /, 1x) +#endif + rhcrit = 0.0 + tstart = 0.0 + rhcrit = rhcrHY + tstart = tim_HY + write(21, 604) & + conmas, swich(-zext(conmas)), potvor, swich(-zext(potvor)), & + brocam, swich(-zext(brocam)), turhor, swich(-zext(turhor)), & + convec, swich(-zext(convec)), & + micphy, swich(-zext(micphy)), 1.d+2 * rhcrit, tstart, & + fracld, swich(-zext(fracld)), & + chimod, swich(-zext(chimod)), & + physic, swich(-zext(physic)), & + snomod, swich(-zext(snomod)), polmod, swich(-zext(polmod)), fxlead, & + vegmod, swich(-zext(vegmod)), qsolSL, swich(-zext(qsolSL)), & + rxbase, rxfact +604 format( & + ' conmas=', l2, 4x, ' => Mass Conservation Constraint ', a3, & + /, ' potvor=', l2, 4x, ' => PV Conservation Constraint ', a3, & + /, ' brocam=', l2, 4x, ' => Brown and Campana Time Scheme ', a3, & + /, ' turhor=', l2, 4x, ' => Horizontal Diffusion ', a3, & + /, ' convec=', l2, 4x, ' => Mass Flux convective Scheme ', a3, & + /, ' micphy=', l2, 4x, ' => Cloud Microphysics ', a3, & + /, ' rhcrHY=', f6.0, ' % Critical Relative Humidity Value ', & + /, ' tim_HY=', f6.0, ' Cloud Microphysics Starting Time ', & + /, ' fracld=', l2, 4x, ' => Fractional Cloudiness Scheme ', a3, & + /, ' chimod=', l2, 4x, ' => Chemical Atmospheric Model ', a3, & + /, ' physic=', l2, 4x, ' => Atmosphere / Surface Physics ', a3, & + /, ' snomod=', l2, 4x, ' => Interactive Snow Model ', a3, & + /, ' polmod=', l2, 4x, ' => Interactive Polynya Model ', a3, & + /, ' fxlead=', f5.2, ' Initial Minimal Lead Fraction ', & + /, ' vegmod=', l2, 4x, ' => Interactive SVAT Model ', a3, & + /, ' qsolSL=', l2, 4x, ' => Soil Humidity Model ', a3, & + /, ' rxbase=', f6.3, ' Nudging Coeff.(Anthes et al. 1989)', & + /, ' rxfact=', f6.1, ' Lateral Sponge Coefficient (A89)') + write(21, 605) dx, mx, dy, my, & + dt, dtfast, ntFast, & + center, nordps, staggr, & + dtRadi, jtRadi, ntRadi, & + dtPhys, jtPhys, ntPhys, & + dtDiff, jtDiff, ntDiff, & + FIslot, FIkhmn, TUkhff, TUkhmx, FIslou, FIslop +605 format(//, ' MAR DISCRETISATION', /, ' ++++++++++++++++++', & + //, ' dx =', f8.1, ' m / Nb Points : ', i12, & + /, ' dy =', f8.1, ' m / Nb Points : ', i12, & + /, ' dt =', f8.1, ' sec', & + /, ' dt Lamb =', f8.1, ' sec', & + /, ' nt Lamb =', i6, & + /, ' p* Discret.=', l6, 5x, ' / p* Precis.= ', i12, & + /, ' Vert.Stagg.=', l6, & + //, ' dt Sol./IR =', f8.1, ' sec => jt Sol./IR= ', i12, & + /, ' nt Sol./IR= ', i12, & + //, ' dt Surface =', f8.1, ' sec => jt Surface= ', i12, & + /, ' nt Surface= ', i12, & + /, ' CAUTION: := dt', & + //, ' dt Turbul. =', f8.1, ' sec => jt Turbul.= ', i12, & + /, ' / nt Turbul.= ', i12, & + /, ' CAUTION: := dt', & + //, ' delta T =', f11.4, ' => Kh(delta) = ', e12.4, & + /, ' ', 11x, ' -- fac. (Kh) = ', f12.4, & + /, ' Absorbing Layer -> Kh max = ', e12.4, & + /, ' delta u =', f11.4, & + /, ' delta p =', f11.4) + endif + ! + + ! +--WARNINGS + ! + ======== + ! + + ! +--Time Step + ! + --------- + ! + + ! if (abs(dt-dtdom) > epsi) write(6,2) dt,dtdom + !2 format(/,' ***********************************', + ! . '********************************', + ! . /,' * CAUTION: dt(MARctr.dat)=',f8.2,'s', + ! . ' /= dt(MARdom.dat)=',f8.2,'s *', + ! . /,' ***********************************', + ! . '********************************',/,1x) + ! + + ! + + ! +--Topography + ! + ---------- + ! + + lo_CAU = 0 + if(n7mxLB > 1) then + do j = 1, my + do i = 1, n7mxLB - 1 + if(abs(sh(i, j) - sh(ip1(i), j)) > epsi) lo_CAU = 1 + enddo + enddo + endif + ! + + if(n6mxLB > 0) then + do j = 1, my + do i = mx - n6mxLB + 1, mx + if(abs(sh(i, j) - sh(im1(i), j)) > epsi) lo_CAU = 1 + enddo + enddo + endif + ! + + if(n7myLB > 1) then + do j = 1, n7myLB - 1 + do i = 1, mx + if(abs(sh(i, j) - sh(i, jp1(j))) > epsi) lo_CAU = 1 + enddo + enddo + endif + ! + + if(n6myLB > 0) then + do i = 1, mx + do j = my - n6myLB + 1, my + if(abs(sh(i, j) - sh(i, jm1(j))) > epsi) lo_CAU = 1 + enddo + enddo + endif + ! + + if(lo_CAU == 1) then + write(6, 1) +1 format(' ******************************************************************', & + /, ' * CAUTION: Lateral Sponge too large OR Lateral Plateau too small *', & + /, ' ******************************************************************', /, 1x) + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ INITIALISATION INCLUDING A SAVED STATE OF THE VARIABLES ++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + if(reaVAR) then + ! +--Timing + ! + ====== + iterun = 0 + ! +--Dynamics + ! + ======== + open(unit=11, status='old', form='unformatted', file='MARdyn.DAT') + rewind 11 + ! In the coupled MAR/ice sheet model simulation, itexpe must be an integer*8 in MARCTR.inc + ! If you started your simulation with an interger*4, you need only 1 time to use + ! the "itexpe2" line to read an integer*4 but to save an integer*8 for the next simulation. + ! Afterwards, you have to use the "itexpe" line to read/write an interger*8 + ! ------------------------------------------------------------------------------------------ ! + ! if itexpe is integer*8 but file in integer*4 + ! read(11) itexpe2,jdh_LB ; itexpe=itexpe2 + ! if itexpe is integer*4 / *8 + read(11) itexpe, jdh_LB + ! ------------------------------------------------------------------------------------------ ! + ! +... Time Parameters + read(11) iyrDYN, mmaDYN, jdaDYN, jhuDYN + ! +--Modified Time Step (BEGIN) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + YYtmp = -1 + MMtmp = -1 + DDtmp = -1 + dt_old = -1 + dt_new = -1 + open(unit=51, status='old', file='MARtime.ctr', err=51) + read(51, *, err=51) YYtmp, MMtmp, DDtmp, dt_old, dt_new +51 continue + close(51) + if(YYtmp == iyrDYN .and. MMtmp == mmaDYN .and. & + DDtmp == jdaDYN .and. dt_old > 0 .and. dt_new > 0) then + write(6, *) ' ' + write(6, *) 'WARNING--WARNING--WARING--WARING--WARNING' + write(6, *) 'itexpe modified by MARtime.ctr' + write(6, *) 'dt_old =', dt_old + write(6, *) 'dt_new =', dt_new + write(6, *) 'WARNING--WARNING--WARING--WARING--WARNING' + write(6, *) ' ' + itexpe = (itexpe * dt_old) / dt_new + endif + ! +--Modified Time Step (end) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Spatial Parameters + read(11) imezdy, jmezdy + read(11) aladyn, alodyn + ! Discretisation + read(11) sigma, ptopDY, dx, dy + ! Dynamics + read(11) uairDY + read(11) vairDY + read(11) pktaDY + read(11) pstDY + read(11) qvDY + read(11) sh +#if(GL) + ! MAR-GRISLI coupling + call ice_sheet_model_coupling +#endif + read(11) pstDY1 + ! Lateral Boundary Conditions + read(11) iyr_LB, mma_LB, jda_LB, jhu_LB, jdh_LB + read(11) vaxgLB, vaxdLB, vayiLB, vaysLB + read(11) sst_LB + ! Upper Sponge Reference State + read(11) uairUB, vairUB, pktaUB + if(jdh_LB <= 0) then + ! write(6,6000) jdh_LB +! 6000 format(/, '##############################################', & +! /, '# CAUTION: previous jdh_LB =', i6, ' set:= 1 #', & +! /, '##############################################',/) + jdh_LB = 1 + endif + if(itexpe > 0) then + read(11) pstDYn + read(11) RAd_ir + read(11) IRsoil + read(11) virDY + read(11) tim1LB, v1xgLB, v1xdLB, v1yiLB, v1ysLB + read(11) tim2LB, v2xgLB, v2xdLB, v2yiLB, v2ysLB + read(11) sst1LB, sst2LB + read(11) ua1_UB, ua2_UB + read(11) va1_UB, va2_UB + read(11) pkt1UB, pkt2UB + if(my == 1) then + read(11) ugeoDY + read(11) vgeoDY +#if(PV) + stop ' ?!&~@|@[#@# PV not conserved! EMERGENCY STOP' +#endif + endif + endif + close(unit=11) +#if(iso) + if(itexpe == 0) then + call mariso_init_dy(iso_init_type, qvDY, qvDY_iso) + else + ! read isotopic composition of dynamical variables + open(unit=11, status='old', form='unformatted', file='MARdyn_iso.DAT') + rewind 11 + read(11) qvDY_iso + close(unit=11) + endif +#endif + + ! +--sigma-levels Height + ! + ------------------- + do k = 1, mz + zsigma(k) = -(sst_SL / 0.0065) * ((1.e0 + (sigma(k) - 1.) & + * (1.e2 / ps_sig)) & + **(RDryAi * 0.0065 / gravit) - 1.) + enddo + if(IO_gen >= 2) then + write(21, 130)(sigma(k), k=1, mz) + write(21, 131)(zsigma(k), k=1, mz) + endif + + ! +--Auxiliary Grid Parameters + ! + ------------------------- + ! + ****** + call grdmar + ! + ****** + + ! +--Geographical Coordinates + ! + ------------------------ + ! + ****** + call grdgeo + ! + ****** + + ! +--Local Time of the Model Center + ! + ------------------------------ + ! + ****** + call timcur + call timgeo + ! + ****** + + ! +--LBC Coefficients + ! + ---------------- + if(itexpe == 0) then + tim1LB = ou2sGE(iyr_LB, mma_LB, jda_LB, jhu_LB, 0, 0) + tim2LB = tim1LB + do iv_ini = 1, 5 + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + v1xgLB(i, j, k, iv_ini) = vaxgLB(i, j, k, iv_ini) + v2xgLB(i, j, k, iv_ini) = vaxgLB(i, j, k, iv_ini) + enddo + enddo + enddo + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + v1xdLB(i, j, k, iv_ini) = vaxdLB(i, j, k, iv_ini) + v2xdLB(i, j, k, iv_ini) = vaxdLB(i, j, k, iv_ini) + enddo + enddo + enddo + do j = 1, n7myLB + do k = 1, mz + do i = 1, mx + v1yiLB(i, j, k, iv_ini) = vayiLB(i, j, k, iv_ini) + v2yiLB(i, j, k, iv_ini) = vayiLB(i, j, k, iv_ini) + enddo + enddo + enddo + do j = my - n6myLB, my + do k = 1, mz + do i = 1, mx + v1ysLB(i, j, k, iv_ini) = vaysLB(i, j, k, iv_ini) + v2ysLB(i, j, k, iv_ini) = vaysLB(i, j, k, iv_ini) + enddo + enddo + enddo + enddo + endif + + ! + ********** + call lbcnud_ini + ! + ********** + + ! + ********** + call lbcnud_par + ! + ********** + + ! +--Soil Model + ! + ========== + open(unit=11, status='old', form='unformatted', file='MARsol.DAT') + rewind 11 + read(11) itever + read(11) iyrSOL, mmaSOL, jdaSOL, jhuSOL + if(itever /= itexpe .or. & + iyrSOL /= iyrDYN .or. & + mmaSOL /= mmaDYN .or. & + jdaSOL /= jdaDYN .or. & + jhuSOL /= jhuDYN) then + write(6, 817) +817 format(' ++WARNING++ MARsol improperly specified ') + endif + read(11) nSLsrf + read(11) SLsrfl + read(11) TairSL + read(11) tsrfSL + read(11) alb0SL, eps0SL + read(11) SaltSL + read(11) ro_SL0 + read(11) ro_SL + read(11) d1_SL + read(11) t2_SL + read(11) w2_SL, wg_SL + read(11) roseSL + read(11) qvapSL + read(11) hsnoSL + read(11) hmelSL + read(11) SLuusl, SL_z0 + read(11) SLutsl, SL_r0 + if(itexpe > 0) then + read(11) pktaSL + read(11) sicsIB + read(11) sic1sI, sic2sI + read(11) albeSL + read(11) SLuus, SLuts + read(11) SLuqs, SLuqsl + read(11) duusSL + read(11) dutsSL + read(11) cdmSL, cdhSL + read(11) V_0aSL + read(11) dT0aSL +#if(AM) + read(11) u_0aSL +#endif +#if(AT) + read(11) uT0aSL +#endif +#if(AS) + read(11) us0aSL +#endif +#if(VX) + read(11) WV__SL +#endif + read(11) SLlmo, SLlmol +#if(BV) + read(11) virSL +#endif + endif + close(unit=11) +#if(iso) + if(itexpe == 0) then + call mariso_init_sl(iso_init_type, qvapSL, qvapSL_iso) + else + ! read isotopic composition of surface air water + open(unit=11, status='old', form='unformatted', file='MARsol_iso.DAT') + rewind 11 + read(11) qvapSL_iso + read(11) SLuqs_iso + read(11) SLuqsl_iso + close(unit=11) + endif +#endif + if(itexpe == 0) then + open(unit=11, status='old', form='unformatted', file='MARsic.DAT') + rewind 11 + read(11) iyr_sI, mma_sI, jda_sI, jhu_sI, jdh_sI + read(11) sicsIB + close(unit=11) + endif + ! +--Update of Soil Parameters + ! + ------------------------- + Tfr_LB = tfrwat +#if(RE) + Tfr_LB = tfrwat + 0.15 + epsi +#endif + do j = 1, my + do i = 1, mx + if(isolSL(i, j) <= 2) then + ! +---1. Open Water + ! + ~~~~~~~~~~~~~ + if(sst_LB(i, j) >= Tfr_LB) then + isolSL(i, j) = 1 + d1_SL(i, j) = 2.09e+8 + albeSL(i, j) = 0.10 + eps0SL(i, j) = 0.97 + SL_z0(i, j, 1) = zs_SL + SL_r0(i, j, 1) = 0.1 * zs_SL + ch0SL(i, j) = 0.00132 + rsurSL(i, j) = 0.0 + else + ! +---2. Sea Ice + ! + ~~~~~~~~~~ + ! (Kondo and Yamazaki, 1990, JAM 29, p.376) + isolSL(i, j) = 2 + d1_SL(i, j) = 1.05e+5 + albeSL(i, j) = 0.70 + eps0SL(i, j) = 0.97 + SL_z0(i, j, 1) = zn_SL + SL_r0(i, j, 1) = 0.1 * zn_SL + ch0SL(i, j) = 0.0021 + rsurSL(i, j) = 0.0 + endif + endif + enddo + enddo + + ! +--SVAT Model + ! + ========== + if(vegmod) then + ! + *********** + call svasav('read') + ! + *********** + endif + +#if(AO) + ! +--Ocean Model + ! + =========== + !AO_CK 20/02/2020 + ! +--cpl Get fields from oasis initialisation files + ! + ---------------------------------------------- + ! il_time_secs : temps depuis le debut du run (au pas de temps precedant) + il_time_secs = 0 + ! +--read fields from NEMO at 1st time step of this run + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + write(6, *) ' call fromcpl, itexpe =', itexpe + write(6, *) ' call fromcpl, il_time_secs =', il_time_secs + + call fromcpl(il_time_secs, srftAO(:, :, 1), aoss, & + sicsAO, aogla, albAO(:, :, 2), aoalb, srftAO(:, :, 2), aotic, & + hicAO, aohic, hsnoAO, aohsn, UoceAO, ao_uo, VoceAO, ao_vo, & + UiceAO, ao_ui, ViceAO, ao_vi) + ! + ******* + ! tocken_AO : not to call fromcpl further at the first time step + tocken_AO = 1 + + !No need to check if fields have been updated as they came from restart files (=update) + print *, "AO/coupling: warning on your first restart files" + do j = 1, my + do i = 1, mx + ! +--NEMO temperature + if(weightao_sst(i, j) /= 1) then + srftAO(i, j, 1) = min(max(srftAO(i, j, 1) / (1 - sicsAO(i, j)) & + , 271.01), 300.15) + sst_LB(i, j) = (1.-weightao_sst(i, j)) * srftAO(i, j, 1) & + + (weightAO_sst(i, j) * sst_LB(i, j)) + endif + ! +--NEMO SIC + if(weightao_sic(i, j) /= 1) then + sicsIB(i, j) = (1.-weightao_sic(i, j)) * sicsAO(i, j) & + + (weightAO_sic(i, j) * sicsIB(i, j)) + endif + enddo + enddo + + ! +--NEMO other parameters: + ! snow and sea ice thickness, albedo + ! => not coupled at ini of MAR to increase MAR stability + ! (one thing at a time) #CK + ! SST/ Sea ice Surface temperature cf below + + ! +--Open Water Albedo + ! + ----------------- + if(itexpe == 0) then + do i = 1, mx + do j = 1, my + ! open water albedo prescribed at first time step + albAO(i, j, 1) = 0.066 + ! clear sky value in flx_core.h90 (NEMO) + enddo + enddo + ! ck not sure that is still needed + do i = 1, mx + do j = 1, my + if(sicsIB(i, j) == 0) then + ! where no sea ice, albedo begin with + ! value (taking into account solar ze cloud cover) + albAO(i, j, 1) = albeSL(i, j) + else + ! elsewhere, albedo ove + ! and albedo over ice is NEMO's albed + ! by sending solar zenith angle and c + ! so that it computes himself ocean a + albAO(i, j, 1) = 0.066 + endif + enddo + enddo + endif + do j = 1, my + do i = 1, mx + if(isolSL(i, j) <= 2) then + albsSL(i, j) = albAO(i, j, 1) * (1.-sicsAO(i, j)) & + + albAO(i, j, 2) * sicsAO(i, j) + albeSL(i, j) = albsSL(i, j) + endif + enddo + enddo + do i = 1, mx + do j = 1, my + if(isolSL(i, j) <= 2) then + maskSL(i, j) = 1 !ocean/sea-ice + do n = 1, 2 + ! to be sure that they have a value => tairdy(i,j,mz) + if(i == 1) tsrfSL(i, j, n) = tairDY(i, j, mz) + if(j == 1) tsrfSL(i, j, n) = tairDY(i, j, mz) + if(i == mx) tsrfSL(i, j, n) = tairDY(i, j, mz) + if(j == my) tsrfSL(i, j, n) = tairDY(i, j, mz) + tsrfSL(i, j, n) = srftAO(i, j, n) * (1.-weightao_st(i, j)) & + + (weightAO_st(i, j) * tsrfSL(i, j, n)) + + do isl = -nsol, 0 + if(n == 1) then !ocean + ! Prescribed SST + TsolTV(i, j, n, 1 - isl) = tsrfSL(i, j, n) + SLsrfl(i, j, n) = 1.-sicsIB(i, j) + endif + if(n == 2) then + ! sea ice + ! Prescribed SST beneath Ice + TsolTV(i, j, n, 1 - isl) = 271.2 + SLsrfl(i, j, n) = sicsIB(i, j) + endif + enddo + enddo + else + ! land + maskSL(i, j) = 0 + endif + enddo + enddo +#endif + if(itexpe > 0) then +#if(NH) + ! +--Non-Hydrostatic Dynamics + ! + ======================== + open(unit=11, status='unknown', form='unformatted', file='MARonh.DAT') + rewind 11 + ! Time Parameters + read(11) itever + read(11) iyrONH, mmaONH, jdaONH, jhuONH + if(itever /= itexpe .or. & + iyrONH /= iyrDYN .or. & + mmaONH /= mmaDYN .or. & + jdaONH /= jdaDYN .or. & + jhuONH /= jhuDYN) write(6, 810) +810 format(' ++WARNING++ MARonh improperly specified ') + ! +... Dynamics + read(11) wa0_NH + read(11) ua0_NH + read(11) va0_NH + read(11) wairNH + read(11) pairNH + close(unit=11) +#endif + ! +--Mass Flux convective Scheme + ! + =========================== + if(convec) then + open(unit=11, status='old', form='unformatted', file='MARcva.DAT') + rewind 11 + read(11) itever + ! Time Parameters + read(11) iyrCVA, mmaCVA, jdaCVA, jhuCVA + if(itever /= itexpe .or. & + iyrCVA /= iyrDYN .or. & + mmaCVA /= mmaDYN .or. & + jdaCVA /= jdaDYN .or. & + jhuCVA /= jhuDYN) then + write(6, 811) +811 format(' ++WARNING++ MARcva improperly specified ') + endif + read(11) adj_CA + read(11) int_CA + read(11) dpktCA + read(11) dqv_CA + read(11) dqw_CA + read(11) dqi_CA + read(11) drr_CA + read(11) dss_CA + read(11) dsn_CA + read(11) rainCA + read(11) snowCA + read(11) tau_CA + read(11) Kstep1 + read(11) K_CbT1 + read(11) K_CbB1 + read(11) P_CH_0 + read(11) PdCH_1 + read(11) PdTa_1 + read(11) PdQa_1 + read(11) PdQw_1 + read(11) PdQi_1 + read(11) Pdrr_1 + read(11) Pdss_1 + read(11) PuMF_1 + read(11) PdMF_1 + read(11) Pfrr_1 + read(11) Pfss_1 + read(11) Pcape1 + close(unit=11) +#if(iso) + ! read isotopic composition of convective variables + open(unit=11, status='old', form='unformatted', file='MARcva_iso.DAT') + rewind 11 + read(11) dqv_CA_iso + read(11) dqw_CA_iso + read(11) dqi_CA_iso + read(11) drr_CA_iso + read(11) dss_CA_iso + read(11) dsn_CA_iso + read(11) rainCA_iso + read(11) snowCA_iso + close(unit=11) +#endif + endif + + ! +--Microphysics + ! + ============ + if(micphy) then + open(unit=11, status='old', form='unformatted', file='MARcld.DAT') + rewind 11 + read(11) itever + read(11) iyrHYD, mmaHYD, jdaHYD, jhuHYD + if(itever /= itexpe .or. & + iyrHYD /= iyrDYN .or. & + mmaHYD /= mmaDYN .or. & + jdaHYD /= jdaDYN .or. & + jhuHYD /= jhuDYN) write(6, 812) +812 format(' ++WARNING++ MARcld improperly specified ') + ! + + read(11) turnHY + read(11) ccniHY + read(11) qiHY + read(11) qsHY + ! +HG read(11) qgHY + read(11) qwHY + read(11) qrHY + read(11) rainHY, rai0HY + read(11) snowHY, sno0HY, sfa0HY + read(11) crysHY + read(11) rainCA +#if(BS) + read(11) uss_HY +#endif + close(unit=11) +#if(iso) + ! read isotopic composition of microphysics water + open(unit=11, status='old', form='unformatted', file='MARcld_iso.DAT') + rewind 11 + read(11) qiHY_iso + read(11) qsHY_iso + read(11) qwHY_iso + read(11) qrHY_iso + read(11) rainHY_iso, rai0HY_iso + read(11) snowHY_iso, sno0HY_iso, sfa0HY_iso + read(11) crysHY_iso + ! rainCA_iso already in 'MARcva_iso.DAT' + ! read(11) rainCA_iso + close(unit=11) +#endif + endif +#if(TC) + ! +--Atmospheric Tracers + ! + =================== + open(unit=11, status='old', form='unformatted', file='MARtca.DAT') + rewind 11 + read(11) itever + read(11) iyrTCA, mmaTCA, jdaTCA, jhuTCA + read(11) dt_ODE, dt2ODE, nt_ODE, jt_ODE + if(itever /= itexpe .or. & + iyrTCA /= iyrDYN .or. & + mmaTCA /= mmaDYN .or. & + jdaTCA /= jdaDYN .or. & + jhuTCA /= jhuDYN) write(6, 813) +813 format(' ++WARNING++ MARtca improperly specified ') + read(11) qxTC + read(11) qsTC + read(11) uqTC + close(unit=11) +#endif +#if(PO) + ! +--Polynya Model + ! + ============= + if(polmod) then + open(unit=11, status='old', form='unformatted', file='MARpol.DAT') + rewind 11 + read(11) itever + read(11) iyrPOL, mmaPOL, jdaPOL, jhuPOL + if(itever /= itexpe .or. & + iyrPOL /= iyrDYN .or. & + mmaPOL /= mmaDYN .or. & + jdaPOL /= jdaDYN .or. & + jhuPOL /= jhuDYN) then + write(6, 814) +814 format(' ++WARNING++ MARpol improperly specified ') + endif + read(11) isolSL + read(11) iPO1, iPO2, jPO1, jPO2, iPO3, iPO4, jPO3, jPO4 + read(11) hfraPO, vgriPO, uocnPO, vocnPO, swsaPO, focnPO + read(11) silfPO, hicePO, aicePO, uicePO, vicePO, dtPO + close(unit=11) + endif +#endif + ! +--Turbulence + ! + ========== + open(unit=11, status='old', form='unformatted', file='MARtur.DAT') + rewind 11 + read(11) itever + read(11) iyrTUR, mmaTUR, jdaTUR, jhuTUR + if(itever /= itexpe .or. & + iyrTUR /= iyrDYN .or. & + mmaTUR /= mmaDYN .or. & + jdaTUR /= jdaDYN .or. & + jhuTUR /= jhuDYN) then + write(6, 816) +816 format(' ++WARNING++ MARtur improperly specified ') + endif + ! TURBULENT KINETIC ENERGY (TKE) and DISSIPATION (e) + read(11) ect_TE + read(11) eps_TE + read(11) tranTE + ! TURBULENT DifFUSION COEFFICIENT + read(11) TUkvm + read(11) TUkvh + close(unit=11) + else + ! +--Timing + ! + ====== + itexpe = 0 + iterun = 0 + ! +--Atmosphere + ! + ========== + ! + + do j = 1, my + do i = 1, mx + pstDYn(i, j) = pstDY(i, j) + enddo + enddo + ! + ********* + call dyngpo_mp + ! + ********* + ! +--Microphysics and Surface + ! + ======================== + ! + ****** + call iniphy + ! + ****** + ! +--Water Vapor and Precipitation Loading + ! + ------------------------------------- + ! + ****** + call dynloa + ! + ****** + ! +--Surface Albedo (set to underlaying Soil Albedo) + ! + -------------- + do j = 1, my + do i = 1, mx + alb0SL(i, j) = max(albsSL(i, j), alb0SL(i, j)) + albeSL(i, j) = max(albsSL(i, j), albeSL(i, j)) + enddo + enddo + endif + else + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ INITIALISATION INCLUDING A SOUNDING ++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! cCAiso : no isotope for sounding + ! +--Timing + ! + ====== + itexpe = 0 + iterun = 0 + ! +--Dynamics + ! + ======== + ! +--Vertical Grid Initialisation + ! + ----------------------------- + ! + ****** + if(.not. geoNST) call grdsig(zmin_0, aavu_0, bbvu_0, ccvu_0, verti0) + ! + ****** + ! + + ! +--Auxiliary Grid Parameters + ! + ------------------------- + ! + ****** + call grdmar + ! + ****** + ! + + ! +--Geographical Coordinates + ! + ------------------------ + ! + ****** + call grdgeo + ! + ****** + ! + + ! +--Local Time of the Model Center + ! + ------------------------------ + ! + ****** + call timcur + call timgeo + ! + ****** + ! + + ! +--Initialisation assuming horizontal Homogeneity + ! + ---------------------------------------------- + ! + ****** + call inisnd + ! + ****** + ! + + ! + ********** + call lbcnud_ini + ! + ********** + ! + + ! + ********** + call lbcnud_par + ! + ********** + ! + + ! +--Leapfrog Auxiliary Variables + ! + ============================ + do j = 1, my + do i = 1, mx + pstDYn(i, j) = pstDY(i, j) + enddo + enddo + ! + + ! +--Microphysics and Surface + ! + ======================== + ! + ****** + call iniphy + ! + ****** + ! + + ! +--Water Vapor and Precipitation Loading + ! + ------------------------------------- + ! + ****** + call dynloa + ! + ****** + ! + + ! +--Surface Albedo (set to underlaying Soil Albedo) + ! + -------------- + do j = 1, my + do i = 1, mx + alb0SL(i, j) = max(albsSL(i, j), alb0SL(i, j)) + albeSL(i, j) = max(albsSL(i, j), albeSL(i, j)) + enddo + enddo + endif + ! + + ! + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ AUXILIARY VARIABLES INITIALISATION +++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + + ! + + ! +--Parameters + ! + ========== + ! + + ipri = 0 + ! +... print parameter used in Model Validation + ! + on Linear Mountain Waves Simulations + ! + + ! +--Atmospheric variables + ! + ===================== + ! + + ! + + ! +--Leapfrog Auxiliary Variables + ! + ---------------------------- + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + ubefDY(i, j, k) = uairDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + enddo + enddo + enddo + ! + + ! + + ! +--Surface Geopotential + ! + -------------------- + ! + + do j = 1, my + do i = 1, mx + gplvDY(i, j, mzz) = gravit * sh(i, j) + enddo + enddo + ! + + ! + + ! +--Exner Potential, Temperature and Level Geopotential + ! + --------------------------------------------------- + ! + + ! + ********* + call dyngpo_mp + ! + ********* + ! + + ! +--Mid-Level Geopotential + ! + ---------------------- + ! + + k = 1 + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = 0.5 * (3.5 * gplvDY(i, j, 1) - 0.5d0 * gplvDY(i, j, 2)) + enddo + enddo + ! + + do k = kp1(1), mzz + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = 0.5 * (gplvDY(i, j, k - 1) + gplvDY(i, j, k)) + enddo + enddo + enddo + ! + + k = mzz + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = (0.5 * z__SBL + sh(i, j)) * gravit + enddo + enddo + ! +--Vertical Temperature Gradient at Sponge Base + ! + -------------------------------------------- + ! + + gradTz = 1.0e+3 * grvinv + if(mzabso > 1) then + mzabs1 = max(mzabso - 1, 1) + do j = 1, my + do i = 1, mx + gradTz = min(gradTz,(tairDY(i, j, mzabs1) - tairDY(i, j, mzabso)) & + / (epsi + gplvDY(i, j, mzabs1) - gplvDY(i, j, mzabso))) + enddo + enddo + endif + gradTz = gradTz * gravit * 1.0d+3 +#if(OL) + ! +--Sigma Surfaces Initial Altitudes for Linear Mountain Wave Experiments + ! + --------------------------------------------------------------------- + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + gp00OL(i, j, k) = gplvDY(i, j, k) + enddo + enddo + enddo +#endif +#if(PE) + ! +--Slopes of the Sigma Surfaces + ! + ---------------------------- + ! + + ! + ****** + ! _PE call INIpen + ! + ****** + ! + + ! cCA : subroutine INIpen not found + ! + ****** + ! call INIpen + ! + ****** + ! + + ! + +#endif +#if(Di) + ! +--Top / Bottom Boundaries + ! + ----------------------- + ! + + ! do j=1,my + ! do i=1,mx + ! qvtoDI(i,j) = qvDY(i,j,1) + ! pkttDI(i,j) = pktaDY(i,j,1) + ! uairDI(i,j) = uairDY(i,j,1) + ! vairDI(i,j) = vairDY(i,j,1) + ! end do + ! end do +#endif + ! + + ! + + ! +--Specific Mass + ! + ------------- + ! + ****** + call dynrho + ! + ****** + ! + + ! +--Surface Variables + ! + ================= + ! + + ! +--Land-Sea Mask + ! + ------------- + do j = 1, my + do i = 1, mx + if(isolSL(i, j) <= 2) then + maskSL(i, j) = 1 + else + maskSL(i, j) = 0 + endif + enddo + enddo + ! +--OUTPUT + ! + ====== + if(IO_loc >= 1) then + write(21, 606) jdaMAR, jhaMAR, itexpe, nboucl, nprint, & + 0.1 * pSND(1, 1), pstSND, sst_SL, dtagSL, & + zs_SL, zn_SL, gradtz, mzabso +606 format(//, ' EXECUTION STATUS', /, ' ++++++++++++++++', /, & + /, ' Preceding Execution stopped after', i5, ' day(s)', i5, ' hour(s)', & + /, ' itexpe =', i8, 8x, ' nboucl =', i8, 8x, 'nprint =', i8, & + /, ' p MSL =', f8.1, ' cb', 5x, 'p* 0 =', f8.1, ' cb', & + /, ' SST =', f8.1, ' K ', 5x, 'T0-Tg =', f8.1, ' K ', & + /, ' zs =', f8.5, ' m ', 5x, 'zn =', f8.5, ' m ', & + /, ' dT/dz >=', f8.2, ' K/km / mzabso =', i8, ' Sponge Base') + if(gradtz < -4.0) write(6, 607) gradtz, mzabso +607 format(/, ' WARNING: dT/dz Min =', f8.2, ' K/km at Sponge Base (k=mzabso=', i2, ')') + endif + return +endsubroutine inigen + +integer function zext(logvar) + logical, intent(in) :: logvar + if(logvar) then + zext = -1 + else + zext = 0 + endif + return +endfunction zext diff --git a/MAR/code_mar/iniglf.f90 b/MAR/code_mar/iniglf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d58d517245a7124cf128e688f68b4abda562a987 --- /dev/null +++ b/MAR/code_mar/iniglf.f90 @@ -0,0 +1,190 @@ +#include "MAR_pp.def" +subroutine INIglf(ihamr_glf, nhamr_glf, newglfINI) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT SVAT 7-06-2002 MAR | + ! | subroutine INIglf is used to initialize MAR Green Leaf Fractions | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ihamr_glf: Time Digital Filter Status | + ! | ^^^^^ nhamr_glf: Time Digital Filter Set Up | + ! | | + ! | OUTPUT: newglfINI: (0,1) ==> (NO new glf , new glf) | + ! | ^^^^^^^ | + ! | | + ! | OUTPUT: alaiTV: Current Leaf Area Index (LAI)| + ! | ^^^^^^^ LAI1VB: Previous Nesting Time Step Leaf Area Index | + ! | LAI2VB: Next Nesting Time Step Leaf Area Index | + ! | glf_TV: Current Green Leaf Fraction (GLF)| + ! | glf1VB: Previous Nesting Time Step Green Leaf Fraction | + ! | glf2VB: Next Nesting Time Step Green Leaf Fraction | + ! | tim1VB,tim2VB: Times n, n+1 of LAI and GLF | + ! | | + ! | CAUTION: It is assumed that tim1VB and tim2VB do not change when the | + ! | ^^^^^^^^ Variables are reassigned after the dynamical Initialization | + ! | (Reassignation => itexpe := nham => timar := timar-nham*dt) | + ! | | + ! +------------------------------------------------------------------------+ + ! + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_sl + use mar_sv + use mar_tv + use mar_vb + ! + + implicit none + + integer i, j, k, m + integer ihamr_glf, nhamr_glf + integer newglfINI + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + !XF + integer(kind=8) itisva, iv_glf + ! int*8 is needed for making future projections!!!! + real rate + ! + + ! + + ! +--Current Time + ! + ============ + ! + + itisva = ou2sGE(iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, jsecGE) +#if(HF) + itisva = itisva + (ihamr_glf + nhamr_glf) * idt +#endif + ! + + ! + + ! +--Reinitialization of the Leaf Area Index and the Green Leaf Fraction + ! + ------------------------------------------------------------------- + ! + + if(iterun == 0) then + jdh_VB = 1 + iyr_VB = iyrrGE + mma_VB = mmarGE + jda_VB = jdarGE + jhu_VB = jhurGE + tim1VB = itisva + tim2VB = itisva + do iv_glf = 1, nvx + do j = 1, my + do i = 1, mx +#if(LN) + LAI1VB(i, j, iv_glf) = alaiTV(i, j, iv_glf) + LAI2VB(i, j, iv_glf) = alaiTV(i, j, iv_glf) +#endif + glf1VB(i, j, iv_glf) = glf_TV(i, j, iv_glf) + glf2VB(i, j, iv_glf) = glf_TV(i, j, iv_glf) + enddo + enddo + enddo + ! + + endif + ! + + ! + + ! +--New VBC + ! + ======= + ! + + if(itisva > tim2VB) then + ! + + tim1VB = tim2VB + ! + + write(6, 6001) jda_VB, labmGE(mma_VB), iyr_VB, & + jhu_VB, tim1VB, & + jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itisva +6001 format(/, ' 1st VBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/', 2x, & + ' t =', i12, 's A.P.', & + /, ' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12) + ! + + if(jdh_VB == 0) jdh_VB = -1 + open(unit=11, status='old', form='unformatted', file='MARglf.DAT') + rewind 11 +11 continue + if(jdh_VB <= 0) go to 10 + ! + + ! + + ! +--VBC at nesting time step n + ! + -------------------------- + ! + + do iv_glf = 1, nvx + do j = 1, my + do i = 1, mx +#if(LN) + LAI1VB(i, j, iv_glf) = LAI2VB(i, j, iv_glf) +#endif + glf1VB(i, j, iv_glf) = glf2VB(i, j, iv_glf) +#if(LN) + LAI2VB(i, j, iv_glf) = 0.d0 +#endif + glf2VB(i, j, iv_glf) = 0.d0 + enddo + enddo + enddo + ! + + ! + + ! +--VBC at nesting time step n+1 + ! + ---------------------------- + ! + + read(11) iyr_VB, mma_VB, jda_VB, jhu_VB, jdh_VB + read(11) glf2VB +#if(LN) + read(11) LAI2VB +#endif + ! + + tim2VB = ou2sGE(iyr_VB, mma_VB, jda_VB, jhu_VB, 0, 0) + ! + + if(itisva > tim2VB) go to 11 + ! + + write(6, 6002) jda_VB, labmGE(mma_VB), iyr_VB, & + jhu_VB, jdh_VB, tim2VB +6002 format(' 2nd VBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/(', i1, & + ') t =', i12, /, 1x) + ! + +10 continue + close(unit=11) + ! + + else +#if(WR) + write(6, 6003) jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itisva +#endif +6003 format(' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12, 's A.P.') + endif + ! + + ! + + ! +--Time Interpolation + ! + ================== + ! + + if(itisva <= tim2VB .and. tim1VB < tim2VB) then + ! + + rate = float(itisva - tim1VB) / float(tim2VB - tim1VB) + do iv_glf = 1, nvx + do j = 1, my + do i = 1, mx +#if(LN) + alaiTV(i, j, iv_glf) = LAI1VB(i, j, iv_glf) + & + (LAI2VB(i, j, iv_glf) - LAI1VB(i, j, iv_glf)) * rate +#endif + glf_TV(i, j, iv_glf) = glf1VB(i, j, iv_glf) + & + (glf2VB(i, j, iv_glf) - glf1VB(i, j, iv_glf)) * rate + enddo + enddo + enddo + ! + + newglfINI = 1 + ! + + else + newglfINI = 0 + endif + ! + + return +endsubroutine INIglf diff --git a/MAR/code_mar/inilbc.f90 b/MAR/code_mar/inilbc.f90 new file mode 100644 index 0000000000000000000000000000000000000000..896ac3fd1ffcf50431a0ba83b3276951437bf9ed --- /dev/null +++ b/MAR/code_mar/inilbc.f90 @@ -0,0 +1,511 @@ +#include "MAR_pp.def" +subroutine INIlbc(ihamr_lbc, nhamr_lbc, newlbc) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT ATMOS Tue 27-10-2017 MAR | + ! | subroutine INIlbc initializes MAR Lateral Boundaries | + ! | verifies MARlbc.DAT EOF | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ihamr_lbc : Time Digital Filter Status | + ! | ^^^^^ nhamr_lbc : Time Digital Filter Set Up | + ! | | + ! | OUTPUT: newlbc : (0,1) ==> (NO new LBC ,new LBC) | + ! | ^^^^^^^ | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ vaxgLB,vaxdLB,vayiLB,vaysLB: Current LBCs | + ! | v1xgLB,v1xdLB,v1yiLB,v1ysLB: Previous Nesting Time Step LBCs | + ! | v2xgLB,v2xdLB,v2yiLB,v2ysLB: Next Nesting Time Step LBCs | + ! | tim1LB,tim2LB : LBC Nesting Times n, n+1 | + ! | | + ! | CAUTION: It is assumed that tim1LB and tim2LB do not change when the | + ! | ^^^^^^^^ Variables are reassigned after the dynamical Initialization | + ! | (Reassignation => itexpe:= nham => itimar:= itimar-nham*dt) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use marmagic + use marsnd +#if(AO) + use mar_ao +#endif + + implicit none + + integer i, j, k, m + integer ihamr_lbc, nhamr_lbc + integer newlbc + real pst__1, pst_mx + common / INIlbcRLoc / pst__1, pst_mx + + ! +--Local Variables + ! + ================ + + integer(kind=8) itimar, iv_ilb + real rate, correction_humidity + real vax_An, vax_Ap, vax_A + real qsat0D, qs, tt +#if(CE) + real qse_0D, qse +#endif +#if(FS) + ! rh_min : relative humidity above which clouds exist + real rh_min, qq + ! fac_qq : prescribed specific humidity tuning at LBC + real fac_qq + data rh_min/0.80/ + ! fac_qq = 1.50 ==> 0.8 + 1.5 * 0.2 = 1.1 + data fac_qq/1.50/ +#endif + ! +--Current Time + ! + ============ + + itimar = ou2sGE(iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, jsecGE) +#if(HF) + itimar = +(ihamr_lbc + nhamr_lbc) * idt +#endif + + !XF + ! WARNING Compile with -i8 if the simulation run > 50yrs!! + !XF + + ! initialize iSND jSND for PHYrad_top initialization + ! ================================================== + iSND = 1 + jSND = 1 + + ! +--New LBC + ! + ======= + + if(itimar > tim2LB) then + + tim1LB = tim2LB + + write(6, 6001) jda_LB, labmGE(mma_LB), iyr_LB, & + jhu_LB, tim1LB, & + jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itimar +6001 format(/, ' 1st LBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/', 2x, & + ' t =', i12, 's A.P.', & + /, ' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12) + + if(jdh_LB == 0) jdh_LB = -1 + open(unit=11, status='old', form='unformatted', file='MARlbc.DAT') + rewind 11 +11 continue + if(jdh_LB <= 0) go to 10 + + ! +--LBC at nesting time step n + ! + -------------------------- + + do iv_ilb = 1, 5 + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + v1xgLB(i, j, k, iv_ilb) = v2xgLB(i, j, k, iv_ilb) + v2xgLB(i, j, k, iv_ilb) = 0.0 + enddo + enddo + enddo + + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + v1xdLB(i, j, k, iv_ilb) = v2xdLB(i, j, k, iv_ilb) + v2xdLB(i, j, k, iv_ilb) = 0.0 + enddo + enddo + enddo + + do j = 1, n7myLB + do k = 1, mz + do i = 1, mx + v1yiLB(i, j, k, iv_ilb) = v2yiLB(i, j, k, iv_ilb) + v2yiLB(i, j, k, iv_ilb) = 0.0 + enddo + enddo + enddo + + do j = my - n6myLB, my + do k = 1, mz + do i = 1, mx + v1ysLB(i, j, k, iv_ilb) = v2ysLB(i, j, k, iv_ilb) + v2ysLB(i, j, k, iv_ilb) = 0.0 + enddo + enddo + enddo + + enddo + + do j = 1, my + do i = 1, mx + sst1LB(i, j) = sst2LB(i, j) + enddo + enddo + + ! +--LBC at nesting time step n+1 + ! + ---------------------------- + + read(11) iyr_LB, mma_LB, jda_LB, jhu_LB, jdh_LB + read(11) v2xgLB, v2xdLB, v2yiLB, v2ysLB + read(11) sst2LB + + tim2LB = ou2sGE(iyr_LB, mma_LB, jda_LB, jhu_LB, 0, 0) + + do iv_ilb = 1, 2 + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + v2xgLB(i, j, k, iv_ilb) = v2xgLB(i, j, k, iv_ilb) / SFm_DY(i, j) + enddo + enddo + enddo + + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + v2xdLB(i, j, k, iv_ilb) = v2xdLB(i, j, k, iv_ilb) / SFm_DY(i, j) + enddo + enddo + enddo + + do j = 1, n7myLB + do k = 1, mz + do i = 1, mx + v2yiLB(i, j, k, iv_ilb) = v2yiLB(i, j, k, iv_ilb) / SFm_DY(i, j) + enddo + enddo + enddo + + do j = my - n6myLB, my + do k = 1, mz + do i = 1, mx + v2ysLB(i, j, k, iv_ilb) = v2ysLB(i, j, k, iv_ilb) / SFm_DY(i, j) + enddo + enddo + enddo + + enddo + + if(itimar > tim2LB) go to 11 + + write(6, 6002) jda_LB, labmGE(mma_LB), iyr_LB, & + jhu_LB, jdh_LB, tim2LB +6002 format(' 2nd LBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/(', i1, & + ') t =', i12) + +10 continue + close(unit=11) + + ! +--Force Sursaturation where relative humidity larger than rh_min (i.e., 80%) + ! + -------------------------------------------------------------------------- + + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + tt = v2xgLB(i, j, k, 4) & + * exp(cap * log(v2xgLB(i, j, 1, 5) * sigma(k) + ptopDY)) + qs = qsat0D(tt, sigma(k), v2xgLB(i, j, 1, 5), ptopDY, 0) +#if(FS) + qq = qs * rh_min +#endif +#if(CE) + qse = qse_0D(tt, sigma(k), v2xgLB(i, j, 1, 5), ptopDY) +#endif +#if(FS) + v2xgLB(i, j, k, 3) = min(v2xgLB(i, j, k, 3), qq) & + + fac_qq * max(v2xgLB(i, j, k, 3) - qq, 0.) +#endif +#if(CE) + v2xgLB(i, j, k, 3) = v2xgLB(i, j, k, 3) * qs / qse +#endif + + enddo + enddo + enddo + + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + tt = v2xdLB(i, j, k, 4) & + * exp(cap * log(v2xdLB(i, j, 1, 5) * sigma(k) + ptopDY)) + qs = qsat0D(tt, sigma(k), v2xdLB(i, j, 1, 5), ptopDY, 0) +#if(FS) + qq = qs * rh_min +#endif +#if(CE) + qse = qse_0D(tt, sigma(k), v2xdLB(i, j, 1, 5), ptopDY) +#endif +#if(FS) + v2xdLB(i, j, k, 3) = min(v2xdLB(i, j, k, 3), qq) & + + fac_qq * max(v2xdLB(i, j, k, 3) - qq, 0.) +#endif +#if(CE) + v2xdLB(i, j, k, 3) = v2xdLB(i, j, k, 3) * qs / qse +#endif + + enddo + enddo + enddo + + do j = 1, n7myLB + do k = 1, mz + do i = 1, mx + tt = v2yiLB(i, j, k, 4) & + * exp(cap * log(v2yiLB(i, j, 1, 5) * sigma(k) + ptopDY)) + qs = qsat0D(tt, sigma(k), v2yiLB(i, j, 1, 5), ptopDY, 0) +#if(FS) + qq = qs * rh_min +#endif +#if(CE) + qse = qse_0D(tt, sigma(k), v2yiLB(i, j, 1, 5), ptopDY) +#endif +#if(FS) + v2yiLB(i, j, k, 3) = min(v2yiLB(i, j, k, 3), qq) & + + fac_qq * max(v2yiLB(i, j, k, 3) - qq, 0.) +#endif +#if(CE) + v2yiLB(i, j, k, 3) = v2yiLB(i, j, k, 3) * qs / qse +#endif + + enddo + enddo + enddo + + do j = my - n6myLB, my + do k = 1, mz + do i = 1, mx + tt = v2ysLB(i, j, k, 4) & + * exp(cap * log(v2ysLB(i, j, 1, 5) * sigma(k) + ptopDY)) + qs = qsat0D(tt, sigma(k), v2ysLB(i, j, 1, 5), ptopDY, 0) +#if(FS) + qq = qs * rh_min +#endif +#if(CE) + qse = qse_0D(tt, sigma(k), v2ysLB(i, j, 1, 5), ptopDY) +#endif +#if(FS) + v2ysLB(i, j, k, 3) = min(v2ysLB(i, j, k, 3), qq) & + + fac_qq * max(v2ysLB(i, j, k, 3) - qq, 0.) +#endif +#if(CE) + v2ysLB(i, j, k, 3) = v2ysLB(i, j, k, 3) * qs / qse +#endif + + enddo + enddo + enddo + + else +#if(WR) + write(6, 6003) jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itimar +6003 format(' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12, 's A.P.') +#endif + endif + + ! +--Time Interpolation + ! + ================== + + if(itimar <= tim2LB .and. tim1LB < tim2LB) then + + rate = float(itimar - tim1LB) / float(tim2LB - tim1LB) + do iv_ilb = 1, 5 + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + vaxgLB(i, j, k, iv_ilb) = v1xgLB(i, j, k, iv_ilb) + & + (v2xgLB(i, j, k, iv_ilb) - v1xgLB(i, j, k, iv_ilb)) * rate + + if(iv_ilb == 3 .and. correction_humidity_boundary /= 0.) & + vaxgLB(i, j, k, iv_ilb) = vaxgLB(i, j, k, iv_ilb) * (1.+ & + correction_humidity_boundary) + + enddo + enddo + enddo + + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + vaxdLB(i, j, k, iv_ilb) = v1xdLB(i, j, k, iv_ilb) + & + (v2xdLB(i, j, k, iv_ilb) - v1xdLB(i, j, k, iv_ilb)) * rate + + if(iv_ilb == 3 .and. correction_humidity_boundary /= 0.) & + vaxdLB(i, j, k, iv_ilb) = vaxdLB(i, j, k, iv_ilb) * (1.+ & + correction_humidity_boundary) + + enddo + enddo + enddo + + do j = 1, n7myLB + do k = 1, mz + do i = 1, mx + vayiLB(i, j, k, iv_ilb) = v1yiLB(i, j, k, iv_ilb) + & + (v2yiLB(i, j, k, iv_ilb) - v1yiLB(i, j, k, iv_ilb)) * rate + + if(iv_ilb == 3 .and. correction_humidity_boundary /= 0.) & + vayiLB(i, j, k, iv_ilb) = vayiLB(i, j, k, iv_ilb) * (1.+ & + correction_humidity_boundary) + + enddo + enddo + enddo + + do j = my - n6myLB, my + do k = 1, mz + do i = 1, mx + vaysLB(i, j, k, iv_ilb) = v1ysLB(i, j, k, iv_ilb) + & + (v2ysLB(i, j, k, iv_ilb) - v1ysLB(i, j, k, iv_ilb)) * rate + + if(iv_ilb == 3 .and. correction_humidity_boundary /= 0.) & + vaysLB(i, j, k, iv_ilb) = vaysLB(i, j, k, iv_ilb) * (1.+ & + correction_humidity_boundary) + + enddo + enddo + enddo + enddo + + ! +--Zonally Averaged Version + ! + ------------------------ + + if(mmy == 1) then + if(itexpe == 1) then + pst__1 = vaxgLB(1, 1, 1, 5) + pst_mx = vaxdLB(mx, 1, 1, 5) + endif +#if(IN) + ! +--LBC: Smooth Set up of the Large Scale Wind + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(itexpe * dt < 86400.) then + rate = itexpe * dt / 86400. + do iv_ilb = 1, 2 + do i = 1, n7mxLB + do k = 1, mz + do j = 1, my + vaxgLB(i, j, k, iv_ilb) = vaxgLB(i, j, k, iv_ilb) * rate + enddo + enddo + enddo + do i = mx - n6mxLB, mx + do k = 1, mz + do j = 1, my + vaxdLB(i, j, k, iv_ilb) = vaxdLB(i, j, k, iv_ilb) * rate + enddo + enddo + enddo + enddo + endif +#endif + ! +--Meridional Wind: zero Mass Flux Correction, excedent Mass Flux Reduction + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + iv_ilb = 2 + j = 1 + do i = 1, n7mxLB + vax_An = 0. + vax_Ap = 0. + do k = 1, mz + vax_An = vax_An + min(real(vaxgLB(i, j, k, iv_ilb)), 0.) & + * dsigm1(k) + vax_Ap = vax_Ap + max(real(vaxgLB(i, j, k, iv_ilb)), 0.) & + * dsigm1(k) + enddo + vax_A = vax_An + vax_Ap + if(vax_A > 0.) then + vax_A = (vax_Ap - vax_A) / max(epsi, vax_Ap) + do k = 1, mz + if(vaxgLB(i, j, k, iv_ilb) > 0.) & + vaxgLB(i, j, k, iv_ilb) = vaxgLB(i, j, k, iv_ilb) * vax_A + enddo + else + vax_A = (vax_An - vax_A) / min(-epsi, vax_An) + do k = 1, mz + if(vaxgLB(i, j, k, iv_ilb) < 0.) & + vaxgLB(i, j, k, iv_ilb) = vaxgLB(i, j, k, iv_ilb) * vax_A + enddo + endif + enddo + + do i = mx - n6mxLB, mx + vax_An = 0. + vax_Ap = 0. + do k = 1, mz + vax_An = vax_An + min(real(vaxdLB(i, j, k, iv_ilb)), 0.) & + * dsigm1(k) + vax_Ap = vax_Ap + max(real(vaxdLB(i, j, k, iv_ilb)), 0.) & + * dsigm1(k) + enddo + vax_A = vax_An + vax_Ap + if(vax_A > 0.) then + vax_A = (vax_Ap - vax_A) / max(epsi, vax_Ap) + do k = 1, mz + if(vaxdLB(i, j, k, iv_ilb) > 0.) & + vaxdLB(i, j, k, iv_ilb) = vaxdLB(i, j, k, iv_ilb) * vax_A + enddo + else + vax_A = (vax_An - vax_A) / min(-epsi, vax_An) + do k = 1, mz + if(vaxdLB(i, j, k, iv_ilb) < 0.) & + vaxdLB(i, j, k, iv_ilb) = vaxdLB(i, j, k, iv_ilb) * vax_A + enddo + endif + enddo + + ! +--Surface Pressure: no Mass Variation + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do i = 1, n7mxLB + vaxgLB(i, 1, 1, 5) = pst__1 ! [kPa] + enddo + do i = mx - n6mxLB, mx + vaxdLB(i, 1, 1, 5) = pst_mx ! [kPa] + enddo + endif + + ! +--Sea Surface Temperatures + ! + ------------------------ + + do j = 1, my + do i = 1, mx + + !Coupling: inside NEMO domaine sst_LB changed in + ! - inigen.f (first timpe step) + ! -oasis_2_mar.f (all the others) + ! outside MAJ sst_LB here with the usual sst rate + ! CK_AO 28/02/2020 + + !old way + !c #AO sst1LB(i,j) =sst_LB(i,j) + !c #AO sst2LB(i,j) =sst_LB(i,j) + + sst_LB(i, j) = sst1LB(i, j) + & + (sst2LB(i, j) - sst1LB(i, j)) * rate +#if(AO) + if(weightao_sst(i, j) /= 1) then + sst_LB(i, j) = (1.-weightao_sst(i, j)) * srftAO(i, j, 1) + & + (weightAO_sst(i, j) * sst_LB(i, j)) + endif +#endif + enddo + enddo + + newlbc = 1 + + else + newlbc = 0 + endif + + return +end diff --git a/MAR/code_mar/iniphy.f90 b/MAR/code_mar/iniphy.f90 new file mode 100644 index 0000000000000000000000000000000000000000..16ba2223aeee802a7ada64d3b31bdc4f3adf4afb --- /dev/null +++ b/MAR/code_mar/iniphy.f90 @@ -0,0 +1,287 @@ +#include "MAR_pp.def" +subroutine iniphy + ! +------------------------------------------------------------------------+ + ! | MAR INPUT ATMOS Thu 21-Jul-2011 MAR | + ! | subroutine iniphy Initializes coupling Variables between | + ! | MAR Surface and Atmosphere | + ! | Calls MAR Surface Model initializing Routines| + ! | Initializes MAR Cloud Microphysical Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: itexpe: Experiment Iteration Counter | + ! | ^^^^^ micphy: Cloud Microphysics Switch | + ! | fxlead: Lead (in Sea ice) Fraction | + ! | polmod: Polynya Model Switch | + ! | snomod: Snow Model Switch | + ! | reaVAR: Previous OR Large Scale Variables Switch | + ! | reaLBC: LBC: Large Scale Variables Switch | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ pstDY (mx,my) : Atmosphere Thickness [kPa] | + ! | (itexpe=0): TairSL(mx,my) : Surface Air Temperature [K] | + ! | (Sounding Extrapolated to the Surface | + ! | - dtagSL )| + ! | (itexpe=1): pktaDY(mx,my,mzz): Reduced Potential Temperature | + ! | sh (mx,my) : Surface Elevation [m] | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ tsrfSL(mx,my,mw) : Surface Temperature [K] | + ! | (itexpe=1): TairSL(mx,my) : Surface Air Temperature [K] | + ! | (CAUTION: CRUDE REINITIALISATION | + ! | BE CAREFULL WHEN USING PRESCRIBED TEMPERATURE) | + ! | SLsrfl(mx,my,mw) : Surface Type Area | + ! | (itexpe=0): pktaDY(mx,my,mzz): Reduced Potential Temperature | + ! | gplvDY(mx,my,mzz): Geopotential [m2/s2] | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_lb + use mar_hy + use mar_ca + use mar_sl + use mar_sv + use mar_tv +#if(AO) + include 'MAR_AO.inc' +#endif +#if(BS) + include 'MAR_BS.inc' +#endif +#if(iso) + use mariso, only: qiHY_iso, qsHY_iso, qwHY_iso, qrHY_iso, & + rainHY_iso, snowHY_iso, crysHY_iso, rainCA_iso, snowCA_iso +#endif + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m, n + real tsrf, rowat2 + + ! +--First Guess Initialization + ! + ========================== + if(.not. reaVAR) then + ! +--Surface Geopotential + ! + -------------------- + do j = 1, my + do i = 1, mx + gplvDY(i, j, mzz) = sh(i, j) * gravit + enddo + enddo + ! +--Grid BOXES Area (First Guess) + ! + ----------------------------- + do j = 1, my + do i = 1, mx + SLsrfl(i, j, 1) = 1.0 + SLsrfl(i, j, 2) = 0.0 + enddo + enddo + ! +--Surface Temperature (First Guess) + ! + --------------------------------- + do n = 1, mw + do j = 1, my + do i = 1, mx + tsrfSL(i, j, n) = TairSL(i, j) + enddo + enddo + enddo + do j = 1, my + do i = 1, mx + go to(101, 102, 103, 104, 105) isolSL(i, j) +101 continue + if(reaLBC) then + tsrfSL(i, j, 1) = sst_LB(i, j) + else + tsrfSL(i, j, 1) = max(sst_SL, tfrwat) + endif + go to 106 +102 continue +#if(OM) + tsrf = tsrfSL(i, j, 1) +#endif + tsrfSL(i, j, 1) = min(tsrfSL(i, j, 1), TfSnow) +#if(OM) + tsrfSL(i, j, 1) = tsrf +#endif + tsrfSL(i, j, 2) = sst_SL + go to 106 +103 continue + tsrfSL(i, j, 1) = min(tsrfSL(i, j, 1), TfSnow) + go to 106 +104 continue + go to 106 +105 continue + go to 106 +106 continue + enddo + enddo + endif + +#if(PO) + ! +--Polynya Model + ! + ============= + ! +--Polynya Model Initialisation + ! + ---------------------------- + ! cCA : SRFini_pol not found + ! ! + ********** + ! call SRFini_pol + ! ! + ********** +#endif + + ! +--Snow Model + ! + ========== + ! cCAiso : ro_SL is not used, replaced with sisvat variables + rowat2 = ro_Wat**1.88 + do j = 1, my + do i = 1, mx + ro_SL0(i, j) = (d1_SL(i, j) / sqrt(csnow * cdice * cs2SL / rowat2))**(1.0 / 1.44) + ro_SL(i, j) = ro_SL0(i, j) + ! SaltSL: Here an impossible Value + ! (Preclude Saltation) + SaltSL(i, j) = 1.e2 + enddo + enddo + + if(.not. snomod) then + do j = 1, my + do i = 1, mx + if(isolSL(i, j) >= 2 .and. tsrfSL(i, j, 1) < TfSnow) then + ro_SL(i, j) = 0.00 + ! SaltSL: Threshold Friction Velocity for Blowing Snow + ! (Budd et al., 1966, Byrd Snow Project) + SaltSL(i, j) = 0.38 + endif + enddo + enddo + endif + + ! +--Soil Model + ! + ========== + do j = 1, my + do i = 1, mx + roseSL(i, j) = 0.0 + hmelSL(i, j) = 0.0 + enddo + enddo + + do j = 1, my + do i = 1, mx + go to(51, 51, 53, 54, 51) isolSL(i, j) +51 continue + t2_SL(i, j) = tsrfSL(i, j, 1) + go to 59 +53 continue + if(.not. snomod) then + t2_SL(i, j) = tsrfSL(i, j, 1) + endif + go to 59 +54 continue + t2_SL(i, j) = tsrfSL(i, j, 1) + w2_SL(i, j) = w20SL + wg_SL(i, j) = wg0SL + wk_SL(i, j) = wk0SL + wx_SL(i, j) = wx0SL + go to 59 +59 continue + enddo + enddo + + ! +--Grid BOXES Area (Update) + ! + ======================== + if(VSISVAT) then + do j = 1, my + do i = 1, mx + nSLsrf(i, j) = nvx + enddo + enddo + do n = 1, nvx + do j = 1, my + do i = 1, mx + SLsrfl(i, j, n) = ifraTV(i, j, n) + SLsrfl(i, j, n) = SLsrfl(i, j, n) * 0.01 + enddo + enddo + enddo + else + do j = 1, my + do i = 1, mx + if(isolSL(i, j) <= 4) then + nSLsrf(i, j) = max(iun, nSLsrf(i, j)) + SLsrfl(i, j, 1) = 1.-SLsrfl(i, j, 2) + else + nSLsrf(i, j) = 1 + SLsrfl(i, j, 1) = 1. + nSLsrf(i, j) = nvx + do n = 1, nvx + SLsrfl(i, j, n) = ifraTV(i, j, n) + SLsrfl(i, j, n) = SLsrfl(i, j, n) * 0.01 + enddo + endif + enddo + enddo + endif + + ! +--Surface Temperature (Update) + ! + ============================ + do j = 1, my + do i = 1, mx + TairSL(i, j) = 0. + do n = 1, mw + TairSL(i, j) = TairSL(i, j) + SLsrfl(i, j, n) * tsrfSL(i, j, n) + enddo + pktaDY(i, j, mzz) = TairSL(i, j) / ((pstDY(i, j) + ptopDY)**cap) + enddo + enddo + + ! +--Microphysics + ! + ============ + + if(micphy) then + turnHY = .false. + qiHY = 0.0 + qsHY = 0.0 + qwHY = 0.0 + qrHY = 0.0 +#if(iso) + qiHY_iso = 0.0 + qsHY_iso = 0.0 + qwHY_iso = 0.0 + qrHY_iso = 0.0 +#endif + hlatHY = 0.0 + snfHY = 0.0 + depHY = 0.0 + sblHY = 0.0 + rnfHY = 0.0 + evpHY = 0.0 + smtHY = 0.0 + qssblHY = 0.0 +#if(iso) + ! todo : check if snfHY, sblHY, rnfHY, evpHY needed with isotopes + ! todo : check if snf2D, sbl2D, rnf2D, evp2D needed with isotopes +#endif +#if(qg) + qgHY = 0.0 +#endif + rainHY = 0.0 + snowHY = 0.0 + crysHY = 0.0 + rainCA = 0.0 + snowCA = 0.0 +#if(iso) + rainHY_iso = 0.0 + snowHY_iso = 0.0 + crysHY_iso = 0.0 + rainCA_iso = 0.0 + snowCA_iso = 0.0 +#endif + endif + + return +endsubroutine iniphy diff --git a/MAR/code_mar/inisic.f90 b/MAR/code_mar/inisic.f90 new file mode 100644 index 0000000000000000000000000000000000000000..045dfec6094a8313a25bc6b5c647b7872a3a65ec --- /dev/null +++ b/MAR/code_mar/inisic.f90 @@ -0,0 +1,176 @@ +#include "MAR_pp.def" +subroutine INIsic(ihamr_sic, nhamr_sic, newsicINI) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT Sea-Ice 03-03-2004 MAR | + ! | subroutine INIsic is used to initialize MAR Sea-Ice Fractions | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ihamr_sic: Time Digital Filter Status | + ! | ^^^^^ nhamr_sic: Time Digital Filter Set Up | + ! | | + ! | OUTPUT: newsicINI: (0,1) ==> (NO new sic , new sic) | + ! | ^^^^^^^ | + ! | | + ! | OUTPUT: sicsIB: Current Sea-Ice Fraction | + ! | ^^^^^^^ sic1sI: Previous Nesting Time Step Sea-Ice Fraction | + ! | sic2sI: Next Nesting Time Step Sea-Ice Fraction | + ! | tim1sI,tim2sI: Times n, n+1 of Sea-Ice Fraction | + ! | | + ! | CAUTION: It is assumed that tim1sI and tim2sI do not change when the | + ! | ^^^^^^^^ Variables are reassigned after the dynamical Initialization | + ! | (Reassignation => itexpe := nham => timar := timar-nham*dt) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_sl + use mar_sv + use mar_TV + use marsib +#if(AO) + use mar_ao +#endif + + implicit none + + integer ihamr_sic, nhamr_sic + integer newsicINI + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + !XF + integer(kind=8) itisIB + real rate + + ! +--Current Time + ! + ============ + + itisIB = ou2sGE(iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, jsecGE) +#if(HF) + itisIB = itisIB + (ihamr_sic + nhamr_sic) * idt +#endif + + ! +--Reinitialization of the Sea-Ice Fraction + ! + ---------------------------------------- + + if(iterun == 0) then + jdh_sI = 1 + iyr_sI = iyrrGE + mma_sI = mmarGE + jda_sI = jdarGE + jhu_sI = jhurGE + tim1sI = itisIB + tim2sI = itisIB + do j = 1, my + do i = 1, mx + sic1sI(i, j) = sicsIB(i, j) + sic2sI(i, j) = sicsIB(i, j) + enddo + enddo + + endif + + ! +--New sIB + ! + ======= + + if(itisIB > tim2sI) then + + tim1sI = tim2sI + + write(6, 6001) jda_sI, labmGE(mma_sI), iyr_sI, & + jhu_sI, tim1sI, & + jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itisIB +6001 format(/, ' 1st sIB /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/', 2x, & + ' t =', i12, 's A.P.', & + /, ' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12) + ! + + if(jdh_sI == 0) jdh_sI = -1 + open(unit=11, status='old', form='unformatted', file='MARsic.DAT') + rewind 11 +11 continue + if(jdh_sI <= 0) go to 10 + + ! +--sIB at nesting time step n + ! + -------------------------- + + do j = 1, my + do i = 1, mx + sic1sI(i, j) = sic2sI(i, j) + sic2sI(i, j) = 0.d0 + enddo + enddo + + ! +--sIB at nesting time step n+1 + ! + ---------------------------- + + read(11) iyr_sI, mma_sI, jda_sI, jhu_sI, jdh_sI + read(11) sic2sI + + tim2sI = ou2sGE(iyr_sI, mma_sI, jda_sI, jhu_sI, 0, 0) + + if(itisIB > tim2sI) go to 11 + + write(6, 6002) jda_sI, labmGE(mma_sI), iyr_sI, & + jhu_sI, jdh_sI, tim2sI +6002 format(' 2nd sIB /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/(', i1, & + ') t =', i12) + +10 continue + close(unit=11) + + else +#if(WR) + write(6, 6003) jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itisIB +6003 format(' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12, 's A.P.') +#endif + endif + + ! +--Time Interpolation + ! + ================== + + if(itisIB <= tim2sI .and. tim1sI < tim2sI) then + + rate = float(itisIB - tim1sI) / float(tim2sI - tim1sI) + do j = 1, my + do i = 1, mx + !Coupling: inside NEMO domaine sicsIB changed in + ! - inigen.f (first timpe step) + ! -oasis_2_mar.f (all the others) + ! outside MAJ sicsIB here with the usual sic rate + ! CK_AO 28/02/2020 + + ! old way + !c #AO sic1sI(i,j)=sicsIB(i,j) + !c #AO sic2sI(i,j)=sicsIB(i,j) + + sicsIB(i, j) = sic1sI(i, j) + & + (sic2sI(i, j) - sic1sI(i, j)) * rate + +#if(AO) + if(weightAO_sic(i, j) /= 1) then + sicsIB(i, j) = (1.-weightao_sic(i, j)) * sicsAO(i, j) + & + (weightAO_sic(i, j) * sicsIB(i, j)) + endif +#endif + enddo + enddo + + newsicINI = 1 + + else + newsicINI = 0 + endif + + return +endsubroutine INIsic diff --git a/MAR/code_mar/inisnd.f90 b/MAR/code_mar/inisnd.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c4be764952b222b381161f3dd4ffdc7247fb01c0 --- /dev/null +++ b/MAR/code_mar/inisnd.f90 @@ -0,0 +1,1560 @@ +#include "MAR_pp.def" +subroutine inisnd + ! +-----------------------------------------------------------------------+ + ! | MAR INPUT ATMOS 19-02-2004 MAR | + ! | subroutine inisnd includes Large Scale Conditions from a Sounding | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^^ itexpe: Experiment Iteration Index | + ! | iterun: Run Iteration Index (n Run for 1 Experiment) | + ! | log_1D=(0,1) (before,after) Boundary Layer Initialization | + ! | potvor:"Potential Vorticity conserved" Initialization Switch | + ! | potvor=.T. => Potential Vorticity (PV) Conservation | + ! | Constraint is used (in 2-D Mode only) | + ! | conmas:"Mass conserved" Initialization Switch | + ! | conmas=.T. => Mass Conservation is used | + ! | | + ! | INPUT: Sounding(s) / File MARSND.dat | + ! | ^^^^^^ | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ MESOSCALE VARIABLES | + ! | ^^^^^^^^^^^^^^^^^^^ | + ! | nSND : Sounding Number | + ! | pstDY (mx,my) : Initial Model Thickness [kPa] | + ! | pstDY1(mx,my) : Initial Model Thickness -FIXED- [kPa] | + ! | ugeoDY(mx,my,mz) : Initial Geo. Wind (x-Direction) [m/s] | + ! | vgeoDY(mx,my,mz) : Initial Geo. Wind (y-Direction) [m/s] | + ! | uairDY(mx,my,mz) : Initial Wind (x-Direction) [m/s] | + ! | vairDY(mx,my,mz) : Initial Wind (y-Direction) [m/s] | + ! | tairDY(mx,my,mz) : Initial Temperature [K] | + ! | TairSL(mx,my) : Initial Surface Air Temperature [K] | + ! | (Sounding Extrapolated to the Surface; | + ! | - dtagSL ) | + ! | pktaDY(mx,my,mzz): Initial Reduced Potential Temperature | + ! | qvDY(mx,my,mz) : Initial Specific Humididity [kg/kg] | + ! | qvapSL(mx,my) : Initial Specific Humididity [kg/kg] | + ! | (Sounding Extrapolated to the Surface) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ LARGE SCALE VARIABLES (BOUNDARIES and DOMAIN AVERAGE) | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | 1. LBC | + ! | vaxgLB (mx,my,mz,n):Large Scale Values of the Variables | + ! | (n=1,2,3,4,5) <=> (u,v,qv,pktaDY,pstDY), | + ! | for x << | + ! | vaxdLB : idem, x >> | + ! | vayiLB : idem, y << | + ! | vaysLB : idem, y >> | + ! | zetaD : Potential Vorticity (CAUTION: Time Independant) | + ! | 2. UBC | + ! | uairUB, vairUB, pktaUB | + ! | | + ! | METHOD: Vertical Interpolation on Sigma Levels is first performed | + ! | ^^^^^^^ For two Soundings nearest in Time (before and after runtime) | + ! | Then Time Interpolation | + ! | This order was preferred to the reverse because it allows | + ! | to use Soundings having a different vertical Discretization | + ! | | + ! | # OPTIONS: _SC Supersaturation not allowed (do NOT USE for SCu cloud) | + ! | # ^^^^^^^^ #WR Additional Output | + ! | | + ! | CAUTION: inisnd may be used only for Large Scale Thermodynamics | + ! | ^^^^^^^^ independant of x and y (i.e.for not too large model domain) | + ! | zeSND fixed at its initial value whenever Sounding varies | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_ge + use marsnd + use mar_dy + use mar_lb + use mar_ub + use mar_sl + use mar_wk + use mar_io +#if(NH) + use mar_nh +#endif +#if(PV) + use mar_PV +#endif + + implicit none + + ! +--Local Variables + ! + =============== +#if(CS) + logical consnd +#endif + integer i, j, k, m + integer logcon + integer lbcfix, lsf, lvg + integer intpol, jhsnd1, jhsnd2, i0snd, j0snd, ksnd, msnd + integer ishmin, jshmin, ii, jj, inew, jnew + integer iyrnew, mmanew, jdanew, jhunew + real tsurf0, qsurf0, gradti, graddt, gra, timar, timarn, timmar + real shmin, distmn, distij, ta_inv, pksh, gsnd, ddnew + real zetaD, dul, ttij_1, ttij_2 + real qsat0D, acap, dem1 + + real pksnd(0:40, 2) + ! +... pksnd: pSND ** (R/Cp), + ! + where (pSND/100) ** (R/Cp) : Exner Function + + real tmsnd(0:40, 2) + ! +... tmsnd: Potential Temperature + ! + averaged over the layer between ksnd-1/2 and ksnd+1/2 + + real pint(2) + real tint(2), qint(2) + + real ttij(mz, 2), qvij(mz, 2) + real ulij(mz, 2), vlij(mz, 2) + + real dpt(mz), dqa(mz) + real dug(mz), dvg(mz) + + real fftt(3), ddtt(3) + + ! +--DATA + ! + ==== + + data lbcfix/1/ +#if(CS) + data consnd/.true./ +#endif + + data dem1/1.0e-1/ + + data lsf/0/ +#if(OB) + openLB = .true. + lbcfix = 0 +#endif + + lvg = 0 + ! +...lvg: is set to 1 if |Vg(sounding)| .ne. 0 anywhere + + acap = 1.0 / cap + ! +...acap: Inverse of R / Cp + + ttij_1 = 0.0 + ttij_2 = 0.0 + + ! +--Time Parameters + ! + =============== + + if(iterun == 0) then + tiSND1 = -99999999.99 + tiSND2 = -99999999.99 + iSND = imez + jSND = jmez + loSND = 1 + endif + + timar = ((iyrrGE * 365 + iyrrGE * 0.25 & + + njyrGE(mmarGE) + jdarGE) * 24 & + + jhurGE + itizGE(iSND, jSND)) * 36.d2 & + + minuGE * 6.d1 + jsecGE + timarn = timar + + ! +--Interpolation Parameter + ! + ======================= + + if(tiSND1 >= tiSND2) & + intpol = 0 + ! +... intpol = 0 ==> No Interpolation between two soundings + ! + 1 ==> Interpolation between two soundings + + ! + +++++++++++++++++++++++++++++++ + ! +--Search of the relevant Sounding + ! + +++++++++++++++++++++++++++++++ + + ! +--Main Dependant Variables + ! + ======================== + + tSND(:, 1) = (/277.0, 272.2, 268.7, 265.2, 261.7, & + 255.7, 249.7, 243.7, 237.7, 231.7, & + 225.7, 219.7, 219.2, 218.7, 218.2, & + 217.7, 217.2, 216.7, 216.2, 215.7, & + 215.2, 215.2, 215.2, 215.2, 215.2, & + 215.2, 215.2, 217.4, 227.8, 243.2, & + 258.5, 265.7, 265.7, 265.7, 265.7, & + 265.7, 265.7, 265.7, 265.7, 265.7, 265.7/) + tSND(:, 2) = (/277.0, 272.2, 268.7, 265.2, 261.7, & + 255.7, 249.7, 243.7, 237.7, 231.7, & + 225.7, 219.7, 219.2, 218.7, 218.2, & + 217.7, 217.2, 216.7, 216.2, 215.7, & + 215.2, 215.2, 215.2, 215.2, 215.2, & + 215.2, 215.2, 217.4, 227.8, 243.2, & + 258.5, 265.7, 265.7, 265.7, 265.7, & + 265.7, 265.7, 265.7, 265.7, 265.7, 265.7/) + + qSND(:, 1) = (/27e-2, .27e-2, .21e-2, .17e-2, .13e-2, & + .80e-3, .51e-3, 32e-3, .14e-3, .67e-4, & + .35e-4, .18e-4, .20e-4, .20e-4, 70e-5, & + .45e-5, .40e-5, .39e-5, .40e-5, .42e-5, & + .48e-5, 51e-5, .68e-5, .81e-5, .10e-4, & + .13e-4, .17e-4, .20e-4, 14e-4, .10e-4, & + .14e-4, .69e-5, .70e-5, .72e-5, .74e-5, & + 75e-5, .77e-5, .79e-5, .81e-5, .83e-5, .86e-5/) + qSND(:, 2) = (/27e-2, .27e-2, .21e-2, .17e-2, .13e-2, & + .80e-3, .51e-3, 32e-3, .14e-3, .67e-4, & + .35e-4, .18e-4, .20e-4, .20e-4, 70e-5, & + .45e-5, .40e-5, .39e-5, .40e-5, .42e-5, & + .48e-5, 51e-5, .68e-5, .81e-5, .10e-4, & + .13e-4, .17e-4, .20e-4, 14e-4, .10e-4, & + .14e-4, .69e-5, .70e-5, .72e-5, .74e-5, & + 75e-5, .77e-5, .79e-5, .81e-5, .83e-5, .86e-5/) + + zSND(:, 1) = (/-143., 0., 1001., 1993., 2992., & + 3993., 4994., 5983., 6978., 7988., & + 8984., 9970., 10968., 11975., 12966., & + 13949., 14945., 15932., 16950., 17900., & + 18914., 19884., 20894., 21933., 22985., & + 23799., 24990., 29928., 35068., 38589., & + 46673., 49408., 49583., 49761., 49948., & + 50132., 50324., 50521., 50723., 50930., 51143./) + zSND(:, 2) = (/-143., 0., 1001., 1993., 2992., & + 3993., 4994., 5983., 6978., 7988., & + 8984., 9970., 10968., 11975., 12966., & + 13949., 14945., 15932., 16950., 17900., & + 18914., 19884., 20894., 21933., 22985., & + 23799., 24990., 29928., 35068., 38589., & + 46673., 49408., 49583., 49761., 49948., & + 50132., 50324., 50521., 50723., 50930., 51143./) + + pSND(:, 1) = (/1036., 1018., 897., 790., 694., & + 608., 531., 463., 402., 347., & + 299., 257., 220., 188., 161., & + 138., 118., 101., 86., 74., & + 63., 54., 46., 39., 33., & + 29., 24., 11., 5., 3., & + 1., 0.7, 0.685, 0.669, 0.654, & + 0.637, 0.622, 0.606, 0.591, 0.576, 0.560/) + pSND(:, 2) = (/1036., 1018., 897., 790., 694., & + 608., 531., 463., 402., 347., & + 299., 257., 220., 188., 161., & + 138., 118., 101., 86., 74., & + 63., 54., 46., 39., 33., & + 29., 24., 11., 5., 3., & + 1., 0.7, 0.685, 0.669, 0.654, & + 0.637, 0.622, 0.606, 0.591, 0.576, 0.560/) + + ! + ------------------------------------ + if(timar > tiSND2 .and. loSND == 1) then + ! + ------------------------------------ + + open(unit=2, status='old', file='MARsnd.dat') + rewind 2 + read(2, 202) iyrSND, mmaSND, jdaSND, jhuSND +202 format(4i4, f4.0) + read(2, 203) +203 format(1x) + read(2, 202) iSND, jSND + read(2, 203) + read(2, 203) + read(2, 204)(tSND(ksnd, 1), qSND(ksnd, 1), & + zSND(ksnd, 1), pSND(ksnd, 1), & + fSND(ksnd, 1), dSND(ksnd, 1), ksnd=40, 0, -1) +204 format((6d13.6)) + read(2, 204) zeSND(1) + read(2, 202) loSND + + ! +- Time Parameters + ! + ~~~~~~~~~~~~~~~ + jhsnd1 = (iyrSND * 365 + iyrSND / 4 & + + njyrGE(mmaSND) + jdaSND) * 24 + jhuSND + itizGE(iSND, jSND) + tiSND1 = ((iyrSND * 365 + iyrSND / 4 & + + njyrGE(mmaSND) + jdaSND) * 24 + jhuSND + itizGE(iSND, jSND)) & + * 3.6d3 + + ! + ~~~~~~~~~ + ! +- - -do until + msnd = 1 +200 continue + ! + ~~~~~~~~~ + + if(timar > tiSND1 .and. loSND == 1) then + msnd = msnd + 1 + intpol = 1 + + read(2, 202) iyrnew, mmanew, jdanew, jhunew + read(2, 203) + read(2, 202) inew, jnew + read(2, 203) + read(2, 203) + read(2, 204)(tSND(ksnd, 2), qSND(ksnd, 2), & + zSND(ksnd, 2), pSND(ksnd, 2), & + fSND(ksnd, 2), dSND(ksnd, 2), ksnd=40, 0, -1) + read(2, 204) zeSND(2) + read(2, 202) loSND + + if(abs(zeSND(2) - zeSND(1)) > epsi) & + write(6, 1) +1 format(' **********************************', & + '**********************************', & + /, ' * CAUTION: zeSND is Time Dependant', & + ' (NOT taken into account in MAR) *', & + /, ' **********************************', & + '**********************************', /, 1x) + + ! +- Time Parameters + ! + ~~~~~~~~~~~~~~~ + jhsnd2 = (iyrnew * 365 + iyrnew / 4 & + + njyrGE(mmanew) + jdanew) * 24 + jhunew + itizGE(iSND, jSND) + tiSND2 = ((iyrnew * 365 + iyrnew / 4 & + + njyrGE(mmanew) + jdanew) * 24 + jhunew + itizGE(iSND, jSND)) & + * 3.6d3 + + ! +- Change of Year + ! + ~~~~~~~~~~~~~~~ + timarn = timar + if(mmaSND == 12 .and. mmanew == 1) then +#if(YR) + ! Change in case of iyrSND and iyrnew not defined (#YR) + jhsnd2 = jhsnd2 + nhyrGE + tiSND2 = tiSND2 + nhyrGE * 3600.0 +#endif + + if(mmarGE == 1) & + timarn = timar + nhyrGE * 3600.0 + endif + + ! +- Constant Sounding if either imposed (logcon = 1) or MARsnd.dat at EOF + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + logcon = 0 +#if(CS) + if(itexpe == 0 .and. consnd) logcon = 1 +#endif + if(timarn > tiSND2 .or. logcon == 1) then + + intpol = 0 + + jhsnd1 = jhsnd2 + tiSND1 = tiSND2 + iyrSND = iyrnew + mmaSND = mmanew + jdaSND = jdanew + jhuSND = jhunew + do ksnd = 0, 40 + tSND(ksnd, 1) = tSND(ksnd, 2) + qSND(ksnd, 1) = qSND(ksnd, 2) + zSND(ksnd, 1) = zSND(ksnd, 2) + pSND(ksnd, 1) = pSND(ksnd, 2) + fSND(ksnd, 1) = fSND(ksnd, 2) + dSND(ksnd, 1) = dSND(ksnd, 2) + enddo + endif + + else + + ! +- Constant Sounding if Simulation starts before 1st Sounding Time + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + intpol = 0 + + jhsnd2 = jhsnd1 + tiSND2 = tiSND1 + iyrnew = iyrSND + mmanew = mmaSND + jdanew = jdaSND + jhunew = jhuSND + do ksnd = 0, 40 + tSND(ksnd, 2) = tSND(ksnd, 1) + qSND(ksnd, 2) = qSND(ksnd, 1) + zSND(ksnd, 2) = zSND(ksnd, 1) + pSND(ksnd, 2) = pSND(ksnd, 1) + fSND(ksnd, 2) = fSND(ksnd, 1) + dSND(ksnd, 2) = dSND(ksnd, 1) + enddo + + endif + + ! +- Continue Read + ! + ~~~~~~~~~~~~~ + + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(timarn > tiSND2 .and. loSND == 1) go to 200 + ! +- - -end do until + ! + ~~~~~~~~~~~~~ + + ! +- STOP Read + ! + ~~~~~~~~~~~~~ + + close(unit=2) + + ! +- Output Listing + ! + ~~~~~~~~~~~~~~~ + write(4, 205) msnd - intpol, jdaSND, labmGE(mmaSND), iyrSND, & + jhuSND, jhuSND + itizGE(iSND, jSND) +205 format(/, ' SOUNDING No', i2, i6, 1x, a3, i5, i4, ' TU (', i2, ' LT)', & + ' --- MARsnd ---', & + /, ' =============', & + /, ' z (m) | p (Pa) | T (K) | qv (kg/kg) |', & + ' ff(m/s) | dd(deg) |' & + /, '---------+---------+---------+------------+', & + '---------+---------+') + + write(4, 206)(zSND(ksnd, 1), pSND(ksnd, 1), & + tSND(ksnd, 1), qSND(ksnd, 1), & + fSND(ksnd, 1), dSND(ksnd, 1), ksnd=40, 0, -1) +206 format((2(f8.0, ' |'), f8.2, ' |', d11.3, ' |', f8.2, ' |', f8.1, ' |')) + ! + + if(intpol == 1) then + write(4, 205) msnd, jdanew, labmGE(mmanew), iyrnew, & + jhunew, jhunew + itizGE(iSND, jSND) + write(4, 206)(zSND(ksnd, 2), pSND(ksnd, 2), & + tSND(ksnd, 2), qSND(ksnd, 2), & + fSND(ksnd, 2), dSND(ksnd, 2), ksnd=40, 0, -1) + endif + + ! + ------ + endif + ! + ------ + + ! +--Additional Variables + ! + ==================== + + ! +--Time Parameters + ! + --------------- + + if(tiSND2 > tiSND1) then + gradti = (timarn - tiSND1) / (tiSND2 - tiSND1) + graddt = dt / (tiSND2 - tiSND1) + else + gradti = 0.0 + graddt = 0.0 + endif + + ! +--Exner Function and Potential Temperature + ! + ---------------------------------------- + + do nSND = 1, intpol + 1 + do ksnd = 0, 40 + pksnd(ksnd, nSND) = exp(cap * log(dem1 * pSND(ksnd, nSND))) + tpSND(ksnd, nSND) = tSND(ksnd, nSND) * pcap / pksnd(ksnd, nSND) + enddo + + ! +--Potential Temperature Averaging + ! + ------------------------------- + + tmsnd(0, nSND) = tpSND(1, nSND) + do ksnd = 1, 39 + tmsnd(ksnd, nSND) = 0.5 * (tpSND(ksnd, nSND) & + + tpSND(ksnd + 1, nSND)) + enddo + tmsnd(40, nSND) = tpSND(40, nSND) + enddo + + ! + ++++++++++++++ + ! +--INITIALISATION + ! + ++++++++++++++ + + ! + ++++++++++++++++ + if(itexpe == 0) then + ! + ++++++++++++++++ + + ! +--Reference Sea Level Air Temperature (K) + ! + ======================================= + +#if(NH) + taNH = tSND(1, 1) +#endif + + ! +--Initialisation of the main Thermodynamical Variables + ! + Pressure Thickness, Surface Temperature and Specific Humidity + ! + ============================================================= + + gra = -gravit / RDryAi + pstSND = 0.1 * (pSND(1, 1) + gradti * (pSND(1, intpol + 1) - pSND(1, 1))) & + - ptopDY + tsurf0 = tSND(1, 1) + gradti * (tSND(1, intpol + 1) - tSND(1, 1)) + qsurf0 = qSND(1, 1) + gradti * (qSND(1, intpol + 1) - qSND(1, 1)) + + ! +- Reference Grid Point for Temperature Vertical Profile Initialisation + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ishmin = iSND + jshmin = jSND + ! +... indices for the lowest grid point + + shmin = sh(ishmin, jshmin) + distmn = mx + my + + do j = 1, my + do i = 1, mx + + if(sh(i, j) < shmin) then + ! +... Constraint 1: Reference Grid Point must be the lowest One + + ishmin = i + jshmin = j + shmin = sh(ishmin, jshmin) + distmn = (i - iSND) * (i - iSND) + (j - jSND) * (j - jSND) + else + if(sh(i, j) == shmin) then + ! +... Constraint 2: Reference Grid Point must be the closest One + ! + from the Sounding Grid Point + + distij = (i - iSND) * (i - iSND) + (j - jSND) * (j - jSND) + if(distij < distmn) then + ishmin = i + jshmin = j + shmin = sh(ishmin, jshmin) + distmn = distij + endif + endif + endif + + ! +- Surface Elevation is MSL + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + pstDY(i, j) = pstSND + TairSL(i, j) = tsurf0 - dtagSL + qvapSL(i, j) = qsurf0 + + ! +- Surface Elevation is NOT MSL ==> Integration + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(sh(i, j) /= zero) then + ! + + do nSND = 1, intpol + 1 + ! + + ksnd = 1 + ! +... ksnd = 1 (when pSND(mz) -> pSND(0:mz), etc...) + ! + zSND(0) = -500m + ! + + ! + - - - - - do until +110 continue + if(zSND(ksnd, nSND) > sh(i, j)) go to 111 + ksnd = ksnd + 1 + go to 110 +111 continue + ! + - - - - - end do until + ! + + pksh = pksnd(ksnd - 1, nSND) & + + gravit * (zSND(ksnd - 1, nSND) - sh(i, j)) & + * pcap / (cp * tmsnd(ksnd - 1, nSND)) + pint(nSND) = exp(acap * log(pksh)) + ! + + gsnd = (tSND(ksnd, nSND) - tSND(ksnd - 1, nSND)) & + / (zSND(ksnd, nSND) - zSND(ksnd - 1, nSND)) + tint(nSND) = tSND(ksnd - 1, nSND) & + + gsnd * (sh(i, j) - zSND(ksnd - 1, nSND)) + gsnd = (qSND(ksnd, nSND) - qSND(ksnd - 1, nSND)) & + / (zSND(ksnd, nSND) - zSND(ksnd - 1, nSND)) + qint(nSND) = qSND(ksnd - 1, nSND) & + + gsnd * (sh(i, j) - zSND(ksnd - 1, nSND)) + ! + + enddo + ! + + pstDY(i, j) = pint(1) + gradti * (pint(intpol + 1) - pint(1)) & + - ptopDY + TairSL(i, j) = tint(1) + gradti * (tint(intpol + 1) - tint(1)) & + - dtagSL + qvapSL(i, j) = qint(1) + gradti * (qint(intpol + 1) - qint(1)) + ! + + endif + ! + + ! _SC qmax = qsat0D(TairSL(i,j),unun,pstDY(i,j),ptopDY,lsf) + ! _SC qvapSL(i,j) = min (qvapSL(i,j),qmax) + ! +... avoids supersaturation (_SC) + ! + + pstDY1(i, j) = pstDY(i, j) + enddo + enddo + ! + + ! + + ! +--Temperature and Specific Humidity Vertical Profiles Initialisation + ! + ================================================================== + ! + + do j = 1, my + do i = 1, mx + ! + + do nSND = 1, intpol + 1 + ! + + ! + ************** + call inisnd_th(pstDY(i, j), ptopDY, sigmid, sigma, ttij, qvij) + ! + ************** + ! + + enddo + ! + + do k = mz, 1, -1 + tairDY(i, j, k) = ttij(k, 1) + gradti * (ttij(k, intpol + 1) - ttij(k, 1)) + ta_inv = min(tairDY(i, j, k), tairDY(i, j, mz) - dtagSL) + qvDY(i, j, k) = (qvij(k, 1) + gradti * (qvij(k, intpol + 1) - qvij(k, 1))) & + * qsat0D(ta_inv, sigma(k), & + pstDY(i, j), ptopDY, lsf) & + / qsat0D(tairDY(i, j, k), sigma(k), & + pstDY(i, j), ptopDY, lsf) + ! +... Last two Lines: Correction for possible Surface Inversion + ! + + ! _SC qmax = qsat0D(tairDY(i,j,k),sigma(k), + ! _SC. pstDY(i,j),ptopDY,lsf) + ! _SC qvDY(i,j,k) = min (qvDY(i,j,k),qmax) +#if(OM) + tairDY(i, j, k) = tSND(1, 1) + gradti * (tSND(intpol + 1, 1) - tSND(1, 1)) + qvDY(i, j, k) = zero +#endif + enddo + enddo + enddo + ! + + ! + + ! +--Reduced Potential Temperature Vertical Profiles Initialisation + ! + ================================================================== + ! + + do j = 1, my + do i = 1, mx + pktaDY(i, j, mzz) = TairSL(i, j) & + / ((pstDY1(i, j) + ptopDY)**cap) + enddo + enddo + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + pktaDY(i, j, k) = tairDY(i, j, k) & + / ((pstDY1(i, j) * sigma(k) + ptopDY)**cap) + enddo + enddo + enddo + ! + + ! + + ! +--Geostrophic Wind Vertical Profile 1st Initialisation + ! + ==================================================== + ! + + do j = 1, my + do i = 1, mx + ! + + do nSND = 1, intpol + 1 + ! + + ! + + ! +--Rotation from x in the West-East Direction to x in Direction GEddxx + ! + ------------------------------------------------------------------- + ! + + do ksnd = 0, 40 + ddnew = (GEddxx - dSND(ksnd, nSND)) * degrad + uuSND(ksnd) = fSND(ksnd, nSND) * cos(ddnew) + vvSND(ksnd) = fSND(ksnd, nSND) * sin(ddnew) + enddo + ! + + ! + + ! +--Vertical Interpolation + ! + ---------------------- + ! + + ! + ************** + call inisnd_vl(pstDY(i, j), ptopDY, sigmid, sigma, ulij, vlij) + ! + ************** + ! + + enddo + ! + + ! + + ! +--Time Interpolation + ! + ------------------ + ! + + do k = 1, mz + ugeoDY(i, j, k) = ulij(k, 1) + gradti * (ulij(k, intpol + 1) - ulij(k, 1)) + vgeoDY(i, j, k) = vlij(k, 1) + gradti * (vlij(k, intpol + 1) - vlij(k, 1)) + enddo + enddo + enddo + ! + + zetaD = zeSND(1) + gradti * (zeSND(intpol + 1) - zeSND(1)) + ! +... zetaD: Large Scale Local Vorticity (CAUTION: Time Independant) + ! + + ! + + ! +--Large Scale Wind Vertical Profile 1st Initialisation + ! + ==================================================== + ! + + ! + + ! +--Auxiliary Variable for Mass Flux Computation + ! + -------------------------------------------- + ! + + shmin = 100000.0 + ! +... shmin : minimum surface elevation (for mass flux computation) + ! + + do j = 1, my + do i = 1, mx + if(sh(i, j) < shmin) then + i0snd = i + j0snd = j + shmin = sh(i, j) + endif + enddo + enddo +#if(PV) + ! +--Wind Initialisation, under Constant Potential Vorticity Constraint + ! + ------------------------------------------------------------------ + if(potvor .and. mmx > 1 .and. mmy == 1) then + do k = 1, mz + ulscPV(k) = ugeoDY(iSND, jSND, k) + vlscPV(k) = vgeoDY(iSND, jSND, k) + if(abs(ulscPV(k)) > zero .or. abs(vlscPV(k)) > zero) lvg = 1 + enddo + ! Initialisation based on Potential Vorticity Conservation + ! Based on the Direct Integration of the Relative Vorticity + ! cCA : inisnd_PV does not exist + ! ! + ************** + ! if (mmx.gt.1.and.lvg.eq.1) call inisnd_PV(zetaD) + ! ! + ************** + else + ! +--Wind Initialisation under Constant Mass Flux Constraint + ! + ------------------------------------------------------- +#endif + if(conmas) then + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = pstDY(i0snd, j0snd) * ugeoDY(i, j, k) + WKxyz2(i, j, k) = pstDY(i0snd, j0snd) * vgeoDY(i, j, k) + uairDY(i, j, k) = WKxyz1(i, j, k) / pstDY(i, j) + vairDY(i, j, k) = WKxyz2(i, j, k) / pstDY(i, j) + ! +... Geostrophic Wind only used in Large Scale Press.Grad.Force + ! + real Wind takes into Account Mass Conservation + ! + + enddo + enddo + enddo + ! + + if(mmy == 1) then + do k = 1, mz + do j = 1, my + do i = 1, mx + vairDY(i, j, k) = vgeoDY(i, j, k) + enddo + enddo + enddo + endif + ! + + else + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + uairDY(i, j, k) = ugeoDY(i, j, k) + vairDY(i, j, k) = vgeoDY(i, j, k) + enddo + enddo + enddo + endif +#if(PV) + endif +#endif + ! + + ! + + ! +--Output + ! + ------ + ! + +#if(PV) + write(21, 182)(vgeoDY(i, 1, mz), i=1, mx) +182 format(/, ' Vg(i,1,mz) :', /,(15f8.2)) + write(21, 183)(vairDY(i, 1, mz), i=1, mx) +183 format(/, ' V (i,1,mz) :', /,(15f8.2)) + write(21, 184)(ugeoDY(i, 1, mz), i=1, mx) +184 format(/, ' Ug(i,1,mz) :', /,(15f8.2)) + write(21, 185)(uairDY(i, 1, mz), i=1, mx) +185 format(/, ' U (i,1,mz) :', /,(15f8.2)) +#endif + ! + + if(IO_loc >= 2) then + write(21, 1860) +1860 format(1x) + write(21, 1861)(ugeoDY(iSND, jSND, k), k=1, mz) +1861 format(' ug =', /,(15f7.1, ' m/sec')) + ! + +#if(PV) + if(potvor .and. mmx > 1 .and. mmy == 1) then + write(21, 1860) + write(21, 1862) adugPV +1862 format(' adugPV =', f7.3, ' m/sec') + endif +#endif + ! + + write(21, 1860) + write(21, 1863)(vgeoDY(iSND, jSND, k), k=1, mz) +1863 format(' vg =', /,(15f7.1, ' m/sec')) + ! + +#if(PV) + if(potvor .and. mmx > 1 .and. mmy == 1) then + write(21, 1860) + write(21, 1864)(1.d3 * advgPV(iSND, k), k=1, mz) +1864 format(' advgPV =', /,(15f7.3, ' mm/sec')) + endif +#endif + ! + + write(21, 1860) + endif + ! + + ! + + ! + ++++++ + endif + ! + ++++++ + + ! + +++++++++++++++++++++++++++++++++++++ + ! +--INITIALIZATION of BOUNDARY CONDITIONS + ! + +++++++++++++++++++++++++++++++++++++ + + ! + ++++++++++++++++++ + if(itexpe == 0) then + ! + ++++++++++++++++++ + + ! + ================ + if(log_1D == 0) then + ! + ================ + + ! +--Upper + ! + ----- + do k = 1, mzabso + do j = 1, my + do i = 1, mx + uairUB(i, j, k) = uairDY(i, j, k) + vairUB(i, j, k) = vairDY(i, j, k) + pktaUB(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + + ! +--x Axis + ! + ------ + if(mmx > 1) then + + do k = 1, mz + + do j = 1, my + do i = 1, n7mxLB + vaxgLB(i, j, k, 1) = uairDY(i, j, k) + vaxgLB(i, j, k, 2) = vairDY(i, j, k) + vaxgLB(i, j, k, 3) = qvDY(i, j, k) + vaxgLB(i, j, k, 4) = pktaDY(i, j, k) + vaxgLB(i, j, 1, 5) = pstDY(i, j) + enddo + do i = mx - n6mxLB, mx + vaxdLB(i, j, k, 1) = uairDY(i, j, k) + vaxdLB(i, j, k, 2) = vairDY(i, j, k) + vaxdLB(i, j, k, 3) = qvDY(i, j, k) + vaxdLB(i, j, k, 4) = pktaDY(i, j, k) + vaxdLB(i, j, 1, 5) = pstDY(i, j) + enddo + enddo + + enddo + + endif + + ! +- y Axis + ! + ------ + if(mmy > 1) then + + do k = 1, mz + + do i = 1, mx + do j = 1, n7myLB + vayiLB(i, j, k, 1) = uairDY(i, j, k) + vayiLB(i, j, k, 2) = vairDY(i, j, k) + vayiLB(i, j, k, 3) = qvDY(i, j, k) + vayiLB(i, j, k, 4) = pktaDY(i, j, k) + vayiLB(i, j, 1, 5) = pstDY(i, j) + enddo + do j = my - n6myLB, my + vaysLB(i, j, k, 1) = uairDY(i, j, k) + vaysLB(i, j, k, 2) = vairDY(i, j, k) + vaysLB(i, j, k, 3) = qvDY(i, j, k) + vaysLB(i, j, k, 4) = pktaDY(i, j, k) + vaysLB(i, j, 1, 5) = pstDY(i, j) + enddo + enddo + + enddo + + endif + + ! + ==== + else + ! + ==== + + if(tequil > 0.0) then + + ! +--Upper + ! + ----- + do k = 1, mzabso + do j = 1, my + do i = 1, mx + uairUB(i, j, k) = uairDY(i, j, k) + vairUB(i, j, k) = vairDY(i, j, k) + pktaUB(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + + ! +--x Axis + ! + ------ + if(mmx > 1) then + + do k = 1, mz + + do j = 1, my + do i = 2, n7mxLB + vaxgLB(i, j, k, 1) = uairDY(i, j, k) + vaxgLB(i, j, k, 2) = vairDY(i, j, k) + vaxgLB(i, j, 1, 5) = pstDYn(i, j) + enddo + vaxgLB(1, j, k, 1) = uairDY(ip11 - lbcfix, j, k) + vaxgLB(1, j, k, 2) = vairDY(ip11 - lbcfix, j, k) + vaxgLB(1, j, 1, 5) = pstDYn(ip11 - lbcfix, j) + + do i = mx - n6mxLB, mx1 + vaxdLB(i, j, k, 1) = uairDY(i, j, k) + vaxdLB(i, j, k, 2) = vairDY(i, j, k) + vaxdLB(i, j, 1, 5) = pstDYn(i, j) + enddo + vaxdLB(mx, j, k, 1) = uairDY(mx1 + lbcfix, j, k) + vaxdLB(mx, j, k, 2) = vairDY(mx1 + lbcfix, j, k) + vaxdLB(mx, j, 1, 5) = pstDYn(mx1 + lbcfix, j) + enddo + + enddo + + endif + + ! +- y Axis + ! + ------ + if(mmy > 1) then + + do k = 1, mz + + do i = 1, mx + do j = 1, n7myLB + vayiLB(i, j, k, 1) = uairDY(i, j, k) + vayiLB(i, j, k, 2) = vairDY(i, j, k) + vayiLB(i, j, k, 5) = pstDYn(i, j) + enddo + vayiLB(i, 1, k, 1) = uairDY(i, jp11 - lbcfix, k) + vayiLB(i, 1, k, 2) = vairDY(i, jp11 - lbcfix, k) + vayiLB(i, 1, k, 5) = pstDYn(i, jp11 - lbcfix) + do j = my - n6myLB, my1 + vaysLB(i, j, k, 1) = uairDY(i, j, k) + vaysLB(i, j, k, 2) = vairDY(i, j, k) + vaysLB(i, j, k, 5) = pstDYn(i, j) + enddo + vaysLB(i, my, k, 1) = uairDY(i, my1 + lbcfix, k) + vaysLB(i, my, k, 2) = vairDY(i, my1 + lbcfix, k) + vaysLB(i, my, k, 5) = pstDYn(i, my1 + lbcfix) + enddo + + enddo + + endif + + endif + + ! + ====== + endif + ! + ====== + + ! + +++++++++++++++++++++++++++++++++++++ + ! +--UPDATE of LATERAL BOUNDARY CONDITIONS + ! + +++++++++++++++++++++++++++++++++++++ + ! + + ! + ++++ + else + ! + ++++ + ! + + ! + + ! + ================ + if(intpol > 0) then + ! + ================ + ! + + ! + + ! +--Temperature and Specific Humidity Vertical Profiles Interpolation + ! + ================================================================= + ! + + ! + + ! +--x Axis / x << + ! + ------------- + ! + + if(mmx > 1) then + ! + + i = 1 + do j = 1, my +#if(pv) + i = iSND +#endif + ! + + ! +- Vertical Interpolation + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + do nSND = 1, 2 + ! + + ! + ************** + call inisnd_th(pstDY(i, j), ptopDY, sigmid, sigma, ttij, qvij) + ! + ************** + ! + + enddo +#if(pv) + ! CAUTION: vaxgLB assumed at i=1 assumed to be that of the Sounding Point + ! when Potential Temperature is conserved at the Synoptic Scale + i = 1 +#endif + ! + + ! +- Time Interpolation + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + dpt(k) = (ttij(k, 1) + gradti * (ttij(k, 2) - ttij(k, 1))) & + / exp(cap * log(pstDY(i, j) * sigma(k) + ptopDY)) & + - vaxgLB(i, j, k, 4) + dqa(k) = qvij(k, 1) + gradti * (qvij(k, 2) - qvij(k, 1)) & + - vaxgLB(i, j, k, 3) + enddo + ! + + if(openLB) then + do ii = 1, n7mxLB + do k = 1, mz + vaxgLB(ii, j, k, 4) = vaxgLB(ii, j, k, 4) + dpt(k) + vaxgLB(ii, j, k, 3) = vaxgLB(ii, j, k, 3) + dqa(k) + enddo + enddo + else + do ii = 1, n7mxLB + do k = 1, mz + vaxgLB(ii, j, k, 4) = pktaDY(1, j, k) + dpt(k) + vaxgLB(ii, j, k, 3) = qvDY(1, j, k) + dqa(k) + enddo + enddo + endif + ! + + enddo + ! + + ! + + ! +- x Axis / x >> + ! + ------------- + ! + + i = mx + do j = 1, my +#if(pv) + i = iSND +#endif + ! + + ! +- Vertical Interpolation + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + do nSND = 1, 2 + ! + + ! + ************** + call inisnd_th(pstDY(i, j), ptopDY, sigmid, sigma, ttij, qvij) + ! + ************** + ! + + enddo + ! + +#if(pv) + i = mx +#endif + ! + + ! +- Time Interpolation + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + dpt(k) = (ttij(k, 1) + gradti * (ttij(k, 2) - ttij(k, 1))) & + / exp(cap * log(pstDY(i, j) * sigma(k) + ptopDY)) & + - vaxdLB(i, j, k, 4) + dqa(k) = qvij(k, 1) + gradti * (qvij(k, 2) - qvij(k, 1)) & + - vaxdLB(i, j, k, 3) + enddo + ttij_1 = ttij(mz, 1) + ttij_2 = ttij(mz, 2) + ! + + if(openLB) then + do ii = mx - n6mxLB, mx + do k = 1, mz + vaxdLB(ii, j, k, 4) = vaxdLB(ii, j, k, 4) + dpt(k) + vaxdLB(ii, j, k, 3) = vaxdLB(ii, j, k, 3) + dqa(k) + enddo + enddo + else + do ii = mx - n6mxLB, mx + do k = 1, mz + vaxdLB(ii, j, k, 4) = pktaDY(mx, j, k) + dpt(k) + vaxdLB(ii, j, k, 3) = qvDY(mx, j, k) + dqa(k) + enddo + enddo + endif + ! + + enddo + ! + +#if(WR) + if(mod(minuGE, 30) == 0 .and. jsecGE == 0) then + write(6, 608) mmaSND, jdaSND, jhuSND + itizGE(iSND, jSND), & + mmarGE, jdarGE, jhurGE, & + mmanew, jdanew, jhunew + itizGE(iSND, jSND), & + tiSND1, timmar, tiSND2, & + gradti, vaxdLB(mx, my, mz, 4) * pcap +608 format(3(i6, '/', i2, '/', i2, 'LT'), 3f13.0, & + ' |Time| =', f5.2, 5x, ' Theta_CLS =', f7.2) + endif +#endif + ! + + ENDif ! {end mmx > 1} CTR + ! + + ! + + ! +- y Axis / y << + ! + ------------- + ! + + if(mmy > 1) then + ! + + j = 1 + do i = 1, mx + ! + + ! +- Vertical Interpolation + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + do nSND = 1, 2 + ! + + ! + ************** + call inisnd_th(pstDY(i, j), ptopDY, sigmid, sigma, ttij, qvij) + ! + ************** + ! + + enddo + ! + + ! +- Time Interpolation + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + dpt(k) = (ttij(k, 1) + gradti * (ttij(k, 2) - ttij(k, 1))) & + / exp(cap * log(pstDY(i, j) * sigma(k) + ptopDY)) & + - vayiLB(i, j, k, 4) + dqa(k) = qvij(k, 1) + gradti * (qvij(k, 2) - qvij(k, 1)) & + - vayiLB(i, j, k, 3) + enddo + ! + + if(openLB) then + do jj = 1, n7myLB + do k = 1, mz + vayiLB(i, jj, k, 4) = vayiLB(i, jj, k, 4) + dpt(k) + vayiLB(i, jj, k, 3) = vayiLB(i, jj, k, 3) + dqa(k) + enddo + enddo + else + do jj = 1, n7myLB + do k = 1, mz + vayiLB(i, jj, k, 4) = pktaDY(i, 1, k) + dpt(k) + vayiLB(i, jj, k, 3) = qvDY(i, 1, k) + dqa(k) + enddo + enddo + endif + ! + + enddo + ! + + ! + + ! +- y Axis / y >> + ! + ------------- + ! + + j = my + do i = 1, mx + ! + + ! +- Vertical Interpolation + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + do nSND = 1, 2 + ! + + ! + ************** + call inisnd_th(pstDY(i, j), ptopDY, sigmid, sigma, ttij, qvij) + ! + ************** + ! + + enddo + ! + + ! +- Time Interpolation + ! + ~~~~~~~~~~~~~~~~~~~ + do k = 1, mz + dpt(k) = (ttij(k, 1) + gradti * (ttij(k, 2) - ttij(k, 1))) & + / exp(cap * log(pstDY(i, j) * sigma(k) + ptopDY)) & + - vaysLB(i, j, k, 4) + dqa(k) = qvij(k, 1) + gradti * (qvij(k, 2) - qvij(k, 1)) & + - vaysLB(i, j, k, 3) + enddo + ! + + if(openLB) then + do jj = my - n6myLB, my + do k = 1, mz + vaysLB(i, jj, k, 4) = vaysLB(i, jj, k, 4) + dpt(k) + vaysLB(i, jj, k, 3) = vaysLB(i, jj, k, 3) + dqa(k) + enddo + enddo + else + do jj = my - n6myLB, my + do k = 1, mz + vaysLB(i, jj, k, 4) = pktaDY(i, my, k) + dpt(k) + vaysLB(i, jj, k, 3) = qvDY(i, my, k) + dqa(k) + enddo + enddo + endif + ! + + enddo + ! + + ENDif ! {end mmy > 1} CTR + ! + + ! + + ! +--Large Scale Wind Vertical Profiles Interpolation / Dynamical Adjustment + ! + ======================================================================= + ! + + ! + + ! +--Mass Flux Auxiliary Variable + ! + ---------------------------- + ! + + if(conmas) then + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = pstDY1(iSND, jSND) / pstDY1(i, j) + enddo + enddo + ! + + else + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 1.0 + enddo + enddo + ! + + endif + ! + + ! + + ! +--Large Scale Wind Sounding: Default + ! + ---------------------------------- + ! + + do k = 1, mz + dug(k) = 0.0 + dvg(k) = 0.0 + enddo + ! + + ! + + ! +--Rotation from x in the West-East Direction to x in Direction GEddxx + ! + ------------------------------------------------------------------- + ! + + do nSND = 1, intpol + 1 + do ksnd = 0, 40 + ddnew = (GEddxx - dSND(ksnd, nSND)) * degrad + uuSND(ksnd) = fSND(ksnd, nSND) * cos(ddnew) + vvSND(ksnd) = fSND(ksnd, nSND) * sin(ddnew) + enddo + ! + + ! + + ! +--Vertical Interpolation + ! + ---------------------- + ! + + ! + ************** + call inisnd_vl(pstDY(iSND, jSND), ptopDY, sigmid, sigma, & + ulij, vlij) + ! + ************** + ! + + enddo + ! + + ! + + ! +--Time Interpolation + ! + ------------------ + ! + + do k = 1, mz + dug(k) = graddt * (ulij(k, intpol + 1) - ulij(k, 1)) + dvg(k) = graddt * (vlij(k, intpol + 1) - vlij(k, 1)) + enddo +#if(PV) + ! +--Update of Direct Integration of Wind constrained by PV Conservation + ! + ------------------------------------------------------------------- + ! + + if(potvor .and. mmx > 1 .and. mmy == 1) then + do k = 1, mz + ulscPV(k) = ulscPV(k) + dug(k) + vlscPV(k) = vlscPV(k) + dvg(k) + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx + advbPV(i, k) = advbPV(i, k) + dvg(k) + enddo + enddo + enddo + endif + ! +- PV Conservation + ! + ~~~~~~~~~~~~~~~~~ + if(potvor .and. mmx > 1 .and. mmy == 1) then + do k = 1, mz + do j = 1, my + do i = 1, mx + ! PV Conservation Constraint is included + ugeoDY(i, j, k) = adugPV * ulscPV(k) + vgeoDY(i, j, k) = advbPV(i, k) & + + advgPV(i, k) * ugeoDY(i, j, k) * ugeoDY(i, j, k) + dul = dug(k) * adugPV * adubPV(i, k) + ! uairDY_Synop := uairDY +dul + ! vairDY_Synop := vairDY +dvg(k) + ! isallobaric wind contained in (dul,dvl=dvg) + ugeoDY(i, j, k) = ugeoDY(i, j, k) + dvg(k) & + / (fcorDY(imez, jmez) * dt) + vgeoDY(i, j, k) = vgeoDY(i, j, k) - dul & + / (fcorDY(imez, jmez) * dt) + enddo + enddo + enddo + else +#endif + do k = 1, mz + do j = 1, my + do i = 1, mx + ugeoDY(i, j, k) = ugeoDY(i, j, k) + dug(k) + vgeoDY(i, j, k) = vgeoDY(i, j, k) + dvg(k) + uairDY(i, j, k) = uairDY(i, j, k) + dug(k) * WKxy1(i, j) + vairDY(i, j, k) = vairDY(i, j, k) + dvg(k) * WKxy1(i, j) + enddo + enddo + enddo +#if(PV) + endif +#endif + ! + + ! + + ! +--Lateral Boundaries + ! + ------------------ + ! + + if(openLB) then + ! + + ! +- x Axis / x << + ! + ~~~~~~~~~~~~~ + do i = 1, n7mxLB + do j = 1, my +#if(PV) + if(potvor .and. mmx > 1 .and. mmy == 1) then + do k = 1, mz + vaxgLB(i, j, k, 1) = & + vaxgLB(i, j, k, 1) + dug(k) * adubPV(i, k) * adugPV + vaxgLB(i, j, k, 2) = & + vaxgLB(i, j, k, 2) + dvg(k) + enddo + else +#endif + do k = 1, mz + vaxgLB(i, j, k, 1) = & + vaxgLB(i, j, k, 1) + dug(k) * WKxy1(i, j) + vaxgLB(i, j, k, 2) = & + vaxgLB(i, j, k, 2) + dvg(k) * WKxy1(i, j) + enddo +#if(PV) + endif +#endif + enddo + enddo + ! + + ! +- x Axis / x >> + ! + ~~~~~~~~~~~~~ + do i = mx - n6mxLB, mx + do j = 1, my +#if(PV) + if(potvor .and. mmx > 1 .and. mmy == 1) then + do k = 1, mz + vaxdLB(i, j, k, 1) = & + vaxdLB(i, j, k, 1) + dug(k) * adubPV(i, k) * adugPV + vaxdLB(i, j, k, 2) = & + vaxdLB(i, j, k, 2) + dvg(k) + enddo + else +#endif + do k = 1, mz + vaxdLB(i, j, k, 1) = & + vaxdLB(i, j, k, 1) + dug(k) * WKxy1(i, j) + vaxdLB(i, j, k, 2) = & + vaxdLB(i, j, k, 2) + dvg(k) * WKxy1(i, j) + enddo +#if(PV) + endif +#endif + enddo + enddo + ! + + ! +- y Axis / y << + ! + ~~~~~~~~~~~~~ + if(mmy > 1) then + ! + + do i = 1, mx + do j = 1, n7myLB + do k = 1, mz + vayiLB(i, j, k, 1) = & + vayiLB(i, j, k, 1) + dug(k) * WKxy1(i, j) + vayiLB(i, j, k, 2) = & + vayiLB(i, j, k, 2) + dvg(k) * WKxy1(i, j) + enddo + enddo + enddo + ! + + ! +- y Axis / y >> + ! + ~~~~~~~~~~~~~ + do i = 1, mx + do j = my - n6myLB, my + do k = 1, mz + vaysLB(i, j, k, 1) = & + vaysLB(i, j, k, 1) + dug(k) * WKxy1(i, j) + vaysLB(i, j, k, 2) = & + vaysLB(i, j, k, 2) + dvg(k) * WKxy1(i, j) + enddo + enddo + enddo + ! + + endif + ! + + else ! {end openLB / begin .not. openLB} CTR + ! + + ! +- x Axis / x << + ! + ~~~~~~~~~~~~~ + if(mmx > 1) then + do i = 1, n7mxLB + do j = 1, my + do k = 1, mz + vaxgLB(i, j, k, 1) = uairDY(1, j, k) + vaxgLB(i, j, k, 2) = vairDY(1, j, k) + enddo + enddo + enddo + ! + + ! +- x Axis / x >> + ! + ~~~~~~~~~~~~~ + do i = mx - n6mxLB, mx + do j = 1, my + do k = 1, mz + vaxdLB(i, j, k, 1) = uairDY(mx, j, k) + vaxdLB(i, j, k, 2) = vairDY(mx, j, k) + enddo + enddo + enddo + endif + ! + + ! +- y Axis / y << + ! + ~~~~~~~~~~~~~ + if(mmy > 1) then + do k = 1, mz + do j = 1, n7myLB + do i = 1, mx + vayiLB(i, j, k, 1) = uairDY(i, 1, k) + vayiLB(i, j, k, 2) = vairDY(i, 1, k) + enddo + enddo + enddo + ! + + ! +- y Axis / y >> + ! + ~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, n7myLB + do i = 1, mx + vaysLB(i, j, k, 1) = uairDY(i, my, k) + vaysLB(i, j, k, 2) = vairDY(i, my, k) + enddo + enddo + enddo + endif + ENDif ! {end .not. openLB} CTR + ! + + ! + ====== + endif + ! + ====== + ! + + ! + + ! + ++++++ + endif + ! + ++++++ + ! + + ! + + ! +--OUTPUT (Each Hour) + ! + ================== + ! + + ! + -------------------------------- + if(minuGE == 0 .and. jsecGE == 0) then + ! + -------------------------------- + ! + + do nSND = 1, 2 + fftt(nSND) = sqrt(ulij(mz, nSND) * ulij(mz, nSND) & + + vlij(mz, nSND) * vlij(mz, nSND)) + if(ulij(mz, nSND) /= 0.0) then + ddtt(nSND) = atan(vlij(mz, nSND) / ulij(mz, nSND)) + if(ulij(mz, nSND) < zero) & + ddtt(nSND) = ddtt(nSND) + pi + else + if(vlij(mz, nSND) > zero) then + ddtt(nSND) = 0.5 * pi + else + ddtt(nSND) = -0.5 * pi + endif + endif + enddo + ! + + fftt(3) = sqrt(ugeoDY(iSND, jSND, mz) * ugeoDY(iSND, jSND, mz) & + + vgeoDY(iSND, jSND, mz) * vgeoDY(iSND, jSND, mz)) + if(ugeoDY(iSND, jSND, mz) /= zero) then + ddtt(3) = atan(vgeoDY(iSND, jSND, mz) / ugeoDY(iSND, jSND, mz)) + if(ugeoDY(iSND, jSND, mz) < zero) & + ddtt(3) = ddtt(nSND) + pi + else + if(vgeoDY(iSND, jSND, mz) > zero) then + ddtt(3) = 0.5 * pi + else + ddtt(3) = -0.5 * pi + endif + endif + ! + + do nSND = 1, 3 + ddtt(nSND) = ddtt(nSND) * 180.0 / pi + ddtt(nSND) = -ddtt(nSND) + 90.0 + enddo + ! + + write(4, 442) +442 format( & + /, ' yyyy-MM-jj-UT-mm | uL m/s | vL m/s | VL m/s | dd deg |', & + ' T(mx,mz) K |', & + /, ' -----------------+---------+---------+---------+---------+', & + '------------+') + ! + + i = iSND + j = jSND + ! + + ! + *********** + call TIMcor(i, j) + ! + *********** + ! + + write(4, 443) iyrSND, mmaSND, jdaSND, jhuSND, izr, & + ulij(mz, 1), vlij(mz, 1), & + fftt(1), ddtt(1), ttij_1 + write(4, 443) iyrrGE, mmplus, jdplus, jhurGE, minuGE, & + ugeoDY(iSND, jSND, mz), vgeoDY(iSND, jSND, mz), & + fftt(3), ddtt(3), & + vaxdLB(mx, 1, mz, 4) & + * exp(cap * log(pstDY(mx, 1) * sigma(mz) + ptopDY)) + if(mmanew > 0) & + write(4, 443) iyrnew, mmanew, jdanew, jhunew, izr, & + ulij(mz, 2), vlij(mz, 2), & + fftt(2), ddtt(2), ttij_2 +443 format(i5, 4('-', i2), & + ' |', f8.2, ' |', f8.2, ' |', f8.2, ' |', f8.1, ' |', & + f10.3, ' |') + write(4, 444) +444 format(/, 1x) + ! + + ! + + ! + ------ + endif + ! + ------ + ! + + ! + + ! +--Work Arrays Reset + ! + ================= + ! + + ! + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + enddo + enddo + ! + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + enddo + enddo + enddo + return +endsubroutine inisnd diff --git a/MAR/code_mar/inisnd_th.f90 b/MAR/code_mar/inisnd_th.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c2122181db72e275666d01bd70edb1403aef7e18 --- /dev/null +++ b/MAR/code_mar/inisnd_th.f90 @@ -0,0 +1,158 @@ +#include "MAR_pp.def" +subroutine inisnd_th(pij, ptopDY, sigmid, sigma, t_ij, q_ij) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT ATMOS 25-09-2001 MAR | + ! | subroutine inisnd_th initializes | + ! | ATMOSPHERIC TEMPERATURES and SPECIFIC HUMIDITIES vertical profiles | + ! | from sounding data (observations or academic situation) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: pij -> pstDY (i,j) : Model Pressure Thickness | + ! | ^^^^^ ptopDY Model Pressure Top | + ! | sigmid Model Layer Interface Coordinate | + ! | sigma Model Level Coordinate | + ! | | + ! | INPUT (via common) | + ! | ^^^^^ tpSND Sounding Potential Temperature | + ! | | + ! | OUTPUT: t_ij -> tairDY(i,j,1->mz) | + ! | ^^^^^^ q_ij -> qvDY(i,j,1->mz) | + ! | | + ! | CAUTION: The Sounding must be in Hydrostatic Balance | + ! | ^^^^^^^ | + ! +------------------------------------------------------------------------+ + ! + + use marphy + use mardim + use marsnd + ! + + implicit none + ! + + ! + + real pij, ptopDY + real sigmid(mzz) + real sigma(mz) + ! + + real t_ij(mz, 2), q_ij(mz, 2) + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + integer k, ksnd, lsnd + real gra, prl, pr1, pr2 + real gsnd, tt1, tt2, ttav + real gqv, qv1, qv2, qvav + ! + + ! + + ! +--Scheme Initialisation + ! + ===================== + ! + + gra = -gravit / RDryAi + ! + + ! +--Temperature Vertical Profile + ! + ============================ + ! + + k = mz + ksnd = 1 + ! +... ksnd = 1 (when pSND(mz) -> pSND(0:mz), etc...) + ! + + ! + - -do until +100 continue + prl = pij * sigma(k) + ptopDY + if(k == 1) then + pr1 = (pij * 0.5 * sigma(1) + ptopDY) * 10.0 + else + pr1 = (pij * sigmid(k) + ptopDY) * 10.0 + endif + pr2 = (pij * sigmid(k + 1) + ptopDY) * 10.0 + ! +... Factor 10 is needed for [cb] --> [mb] + ! + + ! + - - do until +110 continue + if(pSND(ksnd, nSND) < pr2) go to 111 + ksnd = ksnd + 1 + go to 110 +111 continue + ! + - - end do + ! + + gsnd = (tpSND(ksnd, nSND) - tpSND(ksnd - 1, nSND)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + tt2 = tpSND(ksnd - 1, nSND) + gsnd * (pr2 - pSND(ksnd - 1, nSND)) + ! + + gqv = (qsnd(ksnd, nSND) - qSND(ksnd - 1, nSND)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + qv2 = qSND(ksnd - 1, nSND) + gqv * (pr2 - pSND(ksnd - 1, nSND)) + ! + + if(pSND(ksnd, nSND) >= pr1) then + ttav = (tt2 + tpSND(ksnd, nSND)) & + * (pr2 - pSND(ksnd, nSND)) + qvav = (qv2 + qSND(ksnd, nSND)) & + * (pr2 - pSND(ksnd, nSND)) + else + ttav = zero + qvav = zero + endif + ! + + ! + - - do until + lsnd = 0 +120 continue + if(pSND(ksnd, nSND) < pr1) go to 121 + ksnd = ksnd + 1 + lsnd = 1 + if(pSND(ksnd, nSND) >= pr1) then + ttav = ttav & + + (tpSND(ksnd - 1, nSND) + tpSND(ksnd, nSND)) & + * (pSND(ksnd - 1, nSND) - pSND(ksnd, nSND)) + qvav = qvav & + + (qSND(ksnd - 1, nSND) + qSND(ksnd, nSND)) & + * (pSND(ksnd - 1, nSND) - pSND(ksnd, nSND)) + else + gsnd = (tpSND(ksnd, nSND) - tpSND(ksnd - 1, nSND)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + tt1 = tpSND(ksnd - 1, nSND) + gsnd * (pr1 - pSND(ksnd - 1, nSND)) + ttav = ttav & + + (tpSND(ksnd - 1, nSND) + tt1) & + * (pSND(ksnd - 1, nSND) - pr1) + ttav = ttav * 0.5 / (pr2 - pr1) + ! + + gqv = (qSND(ksnd, nSND) - qSND(ksnd - 1, nSND)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + qv1 = qSND(ksnd - 1, nSND) + gqv * (pr1 - pSND(ksnd - 1, nSND)) + qvav = qvav & + + (qSND(ksnd - 1, nSND) + qv1) & + * (pSND(ksnd - 1, nSND) - pr1) + qvav = qvav * 0.5 / (pr2 - pr1) + endif + go to 120 +121 continue + ! + - - end do + ! + + if(lsnd == 0) then + tt1 = tpSND(ksnd - 1, nSND) + gsnd * (pr1 - pSND(ksnd - 1, nSND)) + ttav = (tt2 + tt1) * 0.5 + ! + + qv1 = qSND(ksnd - 1, nSND) + gqv * (pr1 - pSND(ksnd - 1, nSND)) + qvav = (qv2 + qv1) * 0.5 + endif + ! + + ! + + ! +--Interpolated/Integrated Values + ! + ============================== + ! + + t_ij(k, nSND) = ttav * prl**cap / pcap + q_ij(k, nSND) = qvav + ! + + ! + + ! +--Continue Interpolation + ! + ====================== + ! + + if(k <= 1) go to 101 + k = k - 1 + go to 100 +101 continue + ! + - -end do + ! + + return +endsubroutine inisnd_th diff --git a/MAR/code_mar/inisnd_vl.f90 b/MAR/code_mar/inisnd_vl.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d46cd89251e9a12ed189dd62eee4c66377bc93cf --- /dev/null +++ b/MAR/code_mar/inisnd_vl.f90 @@ -0,0 +1,146 @@ +#include "MAR_pp.def" +subroutine inisnd_vl(pij, ptopDY, sigmid, sigma, u_ij, v_ij) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT ATMOS 17-02-2004 MAR | + ! | subroutine inisnd_vl initializes | + ! | HORIZONTAL WIND COMPONENTS vertical profiles | + ! | from sounding data (observations or academic situation) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: pij -> pstDY (i,j) : Model Pressure Thickness | + ! | ^^^^^ ptopDY Model Pressure Top | + ! | sigmid Model Layer Interface Coordinate | + ! | sigma Model Level Coordinate | + ! | | + ! | INPUT (via common) | + ! | ^^^^^ uuSND Sounding U-Wind Speed | + ! | vvSND Sounding V-Wind Speed | + ! | | + ! | OUTPUT: u_ij -> ugeoDY(i,j,1->mz) | + ! | ^^^^^^ v_ij -> vgeoDY(i,j,1->mz) | + ! | | + ! | CAUTION: non-zero loav generates erroneous results | + ! | ^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use marsnd + + implicit none + + real pij, ptopDY + real sigma(mz) + real sigmid(mzz) + + real u_ij(mz, 2), v_ij(mz, 2) + + ! +--Local Variables + ! + ================ + + integer k, ksnd, loav + real gra, prl, pr1, pr2 + real guu, uu1, uu2, uuav + real gvv, vv1, vv2, vvav + + ! +--Scheme Initialisation + ! + ===================== + + gra = -gravit / RDryAi + loav = 0 + + ! +--Geostrophic Wind Vertical Profile + ! + ================================= + + k = mz + ksnd = 1 + ! +... ksnd = 1 (when pSND(mz) -> pSND(0:mz), etc...) + + ! + - -do until +100 continue + if(k == 1) then + pr1 = pij * 0.5d1 * sigma(1) + ptopDY + else + pr1 = pij * 1.0d1 * sigmid(k) + ptopDY + endif + pr2 = pij * 1.0d1 * sigmid(k + 1) + ptopDY + ! +... Factor 10 is needed for [cb] --> [mb] + + ! + - - do until +110 continue + if(pSND(ksnd, nSND) < pr2) go to 111 + ksnd = ksnd + 1 + go to 110 +111 continue + ! + - - end do + + guu = (uuSND(ksnd) - uuSND(ksnd - 1)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + uu2 = uuSND(ksnd - 1) + guu * (pr2 - pSND(ksnd - 1, nSND)) + gvv = (vvSND(ksnd) - vvSND(ksnd - 1)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + vv2 = vvSND(ksnd - 1) + gvv * (pr2 - pSND(ksnd - 1, nSND)) + + if(pSND(ksnd, nSND) >= pr1) then + uuav = -(uu2 + uuSND(ksnd)) & + * (pr2 - pSND(ksnd, nSND)) * 0.5 + vvav = -(vv2 + vvSND(ksnd)) & + * (pr2 - pSND(ksnd, nSND)) * 0.5 + else + loav = 0 + uuav = zero + vvav = zero + endif + + ! + - - do until +120 continue + if(pSND(ksnd, nSND) < pr1) go to 121 + ksnd = ksnd + 1 + go to 120 +121 continue + ! + - - end do + + guu = (uuSND(ksnd) - uuSND(ksnd - 1)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + uu1 = uuSND(ksnd - 1) + guu * (pr1 - pSND(ksnd - 1, nSND)) + gvv = (vvSND(ksnd) - vvSND(ksnd - 1)) & + / (pSND(ksnd, nSND) - pSND(ksnd - 1, nSND)) + vv1 = vvSND(ksnd - 1) + gvv * (pr1 - pSND(ksnd - 1, nSND)) + + if(loav > 0) then + uuav = uuav & + + (uuSND(ksnd - 1) + uu1) & + * (pSND(ksnd - 1, nSND) - pr1) * 0.5 + vvav = vvav & + + (vvSND(ksnd - 1) + vv1) & + * (pSND(ksnd - 1, nSND) - pr1) * 0.5 + else + uuav = & + (uu2 + uu1) & + * (pr2 - pr1) * 0.5 + vvav = & + (vv2 + vv1) & + * (pr2 - pr1) * 0.5 + endif + + ! +--Layer Average + ! + ============= + + uuav = uuav / (pr2 - pr1) + vvav = vvav / (pr2 - pr1) + + ! +--Large Scale Wind Components in the MAR Coordinate System + ! + ======================================================== + + u_ij(k, nSND) = uuav + v_ij(k, nSND) = vvav + + if(k <= 1) go to 101 + k = k - 1 + go to 100 +101 continue + ! + - -end do + + return +end diff --git a/MAR/code_mar/iniubc.f90 b/MAR/code_mar/iniubc.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f8091cd8d6c5ae157117e8c89f8a81f20d22c2b9 --- /dev/null +++ b/MAR/code_mar/iniubc.f90 @@ -0,0 +1,184 @@ +#include "MAR_pp.def" +subroutine INIubc(ihamr_ubc, nhamr_ubc, newubcINI) + ! +------------------------------------------------------------------------+ + ! | MAR INPUT Upper Sponge Thu 05-11-2009 MAR | + ! | subroutine INIubc is used to initialize MAR Upper Sponge Refer.State | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ihamr_ubc: Time Digital Filter Status | + ! | ^^^^^ nhamr_ubc: Time Digital Filter Set Up | + ! | | + ! | OUTPUT: newubcINI: (0,1) ==> (NO new ubc , new ubc) | + ! | ^^^^^^^ | + ! | | + ! | OUTPUT: uairUB: Current x-Wind Speed Component | + ! | ^^^^^^^ ua1_UB: Previous Nesting Time Step x-Wind Speed Component | + ! | ua2_UB: Next Nesting Time Step x-Wind Speed Component | + ! | vairUB, va1_UB, va2_UB, pktaUB, pkt1UB, pkt2UB: idem | + ! | tim1UB,tim2UB: Times n, n+1 of uairUB, vairUB, pktaUB | + ! | | + ! | CAUTION: It is assumed that tim1UB and tim2UB do not change when the | + ! | ^^^^^^^^ Variables are reassigned after the dynamical Initialization | + ! | (Reassignation => itexpe := nham => timar := timar-nham*dt) | + ! | | + ! | MODIF. 5 Nov 2009 : Map Scaling Factor SFm_DY scales (u,v) at UB | + ! | ^^^^^ (i.e., ua2_UB, va2_UB are divided by SFm_DY) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_ub + + implicit none + + integer ihamr_ubc, nhamr_ubc + integer newubcINI + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer(kind=8) itimUB + real rate + + ! +--Current Time + ! + ============ + + itimUB = ou2sGE(iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, jsecGE) +#if(HF) + itimUB = itimUB + (ihamr_ubc + nhamr_ubc) * idt +#endif + + ! +--Reinitialization of the Upper Sponge Reference State + ! + ---------------------------------------------------- + + if(iterun == 0) then + jdh_UB = 1 + iyr_UB = iyrrGE + mma_UB = mmarGE + jda_UB = jdarGE + jhu_UB = jhurGE + tim1UB = itimUB + tim2UB = itimUB + do k = 1, mzabso + do j = 1, my + do i = 1, mx + ua1_UB(i, j, k) = uairUB(i, j, k) + ua2_UB(i, j, k) = uairUB(i, j, k) + va1_UB(i, j, k) = vairUB(i, j, k) + va2_UB(i, j, k) = vairUB(i, j, k) + pkt1UB(i, j, k) = pktaUB(i, j, k) + pkt2UB(i, j, k) = pktaUB(i, j, k) + enddo + enddo + enddo + + endif + + ! +--New UBC + ! + ======= + + if(itimUB > tim2UB) then + + tim1UB = tim2UB + + write(6, 6001) jda_UB, labmGE(mma_UB), iyr_UB, & + jhu_UB, tim1UB, & + jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itimUB +6001 format(/, ' 1st UBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/', 2x, & + ' t =', i12, 's A.P.', & + /, ' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12) + ! + + if(jdh_UB == 0) jdh_UB = -1 + open(unit=11, status='old', form='unformatted', file='MARubc.DAT') + rewind 11 +11 continue + if(jdh_UB <= 0) go to 10 + + ! +--UBC at nesting time step n + ! + -------------------------- + + do k = 1, mzabso + do j = 1, my + do i = 1, mx + ua1_UB(i, j, k) = ua2_UB(i, j, k) + va1_UB(i, j, k) = va2_UB(i, j, k) + pkt1UB(i, j, k) = pkt2UB(i, j, k) + ua2_UB(i, j, k) = 0.d0 + va2_UB(i, j, k) = 0.d0 + pkt2UB(i, j, k) = 0.d0 + enddo + enddo + enddo + + ! +--UBC at nesting time step n+1 + ! + ---------------------------- + + read(11) iyr_UB, mma_UB, jda_UB, jhu_UB, jdh_UB + read(11) ua2_UB, va2_UB, pkt2UB + + tim2UB = ou2sGE(iyr_UB, mma_UB, jda_UB, jhu_UB, 0, 0) + + do k = 1, mzabso + do j = 1, my + do i = 1, mx + ua2_UB(i, j, k) = ua2_UB(i, j, k) / SFm_DY(i, j) + va2_UB(i, j, k) = va2_UB(i, j, k) / SFm_DY(i, j) + enddo + enddo + enddo + + if(itimUB > tim2UB) go to 11 + + write(6, 6002) jda_UB, labmGE(mma_UB), iyr_UB, & + jhu_UB, jdh_UB, tim2UB +6002 format(' 2nd UBC /', i3, '-', a3, '-', i4, i3, ' ', 2x, '/(', i1, & + ') t =', i12) + +10 continue + close(unit=11) + + else +#if(WR) + write(6, 6003) jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, itimUB +6003 format(' Current /', i3, '-', a3, '-', i4, i3, ':', i2, ':', i2, & + ' t =', i12, 's A.P.') +#endif + endif + + ! +--Time Interpolation + ! + ================== + + if(itimUB <= tim2UB .and. tim1UB < tim2UB) then + + rate = float(itimUB - tim1UB) / float(tim2UB - tim1UB) + do k = 1, mzabso + do j = 1, my + do i = 1, mx + uairUB(i, j, k) = ua1_UB(i, j, k) + & + (ua2_UB(i, j, k) - ua1_UB(i, j, k)) * rate + vairUB(i, j, k) = va1_UB(i, j, k) + & + (va2_UB(i, j, k) - va1_UB(i, j, k)) * rate + pktaUB(i, j, k) = pkt1UB(i, j, k) + & + (pkt2UB(i, j, k) - pkt1UB(i, j, k)) * rate + enddo + enddo + enddo + + newubcINI = 1 + + else + newubcINI = 0 + endif + + return +end diff --git a/MAR/code_mar/interp_subpix.f90 b/MAR/code_mar/interp_subpix.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d1ce98bdef9f5a6fad72adb07894ec113fd4a6b3 --- /dev/null +++ b/MAR/code_mar/interp_subpix.f90 @@ -0,0 +1,189 @@ +#include "MAR_pp.def" +subroutine interp_subpix(var, var_int, opt, inf, sup, grad_MS) + ! + ---------------------------------------------------------- + + ! / subroutine interp_subpix interpolates MAR variables / + ! / (inputs of SISVAT) on the subgrid. / + ! / Calculates a local gradient for the variable and adjusts / + ! / the subgrid values using the elevation difference between / + ! / the pixel and its subpixels. / + ! + ---------------------------------------------------------- + + ! / / + ! / INPUT : var : MAR variable to be interpolated / + ! / ^^^^^^^ / + ! / / + ! / OUTPUT : var_int : variable interpolated on the subgrid / + ! / ^^^^^^^ grad_MS : mean local gradient of var / + ! / (with spat. and temp. smoothing) / + ! + ---------------------------------------------------------- + + ! / /!\ opt = options / + ! / 1 = only interpolation (eg: for temperature) / + ! / 2 = interpolated value can not be negative / + ! / (eg: humidity, precipitation ...) / + ! / / + ! / inf, sup = lower and upper limits of the gradient / + ! / / + ! / dSH_min = min value of elevation difference between / + ! / 2 pixels to compute the local gradient = 100 m / + ! / / + ! / / + ! / Charlotte Lang 13/03/2015 / + ! + ---------------------------------------------------------- + + + use mardim + use marctr + use mar_ge + use mar_sl + use margrd + use marssn + + implicit none + + integer i, j, k, m, n + real, parameter :: dSH_min = 100 + + real var(mx, my), var_int(mx, my, mw) + real delta_sh, delta_var, grad_old(mx, my) + real grad_var, grad_M(mx, my), grad_MS(mx, my) + + ! + grad_var = gradient between the pixel and one of its 8 surrounding pixels + ! + grad_M = mean value of the local gradient. Average of the 8 surrounding gr + ! + grad_MS = mean gradient after spatial and temporal smoothing + + real w, q, qi(-1:1, -1:1) + real inf, sup + + integer opt + real sum_var_int(mx, my), fact(mx, my) + + do i = 1, mx; do j = 1, my + do k = 1, nsx + var_int(i, j, k) = var(i, j) + if(isnan(var(i, j))) then + write(6, 399) iyrrGE, mmarGE, jdarGE, & + jhurGE, i, j +399 format('/!\ CL WARNING: VAR is NaN ', i4, '/', i2, '/', & + i2, i3, 'h, (i,j)=', i4, i4) + stop + endif + enddo + enddo; + enddo + + do i = 2, mx - 1; do j = 2, my - 1 + + if(itexpe == 0) grad_MS(i, j) = 0.0 + grad_old(i, j) = grad_MS(i, j) + + ! + grad_old = value of the mean local gradient at the previous time step. Used + + ! + ******************************************* + ! + *** Computing of the local gradient *** + ! + ******************************************* + + w = 0.0 + grad_M(i, j) = 0.0 + + if(isolSL(i, j) >= 3) then ! Gradient is computed only for land pixels. gr + + ! + Computation of the gradient between each pixel and its 8 surroung pixels (gr + do m = -1, 1; do n = -1, 1 + + grad_var = 0.0 + + if(isolSL(i + m, j + n) >= 3) then + delta_sh = sh(i + m, j + n) - sh(i, j) + if(abs(delta_sh) > dSH_min) then + ! + If no minimum elevation difference for the computation of the gradient, del + ! + to go through the if loop --> If dSH_min = 0.0, decomment next line. + ! if (delta_sh .neq. 0.0) then + delta_var = var(i + m, j + n) - var(i, j) + grad_var = delta_var / delta_sh + w = w + 1.0 + endif + endif + ! + Computation of the mean local gradient + grad_M(i, j) = grad_M(i, j) + grad_var + + enddo; + enddo + + if(w /= 0.0) then ! w = # of pixels among the 8 surro + grad_M(i, j) = grad_M(i, j) / w ! If w = 0, no pixel among the 8 surrou + endif + + if(isnan(grad_M(i, j))) then + write(6, 400) iyrrGE, mmarGE, jdarGE, & + jhurGE, i, j +400 format('/!\ CL WARNING: grad is NaN ', i4, '/', i2, '/', & + i2, i3, 'h, (i,j)=', i4, i4) + stop + endif + + endif + enddo; + enddo + + !+ *** Smoothing of the mean local gradient *** + do i = 2, mx - 1; do j = 2, my - 1 + + q = 0.0 + grad_MS(i, j) = 0.0 + + if(isolSL(i, j) >= 3) then + + ! + *** Spatial smoothing of the gradient *** + do m = -1, 1; do n = -1, 1 + if(isolSL(i + m, j + n) >= 3) then + qi(m, n) = 1.0 + if(m == 0 .or. n == 0) qi(m, n) = 2.0 + if(m == 0 .and. n == 0) qi(m, n) = 4.0 + q = q + qi(m, n) + grad_MS(i, j) = grad_MS(i, j) + qi(m, n) * grad_M(i + m, j + n) + endif + + enddo; + enddo + + grad_MS(i, j) = grad_MS(i, j) / q + + ! + *** Temporal smoothing of the gradient *** + + if(itexpe /= 0) then + grad_MS(i, j) = 0.75 * grad_MS(i, j) + 0.25 * grad_old(i, j) + endif + + ! + *** Lower and upper limits of the mean gradient value *** + grad_MS(i, j) = max(inf, min(sup, grad_MS(i, j))) + + ! + ******************************************************** + ! + *** Interpolation of the variable on the subgrid *** + ! + ******************************************************** + do k = 1, nsx - 1 + var_int(i, j, k) = var(i, j) & + + grad_MS(i, j) * (sh_int(i, j, k) - sh(i, j)) + enddo + + var_int(i, j, nsx) = var(i, j) + + endif + enddo; + enddo + + ! + ******************* + ! + *** Options *** + ! + ******************* + + ! + Opt = 1 --> Nothing more than the interpolation is done + ! + Opt = 2 --> Interpolated value has to be positive + + if(opt == 2) then + do i = 1, mx; do j = 1, my + do k = 1, nsx + var_int(i, j, k) = max(0.0, var_int(i, j, k)) + enddo + enddo; + enddo + endif + + return +endsubroutine interp_subpix diff --git a/MAR/code_mar/lbcnud_000.f90 b/MAR/code_mar/lbcnud_000.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2cbcc70fda8d4e1ef44a00e2a3cc90bb379a5f51 --- /dev/null +++ b/MAR/code_mar/lbcnud_000.f90 @@ -0,0 +1,267 @@ +#include "MAR_pp.def" +subroutine LBCnud_000(f_LBC0, iv_nu0, kd_nu0) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS LBC 29-01-2020 MAR | + ! | subroutine LBCnud_000 computes the Lateral Boundary Conditions | + ! | following the Davies (1976) scheme | + ! | assuming zero Outer Fields | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT / OUTPUT : f_LBC0, i.e. w,pairNH, ccniHY, qi,qs,qr,qwHY | + ! | ^^^^^^^^ for iv_nu0 = 3, 3, 3, 3, 3, 3) | + ! | f_LBC0 reevalued on a 5-points width boundary zone | + ! | | + ! | INPUT: iv_nu0: Index of the Variable to relax to Outer Conditions | + ! | ^^^^^^ kd_nu0: Maximum Value of the k (vertical) Index | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ reaLBC: Input INI: Previous Dyn.Simulation (MAR .or. GCM) | + ! | rxfact: Lateral Sponge Coefficient (A89) | + ! | rxLB,ryLB: Nudging Coefficient | + ! | Independant Term used in the Implicit Scheme | + ! | | + ! | REFER. : Davies, QJRMS 102, pp.405--418, 1976 (relation 11 p.409) | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_lb + use mar_wk + + implicit none + + ! Global Variables + ! ================ + + real f_LBC0(mx, my, mz) + integer iv_nu0, kd_nu0 + + ! Local Variables + ! ================ + + integer i, j, k, m + logical relaxg + + ! fmag0X:magnification factor (=>nudging selectively modified) + real fmag0g(6), fmag0d(6), fmag0b(6), fmag0h(6) + data fmag0g/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmag0d/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmag0b/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmag0h/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ +#if(OG) + ! relaxg=.false.==> NO nudging at the left boundary. + data relaxg/.false./ +#endif + + ! x Boundaries + ! ============ + +!$OMP PARALLEL do default(shared) private(i,j,k) + do k = 1, kd_nu0 + + if(mmx > 1) then + +#if(OG) + if(relaxg) then +#endif + do i = ip11, n6 - 1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(i, j, k) = f_LBC0(i, j, k) & + / (1.0 + fmag0g(iv_nu0) * rxLB(i)) + enddo + ! end do + enddo +#if(OG) + endif +#endif + + do i = mx - n6 + 2, mx1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(i, j, k) = f_LBC0(i, j, k) & + / (1.0 + fmag0d(iv_nu0) * rxLB(i)) + enddo + ! end do + enddo + + ! Zero Gradient at x LBC if fmag0g,d = 0 + ! -------------------------------------- + + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(1, j, k) = (1.-fmag0g(iv_nu0)) * f_LBC0(ip11, j, k) ! 0-grad. + ! . + fmag0g(iv_nu0) *f_LBC0( 1,j,k) ! 0 at x-LB + f_LBC0(mx, j, k) = (1.-fmag0d(iv_nu0)) * f_LBC0(mx1, j, k) ! 0-grad. + ! . + fmag0d(iv_nu0) *f_LBC0( mx ,j,k) ! 0 at x-LB + enddo + ! end do + + ! Nudging to zero in in the lateral Sponge + ! ---------------------------------------- + + do i = ip11, n6 - 1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + WKxyz1(i, j, k) = f_LBC0(i, j, k) + rxfact * rxLB(i) & + * (f_LBC0(i + 1, j, k) + f_LBC0(i - 1, j, k) & + - f_LBC0(i, j, k) - f_LBC0(i, j, k)) + enddo + ! end do + enddo + + do i = ip11, n6 - 1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(i, j, k) = WKxyz1(i, j, k) + enddo + ! end do + enddo + + do i = mx - n6 + 2, mx1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + WKxyz1(i, j, k) = f_LBC0(i, j, k) + rxfact * rxLB(i) & + * (f_LBC0(i + 1, j, k) + f_LBC0(i - 1, j, k) & + - f_LBC0(i, j, k) - f_LBC0(i, j, k)) + enddo + ! end do + enddo + + do i = mx - n6 + 2, mx1 + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(i, j, k) = WKxyz1(i, j, k) + enddo + ! end do + enddo + + ! Zero Gradient at x LBC if fmag0g,d = 0 + ! -------------------------------------- + + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(1, j, k) = (1.-fmag0g(iv_nu0)) * f_LBC0(ip11, j, k) ! 0-grad. + ! . + fmag0g(iv_nu0) *f_LBC0( 1,j,k) ! 0 at x-LB + f_LBC0(mx, j, k) = (1.-fmag0d(iv_nu0)) * f_LBC0(mx1, j, k) ! 0-grad. + ! . + fmag0d(iv_nu0) *f_LBC0( mx ,j,k) ! 0 at x-LB + enddo + ! end do + + endif + + ! y Boundaries + ! ============ + + if(mmy > 1) then + + do j = jp11, n6 - 1 + ! do k= 1 ,kd_nu0 + do i = 1, mx + f_LBC0(i, j, k) = f_LBC0(i, j, k) & + / (1.0 + fmag0b(iv_nu0) * ryLB(j)) + enddo + ! end do + enddo + + do j = my - n6 + 2, my1 + ! do k= 1 ,kd_nu0 + do i = 1, mx + f_LBC0(i, j, k) = f_LBC0(i, j, k) & + / (1.0 + fmag0h(iv_nu0) * ryLB(j)) + enddo + ! end do + enddo + + ! Zero Gradient at y LBC if fmag0b,h = 0 + ! -------------------------------------- + + ! do k= 1 ,kd_nu0 + do i = 1, mx + f_LBC0(i, 1, k) = (1.-fmag0b(iv_nu0)) * f_LBC0(i, jp11, k) ! 0-grad. + ! . + fmag0b(iv_nu0) *f_LBC0(i, 1,k) ! 0 at y-LB + f_LBC0(i, my, k) = (1.-fmag0h(iv_nu0)) * f_LBC0(i, my1, k) ! 0-grad. + ! . + fmag0h(iv_nu0) *f_LBC0(i, my ,k) ! 0 at y-LB + enddo + ! end do + + ! Nudging to zero in in the lateral Sponge + ! ---------------------------------------- + + do j = 2, n6 - 1 + ! do k= 1 ,kd_nu0 + do i = ip11, mx1 + WKxyz2(i, j, k) = f_LBC0(i, j, k) + rxfact * ryLB(j) & + * (f_LBC0(i, j + 1, k) + f_LBC0(i, j - 1, k) & + - f_LBC0(i, j, k) - f_LBC0(i, j, k)) + enddo + ! end do + enddo + + do j = 2, n6 - 1 + ! do k= 1 ,kd_nu0 + do i = ip11, mx1 + f_LBC0(i, j, k) = WKxyz2(i, j, k) + enddo + ! end do + enddo + + do j = my - n6 + 2, my1 + ! do k= 1 ,kd_nu0 + do i = ip11, mx1 + WKxyz2(i, j, k) = f_LBC0(i, j, k) + rxfact * ryLB(j) & + * (f_LBC0(i, j + 1, k) + f_LBC0(i, j - 1, k) & + - f_LBC0(i, j, k) - f_LBC0(i, j, k)) + enddo + ! end do + enddo + + do j = my - n6 + 2, my1 + ! do k= 1 ,kd_nu0 + do i = ip11, mx1 + f_LBC0(i, j, k) = WKxyz2(i, j, k) + enddo + ! end do + enddo + + ! Zero Gradient at y LBC if fmag0b,h = 0 + ! -------------------------------------- + + ! do k= 1 ,kd_nu0 + do j = jp11, my1 + f_LBC0(i, 1, k) = (1.-fmag0b(iv_nu0)) * f_LBC0(i, jp11, k) ! 0-grad. + ! . + fmag0b(iv_nu0) *f_LBC0(i, 1,k) ! 0 at y-LB + f_LBC0(i, my, k) = (1.-fmag0h(iv_nu0)) * f_LBC0(i, my1, k) ! 0-grad. + ! . + fmag0h(iv_nu0) *f_LBC0(i, my ,k) ! 0 at y-LB + enddo + ! end do + +#if(OB) + do k = 1, kd_nu0 + f_LBC0(1, 1, k) = (f_LBC0(1, jp11, k) + f_LBC0(ip11, 1, k)) * 0.5 + f_LBC0(mx, 1, k) = (f_LBC0(mx, jp11, k) + f_LBC0(mx1, 1, k)) * 0.5 + f_LBC0(1, my, k) = (f_LBC0(1, my1, k) + f_LBC0(ip11, my, k)) * 0.5 + f_LBC0(mx, my, k) = (f_LBC0(mx, my1, k) + f_LBC0(mx1, my, k)) * 0.5 + enddo +#endif + + endif + + ! +--Work Arrays Reset + ! + ================= + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + enddo + enddo + enddo +!$OMP END PARALLEL DO + + return +endsubroutine LBCnud_000 diff --git a/MAR/code_mar/lbcnud_atm.f90 b/MAR/code_mar/lbcnud_atm.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5a047e45ad18c73dbe628c7d692040130f5d648e --- /dev/null +++ b/MAR/code_mar/lbcnud_atm.f90 @@ -0,0 +1,374 @@ +#include "MAR_pp.def" +subroutine LBCnud_atm(f__LBC, iv_nua, kd_nua) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS LBC Fri 4-12-2009 MAR | + ! | subroutine LBCnud_atm computes the Lateral Boundary Conditions | + ! | following the Davies (1976) scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT / OUTPUT : f__LBC, i.e. uairDY, vairDY, qvDY, pktaDY, pstDYn | + ! | ^^^^^^^^ for iv_nua = 1, 2, 3, 4, 5 | + ! | f_LBC0 reevalued on a 5-points width boundary zone | + ! | | + ! | INPUT: iv_nua: Index of the Variable to relax to Outer Conditions | + ! | ^^^^^^ kd_nua: Maximum Value of the k (vertical) Index | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ reaLBC: Input INI: Previous Dyn.Simulation (MAR .or. GCM) | + ! | rxfact: Lateral Sponge Coefficient (A89) | + ! | rxLB,ryLB: Nudging Coefficient | + ! | Independant Term used in the Implicit Scheme | + ! | | + ! | REFER. : Davies, QJRMS 102, pp.405--418, 1976 (relation 11 p.409) | + ! | ^^^^^^^^ | + ! | | + ! | INPUT : Nudging Coefficient rxLB and ryLB | + ! | ^^^^^^^^ Inverted Matrices used in the Implicit Scheme | + ! | wixgLB (zone x <<), wixdLB (zone x >>) | + ! | wiyiLB (zone y <<), wiysLB (zone y >>) | + ! | Independant Term used in the Implicit Scheme | + ! | Variable v: tixgLB (zone x <<), tixdLB (zone x >>) | + ! | Variable u: tiyiLB (zone y <<), tiysLB (zone y >>) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_lb + use mar_wk + + implicit none + + integer i, j, k, m + real f__LBC(mx, my, mz) + integer kd_nua, iv_nua + + ! +--Local Variables + ! + ================ + +#if(OG) + logical relaxg +#endif + + integer il, ic, jl, jc + real sx(mx, mz) + real sy(my, mz) + real txg(2:n7, mz), txd(mx - n6:mx1, mz) + real tyi(2:n7, mz), tys(my - n6:my1, mz) + + real fmagng(6), fmagnd(6), fmagnb(6), fmagnh(6) + + data fmagng/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmagnd/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmagnb/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + data fmagnh/1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0, 1.0e0/ + ! +... fmagnX:magnification factor (=>nudging selectively modified) + +#if(OG) + ! relaxg=.false.==> NO nudging at the left boundary. + data relaxg/.false./ +#endif + + ! x Boundaries + ! ============ +!$OMP PARALLEL do default(shared) private(i,j,k,il,ic) + do k = 1, kd_nua + if(mmx > 1) then + if(iv_nua == 2) then + ! + + do j = jp11, my1 + ! +--`Left' Boundary (x <<) + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do il = ip11, n7 + ! do k = 1,kd_nua + txg(il, k) = 0.d0 + ! end do + do ic = ip11, n7 + ! do k = 1,kd_nua + txg(il, k) = txg(il, k) & + + (tixgLB(ic, j, k) & + + f__LBC(ic, j, k)) * wixgLB(il, ic) + ! end do + enddo + enddo + do i = ip11, n7 + ! do k = 1,kd_nua + f__LBC(i, j, k) = txg(i, k) + ! end do + enddo + + ! +--`Right' Boundary (x >>) + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + do il = mx - n6, mx1 + ! do k = 1,kd_nua + txd(il, k) = 0.d0 + ! end do + do ic = mx - n6, mx1 + ! do k = 1,kd_nua + txd(il, k) = txd(il, k) + & + (tixdLB(ic, j, k) & + + f__LBC(ic, j, k)) * wixdLB(il, ic) + ! end do + enddo + enddo + do i = mx - n6mxLB, mx1 + ! do k = 1,kd_nua + f__LBC(i, j, k) = txd(i, k) + ! end do + enddo + enddo + + else + do j = jp11, my1 +#if(OG) + if(relaxg) then +#endif + do i = ip11, n6 - 1 + ! do k = 1,kd_nua + f__LBC(i, j, k) = (f__LBC(i, j, k) & + + fmagng(iv_nua) * rxLB(i) * vaxgLB(i, j, k, iv_nua)) & + / (1.d0 + fmagng(iv_nua) * rxLB(i)) + ! end do + enddo +#if(OG) + endif +#endif + do i = mx - n6 + 2, mx1 + ! do k = 1,kd_nua + f__LBC(i, j, k) = (f__LBC(i, j, k) & + + fmagnd(iv_nua) * rxLB(i) * vaxdLB(i, j, k, iv_nua)) & + / (1.d0 + fmagnd(iv_nua) * rxLB(i)) + ! end do + enddo + enddo + endif + + ! Zero Gradient at y LBC if fmagng,d = 0 / otherwise prescribed LBC + ! ----------------------------------------------------------------- + ! do k=1,kd_nua + do j = 1, my + f__LBC(1, j, k) = & + (1.-fmagng(iv_nua)) * f__LBC(ip11, j, k) & + + fmagng(iv_nua) * vaxgLB(1, j, k, iv_nua) + f__LBC(mx, j, k) = & + (1.-fmagnd(iv_nua)) * f__LBC(mx1, j, k) & + + fmagnd(iv_nua) * vaxdLB(mx, j, k, iv_nua) + enddo + ! end do + + ! Nudging + ! ------- + do i = ip11, n6 - 1 + ! do k= 1,kd_nua + do j = jp11, my1 + WKxyz1(i, j, k) = f__LBC(i, j, k) + rxfact * rxLB(i) & + * (f__LBC(i + 1, j, k) + f__LBC(i - 1, j, k) & + - f__LBC(i, j, k) - f__LBC(i, j, k) & + - vaxgLB(i + 1, j, k, iv_nua) - vaxgLB(i - 1, j, k, iv_nua) & + + vaxgLB(i, j, k, iv_nua) + vaxgLB(i, j, k, iv_nua)) + enddo + ! end do + enddo + do i = ip11, n6 - 1 + ! do k= 1,kd_nua + do j = jp11, my1 + f__LBC(i, j, k) = WKxyz1(i, j, k) + enddo + ! end do + enddo + + do i = mx - n6 + 2, mx1 + ! do k= 1 ,kd_nua + do j = jp11, my1 + WKxyz1(i, j, k) = f__LBC(i, j, k) + rxfact * rxLB(i) & + * (f__LBC(i + 1, j, k) + f__LBC(i - 1, j, k) & + - f__LBC(i, j, k) - f__LBC(i, j, k) & + - vaxdLB(i + 1, j, k, iv_nua) - vaxdLB(i - 1, j, k, iv_nua) & + + vaxdLB(i, j, k, iv_nua) + vaxdLB(i, j, k, iv_nua)) + enddo + ! end do + enddo + do i = mx - n6 + 2, mx1 + ! do k= 1 ,kd_nua + do j = jp11, my1 + f__LBC(i, j, k) = WKxyz1(i, j, k) + enddo + ! end do + enddo + + ! Zero Gradient at y LBC if fmagng,d = 0 / otherwise prescribed LBC + ! ----------------------------------------------------------------- + ! do k=1,kd_nua + do j = jp11, my1 + f__LBC(1, j, k) = & + (1.-fmagng(iv_nua)) * f__LBC(ip11, j, k) & + + fmagng(iv_nua) * vaxgLB(1, j, k, iv_nua) + f__LBC(mx, j, k) = & + (1.-fmagnd(iv_nua)) * f__LBC(mx1, j, k) & + + fmagnd(iv_nua) * vaxdLB(mx, j, k, iv_nua) + enddo + ! end do + endif + + ! y Boundaries + ! ============ + if(mmy > 1) then + if(iv_nua == 1) then + do i = 1, mx + ! +--`Bottom' Boundary (y <<) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~ + do jl = jp11, n7 + ! do k = 1,kd_nua + tyi(jl, k) = 0.d0 + ! end do + do jc = jp11, n7 + ! do k = 1,kd_nua + tyi(jl, k) = tyi(jl, k) & + + (tiyiLB(i, jc, k) & + + f__LBC(i, jc, k)) * wiyiLB(jl, jc) + ! end do + enddo + enddo + do j = jp11, n7 + ! do k = 1,kd_nua + f__LBC(i, j, k) = tyi(j, k) + ! end do + enddo + ! +--`Top' Boundary (y >>) + ! + ~~~~~~~~~~~~~~~~~~~~~ + do jl = my - n6, my - 1 + ! do k = 1,kd_nua + tys(jl, k) = 0.d0 + ! end do + do jc = my - n6, my - 1 + ! do k = 1,kd_nua + tys(jl, k) = tys(jl, k) & + + (tiysLB(i, jc, k) & + + f__LBC(i, jc, k)) * wiysLB(jl, jc) + ! end do + enddo + enddo + do j = my - n6, my - 1 + ! do k = 1,kd_nua + f__LBC(i, j, k) = tys(j, k) + ! end do + enddo + enddo + else + do j = jp11, n6 - 1 + ! do k= 1 ,kd_nua + do i = 1, mx + f__LBC(i, j, k) = (f__LBC(i, j, k) & + + fmagnb(iv_nua) * ryLB(j) * vayiLB(i, j, k, iv_nua)) & + / (1.d0 + fmagnb(iv_nua) * ryLB(j)) + enddo + ! end do + enddo + do j = my - n6 + 2, my1 + ! do k= 1 ,kd_nua + do i = 1, mx + f__LBC(i, j, k) = (f__LBC(i, j, k) & + + fmagnh(iv_nua) * ryLB(j) * vaysLB(i, j, k, iv_nua)) & + / (1.d0 + fmagnh(iv_nua) * ryLB(j)) + enddo + ! end do + enddo + endif + + ! Zero Gradient at y LBC if fmagnb,h = 0 / otherwise prescribed LBC + ! ----------------------------------------------------------------- + ! do k=1,kd_nua + do i = 1, mx + f__LBC(i, 1, k) = & + (1.-fmagnb(iv_nua)) * f__LBC(i, jp11, k) & + + fmagnb(iv_nua) * vayiLB(i, 1, k, iv_nua) + f__LBC(i, my, k) = & + (1.-fmagnh(iv_nua)) * f__LBC(i, my1, k) & + + fmagnh(iv_nua) * vaysLB(i, my, k, iv_nua) + enddo + ! end do + + ! Nudging + ! ------- + do j = 2, n6 - 1 + ! do k=1 ,kd_nua + do i = ip11, mx1 + WKxyz2(i, j, k) = f__LBC(i, j, k) + rxfact * ryLB(j) & + * (f__LBC(i, j + 1, k) + f__LBC(i, j - 1, k) & + - f__LBC(i, j, k) - f__LBC(i, j, k) & + - vayiLB(i, j + 1, k, iv_nua) - vayiLB(i, j - 1, k, iv_nua) & + + vayiLB(i, j, k, iv_nua) + vayiLB(i, j, k, iv_nua)) + enddo + ! end do + enddo + do j = 2, n6 - 1 + ! do k=1 ,kd_nua + do i = ip11, mx1 + f__LBC(i, j, k) = WKxyz2(i, j, k) + enddo + ! end do + enddo + + do j = my - n6 + 2, my1 + ! do k=1 ,kd_nua + do i = ip11, mx1 + WKxyz2(i, j, k) = f__LBC(i, j, k) + rxfact * ryLB(j) & + * (f__LBC(i, j + 1, k) + f__LBC(i, j - 1, k) & + - f__LBC(i, j, k) - f__LBC(i, j, k) & + - vaysLB(i, j + 1, k, iv_nua) - vaysLB(i, j - 1, k, iv_nua) & + + vaysLB(i, j, k, iv_nua) + vaysLB(i, j, k, iv_nua)) + enddo + ! end do + enddo + do j = my - n6 + 2, my1 + ! do k=1 ,kd_nua + do i = ip11, mx1 + f__LBC(i, j, k) = WKxyz2(i, j, k) + enddo + ! end do + enddo + + ! Zero Gradient at y LBC if fmagnb,h = 0 / otherwise prescribed LBC + ! ----------------------------------------------------------------- + ! do k=1,kd_nua + do i = ip11, mx1 + f__LBC(i, 1, k) = & + (1.-fmagnb(iv_nua)) * f__LBC(i, jp11, k) & + + fmagnb(iv_nua) * vayiLB(i, 1, k, iv_nua) + f__LBC(i, my, k) = & + (1.-fmagnh(iv_nua)) * f__LBC(i, my1, k) & + + fmagnh(iv_nua) * vaysLB(i, my, k, iv_nua) + enddo + ! end do + +#if(OB) + do k = 1, kd_nua + f__LBC(1, 1, k) = (f__LBC(1, jp11, k) & + + f__LBC(ip11, 1, k)) * 0.5d0 + f__LBC(mx, 1, k) = (f__LBC(mx, jp11, k) & + + f__LBC(mx1, 1, k)) * 0.5d0 + f__LBC(1, my, k) = (f__LBC(1, my1, k) & + + f__LBC(ip11, my, k)) * 0.5d0 + f__LBC(mx, my, k) = (f__LBC(mx, my1, k) & + + f__LBC(mx1, my, k)) * 0.5d0 + enddo +#endif + endif + + ! Work Arrays Reset + ! ================= + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + enddo + enddo + enddo +!$OMP END PARALLEL DO + + return +endsubroutine LBCnud_atm diff --git a/MAR/code_mar/lbcnud_ini.f90 b/MAR/code_mar/lbcnud_ini.f90 new file mode 100644 index 0000000000000000000000000000000000000000..160793d876bdfdc8b8465fd2a923a9053b1b4c52 --- /dev/null +++ b/MAR/code_mar/lbcnud_ini.f90 @@ -0,0 +1,72 @@ +#include "MAR_pp.def" +subroutine lbcnud_ini + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS LBC 18-09-2001 MAR | + ! | subroutine lbcnud_ini initialize the Nudging Coefficient | + ! | for the lateral boundary conditions of Davies, 1983 | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | REFER. : Davies, MWR 111, p.1002-1012, 1983 | + ! | ^^^^^^^^ | + ! | | + ! | OUTPUT : rxLB,ryLB: nudging coefficients of the relaxation zones | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_lb + use mar_io + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m + real d25 +#if(da) + real cspeed + ! +--Nudging Coefficient Multiplied by the Time Step + ! + =============================================== + cspeed = 300.d0 * max(n6 - 1, 1) * max(n6 - 1, 1) & + / (max(n6 - 2, 1) * max(n6 - 2, 1)) + ! rxbase: Optimal Maximum Relaxation Coefficient + ! (see Davies 1983, MWR 111 p. 1007, 2e col. K* = K(dx)/c, + ! with K*~0.5, c= c_max= sqrt(gH)=300m/s) + rxbase = cspeed / (2.d0 * dx) + ! rxfact: Such that nu* < 1, but Diffusion_Relaxation replaces Diffusion + ! (see Davies 1983, MWR 111 p. 1004, 1e col. nu* = K(dx)/c, + ! p. 1007, 1e col. 21b) + rxfact = 0.5 * dt * max(n6 - 1, 1) * max(n6 - 1, 1) & + / (max(n6 - 2, 1) * max(n6 - 2, 1)) +#endif + if(IO_loc >= 2) write(21, 999) rxbase, rxfact +999 format(/, ' --- Initialisation / lbcnud_ini ---', & + /, ' K(relax)max =', f14.6, ' (Davies 1983 MWR)', & + /, ' K_H(fac) =', f14.6) + ! + + d25 = (n6 - 1) * (n6 - 1) + rxLB(1) = 0.d0 + rxLB(mx) = 0.d0 + if(mmx > 1) then + do i = ip11, mx1 + rxLB(i) = (max(0, n6 - i) * max(0, n6 - i) & + + max(0, n6 - 1 + i - mx) * max(0, n6 - 1 + i - mx)) & + * rxbase / d25 + enddo + endif + ! + + ryLB(1) = 0.d0 + ryLB(my) = 0.d0 + if(mmy > 1) then + do j = jp11, my1 + ryLB(j) = (max(0, n6 - j) * max(0, n6 - j) & + + max(0, n6 - 1 + j - my) * max(0, n6 - 1 + j - my)) & + * rxbase / d25 + enddo + endif + ! + + return +endsubroutine lbcnud_ini diff --git a/MAR/code_mar/lbcnud_par.f90 b/MAR/code_mar/lbcnud_par.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3b32e713de60fa693ca09850d99a619683d62b1b --- /dev/null +++ b/MAR/code_mar/lbcnud_par.f90 @@ -0,0 +1,319 @@ +#include "MAR_pp.def" +subroutine lbcnud_par + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS LBC 26-09-2001 MAR | + ! | subroutine lbcnud_par initialize the implicit numerical scheme | + ! | for LBC on Wind Component parallel to the Boundary | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | REFER. : Davies, QJRMS 102, pp.405--418, 1976 | + ! | ^^^^^^^^ | + ! | | + ! | INPUT : vaXX : large scale values of relevant dependant variables | + ! | ^^^^^^^^ ^X=(x->x axis border, y->y axis border) | + ! | ^X=(g->x small, d->x large, b->y small, h->y large) | + ! | | + ! | OUTPUT : wiXX : coefficient used in semi-implicit numerical scheme | + ! | ^^^^^^^^ tiXX : independant term of semi-implicit numerical scheme | + ! | ^X=(x->x axis border--variable v, | + ! | y->y axis border--variable u) | + ! | ^X=(g->x small, d->x large, b->y small, h->y large) | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_lb + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m + integer il, ic, ii, nn, n2, n3, n4, lmin, lmax, jl, jc, iv_nup, n1 + real wkxd(mx - n6:mx1, mx - n6:mx1) + + ! +--Matrix Inversion for x large (Reference Boundary) + ! + ================================================= + ! + + if(iterun == 0) then + ! + + if(mmx > 1) then + ! + + do il = mx - n6, mx1 + do ic = mx - n6, mx1 + wkxd(il, ic) = 0.d0 + enddo + enddo + ! + + do ii = mx - n6, mmx2 + wkxd(ii, ii + 1) = rxLB(ii + 1) - rxLB(ii) + enddo + do ii = mx - n6, mmx1 + wkxd(ii, ii) = 1 + 2 * rxLB(ii) + rxLB(ii + 1) - rxLB(ii - 1) + enddo +#if(OB) + wkxd(mx1, mx1) = 1 + rxLB(mx) - rxLB(mmx2) +#endif + do ii = mx - n6 + 1, mmx1 + wkxd(ii, ii - 1) = rxLB(ii) + enddo + do nn = 1, n6 - 3 + n2 = nn + 1 + n3 = nn + 2 + n4 = n6 - 1 - nn + do ii = mx - n4, mmx1 + wkxd(ii, ii - n2) = rxLB(ii - nn) - rxLB(ii - n3) + enddo + enddo + ! + + wkxd(mx1, mx - n6) = rxLB(mmx5) + ! + + lmin = mx - n6 + lmax = mx1 + ! + + ! + ****** + call matinv(wkxd, wixdLB, lmin, lmax) + ! + ****** + ! + + ! +--Inverted Matrices at Other Boundaries + ! + ===================================== + ! + + do il = 2, n7 + do ic = 2, n7 + wixgLB(il, ic) = wixdLB(mx + 1 - il, mx + 1 - ic) + enddo + enddo + ! +... x small + ! + + endif + ! + + if(mmy > 1) then + ! + + do jl = 2, n7 + do jc = 2, n7 + wiyiLB(jl, jc) = wixgLB(jl, jc) + enddo + enddo + ! +... y small + ! + + do jl = 2, n7 + do jc = 2, n7 + wiysLB(my + 1 - jl, my + 1 - jc) = wiyiLB(jl, jc) + enddo + enddo + ! +... y large + ! + + endif + endif + ! + + ! + + ! +--Independant Terms (Constant Coefficients) + ! + ========================================= + ! + + ! +--x Boundaries + ! + ------------ + ! + + if(mmx > 1) then + ! + + iv_nup = 2 + do k = 1, mz + do j = 1, my + ! + + ! +--x large + ! + ~~~~~~~ + do i = mx - n6, mmx1 + tixdLB(i, j, k) = rxLB(n50xLB) * vaxdLB(mx - n6, j, k, iv_nup) + enddo + do i = mx - n6, mmx2 + tixdLB(i, j, k) = tixdLB(i, j, k) + (rxLB(i + 1) & + - rxLB(i)) * vaxdLB(i + 1, j, k, iv_nup) + enddo + do i = mx - n6 + 1, mmx2 + tixdLB(i, j, k) = tixdLB(i, j, k) + (2 * rxLB(i) + rxLB(i + 1) & + - rxLB(i - 1)) * vaxdLB(i, j, k, iv_nup) + enddo + do i = mx - n6 + 2, mmx1 + tixdLB(i, j, k) = tixdLB(i, j, k) & + + rxLB(n40xLB) * vaxdLB(n50xLB, j, k, iv_nup) + enddo + ! + + do nn = n6 - 4, n6 - 3 + n1 = nn + 1 + n2 = nn + 2 + do i = mx - nn, mmx1 + tixdLB(i, j, k) = tixdLB(i, j, k) & + + (rxLB(mx - nn) - rxLB(mx - n2)) * & + vaxdLB(mx - n1, j, k, iv_nup) + enddo + enddo + ! + +#if(OB) + if(openLB) then + tixdLB(mx1, j, k) = tixdLB(mx1, j, k) & + + (rxLB(mmx1) - rxLB(mmx3)) * & + vaxdLB(mmx2, j, k, iv_nup) & + + 3 * rxLB(mmx1) * vaxdLB(mmx1, j, k, iv_nup) + else +#endif + tixdLB(mx1, j, k) = tixdLB(mx1, j, k) & + + (rxLB(mmx1) - rxLB(mmx3)) * & + vaxdLB(mmx2, j, k, iv_nup) & + + 2 * rxLB(mmx1) * vaxdLB(mmx1, j, k, iv_nup) +#if(OB) + endif +#endif + ! + + ! +--x small + ! + ~~~~~~~ + do i = n7mxLB, 2, -1 + tixgLB(i, j, k) = rxLB(n6mxLB) * & + vaxgLB(n7mxLB, j, k, iv_nup) + enddo + do i = n7mxLB, 3, -1 + tixgLB(i, j, k) = tixgLB(i, j, k) + (rxLB(i - 1) & + - rxLB(i)) * vaxgLB(i - 1, j, k, iv_nup) + enddo + do i = n6, 3, -1 + tixgLB(i, j, k) = tixgLB(i, j, k) + & + (2 * rxLB(i) + rxLB(i - 1) & + - rxLB(i + 1)) * vaxgLB(i, j, k, iv_nup) + enddo + do i = n6 - 1, 2, -1 + tixgLB(i, j, k) = tixgLB(i, j, k) & + + rxLB(n5mxLB) * vaxgLB(n6mxLB, j, k, iv_nup) + enddo + ! + + do nn = n6 - 3, n6 - 2 + n1 = nn + 1 + n2 = nn + 2 + do i = nn, 2, -1 + tixgLB(i, j, k) = tixgLB(i, j, k) & + + (rxLB(nn) - rxLB(n2)) * & + vaxgLB(n1, j, k, iv_nup) + enddo + enddo + ! + +#if(OB) + if(openLB) then + tixgLB(2, j, k) = tixgLB(2, j, k) & + + (rxLB(m0x2) - rxLB(m0x4)) * & + vaxgLB(m0x3, j, k, iv_nup) + & + 3 * rxLB(m0x2) * vaxgLB(m0x2, j, k, iv_nup) + else +#endif + tixgLB(2, j, k) = tixgLB(2, j, k) + & + (rxLB(m0x2) - rxLB(m0x4)) * & + vaxgLB(m0x3, j, k, iv_nup) + & + 2 * rxLB(m0x2) * vaxgLB(m0x2, j, k, iv_nup) +#if(OB) + endif +#endif + enddo + ! + + enddo + ! + + endif + ! + + ! + + ! +--y Boundaries + ! + ------------ + ! + + if(mmy > 1) then + ! + + iv_nup = 1 + do k = 1, mz + do i = 1, mx + ! + + ! +--y large + ! + ~~~~~~~ + do j = my - n6, mmy1 + tiysLB(i, j, k) = ryLB(n50yLB) & + * vaysLB(i, my - n6myLB, k, iv_nup) + enddo + do j = my - n6, mmy2 + tiysLB(i, j, k) = tiysLB(i, j, k) + (ryLB(j + 1) & + - ryLB(j)) * vaysLB(i, j + 1, k, iv_nup) + enddo + do j = my - n6 + 1, mmy2 + tiysLB(i, j, k) = tiysLB(i, j, k) + (2 * ryLB(j) + ryLB(j + 1) & + - ryLB(j - 1)) * vaysLB(i, j, k, iv_nup) + enddo + do j = my - n6 + 2, mmy1 + tiysLB(i, j, k) = tiysLB(i, j, k) & + + ryLB(n40yLB) * vaysLB(i, my - n6 + 1, k, iv_nup) + enddo + ! + + do nn = n6 - 4, n6 - 3 + n1 = nn + 1 + n2 = nn + 2 + do j = my - 3, mmy1 + tiysLB(i, j, k) = tiysLB(i, j, k) & + + (ryLB(my - nn) - ryLB(my - n2)) * vaysLB(i, my - n1, k, iv_nup) + enddo + enddo + ! + +#if(OB) + if(openLB) then + tiysLB(i, my1, k) = tiysLB(i, my1, k) & + + (ryLB(mmy1) - ryLB(mmy3)) * vaysLB(i, mmy2, k, iv_nup) & + + 3 * ryLB(mmy1) * vaysLB(i, mmy1, k, iv_nup) + else +#endif + tiysLB(i, my1, k) = tiysLB(i, my1, k) & + + (ryLB(mmy1) - ryLB(mmy3)) * vaysLB(i, mmy2, k, iv_nup) & + + 2 * ryLB(mmy1) * vaysLB(i, mmy1, k, iv_nup) +#if(OB) + endif +#endif + ! + + ! +--y small + ! + ~~~~~~~ + do j = n7, 2, -1 + tiyiLB(i, j, k) = ryLB(n6myLB) * vayiLB(i, n7myLB, k, iv_nup) + enddo + do j = n7, 3, -1 + tiyiLB(i, j, k) = tiyiLB(i, j, k) + (ryLB(j - 1) & + - ryLB(j)) * vayiLB(i, j - 1, k, iv_nup) + enddo + do j = n6, 3, -1 + tiyiLB(i, j, k) = tiyiLB(i, j, k) + (2 * ryLB(j) + ryLB(j - 1) & + - ryLB(j + 1)) * vayiLB(i, j, k, iv_nup) + enddo + do j = n6 - 1, 2, -1 + tiyiLB(i, j, k) = tiyiLB(i, j, k) & + + ryLB(n5myLB) * vayiLB(i, n6myLB, k, iv_nup) + enddo + ! + + do nn = n6 - 3, n6 - 2 + n1 = nn + 1 + n2 = nn + 2 + do j = nn, 2, -1 + tiyiLB(i, j, k) = tiyiLB(i, j, k) & + + (ryLB(nn) - ryLB(n2)) * vayiLB(i, n2, k, iv_nup) + enddo + enddo + ! + + j = 2 +#if(OB) + if(openLB) then + tiyiLB(i, 2, k) = tiyiLB(i, 2, k) & + + (ryLB(m0y2) - ryLB(m0y4)) * vayiLB(i, m0y3, k, iv_nup) & + + 3 * ryLB(m0y2) * vayiLB(i, m0y2, k, iv_nup) + else +#endif + tiyiLB(i, 2, k) = tiyiLB(i, 2, k) & + + (ryLB(m0y2) - ryLB(m0y4)) * vayiLB(i, m0y3, k, iv_nup) & + + 2 * ryLB(m0y2) * vayiLB(i, m0y2, k, iv_nup) +#if(OB) + endif +#endif + enddo + enddo + ! + + endif + ! + + return +endsubroutine lbcnud_par diff --git a/MAR/code_mar/lbcnud_srf.f90 b/MAR/code_mar/lbcnud_srf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fc3d2411ee48151745f0806851d1c4b9f4599dee --- /dev/null +++ b/MAR/code_mar/lbcnud_srf.f90 @@ -0,0 +1,80 @@ +#include "MAR_pp.def" +subroutine LBCnud_srf + ! +------------------------------------------------------------------------+ + ! | MAR, Routine LBCnud_srf 4-06-2002 MAR | + ! | LBCnud_srf includes the Surface Boundary Conditions | + ! | corresponding to Surface Variables | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : sst_LB: Surface Temperature LBC | + ! | ^^^^^^^ | + ! | | + ! | OUTPUT: tsrfSL: Surface Temperature | + ! | ^^^^^^^ | + ! +------------------------------------------------------------------------+ + ! + + use marctr + use marphy + use mardim + use margrd + use mar_lb + use mar_sl + ! + + implicit none + ! + + ! +--Local Variables + ! + ================ + ! + + integer i, j, k, m + logical MAR_SI + ! + + ! + + ! +--Initialization + ! + ============== + ! + + MAR_SI = .false. + if(VSISVAT) MAR_SI = .true. + ! + + ! + + ! +--LBC: New Surface Temperatures + ! + ============================= + ! + + if(.not. polmod .and. .not. MAR_SI) then + do j = 1, my + do i = 1, mx + if(isolSL(i, j) <= 2) then + tsrfSL(i, j, 1) = sst_LB(i, j) + + ! +---1. Open Water + ! + ~~~~~~~~~~~~~ + if(sst_LB(i, j) > Tfr_LB) then + isolSL(i, j) = 1 + d1_SL(i, j) = 2.09d+8 + albeSL(i, j) = 0.10 + eps0SL(i, j) = 0.97 + SL_z0(i, j, 1) = zs_SL + SL_r0(i, j, 1) = 0.1 * zs_SL + ch0SL(i, j) = 0.00132 + rsurSL(i, j) = 0.0 + + ! +---2. Sea Ice + ! + ~~~~~~~~~~ + else + isolSL(i, j) = 2 + d1_SL(i, j) = 1.05d+5 + albeSL(i, j) = 0.70d00 + eps0SL(i, j) = 0.97d00 + SL_z0(i, j, 1) = zn_SL + SL_r0(i, j, 1) = 0.1 * zn_SL + ch0SL(i, j) = 0.0021 + ! +... (Kondo and Yamazaki, 1990, JAM 29, p.376) + rsurSL(i, j) = 0.0 + endif + endif + enddo + enddo + endif + ! + + return +endsubroutine LBCnud_srf diff --git a/MAR/code_mar/libUN.f90 b/MAR/code_mar/libUN.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f7d0685492657f89287f874f0bfcdce1640a39af --- /dev/null +++ b/MAR/code_mar/libUN.f90 @@ -0,0 +1,2972 @@ +!--VERSION:2005.04.08 + +! ----------------------------------------------------------------------- +! libUN : User level NetCDF READ / WRITE routines +! +! by Philippe Marbaix and Xavier Fettweis +! +! Compatible with NetCDF version 3.x (or above). +! ----------------------------------------------------------------------- + +! User-frendly interface : +! ------------------------ + +! CF_INI_FILE : Initialization of the netcf file +! CF_CREATE_DIM : Create axis/dimensions +! CF_CREATE_VAR : Create variables +! CF_CREATE_FILE: Write the netcdf file +! CF_WRITE : Write variables +! CF_READ3D/2D : Read variables +! CF_OPEN : Open netcdf file +! CF_CLOSE : Close netcdf file + +! Main routines : +! --------------- + +! UNscreate : General file creation routine, +! defining multiple dimensions + attributes + +! UNwrite : General variables writting routine +! (also updates 'range' attribute and variable if present) +! Note: Use UNlwrite to write 2D planes in 3D variables + +! UN(s)read : Reading routine (grid coordinates + variable) + +! Complementary routines : +! ------------------------ + +! UNparam : set optional parameters of libUN functions +! UNwopen : re-open file for writting +! UNropen : open file for reading +! UNgtime : Find time index for a given time value +! UNgindx : Generalization of UNgtime: find value in any 1D data. +! UNfindx : modified version of UNgindx safe for non-monotonic data +! UNclose : close the NetCDF file +! UNwratt : Real attributes writting +! UNwcatt : Characters attributes creation & writing + +! Double Precision : +! ------------------ + +! To be in double precision, type this +! > sed "s/REAL\*4/REAL\*8/g" libUN.f > libUN1.f +! > sed "s/\_REAL/\_DOUBLE/g" libUN1.f > libUN2.f +! > sed "s/NF\_FLOAT/NF\_DOUBLE/g" libUN2.f > libUNd.f +! > rm -f libUN1.f libUN2.f + +! ----------------------------------------------------------------------- + +! +---------------------------+---------------------------------------+ +! + subroutine CD_INI_FILE : + Initialize the netcdf file + +! +---------------------------+---------------------------------------+ + +subroutine CF_INI_FILE(filename, filetitle) + + use libUN_mod + ! Input : + ! ======= + + ! filename = name of the netcdf file + ! filetitle = title in the netcdf file + + implicit none + + character * (*) filename, filetitle + + CF_attnam(1) = 'actual_range' + CF_attnum(1) = 2 + + CF_varnbrtot = 0 ! Initialization + CF_dimnbrtot = -1 ! Initialization + + CF_filenam = filename + CF_filetit = filetitle + +ENDsubroutine CF_INI_FILE + +! +-----------------------------+-------------------------------------+ +! + subroutine CF_CREATE_DIM : + Create dimensions/axis + +! +-----------------------------+-------------------------------------+ + +subroutine CF_CREATE_DIM(dimname, dimunits, dimdim, vallues) + use libUN_mod + ! Input : + ! ======= + + ! dimname = name of the axis/dimension + ! dimunits = units of the axis/dimension + ! dimdim = dimensions of the axis/dimension + ! vallues = vallues of the axis/dimension + + implicit none + + character * (*) dimname, dimunits + + integer dimdim, i + REAL(kind=4) vallues(dimdim) + + CF_dimnbrtot = CF_dimnbrtot + 1 + + CF_dimnbrtot = max(0, CF_dimnbrtot) + + CF_dimnam(CF_dimnbrtot) = dimname + CF_dimnamuni(CF_dimnbrtot) = dimunits + CF_dim(CF_dimnbrtot) = dimdim + + do i = 1, dimdim + CF_dimval(i, CF_dimnbrtot) = vallues(i) + enddo + +ENDsubroutine CF_CREATE_DIM + +! +-----------------------------+-------------------------------------+ +! + subroutine CF_CREATE_VAR : + Create variables + +! +-----------------------------+-------------------------------------+ + +subroutine CF_CREATE_VAR(varname, vartitle, varunits, varaxe4, & + varaxe1, varaxe2, varaxe3) + + ! Input : + ! ======= + + ! varname = name of the variable + ! vartitle = title of the variable + ! varunits = units of the variable + ! varaxeX = axes used by the variable (T,X,Y,Z) + use libUN_mod + implicit none + + character * (*) varname, vartitle, varunits + character * (*) varaxe1, varaxe2, varaxe3, varaxe4 + + CF_varnbrtot = max(0, CF_varnbrtot + 1) + + CF_varnam(CF_varnbrtot) = varname + CF_varnamdim(1, CF_varnbrtot) = varaxe1 + CF_varnamdim(2, CF_varnbrtot) = varaxe2 + CF_varnamdim(3, CF_varnbrtot) = varaxe3 + CF_varnamdim(4, CF_varnbrtot) = varaxe4 + CF_varnamuni(CF_varnbrtot) = varunits + CF_vardes(CF_varnbrtot) = vartitle + +ENDsubroutine CF_CREATE_VAR + +! +--------------------------------------+----------------------------+ +! + subroutine CF_CREATE_VAR_VIA_FILE : + Create variables + +! +--------------------------------------+----------------------------+ + +subroutine CF_CREATE_VAR_VIA_FILE(filename) + + ! Input : + ! ======= + + ! filename = name of the file containing informations + ! about the variables + use libUN_mod + implicit none + + character * 200 filename + + character * 120 tmpvar + + OPEN(unit=999, status='old', file=filename) + +980 continue + READ(999, '(A120)', end=990) tmpvar + + if(tmpvar(1:4) == ' ') then + CF_varnbrtot = max(0, CF_varnbrtot + 1) + READ(tmpvar, '(4x,5A9,A12,A50)') & + CF_varnam(CF_varnbrtot), & + CF_varnamdim(1, CF_varnbrtot), & + CF_varnamdim(2, CF_varnbrtot), & + CF_varnamdim(3, CF_varnbrtot), & + CF_varnamdim(4, CF_varnbrtot), & + CF_varnamuni(CF_varnbrtot), & + CF_vardes(CF_varnbrtot) + endif + + GOTO 980 +990 continue + +ENDsubroutine CF_CREATE_VAR_VIA_FILE + +! +------------------------------+------------------------------------+ +! + subroutine CF_CREATE_FILE : + Create the netcdf file + +! +------------------------------+------------------------------------+ + +subroutine CF_CREATE_FILE(filename) + + ! Input : + ! ======= + + ! filename = name of the netcdf file + use libUN_mod + implicit none + + character * (*) filename + + integer i, j, id + + integer UN1_dim(0:CF_dimnbrtot) + + real UN1_dimval(CF_dimmaxlen, 0:CF_dimnbrtot) + + character * 31 UN1_dimnam(0:CF_dimnbrtot), & + UN1_dimnamuni(0:CF_dimnbrtot) + + if(filename /= CF_filenam) then + write(6, *) "ERROR: not "//CF_filenam + stop + endif + + do i = 0, CF_dimnbrtot + UN1_dim(i) = CF_dim(i) + UN1_dimnam(i) = CF_dimnam(i) + UN1_dimnamuni(i) = CF_dimnamuni(i) + do j = 1, CF_dim(i) + UN1_dimval(j, i) = CF_dimval(j, i) + enddo + enddo + + call UNscreate(CF_filenam, CF_filetit, CF_dimnbrtot, UN1_dim, & + CF_dimmaxlen, UN1_dimnam, UN1_dimnamuni, & + UN1_dimval, & + CF_varmaxnbr, CF_varnbrtot, CF_varnam, & + CF_varnamdim, CF_varnamuni, CF_vardes, & + CF_attnbr, CF_attnam, CF_attnum, id) + + call UNclose(id) + +ENDsubroutine CF_CREATE_FILE + +! +------------------------+------------------------------------------+ +! + subroutine CF_WRITE : + Writes variables + +! +------------------------+------------------------------------------+ + +subroutine CF_WRITE(FILEname, VARname, itime, & + Ni, Nj, Nlev, var) + + ! Input : + ! ======= + + ! FILEname = name of the netcdf file + ! VARname = name of variables + ! itime = index on time axis + ! Ni,Nj,Nlev = X,Y,Z dimension + ! var = array of vallues of the variable + use libUN_mod + implicit none + + character * (*) FILEname, VARname + integer itime + integer Ni, Nj, Nlev, fileid + REAL(kind=4) var(Ni, Nj, Nlev) + + if(CF_filenamopened /= FILEname) then + call UNwopen(FILEname, fileid) + else + fileid = CF_fileidopened + endif + + call UNwrite(fileid, VARname, itime, Ni, Nj, Nlev, var) + + if(CF_filenamopened /= FILEname) then + call UNclose(fileid) + endif + +ENDsubroutine CF_WRITE + +!** +-------------------------+-----------------------------------------+ +!** + subroutine CF_READ2D : + Read variables + +!** +-------------------------+-----------------------------------------+ + +subroutine CF_READ2D(FILEname, VARname, itime, & + Ni, Nj, Nlev, var) + + ! Input : + ! ======= + + ! FILEname = name of the netcdf file + ! VARname = name of variables + ! itime = index on time axis + ! Ni,Nj,Nlev = X,Y,Z dimension + + ! Output : + ! ======== + + ! var = array of vallues of the variable + use libUN_mod + implicit none + + character * (*) FILEname, VARname + character * 31 var_units, filetitle + integer Ni, Nj, Nlev, itime, level + REAL(kind=4) var(Ni, Nj) + + integer i, j, fileid + + if(CF_filenamopened /= FILEname) then + call UNropen(FILEname, fileid, filetitle) + else + fileid = CF_fileidopened + endif + + call UNsread(fileid, VARname, itime, Nlev, 1, 1, & + Ni, Nj, 1, var_units, var) + + if(CF_filenamopened /= FILEname) then + call UNclose(fileid) + endif + +ENDsubroutine CF_READ2D + +! +-------------------------+-----------------------------------------+ +! + subroutine CF_READ3D : + Read variables + +! +-------------------------+-----------------------------------------+ + +subroutine CF_READ3D(FILEname, VARname, itime, & + Ni, Nj, Nlev, var) + + ! Input : + ! ======= + + ! FILEname = name of the netcdf file + ! VARname = name of variables + ! itime = index on time axis + ! Ni,Nj,Nlev = X,Y,Z dimension + + ! Output : + ! ======== + + ! var = array of vallues of the variable + use libUN_mod + implicit none + + character * (*) FILEname, VARname + character * 32 var_units, filetitle + integer Ni, Nj, Nlev, itime, level + REAL(kind=4) var(Ni, Nj, Nlev) + + integer i, j, fileid + + if(CF_filenamopened /= FILEname) then + call UNropen(FILEname, fileid, filetitle) + else + fileid = CF_fileidopened + endif + + call UNsread(fileid, VARname, itime, 0, 1, 1, & + Ni, Nj, Nlev, var_units, var) + + if(CF_filenamopened /= FILEname) then + call UNclose(fileid) + endif + +ENDsubroutine CF_READ3D + +!** +------------------------+------------------------------------------+ +!** + subroutine CF_CLOSE : + Close the file + +!** +------------------------+------------------------------------------+ + +subroutine CF_CLOSE(FILEname) + use libUN_mod + implicit none + + character * (*) FILEname + + if(FILEname == CF_filenamopened) then + call UNclose(CF_fileidopened) + else + print *, FILEname//" not opened" + endif + + CF_filenamopened = "" + CF_fileidopened = 0 + +ENDsubroutine CF_CLOSE + +!** +-----------------------+-------------------------------------------+ +!** + subroutine CF_OPEN : + open the file + +!** +-----------------------+-------------------------------------------+ + +subroutine CF_OPEN(FILEname, FILEid) + use libUN_mod + implicit none + + integer FILEid + + character * (*) FILEname + + call UNwopen(FILEname, FILEid) + + CF_filenamopened = FILEname + + CF_fileidopened = FILEid + +ENDsubroutine CF_OPEN + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNscreate : + + +!** +-------------------------+ + +!** + * Purpose : + +!** + Create a NetCDF file, general version. + +!** + (Staggered grids + other extensions to UNcreate) + +!** + + +!** + * How it works : calling routine must provide + +!** + -a list of dimensions + +!** + (size of each dimens., names, units and values of coordinates)+ +!** + -a list of variables + +!** + (units, number of dimensions, names of selected dimensions) + +!** + + +!** + INPUT : + +!** + ------- + +!** + + +!** + General : + +!** + FILEnam [char]: Name of the file to be created. + +!** + title [char]: Title attribute + +!** + + +!** + Dimensions: + +!** + TND : Total Number of SPATIAL dimensions + +!** + Notice : Set "time" to dimension No 0 + +!** + DFdim(0:TND) : # discrete values for each dimension + +!** + Notice : DFdim(0).eq.0 + +!** + -> UNLIMITED TIME (coord. not defined) + +!** + WARNING: In this case, the NetCDF + +!** + use a temporary space to duplicate + +!** + the file -> NOT RECOMMENDED + +!** + MXdim : Maximum value of DFdim, = arrays size + +!** + NAMdim(0:TND) [char]: Name of dimensions, except time + +!** + UNIdim(0:TND) [char]: Units of dimensions (attribute) + +!** + VALdim(MXdim,0:TND)[R4]: Values of coordinate for each dimension+ +!** + + +!** + Variables: + +!** + Dvs : Variable's definitions array sizes, + +!** + Nvs : Number of defined variables(Nvs.le.Dvs)+ +!** + name_vs (Dvs) [char]: name of variable. + +!** + unit_vs (Dvs) [char]: physical units of variable (attribute) + +!** + Sdim_vs (4,Dvs) [char]: name of Selected dims (in above list) + +!** + Blanked or '-' elements = not used + +!** + lnam_vs (Dvs) [char]: Long_name attribute (descript. of var.)+ +!** + + +!** + List of real attributes to all variables: + +!** + Nra : Number of Real Attributes (.ge.1 !) + +!** + NAMrat(Nra) [char]: NAMes of Real ATtributes (''=none) + +!** + (initial value= 0; set it with UNwratt)+ +!** + Nvals(Nra) : Number of values of these attributes. + +!** + ! Currently limited to 1 value (scalar) or 2 (2 elements vector)+ +!** + ! EXCEPTION: Setting the last attribute name to '[var]_range' + +!** + does create a variable (!) for level-by-level range+ +!** + (very usefull for 3D + time fields) + +!** + + +!** + NB : [char] variables may have any length. + +!** + blanks characters are NOT ALLOWED in any variable, + +!** + except the "title". + +!** + and the NetCDF variables defined here are always REAL(kind=4) + +!** + + +!** + OUTPUT : + +!** + -------- + +!** + FILEid : Index of the NetCDF file (remains open)+ +!** +-------------------------------------------------------------------+ + +subroutine UNscreate(FILEnam, title, & + TND, DFdim, MXdim, NAMdim, UNIdim, VALdim, & + Dvs, Nvs, name_vs, Sdim_vs, unit_vs, lnam_vs, & + Nra, NAMrat, Nvals, & + FILEid) + use libUN_mod + ! + + implicit none + + ! + + INTEGER icheck, MXND + ! ** Maximum number of dimensions + parameter(MXND=100) + + ! + INPUT: + ! + - - - + character * (*) FILEnam + character * (*) title + + integer TND, DFdim(0:TND), MXdim + character * (*) NAMdim(0:TND) + character * (*) UNIdim(0:TND) + REAL(kind=4) VALdim(MXdim, 0:TND) + + integer Nvs, Dvs + character * (*) name_vs(Dvs) + character * (*) Sdim_vs(4, Dvs) + character * (*) unit_vs(Dvs) + character * (*) lnam_vs(Dvs) + + integer Nra + character * (*) NAMrat(Nra) + character * 24 Host, Fdate + character * 200 tmpchar + integer Nvals(Nra) + + ! + OUTPUT: + ! + - - - - + INTEGER FILEid + + ! + LOCAL: + ! + - - - + integer VARSIZE + EXTERNAL VARSIZE + character * (30) tmpchr + integer dimDID(0:MXND) + integer dimVID(0:MXND), vsVID, vrVID + integer dID(4), start(4), count(4), rdID(2) + integer mimaID + integer stride(4), imap(4) + integer Ndim_vs + integer ivs, igd, idi, ira, itmp + integer Nlen + integer dNlen(0:MXND) + integer Ierro, TTerr, ii, jj + REAL(kind=4) zero1(1), zero2(2) + + icheck = 0 !Debugging level + + !* 0. Initialisations + ! ------------------ + if(icheck >= 1) write(*, *) 'UNscreate : Begin' + + ! + Routines which opens a file must reset libUN internals: + call UNparam('RESET_PARAMS_', 0.0) + + do ii = 1, 4 + stride(ii) = 1 + enddo + zero1(1) = 0. + zero2(1) = 0. + zero2(2) = 0. + TTerr = 0 !Total of error flags + + if(TND > MXND) then + write(*, *) 'UNscreate - Error: so much dimensions ?', TND + endif + + ! Create a NetCDF file and enter define mode : + ! -------------------------------------------- + if(icheck >= 2) write(*, *) 'FILEnam :', FILEnam + + ! ** getting FILEnam [char] size : + Nlen = VARSIZE(FILEnam) + + Ierro = NF_CREATE(FILEnam(1:Nlen), NF_CLOBBER, FILEid) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + ! ** identif. =>overwrite =error + + !* Time coordinate definition. + ! --------------------------- + + ! ** Define dimension : + if(icheck >= 3) write(*, *) '# time iters.:', DFdim(0) + if(DFdim(0) == 0.) then + Ierro = NF_DEF_DIM(FILEid, 'time', NF_UNLIMITED, dimDID(0)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + else + Ierro = NF_DEF_DIM(FILEid, 'time', DFdim(0), dimDID(0)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + endif + dNlen(0) = 4 ! 4 characters in the name 'time'... + if(NAMdim(0)(1:4) /= 'time') then + write(*, *) 'Sorry, NAMdim(0) must be ''time'' .' + STOP + endif + + ! ** Define variable for the time coordinate values : + dID(1) = dimDID(0) + Ierro = NF_DEF_VAR(FILEid, 'time', NF_FLOAT, 1, dID, dimVID(0)) + ! ** ^^^^^^^^^^ FILEid var name type dims DIMid VARid + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! Spatial coordinates definitions : DIMS and VARs (locations). + ! ------------------------------------------------------------ + ! + do igd = 1, TND !** BEGIN LOOP over all spatial dims + if(icheck >= 3) write(*, *) ' spatial dim:', NAMdim(igd) + + ! ** getting NAMdim [char] size : + Nlen = VARSIZE(NAMdim(igd)) + dNlen(igd) = Nlen !For further use of NAMdim + + Ierro = NF_DEF_DIM(FILEid, NAMdim(igd)(1:Nlen), & + DFdim(igd), dimDID(igd)) + ! **line1 ^^^^^^^^^^ FILEid | dim name + ! **line2 # values | VARid + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + dID(1) = dimDID(igd) + Ierro = NF_DEF_VAR(FILEid, NAMdim(igd)(1:Nlen), & + NF_FLOAT, 1, dID, dimVID(igd)) + ! **line1 ^^^^^^^^^^ FILEid | dim name + ! **line2 type | #dims | dimsIDs | VARid + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + enddo !** END LOOP over all spatial dims + + ! Special coordinate definition: MinMax (for [var]_range) + ! ------------------------------------------------------- + if(NAMrat(Nra)(1:11) == '[var]_range') then + + Ierro = NF_DEF_DIM(FILEid, 'MinMax', 2, mimaID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + endif + + ! Define the fields. + ! ------------------ + + do ivs = 1, Nvs !**BEGIN LOOP on var. num. + if(icheck >= 3) & + WRITE(*, *) 'Defining variable ', name_vs(ivs) + + ! Set space and time dimensions + ! - - - - - - - - - - - - - - - + ! ** Initialise number of dimensions : + Ndim_vs = 0 + + do idi = 1, 4 !** BEGIN LOOP on var dims. + if(Sdim_vs(idi, ivs)(1:1) /= ' ' & + .and. Sdim_vs(idi, ivs)(1:1) /= '-') then !**skip undefined. + + ! ** getting Sdim_vs [char] size : + Nlen = VARSIZE(Sdim_vs(idi, ivs)) + + ! ** Searching for the dimension index from its name (Sdim_vs) + igd = 0 + do WHILE(Sdim_vs(idi, ivs)(1:Nlen) & + /= NAMdim(igd)(1:dNlen(igd))) + if(igd == TND) then + write(*, *) 'UNscreate-ERROR: Dimension not found:', & + Sdim_vs(idi, ivs)(1:Nlen) + STOP + endif + igd = igd + 1 + enddo + ! ** Construct the dimensions id's for that variable (ivs): + if(icheck >= 3) & + WRITE(*, *) 'using dimension ', NAMdim(igd), dimDID(igd) + Ndim_vs = Ndim_vs + 1 + dID(Ndim_vs) = dimDID(igd) + + endif + enddo !** END LOOP on var dims. + + ! Define our special [var]_range field for 4D variables + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - + if(Ndim_vs == 4 & + .and. NAMrat(Nra)(1:11) == '[var]_range') then + + Nlen = VARSIZE(name_vs(ivs)) + rdID(1) = dID(3) !(4D variable, 3th dim = level) + rdID(2) = mimaID !(for min, max) + tmpchr = name_vs(ivs)(1:Nlen)//'_range' + itmp = Nlen + 6 + Ierro = NF_DEF_VAR(FILEid, tmpchr(1:itmp), & + NF_FLOAT, 2, rdID, vrVID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + endif + + ! Define fields : + ! - - - - - - - - + Nlen = VARSIZE(name_vs(ivs)) + Ierro = NF_DEF_VAR(FILEid, name_vs(ivs)(1:Nlen), & + NF_FLOAT, Ndim_vs, dID, vsVID) + ! **line1 ^^^^^^^^^^ FILEid | variable name + ! **line2 type | #dims | dimsIDs | VARid + if(Ierro /= NF_NOERR) & + call HANDLE_ERR('UNscreate (field)', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! Set the variable's attributes : + ! ------------------------------- + + ! ** Units: + ! - - - - - + ! ** getting unit_vs [char] size : + Nlen = VARSIZE(unit_vs(ivs)) + + Ierro = NF_PUT_ATT_TEXT(FILEid, vsVID, 'units', & + Nlen, unit_vs(ivs)(1:Nlen)) + ! **line1 ^^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 length | attr.value + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! ** Special case : units = sigma + ! - - - - - - - - - - - - - - - - + ! In this case, CV convention advises to write the following + ! attribute : positive = down + ! + !BUG Nlen = VARSIZE(lnam_vs(ivs)) + + if(unit_vs(ivs)(1:Nlen) == '[sigma]' & + .OR. unit_vs(ivs)(1:Nlen) == 'sigma_level') then + if(icheck >= 3) then + write(*, *) 'Unit = sigma -> setting positive attr' + endif + + Ierro = NF_PUT_ATT_TEXT(FILEid, vsVID, 'positive', & + 4, 'down') + ! **line1 ^^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 length | attr.value + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + endif + + ! ** "long_name": + ! - - - - - - - - + Nlen = VARSIZE(lnam_vs(ivs)) + + if(icheck >= 3) & + WRITE(*, *) 'Write long_name ', lnam_vs(ivs)(1:Nlen) + + Ierro = NF_PUT_ATT_TEXT(FILEid, vsVID, 'long_name', & + Nlen, lnam_vs(ivs)(1:Nlen)) + + do jj = 1, Nlen + if(lnam_vs(ivs)(jj:jj) == " ") lnam_vs(ivs)(jj:jj) = "_" + if(lnam_vs(ivs)(jj:jj) == ".") lnam_vs(ivs)(jj:jj) = "_" + if(lnam_vs(ivs)(jj:jj) == "(") lnam_vs(ivs)(jj:jj) = "_" + if(lnam_vs(ivs)(jj:jj) == ")") lnam_vs(ivs)(jj:jj) = "_" + if(lnam_vs(ivs)(jj:jj) == "/") lnam_vs(ivs)(jj:jj) = "_" + enddo + + Ierro = NF_PUT_ATT_TEXT(FILEid, vsVID, 'standard_name', & + Nlen, lnam_vs(ivs)(1:Nlen)) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! ** From the list of real attributes (input argument) : + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! + do ira = 1, Nra + if(NAMrat(ira)(1:1) /= ' ') then + if(NAMrat(ira)(1:11) == 'valid_range') then + + ! ** The "valid_range" special attribute : + Ierro = NF_PUT_ATT_REAL(FILEid, vsVID, 'valid_range', & + NF_FLOAT, 2, ValRange) + TTerr = TTerr + ABS(Ierro) + + else if(NAMrat(ira)(1:11) /= '[var]_range') then + + ! ** All "regular" attributes : + Nlen = VARSIZE(NAMrat(ira)) + if(Nvals(ira) == 1) then + Ierro = NF_PUT_ATT_REAL(FILEid, vsVID, NAMrat(ira)(1:Nlen), & + NF_FLOAT, Nvals, zero1) + TTerr = TTerr + ABS(Ierro) + else if(Nvals(ira) == 2) then + Ierro = NF_PUT_ATT_REAL(FILEid, vsVID, NAMrat(ira)(1:Nlen), & + NF_FLOAT, Nvals, zero2) + TTerr = TTerr + ABS(Ierro) + ! + endif + endif + endif + enddo + + enddo ! **END LOOP on var. num. + + ! Set 'unit' attribute for the dimensions: + ! ---------------------------------------- + + do igd = 0, TND !** BEGIN LOOP over all spatial dims + + ! ** getting NAMdim [char] size : + Nlen = VARSIZE(UNIdim(igd)) + + Ierro = NF_PUT_ATT_TEXT(FILEid, dimVID(igd), 'units', & + Nlen, UNIdim(igd)) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + Nlen = VARSIZE(NAMdim(igd)) + + Ierro = NF_PUT_ATT_TEXT(FILEid, dimVID(igd), 'long_name', & + Nlen, NAMdim(igd)) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + Ierro = NF_PUT_ATT_TEXT(FILEid, dimVID(igd), 'standard_name', & + Nlen, NAMdim(igd)) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + enddo + + ! Global attribute(s). + ! -------------------- + + ! ** Title (some general file descriptor) : + ! ** getting unit_vs [char] size : + + Nlen = VARSIZE(title) + + Ierro = NF_PUT_ATT_TEXT(FILEid, NF_GLOBAL, 'title', & + Nlen, title(1:Nlen)) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + Nlen = VARSIZE(CF_institution) + + Ierro = NF_PUT_ATT_TEXT(FILEid, NF_GLOBAL, 'institution', & + Nlen, CF_institution) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + ! call HostNm(Host, Ierro) + + tmpchar = "libUN ("//CF_libUN_version//") - "//FDate() + ! & " - "//Host + + Nlen = VARSIZE(tmpchar) + + Ierro = NF_PUT_ATT_TEXT(FILEid, NF_GLOBAL, 'history', & + Nlen, tmpchar) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + Nlen = VARSIZE(NF_INQ_LIBVERS()) + + Ierro = NF_PUT_ATT_TEXT(FILEid, NF_GLOBAL, 'netcdf', & + Nlen, NF_INQ_LIBVERS()) + + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! Leave define mode (!file remains open ) + ! --------------------------------------- + Ierro = NF_ENDDEF(FILEid) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! Writing of dimensions coordinates. + ! ---------------------------------- + + ! ** Time : + ! - - - - - + + start(1) = 1 !Vector of starting indexes values + count(1) = DFdim(0) !Vector of total # indexes values + if(icheck >= 3) & + WRITE(*, *) 'Write coords for ', NAMdim(0), count(1) + + ! ** Set 'imap' to write with NCVPTG; NCVPT could be enough ? + ! ** (imap tells NetCDF about the memory locations of var, + ! ** we choose NCVPTG because + ! ** only a portion of VALdim is written.) + imap(1) = 1 + imap(2) = 0 ! Not used : write only 1 coord. + + Ierro = NF_PUT_VARM_REAL(FILEid, dimVID(0), start, count, & + stride, imap, VALdim(1, 0)) + ! **line 1 ^^^^^^^^^^^^^^^ ID file| id var. |read from... |#data + ! **line 2 step |re-arrang|variable(beg.) + ! ** (^^^^stride is not used) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + ! ** Space coordinates : + ! - - - - - - - - - - - - + + do igd = 1, TND !** BEGIN LOOP over all spatial dims + + start(1) = 1 + count(1) = DFdim(igd) + if(icheck >= 3) & + WRITE(*, *) 'Write coords for ', NAMdim(igd), count(1) + + Ierro = NF_PUT_VARM_REAL(FILEid, dimVID(igd), start, count, & + stride, imap, VALdim(1, igd)) + ! ** ^^^^^^^^^^^^^^^^ see above + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNscreate', Ierro) + + TTerr = TTerr + ABS(Ierro) + + enddo !** END LOOP over all spatial dims + + ! Stop if an error occured. + ! ------------------------- + + if(TTerr /= 0) then + STOP 'UNscreate : Sorry, an error occured.' + endif + + ! + + RETURN +ENDsubroutine UNscreate + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNwrite : + + +!** +-------------------------+ + +!** + * Writes a variable into a NetCDF file, + +!** + (the NetCDF file must have been created (or re-opened) and + +!** + closed after all writing operations). + +!** + * Automatically updates attribute 'actual_range' if available + +!** + " " special var. '[var]_range' " + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from UNcreate OR NetCDF open) + +!** + VARname : name given to the variable to write (must be in file)+ +!** + itime : No of time step to write to + +!** + Ni,Nj,Nlev: dimensions of 'var' + +!** + ! Nlev= 1 for 2D and 1D input variables. + +!** + Nj = 1 for 1D input variables. + +!** + NB: can not write 1 level of 3D var only (->UNlwrite)+ +!** + + +!** + var : The variable to be writen + +!** + + +!** + REMARK : + +!** + Truncation of input data is permited: + +!** + If the dim of "var" > dim in the NetCDF file, + +!** + "var" is automatically truncted. However, this => WARNING + +!** + message, UNLESS a specific truncation was "announced" + +!** + in var: + +!** + To truncate the first dim to Li, let var(Ni,1,1) = Li + +!** + To truncate the 2nd dim to Lj, let var(1,Nj,1) = Lj + +!** + ... (this has no effect exept cancel the "WARNING" message) + +!** +-------------------------------------------------------------------+ + +subroutine UNwrite(FILEid, VARname, itime, & + Ni, Nj, Nlev, var) + use libUN_mod + implicit none + + INTEGER icheck + + INTEGER Lvnam + PARAMETER(Lvnam=20) + + ! ** input + integer FILEid + integer itime + integer Ni, Nj, Nlev + character * (*) VARname + REAL(kind=4) var(Ni, Nj, Nlev) + + ! ** local : + integer MXlv + PARAMETER(MXlv=500) + ! ^^^^Maximal # levels for a special output + INTEGER VARSIZE + EXTERNAL VARSIZE + INTEGER NVRi, NVRj, NVRlev + INTEGER Ierro, TTerr, Nvatts, vtype + INTEGER dimID(4), dimSIZ(4), count(4) + INTEGER start(4), stride(4), imap(4) + character * (Lvnam) dimNAM(4) + character * (Lvnam) recname + character * (30) tmpchr + INTEGER varVID + INTEGER VNlen, NDIMvar, NSDIvar, tiDI, itmp + INTEGER iz, ii, jj, ll + INTEGER iUNLIMDIM + REAL(kind=4) chkdim + REAL(kind=4) Arange(2), sValRange(2) + REAL(kind=4) Srange(MXlv, 2) + LOGICAL OkRange + + icheck = 0 !** 'debugging' level + TTerr = 0 !** 'total number of errors + + if(icheck >= 1) write(*, *) 'UNwrite : Begin' + + !* 1. Get the variable field and dims IDs + ! ---------------------------------------- + + if(icheck >= 2) write(*, *) 'FILEid :', FILEid + + ! ** getting VARname size : + VNlen = VARSIZE(VARname) + if(icheck >= 3) write(*, *) 'VNlen :', VNlen + if(icheck >= 2) write(*, *) 'VARname :', VARname(1:VNlen) + + ! ** variable field ID : + Ierro = NF_INQ_VARID(FILEid, VARname(1:VNlen), varVID) + + ! ** Cancel writing if an error occured : variable undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNwrite Info : Variable ', VARname(1:VNlen) & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9999 !** UNwrite_end + + ! ** Inquire about the number of dimensions in var : + ! ** + Ierro = NF_INQ_VAR(FILEid, varVID, recname, vtype, & + NDIMvar, dimID, Nvatts) + ! ** line1 id/file id/var var name var type + ! ** line2 # dims id/dims #attributes + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + + if(icheck >= 2) write(*, *) 'Ierro1. ', Ierro + + !* 2. Dimensions : inquire about file + compare with input data. + ! ------------------------------------------------------------- + + ! 2.1 Inquire dimensions names and sizes : + ! + - - - - - - - - - - - - - - - - - - - - - + do iz = 1, 4 + dimSIZ(iz) = 0 + dimNAM(iz) = ' ' + ! ** Set any unused dimension to "0" size / no name + enddo + do iz = 1, NDIMvar + Ierro = NF_INQ_DIM(FILEid, dimID(iz), dimNAM(iz), dimSIZ(iz)) + ! ** id/file id/dim dimname dimsize + ! ** !output output + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + enddo + if(icheck >= 3) write(*, *) 'NDIMvar ', NDIMvar + if(icheck >= 3) write(*, *) 'Ierro 2.0', Ierro + + ! 2.2 Set writing region according to field dimension : 2D or 3D + ! + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! ** Set horizontal dimensions (default, for most data) : + count(1) = Ni + count(2) = Nj + ! + ** Other default values: + count(3) = 0 + count(4) = 0 + start(1) = 1 + start(2) = 1 + start(3) = 1 + start(4) = 1 + + ! +- ------3D+time variable in file----------- + if(NDIMvar == 4) then + ! ** 3D space + time: + NSDIvar = 3 ! Nb. space dims + tiDI = 4 ! No. of the time dim + ! ** write 3D space: + start(3) = 1 ! Start of index 3 in var (here = vert. levs) + count(3) = Nlev ! Nb. values of index 3 in var + ! ** write one time step: + start(4) = itime + count(4) = 1 + ! +- ------3D *OR* 2D+time var in file-------- + else if(NDIMvar == 3) then + if(Nlev == 1) then + ! ** 2D space + time (standard use of UNlib): + NSDIvar = 2 + tiDI = 3 + ! ** ...write one time step: + start(3) = itime + count(3) = 1 + else + ! ** 3D (no time slice): + NSDIvar = 3 + tiDI = 0 + ! ** ...write 3rd dimension: + start(3) = 1 + count(3) = Nlev + endif + ! +- ------2D *OR* 1D+time var in file-------- + else if(NDIMvar == 2) then + if(Nj == 1 .and. dimNAM(2)(1:4) == 'time') then + ! ** Write a 1D vector at time= itime: + NSDIvar = 1 + tiDI = 2 + start(2) = itime + count(2) = 1 + else + ! ** Usual MAR 2D space (no time): + NSDIvar = 2 + tiDI = 0 + endif + ! +- ------1D *OR* 0D+time var in file-------- + else if(NDIMvar == 1) then + ! ** 1D space or time + if(Ni == 1) then + ! ** Write a single element (at itime) + start(1) = itime + count(1) = 1 + count(2) = 0 + NSDIvar = 0 + tiDI = 1 + else + ! ** Write a vector (use only "space" dim 1) + NSDIvar = 1 + tiDI = 0 + count(2) = 0 + endif + else + write(*, *) 'UNwrite ERROR : data field dimension ?' + STOP + endif + + ! 2.3 Compare file dimensions to input data. + ! + - - - - - - - - - - - - - - - - - - - - - - + ! ** Save variable size for use as "valid" size (-> range): + NVRi = Ni + NVRj = Nj + NVRlev = Nlev + ! ** Space dimensions : + if(NSDIvar > 0) then + do iz = 1, NSDIvar + if(dimSIZ(iz) > count(iz)) then + write(*, *) 'UNwrite - WARNING: ' + write(*, *) ' Your field ', VARname, ' has an empty part.' + write(*, *) ' (for the dimension:', dimNAM(iz), ')' + else if(dimSIZ(iz) < count(iz)) then + ! ** Do display "warning" only if truncation + ! was not "correctly announced" (see header) + ! (NVR... => stop here when updating the range attribute) + if(iz == 1) then + chkdim = var(Ni, 1, 1) + NVRi = dimSIZ(1) + else if(iz == 2) then + chkdim = var(1, Nj, 1) + NVRj = dimSIZ(2) + else if(iz == 3) then + chkdim = var(1, 1, Nlev) + NVRlev = dimSIZ(3) + else + chkdim = 0.0 + endif + Ierro = NF_INQ_UNLIMDIM(FILEid, iUNLIMDIM) + if(dimID(iz) /= iUNLIMDIM) then + if(ABS(chkdim - dimSIZ(iz)) > 0.1) then + write(*, *) 'UNwrite - WARNING: ' + write(*, *) ' Your field ', VARname, ' will be truncated.' + write(*, *) ' (for the dimension:', dimNAM(iz), ')' + endif + count(iz) = dimSIZ(iz) + endif + endif + enddo + endif + + ! ** Time dimension (when defined): + if(tiDI /= 0) then + if(itime > dimSIZ(tiDI)) then + if(icheck >= 1) write(*, *) 'Time limit, ID', dimID(tiDI) + Ierro = NF_INQ_UNLIMDIM(FILEid, iUNLIMDIM) + if(dimID(tiDI) /= iUNLIMDIM) then + write(*, *) 'UNwrite - ERROR: ' + write(*, *) ' Time index out of range ' + STOP + endif + endif + endif + + if(icheck >= 2) write(*, *) 'Ierro2. ', Ierro + if(icheck >= 2) write(*, *) 'Dimension names :', dimNAM + if(icheck >= 2) write(*, *) 'dimSIZ :', dimSIZ + if(icheck >= 2) write(*, *) 'count :', count + if(icheck >= 2) write(*, *) 'start :', start + if(icheck >= 2) write(*, *) 'dimID :', dimID + + !* 3. Write variable. + ! ------------------ + + ! ** Set 'imap' and WRITE with NCVPTG: + ! ** NOTE : since the arrays (grid_*) may be over-dimensionned, + ! ** we use the 'generalised' writing routine NCVPTG + ! ** (imap tells NetCDF about the memory locations of var) + imap(1) = 1 + imap(2) = imap(1) * Ni ! 1st dim of var = Ni + imap(3) = imap(2) * Nj ! 2nd dim of var = Nj + imap(4) = 0 ! (not used: 0 or 1 time step) + do iz = 1, 4 + stride(iz) = 1 + enddo + ! ** NOTE: stride is not used. + + Ierro = NF_PUT_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, var(1, 1, 1)) + ! ** line1: id/file | id/var |read from...|#data + ! ** line2: step |re-arrang|variable(beg.) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + + if(icheck >= 2) write(*, *) 'Ierro3.2', Ierro + + !* 4a. Update 'actual_range' attribute. + ! ------------------------------------ + + ! If 'actual_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get the old min and max values: + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'actual_range', & + Arange) + ! **line1 ^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 value + + ! ** Cancel if an error occured : attribute undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNwrite Info : attribute actual_range ' & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9990 !** Next section + + ! If 'valid_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get the min/max valid range (outside = missing val): + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'valid_range', & + sValRange) + if(Ierro /= 0) then + sValRange(1) = ValRange(1) + sValRange(2) = ValRange(2) + endif + + ! Update the min an max + ! - - - - - - - - - - - + + ! **If this is the first pass, initialise min and max: + if(Arange(1) == NF_FILL_REAL & + .OR. (Arange(1) == 0.0 .and. Arange(2) == 0.0)) then + OkRange = .false. + else + OkRange = .true. + endif + + do ll = 1, NVRlev + do jj = 1, NVRj + do ii = 1, NVRi + if(var(ii, jj, ll) >= sValRange(1) & + .and. var(ii, jj, ll) <= sValRange(2)) then + if(OkRange) then + Arange(1) = MIN(Arange(1), var(ii, jj, ll)) + Arange(2) = MAX(Arange(2), var(ii, jj, ll)) + else + Arange(1) = var(ii, jj, ll) + Arange(2) = var(ii, jj, ll) + OkRange = .true. + endif + endif + enddo + enddo + enddo + if(icheck >= 2) write(*, *) 'Arange', Arange + + ! Set attribute. + ! - - - - - - - - + + Ierro = NF_PUT_ATT_REAL(FILEid, varVID, 'actual_range', & + NF_FLOAT, 2, Arange) + ! **line1 ^^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 type |len | attr.value + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! ** Next section: +9990 continue + + !* 5. Update the optional '[var]_range' special variable. + ! ------------------------------------------------------ + if(NDIMvar == 4 .and. Nlev < MXlv) then + + ! If '[var]_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get ID of variable [var]_range : + tmpchr = VARname(1:VNlen)//'_range' + itmp = VNlen + 6 + Ierro = NF_INQ_VARID(FILEid, tmpchr(1:itmp), varVID) + + ! ** Cancel if an error occured : undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNwrite Info : [var]_range ' & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9999 !** UNwrite_end + + ! ** Get the old min and max values: + ! ** NOTE : + ! ** we use the 'generalised' reading routine NCVGTG + ! ** (imap tells NetCDF about the memory locations of var) + imap(1) = 1 + imap(2) = imap(1) * MXlv + start(1) = 1 + start(2) = 1 + count(1) = Nlev + count(2) = 2 + + ! ** (See UNread for explanations about NCVGTG) + Ierro = NF_GET_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, Srange(1, 1)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + + ! Update the min an max + ! - - - - - - - - - - - + ! **If this is the first pass, initialise min and max: + ! **(Constant fields shall not be accounted for) + do ll = 1, Nlev + if(Srange(ll, 1) == Srange(ll, 2)) then + Srange(ll, 1) = var(1, 1, ll) + Srange(ll, 2) = var(1, 1, ll) + endif + enddo + + do jj = 1, NVRj + do ii = 1, NVRi + do ll = 1, NVRlev + Srange(ll, 1) = MIN(Srange(ll, 1), var(ii, jj, ll)) + Srange(ll, 2) = MAX(Srange(ll, 2), var(ii, jj, ll)) + enddo + enddo + enddo + if(icheck >= 4) write(*, *) 'Srange', Srange + + ! Set special variable [var]_range + ! - - - - - - - - - - - - - - - - - + ! **(See UNread for explanations abtout NCVPTG) + + Ierro = NF_PUT_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, Srange(1, 1)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwrite', Ierro) + + endif ! End Section 5. + + ! UNwrite_end + ! ----------- + if(icheck >= 2) write(*, *) 'Errors count:', TTerr + if(icheck >= 2) write(*, *) 'UNwrite : End' +9999 continue + RETURN +END +!** +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNlwrite : + + +!** +-------------------------+ + +!** + * Writes a 2D horizontal LEVEL into a 3D+time NetCDF variable + +!** + OR a 1D vector into a 2D+time + +!** + -- ---- -- + +!** + (SEE ALSO : UNwrite, for all dimensions - this a pecular case + +!** + Note: 1D vectors are writen in the 1st dim of 2D+time) + +!** + + +!** + * Automatically updates attribute 'actual_range' if available + +!** + " " special var. '[var]_range' " + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from UNcreate OR NetCDF open) + +!** + VARname : name given to the variable to write (must be in file)+ +!** + itime : No of time step to write to + +!** + level : No of level to write to + +!** + Ni, Nj : dimensions of 'var'... + +!** + var : A 2D variable to be writen + +!** +-------------------------------------------------------------------+ + +subroutine UNlwrite(FILEid, VARname, itime, & + ilev, Ni, Nj, var) + use libUN_mod + implicit none + + INTEGER icheck + + INTEGER Lvnam + PARAMETER(Lvnam=20) + + ! ** input + INTEGER FILEid + INTEGER itime, ilev + INTEGER Ni, Nj + character * (*) VARname + REAL(kind=4) var(Ni, Nj) + + ! ** local : + INTEGER VARSIZE + EXTERNAL VARSIZE + INTEGER Ierro, TTerr, Nvatts, vtype + INTEGER dimID(4), dimSIZ(4), count(4) + INTEGER start(4), stride(4), imap(4) + INTEGER iUNLIMDIM + character * (Lvnam) dimNAM(4) + character * (Lvnam) recname + character * (30) tmpchr + INTEGER varVID + INTEGER VNlen, NDIMvar, NSDIvar, tiDI, ilDI, itmp + INTEGER iz, ii, jj + LOGICAL OkRange + REAL(kind=4) Arange(2), sValRange(2) + REAL(kind=4) Srange(2) + + icheck = 0 !** 'debugging' level + TTerr = 0 !** 'total numbe of errors + + if(icheck >= 1) write(*, *) 'UNlwrite : Begin' + + !* 1. Get the variable field and dims IDs + ! ---------------------------------------- + + if(icheck >= 2) write(*, *) 'FILEid :', FILEid + + ! ** getting VARname size : + VNlen = VARSIZE(VARname) + if(icheck >= 3) write(*, *) 'VNlen :', VNlen + if(icheck >= 2) write(*, *) 'VARname :', VARname(1:VNlen) + + ! ** variable field ID : + Ierro = NF_INQ_VARID(FILEid, VARname(1:VNlen), varVID) + + ! ** Cancel writing if an error occured : variable undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNlwrite Info : Variable ', VARname(1:VNlen) & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9999 !** UNlwrite_end + + ! ** Inquire about the number of dimensions in var : + ! ** + Ierro = NF_INQ_VAR(FILEid, varVID, recname, vtype, & + NDIMvar, dimID, Nvatts) + ! ** line1 id/file id/var var name var type + ! ** line2 # dims id/dims #attributes + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + + if(icheck >= 2) write(*, *) 'Ierro1. ', Ierro + + !* 2. Dimensions : inquire about file + compare with input data. + ! ------------------------------------------------------------- + + ! 2.1 Inquire dimensions names and sizes : + ! + - - - - - - - - - - - - - - - - - - - - - + do iz = 1, 4 + dimSIZ(iz) = 0 + dimNAM(iz) = ' ' + ! ** Set any unused dimension to "0" size / no name + enddo + + do iz = 1, NDIMvar + Ierro = NF_INQ_DIM(FILEid, dimID(iz), dimNAM(iz), dimSIZ(iz)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + ! ** id/file id/dim dimname dimsize error + ! ** !output output + enddo + if(icheck >= 3) write(*, *) 'NDIMvar ', NDIMvar + if(icheck >= 3) write(*, *) 'Ierro 2.0', Ierro + + ! 2.2 Set writing region according to field dimension : 3D + ! + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! ** Set horizontal dimensions (all field dims): + count(1) = Ni + count(2) = Nj + start(1) = 1 + start(2) = 1 + ! +- ------ 3D+time var in file-------- + if(NDIMvar == 4) then + NSDIvar = 2 ! Nb. input space dims (for a 2D level) + tiDI = 4 ! No. of the time dim + ! ** write one level (set the level No) : + start(3) = ilev ! Start of index 3 in var + count(3) = 1 ! Nb. values of index 3 in var + ilDI = 3 + ! ** write one time step: + start(4) = itime + count(4) = 1 + ! +- ------ 2D+time var in file-------- + else if(NDIMvar == 3) then + NSDIvar = 1 ! Nb. input space dims (for a 1D vector) + tiDI = 3 ! No. of the time dim + ! ** write one "level" - here a 1D vector in the 1st dim. + start(2) = ilev ! Start of index 2 in var + count(2) = 1 ! Nb. values of index 3 in var + ilDI = 2 + ! ** write one time step: + start(3) = itime + count(3) = 1 + else + write(*, *) 'UNlwrite ERROR : data field dimension ?' + write(*, *) ' NB: UNlwrite = only for (2 or) 3D +time.' + STOP + endif + + ! 2.3 Compare file dimensions to input data. + ! + - - - - - - - - - - - - - - - - - - - - - - + ! ** Space dimensions : + do iz = 1, NSDIvar + if(dimSIZ(iz) > count(iz)) then + write(*, *) 'UNlwrite - WARNING: ' + write(*, *) ' Your field ', VARname, ' has an empty part.' + write(*, *) ' (for the dimension:', dimNAM(iz), ')' + else if(dimSIZ(iz) < count(iz)) then + write(*, *) 'UNlwrite - WARNING: ' + write(*, *) ' Your field ', VARname, ' will be truncated.' + write(*, *) ' (for the dimension:', dimNAM(iz), ')' + count(iz) = dimSIZ(iz) + endif + enddo + + ! ** Space dimensions - check if requested level exists: + if(dimSIZ(ilDI) < ilev) then + write(*, *) 'UNlwrite - ERROR: ' + write(*, *) ' The requested level =', ilev + write(*, *) ' does not exist in the field ', VARname + write(*, *) ' (for the dimension:', dimNAM(ilDI), ')' + STOP + endif + + ! ** Time dimension (when defined): + if(tiDI /= 0) then + if(itime > dimSIZ(tiDI)) then + if(icheck >= 1) write(*, *) 'Time limit, ID', dimID(tiDI) + Ierro = NF_INQ_UNLIMDIM(FILEid, iUNLIMDIM) + if(dimID(tiDI) /= iUNLIMDIM) then + write(*, *) 'UNlwrite - ERROR: ' + write(*, *) ' Time index out of range ' + STOP + endif + endif + endif + + if(icheck >= 2) write(*, *) 'Ierro2. ', Ierro + if(icheck >= 2) write(*, *) 'Dimension names :', dimNAM + if(icheck >= 3) write(*, *) 'dimSIZ :', dimSIZ + if(icheck >= 3) write(*, *) 'count :', count + if(icheck >= 3) write(*, *) 'start :', start + if(icheck >= 3) write(*, *) 'dimID :', dimID + + !* 3. Write variable. + ! ------------------ + + ! ** Set 'imap' and WRITE with NCVPTG: + ! ** NOTE : since the arrays (grid_*) may be over-dimensionned, + ! ** we use the 'generalised' writing routine NCVPTG + ! ** (imap tells NetCDF about the memory locations of var) + imap(1) = 1 + imap(2) = imap(1) * Ni ! 1st dim of var = Ni + imap(3) = imap(2) * Nj ! (not used: 1 level...) + imap(4) = 0 ! (not used: 0 or 1 time step) + do iz = 1, 4 + stride(iz) = 1 + enddo + ! ** NOTE: stride is not used. + + Ierro = NF_PUT_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, var(1, 1)) + ! ** line1: id/file | id/var |read from...|#data + ! ** line2: step |re-arrang|variable(beg.) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + + if(icheck >= 2) write(*, *) 'Ierro3.2', Ierro + + !* 4a. Update 'actual_range' attribute. + ! ------------------------------------ + + ! If 'actual_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get the old min and max values: + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'actual_range', & + Arange) + ! **line1 ^^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 value + + ! ** Cancel if an error occured : attribute undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNlwrite Info : attribute actual_range ' & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9990 !** Next section + + ! If 'valid_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get the min/max valid range (outside = missing val): + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'valid_range', & + sValRange) + if(Ierro /= 0) then + sValRange(1) = ValRange(1) + sValRange(1) = ValRange(2) + endif + + ! Update the min an max + ! - - - - - - - - - - - + + ! **If this is the first pass, initialise min and max: + if(Arange(1) == NF_FILL_REAL & + .OR. (Arange(1) == 0.0 .and. Arange(2) == 0.0)) then + OkRange = .false. + else + OkRange = .true. + endif + + do jj = 1, Nj + do ii = 1, Ni + if(var(ii, jj) >= sValRange(1) & + .and. var(ii, jj) <= sValRange(2)) then + if(OkRange) then + Arange(1) = MIN(Arange(1), var(ii, jj)) + Arange(2) = MAX(Arange(2), var(ii, jj)) + else + Arange(1) = var(ii, jj) + Arange(2) = var(ii, jj) + OkRange = .true. + endif + endif + enddo + enddo + if(icheck >= 2) write(*, *) 'Arange', Arange + + ! Set attribute. + ! - - - - - - - - + + Ierro = NF_PUT_ATT_REAL(FILEid, varVID, 'actual_range', & + NF_FLOAT, 2, Arange) + ! **line1 ^^^^^^^^^^^^^^^ FILEid |var.id | attr.name + ! **line2 type |len | attr.value + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + TTerr = TTerr + ABS(Ierro) + + ! ** Next section: +9990 continue + + !* 5. Update the optional '[var]_range' special variable. + ! ------------------------------------------------------ + if(NDIMvar == 4) then + + ! If '[var]_range' available, get its current value: + ! - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! ** Get ID of variable [var]_range : + tmpchr = VARname(1:VNlen)//'_range' + itmp = VNlen + 6 + Ierro = NF_INQ_VARID(FILEid, tmpchr(1:itmp), varVID) + + ! ** Cancel if an error occured : undefined ? + if(Ierro /= 0 .and. icheck >= 1) then + write(*, *) 'UNlwrite Info : [var]_range ' & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9999 !** UNlwrite_end + + ! ** Get the old min and max values: + ! ** NOTE : + ! ** we use the 'generalised' reading routine NCVGTG + ! ** (imap tells NetCDF about the memory locations of var) + imap(1) = 1 + imap(2) = 0 ! Not used (write only 1 lev) + start(1) = ilev + count(1) = 1 + start(2) = 1 + count(2) = 2 + + ! ** (See UNread for explanations abtout NCVGTG) + Ierro = NF_GET_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, Srange(1)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + + ! Update the min an max + ! - - - - - - - - - - - + ! **If this is the first pass, initialise min and max: + ! **(Constant fields shall not be accounted for) + if(Srange(1) == Srange(2)) then + Srange(1) = var(1, 1) + Srange(2) = var(1, 1) + endif + + do jj = 1, Nj + do ii = 1, Ni + Srange(1) = MIN(Srange(1), var(ii, jj)) + Srange(2) = MAX(Srange(2), var(ii, jj)) + enddo + enddo + if(icheck >= 4) write(*, *) 'Srange', Srange + + ! Set special variable [var]_range + ! - - - - - - - - - - - - - - - - - + ! **(See UNread for explanations abtout NCVPTG) + + Ierro = NF_PUT_VARM_REAL(FILEid, varVID, start, count, & + stride, imap, Srange(1)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNlwrite', Ierro) + + endif ! End Section 5. + + ! UNlwrite_end + ! ----------- + if(icheck >= 2) write(*, *) 'Errors count:', TTerr + if(icheck >= 2) write(*, *) 'UNlwrite : End' +9999 continue + RETURN +END +!** +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNread : + + +!** +-------------------------+ + +!** + * Reads a model variable from a NetCDF file, + +!** + and reads the coordinates of the grid upon wich it is defined. + +!** + (the NetCDF file must have been opened and must be closed + +!** + after all reading operations). May read an x-y subregion. + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from NetCDF open) + +!** + VARname : name of the requested variable. + +!** + time : [integer*4] is the time index of the data field to read + +!** + level: [integer*4] (usefull for 3D-space fields only) : + +!** + if not=0 --> = no of the level + +!** + -> output is 2D (l_dim = 1) + +!** + if =0 --> read ALL levels + +!** + -> output is 3D + +!** + i_dbeg, j_dbeg : horizontal indexes of requested region + +!** + in input data file + +!** + i_dim, j_dim, l_dim : ...the dimensions of 'var', + +!** + = the dimensions of the sub-region to read + +!** + ! l_dim = 1 if level not=0 + +!** + ! j_dim = 1 if var is 1D + +!** + OUTPUT : + +!** + varax1[i_dim] (real ) + +!** + varax2[j_dim]: Horizontal coordinates in the file (lat/lon,...)+ +!** + varlev[l_dim]: vertical coordinate of the levels + +!** + (! when level not=0, only varlev(1) is defined) + +!** + var_units : physical units of var. + +!** + var[i_dim,j_dim,l_dim] : + +!** + data field values + +!** + (var must be defined, and is REAL ) + +!** + + +!** +-------------------------------------------------------------------+ + +subroutine UNread & + (FILEid, VARname, time, level, i_dbeg, j_dbeg, & + i_dim, j_dim, l_dim, & + varax1, varax2, varlev, & + var_units, var) + use libUN_mod + implicit none + + INTEGER icheck + + INTEGER Lvnam + PARAMETER(Lvnam=21) + + ! ** input + INTEGER FILEid + INTEGER time, level, i_dbeg, j_dbeg + INTEGER i_dim, j_dim, l_dim + character * (*) VARname + + ! ** output + REAL(kind=4) varax1(i_dim), varax2(j_dim), varlev(l_dim) + character * (*) var_units + REAL(kind=4) var(i_dim, j_dim, l_dim) + + ! ** local : + INTEGER VARSIZE + EXTERNAL VARSIZE + REAL(kind=4) varmin, varmax, add_offset, scale_factor + INTEGER Ierro, Nvatts, vtype + INTEGER dimID(4), dimSIZ(4), dimREG(4) + INTEGER start(4), begREG(4), count(4), stride(4), imap(4) + character * (Lvnam) dimNAM(4) + character * (Lvnam) dNAMver, dNAMtim + character * (Lvnam) recname + character * (10) Routine + INTEGER ax1VID, ax2VID, verVID, timVID, varVID + INTEGER VNlen, varNUMDIM + INTEGER ii, jj, ll, z + + icheck = 0 + !* 0. Initialisations + ! ------------------ + Routine = 'UNread' + if(icheck >= 1) write(*, *) 'UNread : Begin' + + do ii = 1, 4 + stride(ii) = 1 + begREG(ii) = 1 + start(ii) = 1 + enddo + + !* 1. Get the variable field and dims IDs + ! ---------------------------------------- + + if(icheck >= 3) write(*, *) 'FILEid :', FILEid + + ! ** getting VARname size : + VNlen = VARSIZE(VARname) + if(icheck >= 3) write(*, *) 'VNlen :', VNlen + if(icheck >= 2) write(*, *) 'VARname :', VARname(1:VNlen) + + ! ** variable field ID : + Ierro = NF_INQ_VARID(FILEid, VARname(1:VNlen), varVID) + + !* 1b. Handle non-existing variables + ! --------------------------------- + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTVAR .and. iVarWarn <= 1) then + if(iVarWarn == 1) then + write(*, *) 'WARNING (UNsread): variable not found:' + write(*, *) ' ', varName + endif + do ll = 1, l_dim + do jj = 1, j_dim + do ii = 1, i_dim + var(ii, jj, ll) = VarRepl + enddo + enddo + enddo + RETURN ! EXIT subroutine, read nothing + endif + write(*, *) 'Error reading variable: ', VARname(1:VNlen) + call HANDLE_ERR('UNsread', Ierro) + endif + + ! 1c. Inquire about the number of dimensions in var + ! ------------------------------------------------- + + Ierro = NF_INQ_VAR(FILEid, varVID, recname, vtype, & + varNUMDIM, dimID, Nvatts) + ! ** line1 id/file id/var var name var type + ! ** line2 # dims id/dims #attributes + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNsread', Ierro) + + if(icheck >= 3) write(*, *) 'Ierro1. ', Ierro + + !* 2. Dimensions : in the reading region and in the file. + ! ------------------------------------------------------ + + ! ** inquire dimensions names and sizes : + do z = 1, varNUMDIM + Ierro = NF_INQ_DIM(FILEid, dimID(z), dimNAM(z), dimSIZ(z)) + ! ** id/file id/dim dimname dimsize + ! ** !output output + if(Ierro /= NF_NOERR) call HANDLE_ERR(Routine, Ierro) + enddo + + ! ** In this version, we read only a xy subregion of the file : + dimREG(1) = i_dim + dimREG(2) = j_dim + begREG(1) = i_dbeg + begREG(2) = j_dbeg + if(begREG(1) < 1) begREG(1) = 1 + if(begREG(2) < 1) begREG(2) = 1 + + ! ** Set reading region according to field dimension : 2D or 3D + if(varNUMDIM == 4) then + ! ** for 3D fields : + if(level > 0) then + ! ** one level is read : + dimREG(3) = 1 + begREG(3) = level + dNAMver = dimNAM(3) + else + ! ** all levels are read : + dimREG(3) = l_dim + begREG(3) = 1 + dNAMver = dimNAM(3) + endif + ! ** one time step is read: + dimREG(4) = 1 + begREG(4) = time + dNAMtim = dimNAM(4) + else if(varNUMDIM == 3) then + ! ** for 2D space fields + time: + ! ** one time step is read: + dimREG(3) = 1 + begREG(3) = time + dNAMtim = dimNAM(3) + dimREG(4) = 0 + begREG(4) = 0 + dimNAM(4) = 'none' + else if(varNUMDIM == 2) then + ! ** for 2D fields : + ! ** no time step is read: + dimREG(3) = 0 + begREG(3) = 0 + dNAMtim = 'none' + dimNAM(3) = 'none' + dimREG(4) = 0 + begREG(4) = 0 + dimNAM(4) = 'none' + else if(varNUMDIM == 1) then + ! ** for 1D variable : + ! ** not assumed to be on a XYZ grid, + ! ** just read a vector + dimREG(2) = 0 + begREG(2) = 0 + dimNAM(2) = 'none' + dimREG(3) = 0 + begREG(3) = 0 + dimNAM(3) = 'none' + dNAMtim = 'none' + dimREG(4) = 0 + begREG(4) = 0 + dimNAM(4) = 'none' + else + write(*, *) 'UNread ERROR : data field dimension ?' + STOP + endif + + do z = 1, varNUMDIM + if(begREG(z) > dimSIZ(z)) then + write(*, *) 'UNread - ERROR : requested area out ' + write(*, *) ' of file area. ' + write(*, *) ' (for the dimension:', dimNAM(z), ')' + STOP + endif + if(dimSIZ(z) < (dimREG(z) + begREG(z) - 1)) then + write(*, *) 'UNread - WARNING : empty portion in field, ' + write(*, *) ' requested region > file contents ' + write(*, *) ' (for the dimension:', dimNAM(z), ')' + dimREG(z) = dimSIZ(z) - begREG(z) + 1 + endif + enddo + + if(icheck >= 3) write(*, *) 'Ierro2. ', Ierro + if(icheck >= 2) write(*, *) 'Dimension names :', dimNAM + if(icheck >= 2) write(*, *) 'dimSIZ :', dimSIZ + if(icheck >= 2) write(*, *) 'dimREG :', dimREG + if(icheck >= 2) write(*, *) 'begREG :', begREG + if(icheck >= 3) write(*, *) 'dimID :', dimID + + !* 3. Get the variables IDs for the grid points locations. + ! ------------------------------------------------------- + + if(varNUMDIM >= 2) then + Ierro = NF_INQ_VARID(FILEid, dimNAM(1), ax1VID) + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTVAR) then + write(*, *) 'Coordinate values not found:', dimNAM(1) + endif + call HANDLE_ERR(Routine, Ierro) + endif + Ierro = NF_INQ_VARID(FILEid, dimNAM(2), ax2VID) + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTVAR) then + write(*, *) 'Coordinate values not found:', dimNAM(2) + endif + call HANDLE_ERR(Routine, Ierro) + endif + endif + if(varNUMDIM >= 3) then + Ierro = NF_INQ_VARID(FILEid, dNAMtim, timVID) + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTVAR) then + write(*, *) 'Coordinate values not found:', dNAMtim + endif + call HANDLE_ERR(Routine, Ierro) + endif + endif + if(varNUMDIM == 4) then + Ierro = NF_INQ_VARID(FILEid, dNAMver, verVID) + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTVAR) then + write(*, *) 'Coordinate values not found:', dNAMver + endif + call HANDLE_ERR(Routine, Ierro) + endif + endif + ! ** id/file name id/var + + if(icheck >= 3) write(*, *) 'Ierro3. ', Ierro + + !* 4. Get attributes. + ! ------------------ + + if(varNUMDIM >= 2) then !Not for 1D vectors (special case) + ! ** units attribute + Ierro = NF_GET_ATT_TEXT(FILEid, varVID, 'units', & + var_units) + if(Ierro /= NF_NOERR) then + if(Ierro == NF_ENOTATT) then + write(*, *) 'Note (UNread): units not found for' + write(*, *) ' ', varName + var_units = ' ' + else + call HANDLE_ERR('UNread', Ierro) + endif + endif + + if(icheck >= 2) write(*, *) 'var_units :', var_units + endif + + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'scale_factor', & + scale_factor) + + Ierro = NF_GET_ATT_REAL(FILEid, varVID, 'add_offset', & + add_offset) + + if(Ierro /= NF_NOERR .and. Ierro == NF_ENOTATT) then + scale_factor = 1. + add_offset = 0. + else + if(icheck >= 2) & + print *, VARname(1:VNlen)//" scale_factor", scale_factor + if(icheck >= 2) & + print *, VARname(1:VNlen)//" add_offset", add_offset + endif + + !* 5. Get values. + ! -------------- + !* 5.1 ...for the grid points locations. + ! ------------------------------------- + + ! ** Horizontal : always read, except for 1D vectors + if(varNUMDIM >= 2) then + count(1) = dimREG(1) + start(1) = begREG(1) + Ierro = NF_GET_VARA_REAL(FILEid, ax1VID, start, count, varax1) + ! ** id/file id/var from #data data + if(Ierro /= NF_NOERR) call HANDLE_ERR(Routine, Ierro) + count(1) = dimREG(2) + start(1) = begREG(2) + Ierro = NF_GET_VARA_REAL(FILEid, ax2VID, start, count, varax2) + if(Ierro /= NF_NOERR) call HANDLE_ERR(Routine, Ierro) + endif + + ! ** vertical : only for 3D fields. + if(varNUMDIM == 4) then + start(1) = begREG(3) + count(1) = dimREG(3) + Ierro = NF_GET_VARA_REAL(FILEid, verVID, start, count, varlev) + if(Ierro /= NF_NOERR) call HANDLE_ERR(Routine, Ierro) + endif + + if(icheck >= 3) write(*, *) 'Ierro5.1', Ierro + + !* 5.2 ...for the the variable. + ! ---------------------------- + + ! ** Set 'imap' and READ with NCVGTG: + ! ** NOTE : + ! ** we use the 'generalised' reading routine NCVGTG + ! ** (imap tells NetCDF about the memory locations of var) + imap(1) = 1 + imap(2) = imap(1) * i_dim ! 1st dim of var = i_dim + imap(3) = imap(2) * j_dim ! 2nd dim of var = j_dim + imap(4) = 0 ! Should NEVER be used + + Ierro = NF_GET_VARM_REAL(FILEid, varVID, begREG, dimREG, & + stride, imap, var(1, 1, 1)) + ! ** line1: id/file | id/var |read from...|#data + ! ** line2: step |re-arrang|variable(beg.) + ! ** NOTE: stride is not used here. + if(Ierro /= NF_NOERR) call HANDLE_ERR(Routine, Ierro) + + if(icheck >= 3) write(*, *) 'Ierro5.2', Ierro + + do ll = 1, l_dim + do jj = 1, j_dim + do ii = 1, i_dim + var(ii, jj, ll) = var(ii, jj, ll) * scale_factor & + + add_offset + enddo + enddo + enddo + + !* 6. Check data + ! ------------- + if(ireadchk >= 1) then + varmax = var(1, 1, 1) + varmin = var(1, 1, 1) + do ll = 1, l_dim + do jj = 1, j_dim + do ii = 1, i_dim + var(ii, jj, ll) = var(ii, jj, ll) + 0. + ! This fixes underflow values but must compile with -fpe1 + varmax = MAX(var(ii, jj, ll), varmax) + varmin = MIN(var(ii, jj, ll), varmin) + enddo + enddo + enddo + if(varmin < vReadMin .OR. varmax > vReadMax) then + write(*, *) 'WARNING (UNread): variable ', VARname + write(*, *) ' is out of specified bounds;' + write(*, *) ' min is:', varmin + write(*, *) ' max is:', varmax + endif + endif + + if(icheck >= 2) write(*, *) 'UNread : End' + +ENDsubroutine UNread + +!** +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNsread : + + +!** +-------------------------+ + +!** + * Reads a model variable from a NetCDF file, + +!** + SIMPLIFIED VERSION of UNread : does NOT read coordinates. + +!** + + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from NetCDF open) + +!** + VARname : name of the requested variable. + +!** + time : [integer*4] is the time index of the data field to read + +!** + level: [integer*4] (usefull for 3D-space fields only) : + +!** + if not=0 --> = no of the level + +!** + -> output is 2D (l_dim = 1) + +!** + if =0 --> read ALL levels + +!** + -> output is 3D + +!** + i_dbeg, j_dbeg : horizontal indexes of requested region + +!** + in input data file + +!** + i_dim, j_dim, l_dim : ...the dimensions of 'var', + +!** + = the dimensions of the sub-region to read + +!** + ! l_dim = 1 if level not=0 + +!** + ! j_dim = 1 if var is 1D + +!** + OUTPUT : + +!** + var_units : physical units of var. + +!** + var[i_dim,j_dim,l_dim] : + +!** + data field values + +!** + (var must be defined, and is REAL ) + +!** + + +!** +-------------------------------------------------------------------+ + +subroutine UNsread & + (FILEid, VARname, time, level, i_dbeg, j_dbeg, & + i_dim, j_dim, l_dim, & + var_units, var) + + implicit none + + ! ** input + integer FILEid + integer time, level, i_dbeg, j_dbeg + integer i_dim, j_dim, l_dim + character * (*) VARname + + ! ** output + character * (*) var_units + REAL(kind=4) var(i_dim, j_dim, l_dim) + REAL(kind=4) varax1(i_dim), varax2(j_dim), varlev(l_dim) + + call UNread(FILEid, VARname, time, level, i_dbeg, j_dbeg, & + i_dim, j_dim, l_dim, & + varax1, varax2, varlev, & + var_units, var) + +ENDsubroutine UNsread + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNwcatt : + + +!** +-------------------------+ + +!** + *Character Attributes creation and (over)writing + +!** + (the NetCDF file must be open, in data mode) + +!** + *WARNING: this routine (may?) use a temporary disk space + +!** + equal to the file length (duplicate the file) + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from UNcreate OR NetCDF open) + +!** + varnam : name of variable to which attribute shall be attached+ +!** + or 'GLOBAL_ATT' + +!** + attnam : name of writen attribute. + +!** + attval : string to be assigned to attribute. + +!** + (never inclulde more than 3 consecutive blanks !) + +!** + + +!** + Note : all arguments except FILEid are strings of any length + +!** +-------------------------------------------------------------------+ + +subroutine UNwcatt(FILEid, varnam, attnam, attval) + use libUN_mod + implicit none + ! **Input: + + INTEGER FILEid + character * (*) varnam + character * (*) attnam + character * (*) attval + + ! **Local: + INTEGER VARSIZE + EXTERNAL VARSIZE + INTEGER Nlen, Ierro, varVID, Vlen, TTerr + INTEGER icheck + icheck = 0 !** 'debugging' level + + if(icheck >= 1) write(*, *) 'UNwcatt : Begin' + + !* Get the variable ID + ! ------------------- + + if(icheck >= 2) write(*, *) 'FILEid :', FILEid + + ! ** getting varnam size : + Nlen = VARSIZE(varnam) + + ! ** Case of global attributes: + if(varnam(1:Nlen) == 'GLOBAL_ATT') then + varVID = NF_GLOBAL + + else + + ! ** Get variable ID to which att is attached to: + Ierro = NF_INQ_VARID(FILEid, varnam(1:Nlen), varVID) + TTerr = ABS(Ierro) + + ! ** Cancel writing if an error occured : variable undefined ? + if(Ierro /= 0) then + write(*, *) 'UNwcatt -ERROR : Variable ', varnam(1:Nlen) & + , ' not found -> not written.' + endif + if(Ierro /= 0) RETURN !** UNwcatt_end + + endif + + ! Switch to Define Mode, + ! because attribute may be created or change size. + ! -------------------------------------------------- + Ierro = NF_REDEF(FILEid) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwcatt', Ierro) + + ! Set attribute. + ! -------------- + + ! ** getting attnam [char] size : + Nlen = VARSIZE(attnam) + ! ** getting attval [char] size : + Vlen = VARSIZE(attval) + + Ierro = NF_PUT_ATT_TEXT(FILEid, varVID, attnam(1:Nlen), & + Vlen, attval(1:Vlen)) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwcatt', Ierro) + ! **line1^^^^ FILEid |var.id | attr.name + ! **line2 type | len | attr.value | flag + TTerr = TTerr + ABS(Ierro) + + ! Leave define mode (!file remains open ) + ! --------------------------------------- + Ierro = NF_ENDDEF(FILEid) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwcatt', Ierro) + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNwratt : + + +!** +-------------------------+ + +!** + *real attributes writing - ! Can not create new attrib ! + +!** + (the NetCDF file must be open) + +!** + + +!** + INPUT : + +!** + FILEid : input file identifier (from UNcreate OR NetCDF open) + +!** + varnam : name given to the variable to write (must be in file)+ +!** + attnam : name of treated attribute. + +!** + Nvals : Number of values of that attribute + +!** + atvalsi(Nvals) : real vector of values for attribute. + +!** + + +!** +-------------------------------------------------------------------+ + +! WARNING: this routine uses a temporary disk space +! equal to the file length (duplicate the file) +! (its use is NOT recommended) + +subroutine UNwratt(FILEid, varnam, attnam, Nvals, atvals) + use libUN_mod + implicit none + + ! **Input: + + INTEGER FILEid, Nvals + character * (*) varnam + character * (*) attnam + REAL(kind=4) atvals(Nvals) + + ! **Local: + INTEGER VARSIZE + EXTERNAL VARSIZE + INTEGER Nlen, Ierro, varVID + INTEGER icheck, TTerr + icheck = 0 !** 'debugging' level + TTerr = 0 + + if(icheck >= 1) write(*, *) 'UNwratt : Begin' + + !* Get the variable ID + ! ------------------- + if(icheck >= 2) write(*, *) 'FILEid :', FILEid + + ! ** getting varnam size : + Nlen = VARSIZE(varnam) + + ! ** variable ID : + Ierro = NF_INQ_VARID(FILEid, varnam(1:Nlen), varVID) + TTerr = TTerr + ABS(Ierro) + + ! ** Cancel writing if an error occured : variable undefined ? + if(Ierro /= 0) then + write(*, *) 'UNwratt -ERROR : Variable ', varnam(1:Nlen) & + , ' not found -> not written.' + endif + if(Ierro /= 0) GOTO 9999 !** UNwratt_end + + ! Set attribute. + ! -------------- + + ! ** getting attnam [char] size : + Nlen = VARSIZE(attnam) + + Ierro = NF_PUT_ATT_REAL(FILEid, varVID, attnam(1:Nlen), & + NF_FLOAT, nvals, atvals) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNwratt', Ierro) + ! **line1^^^^FILEid |var.id | attr.name + ! **line2 type | attr.value | flag + TTerr = TTerr + ABS(Ierro) + +9999 continue + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNwopen : + libUN (0896) + +!** +-------------------------+-----------------------------------------+ +!** + * Open a NetCDF file for writing. + +!** + + +!** + INPUT : + +!** + FILEnam : file name + +!** + + +!** + OUTPUT : + +!** + FILEid : NetCDF file identifier ('logical unit') + +!** +---------------------------------------------------------------7++++ + +subroutine UNwopen(FILEnam, FILEid) + use libUN_mod + implicit none + + ! ** input + character * (*) FILEnam + + ! ** output + INTEGER FILEid + + ! ** local : + INTEGER Ierro + INTEGER icheck + + icheck = 0 + + ! + Routines which opens a file must reset libUN internals: + call UNparam('RESET_PARAMS_', 0.0) + + ! ** Open NetCDF file, for read-only: + ! ----------------------------------- + Ierro = NF_OPEN(FILEnam, NF_WRITE, FILEid) + if(Ierro /= NF_NOERR) then + write(*, *) 'Error opening file: ', FILEnam + call HANDLE_ERR('UNwopen', Ierro) + endif + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNropen : + libUN (0896) + +!** +-------------------------+-----------------------------------------+ +!** + * Open a NetCDF file for reading, + +!** + + +!** + INPUT : + +!** + FILEnam : file name + +!** + + +!** + OUTPUT : + +!** + FILEid : NetCDF file identifier ('logical unit') + +!** + FILEtit : title of the NetCDF file + +!** + ! [CHAR], must be defined (length > length(title) !) + +!** +---------------------------------------------------------------7++++ + +subroutine UNropen(FILEnam, FILEid, FILEtit) + use libUN_mod + implicit none + + ! ** input + character * (*) FILEnam + + ! ** output + INTEGER FILEid + character * (*) FILEtit + + ! ** local : + INTEGER Ierro + INTEGER icheck + + icheck = 0 + + if(icheck >= 2) write(*, *) 'UNropen: Begin' + if(icheck >= 2) write(*, *) 'FILEnam: ', FILEnam + + ! + Routines which opens a file must reset libUN internals: + call UNparam('RESET_PARAMS_', 0.0) + + ! ** Open NetCDF file, for read-only: + ! ----------------------------------- + Ierro = NF_OPEN(FILEnam, NF_NOWRITE, FILEid) + if(Ierro /= NF_NOERR) then + write(*, *) 'Error opening file: ', FILEnam + call HANDLE_ERR('UNropen', Ierro) + endif + + ! ** Read title attribute, + ! ------------------------ + + ! ** Read attribute: + Ierro = NF_GET_ATT_TEXT(FILEid, NF_GLOBAL, 'title', & + FILEtit) + + ! ** Display message if an error occured : + ! ** no title or title too long ? + ! !if (Ierro.ne.0) then + ! ! write(*,*) 'UNropen WARNING: no title or title too long' + ! !end if + if(icheck >= 2) write(*, *) 'UNropen: End' + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNgtime : + libUN (0896) + +!** +-------------------------+-----------------------------------------+ +!** + * From a given value of desired 'time' coordinate, + +!** + gets the coordinate index ('iteration no') + found time value + +!** + + +!** + INPUT : + +!** + FILEid : NetCDF file identifier (from UNropen) + +!** + RQtime : ReQuested time + +!** + + +!** + OUTPUT : + +!** + RDtime : The last time for wich RDtime .le. RQtime + +!** + Ftime : The next time value Following RDtime + +!** + (-1 if it would be after end-of-file) + +!** + it : The time index : RDtime = time(it) + +!** +---------------------------------------------------------------7++++ + +subroutine UNgtime(FILEid, RQtime, RDtime, Ftime, it) + use libUN_mod + implicit none + + INTEGER Lvnam + PARAMETER(Lvnam=20) + + ! ** input + INTEGER FILEid + REAL(kind=4) RQtime + + ! ** output + REAL(kind=4) RDtime, Ftime + INTEGER it + + ! ** local : + INTEGER Ierro, timVID + INTEGER timDID + REAL(kind=4) gtim + INTEGER K, KHI, KLO, Kmax + INTEGER Mindex(1) + INTEGER icheck + character * (Lvnam) dimNAM(1) + + icheck = 0 + + ! ** Kmax= nb pas de temps dans le fichier, = dim(time): + ! ** - - - - - - - - - - - - - - - - - - - - - - - - - - + ! + Ierro = NF_INQ_DIMID(FILEid, 'time', timDID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + ! **^^ Dimension'time' NetCDF index + + Ierro = NF_INQ_DIM(FILEid, timDID, dimNAM, Kmax) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + ! ** id/file id/dim dimname dimsize error + ! ** !output output + + ! ** Read/Search the requested time step. + ! ** - - - - - - - - - - - - - - - - - - - + + Ierro = NF_INQ_VARID(FILEid, 'time', timVID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + ! **^^ Variable 'time' NetCDF index + + KLO = 1 + KHI = Kmax + +1 if(KHI - KLO > 1) then + K = (KHI + KLO) / 2 + + ! ** Set the position of the needed time step: + Mindex(1) = K + ! ** Get 1 time value (gtim = time(K)): + Ierro = NF_GET_VAR1_REAL(FILEid, timVID, Mindex, gtim) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + + if(gtim > RQtime) then + KHI = K + else + KLO = K + endif + GOTO 1 + endif + it = KLO + ! ** read RDtime= time(KLO) + Mindex(1) = KLO + Ierro = NF_GET_VAR1_REAL(FILEid, timVID, Mindex, RDtime) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + ! ** read Ftime= time(KHI) + Mindex(1) = KHI + Ierro = NF_GET_VAR1_REAL(FILEid, timVID, Mindex, Ftime) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgtime', Ierro) + + ! ** if the last available time step is before + ! ** the requested time, then KHI and KLO are the + ! ** two last available time step. Correct this : + if(RQtime >= Ftime) then + RDtime = Ftime + it = KHI + Ftime = -1.0 + endif + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNgindx : + libUN (0199) + +!** +-------------------------+-----------------------------------------+ +!** + * From a given value of a desired coordinate, + +!** + gets the coordinate index + found the coresp. coordinate value + +!** + + +!** + INPUT : + +!** + FILEid : NetCDF file identifier (from UNropen) + +!** + Cname : The name of the coordinate + +!** + RQval : The requested value for that coordinate + +!** + + +!** + OUTPUT : + +!** + RDval : The last value for wich RDval .le. RQval + +!** + Fval : The next val value Following RDval + +!** + (-1 if it would be after end-of-file) + +!** + indx : The val index : RDval = value_of_Cname(it) + +!** +---------------------------------------------------------------7++++ + +subroutine UNgindx(FILEid, Cname, RQval, RDval, Fval, indx) + use libUN_mod + implicit none + + INTEGER Lvnam + PARAMETER(Lvnam=20) + + ! ** input + INTEGER FILEid + character * (*) Cname + REAL(kind=4) RQval + + ! ** output + REAL(kind=4) RDval, Fval + INTEGER indx + + ! ** local : + INTEGER VARSIZE + EXTERNAL VARSIZE + REAL(kind=4) gval + INTEGER Ierro + INTEGER varDID, VNlen, varVID, varNUMDIM + INTEGER Nvatts, vtype + INTEGER K, KHI, KLO, Kmax + INTEGER Mindex(1), dimID(4) + INTEGER icheck + character * (Lvnam) dimNAM(4) + character * 13 recname + + icheck = 0 + + ! ** Kmax= nb pas de temps dans le fichier, = dim(val): + ! ** - - - - - - - - - - - - - - - - - - - - - - - - - - + ! ** get Cname string size : + VNlen = VARSIZE(Cname) + ! + ! ** get variable ID : + Ierro = NF_INQ_VARID(FILEid, Cname(1:VNlen), varVID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + ! + ! ** Inquire about the id of the dimension: + ! ** + Ierro = NF_INQ_VAR(FILEid, varVID, recname, vtype, & + varNUMDIM, dimID, Nvatts) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + ! ** line1 id/file id/var var name var type + ! ** line2 # dims id/dims #attributes + varDID = dimID(1) + ! ^^^At last, the id of the relevant dimension. + + Ierro = NF_INQ_DIM(FILEid, varDID, dimNAM, Kmax) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + ! ** id/file id/dim dimname dimsize error + ! ** !output output + ! ** (Kmax is what we needed: size of the dimension) + + ! ** Read/Search the requested val step. + ! ** - - - - - - - - - - - - - - - - - - - + + KLO = 1 + KHI = Kmax + +1 if(KHI - KLO > 1) then + K = (KHI + KLO) / 2 + + ! ** Set the position of the needed val step: + Mindex(1) = K + ! ** Get 1 val value (gval = val(K)): + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, gval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + + if(gval > RQval) then + KHI = K + else + KLO = K + endif + GOTO 1 + endif + indx = KLO + ! ** read RDval= val(KLO) + Mindex(1) = KLO + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, RDval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + ! ** read Fval= val(KHI) + Mindex(1) = KHI + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, Fval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNgindex', Ierro) + + ! ** if the last available val step is before + ! ** the requested val, then KHI and KLO are the + ! ** two last available val step. Correct this : + if(RQval >= Fval) then + RDval = Fval + indx = KHI + Fval = -1.0 + endif + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNfindx : + (libUN 2003)+ +!** +-------------------------+-----------------------------------------+ +!** + * Intended to replace UNgindx or UNgtime + +!** + From a given value of a desired coordinate, + +!** + gets the coordinate index + the coresp. coordinate value + +!** + This version solves the issue of Dates at year change + +!** + occuring because 1 jan is < 31 dec. Not optimised. + +!** + + +!** + INPUT : + +!** + FILEid : NetCDF file identifier (from UNropen) + +!** + Cname : The name of the coordinate + +!** + RQval : The requested value for that coordinate + +!** + + +!** + OUTPUT : + +!** + RDval : The file value closest to RQval + +!** + Fval : The next value in the file + +!** + (-1 if after file end) + +!** + (This is mainly for compatibility with older version)+ +!** + indx : The val index : RDval = value_of_Cname(it) + +!** + (-1 may be returned if the value can't be found) + +!** +---------------------------------------------------------------7++++ + +subroutine UNfindx(FILEid, Cname, RQval, RDval, Fval, indx) + use libUN_mod + implicit none + + INTEGER Lvnam + PARAMETER(Lvnam=20) + + ! ** input + INTEGER FILEid + character * (*) Cname + REAL(kind=4) RQval + + ! ** output + REAL(kind=4) RDval, Fval + INTEGER indx + + ! ** local : + INTEGER VARSIZE + EXTERNAL VARSIZE + REAL(kind=4) gval, bmatch, gdist + INTEGER Ierro + INTEGER varDID, VNlen, varVID, varNUMDIM + INTEGER Nvatts, vtype + INTEGER K, KHI, KLO, Kmax + INTEGER Mindex(1), dimID(4) + INTEGER icheck + character * (Lvnam) dimNAM(4) + character * 13 recname + + icheck = 0 + + ! ** Kmax= nb pas de temps dans le fichier, = dim(val): + ! ** - - - - - - - - - - - - - - - - - - - - - - - - - - + ! ** get Cname string size : + VNlen = VARSIZE(Cname) + ! + ! ** get variable ID : + Ierro = NF_INQ_VARID(FILEid, Cname(1:VNlen), varVID) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + ! + ! ** Inquire about the id of the dimension: + ! ** + Ierro = NF_INQ_VAR(FILEid, varVID, recname, vtype, & + varNUMDIM, dimID, Nvatts) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + ! ** line1 id/file id/var var name var type + ! ** line2 # dims id/dims #attributes + varDID = dimID(1) + ! ^^^At last, the id of the relevant dimension. + + Ierro = NF_INQ_DIM(FILEid, varDID, dimNAM, Kmax) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + ! ** id/file id/dim dimname dimsize error + ! ** !output output + ! ** (Kmax is what we needed: size of the dimension) + + ! ** Read/Search the requested val step. + ! ** - - - - - - - - - - - - - - - - - - - + + ! This is a workaround, not optimised as stated above. + ! We simply look at all values sequencially. + ! + bmatch = 1.E10 + KLO = -1 + + do K = 1, KMAX + + ! ** Get 1 val value (gval = val(K)): + Mindex(1) = K + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, gval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + + gdist = ABS(gval - RQval) + if(gdist < bmatch) then + + bmatch = gdist + KLO = K + + endif + + enddo + + indx = KLO + + KHI = min((KLO + 1), KMAX) + + ! ** read values... + + Mindex(1) = KLO + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, RDval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + ! ** read Fval= val(KHI) + Mindex(1) = KHI + Ierro = NF_GET_VAR1_REAL(FILEid, varVID, Mindex, Fval) + if(Ierro /= NF_NOERR) call HANDLE_ERR('UNfindex', Ierro) + + if(KHI == KLO) then + Fval = -1.0 + endif + + if(bmatch > 1.E9) then + Fval = -1.0 + indx = -1 + endif + + RETURN +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNclose : + libUN (0300) + +!** +-------------------------+-----------------------------------------+ +!** + * Close the desired file + +!** + Created to suppress the need the directly call a netcdf + +!** + routine from a program + +!** + + +!** + INPUT : + +!** + FILEid : NetCDF file identifier (from UNropen) + +!** +---------------------------------------------------------------7++++ + +subroutine UNCLOSE(FILEid) + use libUN_mod + implicit none + + integer Ierro, FILEid + + Ierro = NF_CLOSE(FILEid) + if(Ierro /= NF_NOERR) then + call HANDLE_ERR('UNclose', Ierro) + endif + +END + +!** +-------------------------+-----------------------------------------+ +!** + subroutine UNparam : + libUN (0202) + +!** +-------------------------+-----------------------------------------+ +!** + Changes some global libUN parameters + +!** + NB: default values are set at first libUN call + +!** + + +!** + + +!** + INPUT : pname name of the parameters to set + +!** + pvalue the requested new value + +!** + + +!** +---------------------------------------------------------------7++++ + +subroutine UNparam(pname, pvalue) + use libUN_mod + implicit none + + character * (*) pname + REAL(kind=4) pvalue + + LOGICAL Lstart + SAVE Lstart + DATA Lstart/.true./ + + if(pname == 'RESET_PARAMS_') then + if(Lstart .OR. pvalue > 0.5) then + vMissVal = 1.0E21 ! for missing values + VarRepl = vMissVal ! for missing VARIABLES + ValRange(1) = -vMissVal / 10. + ValRange(2) = vMissVal / 10. + iVarWarn = 2 + vReadMin = 0.0 + vReadMax = 0.0 + ireadchk = 0 + Lstart = .false. + endif + + else if(pname == 'NOVAR_REPLACE') then + VarRepl = pvalue + + else if(pname == 'NOVAR_WARNING') then + iVarWarn = NINT(pvalue) + + else if(pname == 'VALID_RANGE_MIN') then + ValRange(1) = pvalue + + else if(pname == 'VALID_RANGE_MAX') then + ValRange(2) = pvalue + + else if(pname == 'READOVER_WARN') then + vReadMin = -pvalue + vReadMax = pvalue + ireadchk = 1 + + else if(pname == 'READ_MIN_WARN') then + vReadMin = pvalue + ireadchk = 1 + + else if(pname == 'READ_MAX_WARN') then + vReadMax = pvalue + ireadchk = 1 + + else + write(*, *) 'UNparam (libUN) Error: ' + write(*, *) ' parameter undefined:', pname + + endif + +END + +!** +-------------------------+-----------------------------------------+ +subroutine UNversion(UNver, NCDFver) + !** +-------------------------+-----------------------------------------+ + use libUN_mod + implicit none + + character * 80 UNver, NCDFver + + UNver = '2005.03.31' + NCDFver = NF_INQ_LIBVERS() + +END + +!** +-------------------------------------------------------------------+ +FUNCTION VARSIZE(CHAvar) + !** +-------------------------------------------------------------------+ + implicit none + integer maxcha, iz, VARSIZE + parameter(maxcha=512) + character * (*) CHAvar + character * (maxcha) CHAtmp + + write(CHAtmp, '(A)') CHAvar + iz = 0 + do while((CHAtmp(iz + 1:iz + 3) /= ' ') .and. (iz + 3 <= maxcha)) + iz = iz + 1 + enddo + VARSIZE = iz + + RETURN +END + +!** +-------------------------------------------------------------------+ +subroutine HANDLE_ERR(LOCATION, STATUS) + !** +-------------------------------------------------------------------+ + use libUN_mod + implicit none + + character * (*) LOCATION + integer STATUS + if(STATUS /= NF_NOERR) then + write(*, *) 'IN ROUTINE ', LOCATION + write(*, *) NF_STRERROR(STATUS) + STOP 'Stopped' + endif +END + +! UN library: history of fixed bugs and updates. +! ---------------------------------------------- +! +! 961206 - UNgtime, trouble at end-of-file +! 961218 - - all -, display 'artificial' errors +! 970318 - again, display 'artificial' errors +! 971028 - (3 sub),'syntax'error on Cray computer +! 971105 - Allowed variable "imap(1)", =8 for Cray +! 980705 - "single element" extension to UNwrite. +! 980709 - bug fixes (start) in UNwrite & UNlwrite +! ("DATA" statement incorrectly used). +! 980825 - Changed default "stride" to 1 for v3.x +! 981222 - bug fix: allow UNwrite for unlim dims. +! note that this should be tested. +! 990110 - Added "UNgindx" = general. of UNgtime +! - Removed all "DATA" and all "//" in write +! (the later should improve compatibility) +! 990128 - UNwrite: added a "no warning" option. +! 990323 - UNwrite: added 1D+time capability. +! 990807 - UNwrite: added 3D-notime capability. +! ----------------------------------------------------------------------- +! 000404 - Major upgrade: compatibility with +! NetCDF v3.4 +! - NOTE: Types other than REAL may be +! accepted in UNread, but not tested +! ----------------------------------------------------------------------- +! 000614 - Bug fixes: uninitialised error count +! in UNwcatt, bug in UNclose. +! 000620 - Bug fix: UNropen(args. of get title fn) +! 000713 - Bug fix: UNgtime (missing arg in a call) +! (last tree caused by 000404 upgrade) +! ----------------------------------------------------------------------- +! 000928 - UNlwrite: added 2D+time capability. +! 001008 - All: character*(*) declaration for units +! and longer strings for intern. variables +! 010417 - UNread: added var not found info +! UNropen: added file not found info +! 010715 - UNwrite + UNlwrite: +! fixed bug / unlimited time dim +! 0107xx - UNwrite: +! missing values -> not in "range" +! 020130 - All: +! .removed obsolete warnings about +! double precision in files. +! .added a version (libUN_dbl) with +! REAL*8 as arguments - but still +! creates REAL(kind=4) in files. +! 020526 - Added UNparam function, +! which provide optional features such +! as missing variable behavior control +! 020808 - Very simple fix for underflows while +! reading some files; must use -fpe1 +! Fixed a bug -> out of range msg +! 030121 - Enabled some non-standard NetCDF files +! (missing units...) -> new warnings +! rather then program stop. +! 030215 - Added UNfindx for non-monotonic data +! 030215 - Removed warning related to UNLIM dims +! 030311 - Added VALID_RANGE attribute (option) +! (if set, the range is accounted for +! in the min/max set while writing vars) +! 040902 - Improvements to "valid_range" attribute +! - Added attribute "positive=down" +! if units are sigma or sigma_level +! 050331 - Added "user friendly" interfaces diff --git a/MAR/code_mar/libUN_mod.f90 b/MAR/code_mar/libUN_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a5361740d84c00e090b22ba819ee9a9af632225e --- /dev/null +++ b/MAR/code_mar/libUN_mod.f90 @@ -0,0 +1,27 @@ +module libUN_mod + implicit none + INCLUDE 'NetCDF.inc' + character(50), PARAMETER :: CF_institution = "ULg (Xavier Fettweis)" + character(10), PARAMETER :: CF_libUN_version = "2005.04.08" + ! CF_dimmaxlen : Maximum dim/axes length + INTEGER, PARAMETER :: CF_dimmaxlen = 99999 + ! CF_dimmaxnbr : Nbr Maximum of dim/axes + INTEGER, PARAMETER :: CF_dimmaxnbr = 20 + ! CF_varmaxnbr : Nbr maximum of variables + INTEGER, PARAMETER :: CF_varmaxnbr = 300 + ! CF_attnbr : nbr of attibutes + INTEGER, PARAMETER :: CF_attnbr = 1 + INTEGER, SAVE :: CF_dim(0:CF_dimmaxnbr), CF_attnum(CF_attnbr) + INTEGER, SAVE :: CF_varnbrtot, CF_dimnbrtot, CF_fileidopened + REAL, SAVE :: CF_dimval(CF_dimmaxlen, 0:CF_dimmaxnbr) + character(len=13), SAVE :: CF_dimnam(0:CF_dimmaxnbr) + character(len=13), SAVE :: CF_varnam(CF_varmaxnbr) + character(len=13), SAVE :: CF_varnamdim(4, CF_varmaxnbr) + character(len=13), SAVE :: CF_attnam(CF_attnbr) + character(len=31), SAVE :: CF_dimnamuni(0:CF_dimmaxnbr) + character(len=31), SAVE :: CF_varnamuni(CF_varmaxnbr) + character(len=50), SAVE :: CF_vardes(CF_varmaxnbr) + character(len=200), SAVE :: CF_filenam, CF_filetit, CF_filenamopened + INTEGER, SAVE :: iVarWarn, ireadchk + REAL, SAVE :: VarRepl, vReadMin, vReadMax, vMissVal, ValRange(2) +endmodule libUN_mod diff --git a/MAR/code_mar/mar.f90 b/MAR/code_mar/mar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e2b89840f20cd0e970130e7ee302f9d647812854 --- /dev/null +++ b/MAR/code_mar/mar.f90 @@ -0,0 +1,2733 @@ +#include "MAR_pp.def" +! +************************************************************************+ +! | | +! | | +! | | +! | | +! | | +! | | +! | | +! | M M AAAAAAA RRRRRRR | +! | MM MM A A R R | +! | M M M M A A R R | +! | M M M M A A R R | +! | M MM M A AAAAA A R RRRRR R | +! | M M A A R R | +! | (MODELE tridimensionnel ATMOSPHERIQUE a l'echelle REGIONALE) | +! | M M A A R R | +! | M M A A R R | +! | M M A A R R | +! | M M A A R R | +! | | +! | \__ _ ____ / | +! | \_/ @@@@ / \ | +! | / \ @@@@@@ / / \ | +! | / \ @@@@@@ | / | | +! | ... *** \ / / LGGE/IGE/LSCE/CNRS | +! | .... ** \/___/ | +! | .... ** / IAG/UCL ULIEGE/FNRS | +! | | +! | Laboratoire de Glaciologie et de Geophysique de l'Environnement | +! | Institut d'Astronomie et de Geophysique Georges Lemaitre | +! | Laboratoire d'etudes des Transferts en Hydrologie et Environnement | +! | | +! | | +! | | +! +************************************************************************+ +! | | +! | Version MARv3.13.0 13 Dec 2022 | +! | | +! +************************************************************************+ +! | | +! | MAR CURRENT CONTRIBUTORS: | +! | | +! | H. Gallee, X. Fettweis, C. Agosta, C. Amory, C. Kittel, ... | +! | | +! +************************************************************************+ +! | | +! | SUMMARY : THE MODEL USES THE FULL COMPRESSIBLE PRIMITIVES EQUATIONS | +! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | Vertical Coordinate : Normalized Pressure Sigma | +! | Horizontal Grid : Arakawa A-grid | +! | (Purser and Leslie, MWR 116, 2069--2080, 1988) | +! | Modes : 1-Dimensional (mx=1,my=1,mz) OR | +! | ^^^^^^^ 2-Dimensional (mx ,my=1,mz) OR | +! | 3-Dimensional (mx ,my ,mz) | +! | Condition mx > my must be fulfilled in this case | +! | (cfr."MARdim.inc") | +! | | +! +************************************************************************+ +! | | +! | THE FILE MAR___.FOR contains the BASIC SOURCE CODE | +! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | It may be used as is in 1-D, 2-D or 3-D Mode | +! | It may be modified in order to allow other possibilities. | +! | Modifications are performed by replacing labels `c #XY' by blanks. | +! | (see Preprocessor MAR_pp.for) | +! | | +! | # MAIN OPTIONS: | +! | #^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: Dynamics | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: Sea, Polynya and Snow Models | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: | +! | #^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: BOUNDARY CONDITIONS | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: CONVECTIVE ADJUSTMENT | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: VERTICAL TURBULENCE | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: SURFACE LAYER | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | | +! | # ADDITIONAL OPTIONS: HORIZONTAL DifFUSION | +! | #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +! | !. `Standard' Horizontal Diffusion is performed on Sigma Surfaces | +! | !. Smagorinski Relation (see Tag et al. 1979, JAM 18, 1429--1441) | +! | !. CAUTION: Horizontal Diffusion is switched on with turhor = .true. | +! | 2. _PE, _HH, : Diffus.on Sigma Surfaces (%Grad.) +Vert.Corr. | +! | 3. _PE, _HH, #CR : Diffus.on Sigma Surfaces (%Grad.) +all Corr. | +! | 4. #DF, #PE, : Diffus.on Sigma Surfaces (%Strain)+Vert.Corr. | +! | 5. #DF, #PE, #DC, #CR : Diffus.on Sigma Surfaces (%Strain)+all Corr. | +! | (#DC -> u,v; #CR -> other Variables) | +! | CAUTION: if #QE, then #qe MUST BE SWITCHED ON before 2, 3, 4 OR 5 | +! | ^^^^^^^ if #HY, then #se MUST BE SWITCHED ON before 2, 3, 4 OR 5 | +! | | +! +************************************************************************+ + +program MAR + use mardim +#if(AO) + ! Coupling Module / OASIS + ! ======================== + !AO_CK 20/02/2020 + use mod_OASIS + use mar_module + ! USE flincom !CK?? +#endif + use marctr + use marphy + use margrd + use mar_ge + use marsnd + use mar_dy + use marqqm +#if(NH) + use mar_nh +#endif + use mar_lb + use mar_ub + use mar_te + use mar_tu + use mar_ca + use mar_fi + use mar_hy +#if(TC) + use mar_tc +#endif + use mar_ra + use mar_sl +#if(AO) + use mar_ao +#endif + use mar_wk + use mar_sv + use mardsv + use mar_tv + use marlsv + use marssn + use mar_ib + use mar_io + use marmagic + use radcep + use marvec + use trackwind, only : track_wind, delta_u, delta_v, uairDY_save, vairDY_save, & + i_dyndgz, i_dynfil, i_coriol, i_turhor, i_turabl, i_lbcnud, trackwind_init, & + track_dgz, delta_u_dgz, delta_v_dgz, trackdgz_init + use trackwater, only: track_water, delta_qv, qvDY_save, trackwater_init, & + j_dynadv, j_turhor, j_turabl, j_sspray, j_hydgen, j_lbcnud, j_cvagen + +#if(iso) + use mariso, only : mariso_constants +#endif + implicit none + +#if(iso) + ! iso_time : number of the output file increment + integer :: iso_time + ! iso_label : label of output increment + character*10 :: iso_label +#endif + ! +--Local Variables + ! + ================ + integer ipr_nc + logical qqmass + integer norder_0 + integer newlbc_0 + real rhcrit_0 + real tstart_0 + character * 3 DYNadv + real dt_inv, dtLLoc, dtDifH, dt_Out, deltaF, cfladv, csnd + real hham, hhac, fham, thac, argham, hhhnnn, tdt, afdt + real pav, ppp, wwwabs, wwwmax, ectnew, pente, dthdz, adum, adu + real pnhLav, pnh_av, ave_swd + integer i, j, k, m + integer n, mlg, mlh, mlm, mld, iargum, i__min, i__max + integer kk, kdim, ksig, iv, iw + integer nt_Loc, jt_Loc, it_Loc, ntLLoc, itLLoc, itPhys + integer iham, nham, ihamr, nhamr, jham, ibd + integer jmmd, jm10, jh10, jh1, jd10, jd1 + integer iteChi + integer iprint, log_nc + integer iout, idum, jdum, id6, i_wmax, j_wmax, k_wmax + integer ntracr, lotrac + ! Auxil. Variables (variable nt_Mix) + logical ntFlog + integer nt_BAK, nt_sig, nt_smooth, nt_Mix_min + integer nt_Mix_nbr(20), nt_tmp1, nt_tmp2 + real VLoc, VLocmx, rtFact, CFLinv, TLocmn + integer iLocmx, jLocmx, kLocmx + ! DistST: Normalized Earth's Sun Distance + real DistST + character(len = 8) ttime + ! +--Check openmp + ! + ------------ + integer number_threads + integer omp_get_thread_num, omp_get_max_threads + ! +--Vertically Integrated Normalized Mass Flux + ! + ------------------------------------------ + real fu(mx, my), fv(mx, my) + ! +--Machine Precision + ! + ----------------- + real reamin, reamax + ! +--IO + ! + -- + real zza(5) + real tta(5) + + ! MAR allocate + call mar_allocate() + + ! +--Flags + ! + ===== + openmp = .false. + !$ openmp = .true. + ini_KA_TE = .false. + VSISVAT = .true. + iniIRs = .false. + iniOUT = .false. + ! +--Blowing Snow + ! + ~~~~~~~~~~~~ + BloMod = .false. +#if(AE) + BloMod = .true. +#endif + ! +--Advection + ! + ~~~~~~~~~ + DYNadv = 'LFB' +#if(UW) + DYNadv = 'UPW' +#endif + no_vec = .true. + ntFlog = .false. + openLB = .false. + sommlb = .false. + ! SBLitr=.true. ==> SBL is iterated + SBLitr = .true. + tur_25 = .false. + ! +--CONSTANTS + ! + ========= + ntracr = 0 +#if(TC) + ntracr = ntrac +#endif + ! +--Grid Constants + ! + -------------- + rxy = 1.e-6 / (mx * my) + m = mx + m1 = m - 1 + m2 = m - 2 + m3 = m - 3 + m4 = m - 4 + mn3 = mn - 3 + mn4 = mn - 4 + + ttime = ' ' + write(6, 6) + 6 format(& + /, " " & + , /, " *********************************** " & + , /, " * * " & + , /, " * MM MM AAAA RRRRRR * " & + , /, " * MMMM MMMM AA AA RR RR * " & + , /, " * MM MM MM AAAAAAAA RRRRRR * " & + , /, " * MM MM AA AA RR RR * " & + , /, " * MM MM AA AA RR RR * " & + , /, " * * " & + , /, " * Modele Atmospherique Regional * " & + , /, " * * " & + , /, " *********************************** " & + , /, " " & + , /, " - MARv3.13.0 - 13/12/2022 - " & + , /, " ") + + !$ number_threads = omp_get_max_threads() + + write(6, 7) " OMP CPU=", number_threads + write(6, 7) " mx=", mx + write(6, 7) " my=", my + write(6, 7) " mz=", mz + write(6, 7) " mw=", mw + write(6, 7) " nsno=", nsno + write(6, 7) " mzabso=", mzabso + write(6, 7) " mzhyd=", mzhyd + write(6, *) "" + write(6, 8) " humidity_magic=", humidity_magic + write(6, 8) " cloud_magic=", cloud_magic + write(6, 8) "correction_humidity_boundary=", correction_humidity_boundary + write(6, *) "" + + if(cloud_magic < 0 .or. cloud_magic > 1 .or. humidity_magic < 0) then + print *, "error in cloud_magic [0,1] or humidity_magic [0,100]" + stop + endif + + if(correction_humidity_boundary < -0.5 .or. correction_humidity_boundary > 0.5) then + print *, "error in correction_humidity_boundary [-0.5,0.5]" + stop + endif + + if(klonv > 1 .or. klon > 1) then + print *, "klonv/klon must be = 1 in mar_sv_mod.f90/MARdim_mod.f90" + stop + endif + + 7 format(a29, i4) + 8 format(a29, f6.2) + + ! +--Machine Precision + ! + ================= + rrmin = 0.1e-36 + rrmax = 0.1e+38 + + ! +--Min and Max Arguments of Function exp(x) + ! + ---------------------------------------- + argmin = log(rrmin) + iargum = argmin + i__min = iargum + 7 + argmax = log(rrmax) + iargum = argmax + i__max = iargum - 8 + ! write(6,600) argmin,i__min,argmax,i__max + ! 600 format(/, ' Function exp(x) : Arguments:', & + ! /, ' Minimum Value : ', e12.4, 5x, '==> (', i3, ')', & + ! /, ' Maximum Value : ', e12.4, 5x, '==> (', i3, ')') + argmin = i__min + argmax = i__max + + ! +--PHYSICAL DATA + ! + ============= + ! + ****** + call phymar + ! + ****** +#if(iso) + ! iso constants + call mariso_constants +#endif + + ! +--CONTROL PARAMETERS + ! + ================== + open(unit = 3, status = 'old', file = 'MARctr.dat') + rewind 3 + read(3, 31) reaVAR, reaLBC, safVAR + 31 format(l12) + if(.not. reaVAR) geoNST = .false. + ! hamfil: Initialisation based on Temporal Filtering (Hamming) + read(3, 31) hamfil + ! conmas: Initialis. Constrained (Mass Conservation) + read(3, 31) conmas + ! potvor: Initialis. Constrained (Potent. Vortic. Conservation) + read(3, 31) potvor + ! brocam: Brown and Campana Time Scheme Switch + read(3, 31) brocam + ! center=.T. => Pressure Spatial Scheme centered + read(3, 31) center + ! nordps= 4 : Pressure Spatial Scheme Precision + read(3, 32) nordps + ! staggr=.T. => Vertical Grid staggered + read(3, 31) staggr + 32 format(i12) + ! turhor=.T.: Horizontal Diffusion (Smagorinsky) Switch + read(3, 31) turhor + ! chimod=.F.: Atmospheric Chemical Model turned OFF + ! chimod=.T.: Atmospheric Chemical Model turned ON + read(3, 31) chimod + ! convec=.T.: Mass Flux convective Scheme turned ON + read(3, 31) convec + ! micphy=.F.: only the dry model is run + ! micphy=.T.: the explicit hydrological cycle is included + read(3, 31) micphy + ! fracld=.T.: Fraction.Cloudiness Scheme turned ON + read(3, 31) fracld + ! rhcrit_0: relative humidity critical saturation value + read(3, 43) rhcrit_0 + ! rhcrHY: relative humidity critical saturation value + rhcrHY = rhcrit_0 + !cCA:[TO DO] -> to be changed to accept supersaturation? + if(rhcrHY > 1.) then + write(6, 300) rhcrHY + 300 format(/, ' *********************************************************************', & + /, ' * Critical Humidity =', f6.2, ' [%] / new units: [-] => divide by 100 *', & + /, ' *********************************************************************', /, 1x) + rhcrHY = rhcrHY * 10.**(-2) + endif + read(3, 43) tstart_0 + ! tim_HY: hydrological cycle starting time (prefarably uses 0.) + tim_HY = tstart_0 + 43 format(f12.4) + ! cz0_GE : Cosine of Solar Zenith Angle (Minimum Value for solari call) + read(3, 34) cz0_GE + 34 format(d12.4) + ! physic: Physics are included + read(3, 31) physic + ! vegmod =.true. : Interactive SVAT turned ON + read(3, 31) vegmod + if(.not. physic) vegmod = .false. + ! snomod =.true. : Interactive Snow Model turned ON + read(3, 31) snomod + if(.not. physic) snomod = .false. + ! polmod =.true. : Interactive Polynya Dynamics turned ON + read(3, 31) polmod + ! hic0 : assumed initial sea-ice Thickness + read(3, 43) hic0 + ! fxlead : assumed initial minimal Leads Fraction + read(3, 43) fxlead + ! qsolSL: Deardorff model for soil humidity + read(3, 31) qsolSL + read(3, 43) dt + dt_inv = 1.0 / dt + ! nboucl : nb of time steps between each print + read(3, 32) nboucl + read(3, 32) nprint + read(3, 32) ntFast + if(mod(ntFast, 2) == 0) then + write(6, 301) ntFast + 301 format(/, ' *******************************************************************', & + /, ' * Value of ntFast =', i6, ' is even (precluded) =====> 1 is added *', & + /, ' *******************************************************************', /, 1x) + ! Fixed ntFast + ntFast = ntFast + 1 + endif + ! XF no usefull to have ntFast=3 + ntFast = 1 + itexpe = 0 + ! variable nt_Mix + nt_Mix = 3 + nt_Mix_min = 1 + nt_Mix_nbr = 0 + nt_smooth = 0 + ! dtDiff : Calibrated Subgrid Scale Time Step + read(3, 43) dtDiff + ! dtPhys : Surface Physics Time Step + read(3, 43) dtPhys + ! dtRadi : Radiation Time Step + read(3, 43) dtRadi + ! rxbase : Nudging Coefficient + read(3, 34) rxbase + ! rxfact : Lateral Sponge Coefficient + read(3, 34) rxfact + close(unit = 3) + + ! +--New Control Parameters + ! + ---------------------- +#if(NH) + ! +--Non-Hydrostatic Dynamics + ! + ~~~~~~~~~~~~~~~~~~~~~~~~ + ! csnd: Prescribed Sound Speed (m/s) + csnd = 330. + c2NH = csnd * csnd +#endif + ! +--Chemical Model + ! + ~~~~~~~~~~~~~~ + lotrac = 0 +#if(TC) + lotrac = 1 + jtAdvH = 1 + dtAdvH = dt + jt_ODE = 1 + if(.not. chimod) then + dt_ODE = dt + jt_ODE = 1 + nt_ODE = 1 + ikTC(1) = 1 + endif +#endif + ! +--Print Characteristic + ! + -------------------- + if(nprint < 0) then + nprint = -nprint + log_nc = 1 + else + log_nc = 0 + endif + ! ipr_nc (npr_nc): Netcdf Output File: Current No (Total Nb) of Prints + ipr_nc = 0 + npr_nc = 1 + nprint + nterun = nboucl * nprint +#if(AO) + !$OMP BARRIER + !$OMP MASTER + ! +-- Initialize coupling (cpl) + ! + ========================== + coupling_ao = .false. + write(6, *) 'Initialize coupling in MAR' + ! inicma : Define coupling fields in MAR + ! coupling_ao => .true. + ! + ***** + call inicma + ! + ***** + if(coupling_ao) then + write(6, *) 'Coupling initialization done in MAR' + write(6, *) coupling_ao + ! else + ! write(6,*) 'error in coupling init', coupling_ao + ! stop + endif + !$OMP END MASTER + !$OMP BARRIER +#endif + ! +--OUTPUT Files + ! + ============ + open(unit = 4, status = 'replace', file = 'MARphy.out') + rewind 4 + open(unit = 21, status = 'new', file = 'MAR.log') + rewind 21 + + ! +--Katabatic Jump Diagnostics + ! + -------------------------- + if(mx > 1 .and. my <= 1) then + open(unit = 22, status = 'unknown', file = 'MAR.uuu') + rewind 22 + open(unit = 23, status = 'unknown', file = 'MAR.ttt') + rewind 23 + open(unit = 24, status = 'unknown', file = 'MAR.ppp') + rewind 24 + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ INITIALISATION +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !$OMP BARRIER + !$OMP MASTER + ! + ****** + call inigen + ! + ****** + !$OMP END MASTER + !$OMP BARRIER + if(track_wind) then + call trackwind_init() + endif + if (track_dgz) then + call trackdgz_init() + end if + if(track_water) then + ! allocate and set water budget variables to zero before time loop + call trackwater_init() + end if + +#if(iso) + ! iso outputs + call mariso_create_file + ! initialize output file time increment + iso_time = 1 + iso_label = 'create ' + call mariso_write_file(iso_time, iso_label) ! 1 +#endif + + ! +--PBL Initialization Parameter + ! + ============================ + if(itexpe <= 0) then + log_1D = 0 + else + log_1D = 1 + endif + + ! +--HAMMING Filter Parameters + ! + ========================= + iham = 0 + nham = 0 + + ihamr = iham + nhamr = nham + + ! +--Domain Averaged Pressure Thickness + ! + ================================== + pav = 0. + do j = 1, my + do i = 1, mx + pav = pav + pstDYn(i, j) + enddo + enddo + pav = pav / (mx * my) + + ! +--OUTPUT + ! + ====== + if(IO_loc >= 2) then + do i = 1, 5 + tta(i) = tsrfSL(igrdIO(i), jgrdIO(i), 1) - TfSnow + enddo + write(21, 607)(igrdIO(i), jgrdIO(i), i = 1, 5), & + (sh(igrdIO(i), jgrdIO(i)), tta(i), i = 1, 5) + 607 format(//, 5(5x, ' (', i4, ',', i4, ')', 5x, '!! '), & + /, 5(' altitude ! temperat. ', '!! '), & + /, 5(10('-'), '!', 11('-'), '!!-'), & + /, 5(f8.1, ' ! ', f8.2, ' !! ')) + do kk = 1, mz + k = mz + 1 - kk + do i = 1, 5 + zza(i) = gplvDY(igrdIO(i), jgrdIO(i), k) * grvinv + tta(i) = pktaDY(igrdIO(i), jgrdIO(i), k) * pcap + enddo + write(21, 609)(zza(i), tta(i), i = 1, 5) + 609 format(5(f8.1, ' ! ', f8.2, ' !! ')) + enddo + write(21, 611) + 611 format(1x) + endif + + if(mmx > 1 .and. mmy <= 1) then + write(22, 221) itexpe, (xxkm(i), i = imez - 10, imez + 30) + write(23, 221) itexpe, (xxkm(i), i = imez - 10, imez + 30) + write(24, 221) itexpe, (xxkm(i), i = imez - 10, imez + 30) + endif + + ! +--NetCDF Files + ! + ------------ + nbhour = 0 + do while(mod(3600 * nbhour, idt) /= 0) + !cCA 1 continue + nbhour = nbhour + 1 + enddo + !cCA if (mod(3600 * nbhour, idt)/=0) go to 1 + if(log_nc == 1) then + dt_Loc = dt + ipr_nc = ipr_nc + 1 + ! + ****** + call out_nc(ipr_nc) + ! + ****** + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of the EXTERNAL TIME INCREMENTATION (nprint over dt * nboucl) ++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + do iprint = 0, nprint - 1 + ! +--Output Files Label + ! + ================== + fnam(1:3) = 'si_' + jmmd = 1 + mod(minuGE, 10) + jm10 = 1 + minuGE / 10 + jh10 = 1 + jhaMAR / 10 + jh1 = 1 + mod(jhaMAR, 10) + jd10 = 1 + jdaMAR / 10 + if(jd10 > 10) then + fnam(3:3) = '+' + jd10 = mod(jd10, 10) + endif + jd1 = 1 + mod(jdaMAR, 10) + fnam(4:4) = labnum(jd10) + fnam(5:5) = labnum(jd1) + fnam(6:6) = labnum(jh10) + fnam(7:7) = labnum(jh1) + fnam(8:8) = labnum(jm10) + fnam(9:9) = labnum(jmmd) + fnam(10:10) = '.' + fnam(11:13) = explIO + fnam(14:16) = ' ' + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of the INTERNAL TIME INCREMENTATION (nboucl over dt) +++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !cCA iboucl = 1 + !cCA 2 continue + do iboucl = 1, nboucl +#if(AO) + ! +--cpl : GET FIELDS FROM OASIS + ! + =========================== + !$OMP BARRIER + !$OMP MASTER + ! + *********** + call OASIS_2_MAR + ! + *********** + !$OMP END MASTER + !$OMP BARRIER +#endif +#if(SB) + ! +--Modification of the Surface Forcing + ! + =================================== + ! + ****** + call sbcnew + ! + ****** +#endif +#if(iso) + iso_label = 'sbcnew ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) ! 2 +#endif(iso) + + ! + ****** + call filatmo + ! + ****** + + if(iterun <= 1 .or. mod(iterun, 6 * 3600 / int(dt)) == 0) call time_steps + + if(itexpe <= 1) then + do j = 1, my + do i = 1, mx + do k = 1, mw + if(ivegTV(i, j, k) > nvgt .or. ivegTV(i, j, k) < 0) then + print *, "Error in vegetation type", i, j, k, ivegTV(i, j, k) + print *, "Have you initialized your snowpack ?" + stop + endif + enddo + enddo + enddo + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of DIABATIC INITIALISATION +++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + if(mmx > 1 .and. log_1D == 1) then + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of FAST PROPAGATING WAVES DYNAMICS (HYDROSTATIC PART) ++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +...``Dynamics'' is active only after the 1-D Initialisation Phase + ! +--Update of Horizontal Wind Speed and Mass + ! + ======================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + ubefDY(i, j, k) = uairDY(i, j, k) + vbefDY(i, j, k) = vairDY(i, j, k) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + pstDY(i, j) = pstDYn(i, j) + opstDY(i, j) = pstDYn(i, j) + enddo + enddo + + ! +--Update of nt_Mix parameter (CFL criterion on Max Wind Speed) + ! + ============================================================ + if(.not. ntFlog) then + ntFlog = .true. + ! CFLinv : Inverse CFL Number + CFLinv = dt / dx + ! rtFact : Sound Speed upper Bound (500m/s) normalized by the CFL Number + rtFact = 500.0 * CFLinv + ! +--Local Wind Speed + ! + ---------------- + VLocmx = 0. + TLocmn = 273.15 + iLocmx = 0 + jLocmx = 0 + kLocmx = 0 + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = (abs(uairDY(i, j, k)) & + + min(1, my - 1) * abs(vairDY(i, j, k))) + enddo + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + VLocmx = max(VLocmx, WKxyz1(i, j, k)) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + TLocmn = min(TLocmn, tairDY(i, j, mz - 1)) + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + if(WKxyz1(i, j, k) > VLocmx - epsi) then + iLocmx = i + jLocmx = j + kLocmx = k + endif + enddo + enddo + enddo + + TLocmn = TLocmn - 273.15 + nt_sig = 1 + CFLzDY / ntFast + nt_BAK = nt_Mix + nt_Mix = max(nt_sig, int(rtFact + CFLinv * VLocmx)) + nt_Mix = max(3, nt_Mix) + if(itexpe < 100) nt_Mix = max(8, nt_Mix) + + dtFast = dt / ((ntFast + 1) * nt_Mix) ! see inigen + FIfstu = FIslou / ((ntFast + 1)) ! see grdmar + FIfstp = FIslop / ((ntFast + 1)) ! see grdmar + do k = 1, mz + FIk_fu(k) = max(FIk_fu(k), FIfstu / max(0.1, sigma(k))) ! see grdmar + FIk_fp(k) = max(FIk_fp(k), FIfstp / max(0.1, sigma(k))) ! see grdmar + enddo + + write(6, 1001) & + TLocmn, VLocmx, iLocmx, jLocmx, kLocmx & + , nt_BAK, nt_Mix, itexpe & + , jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, jsecGE + 1001 format('WARNING: TT min =', f8.2, & + ' S(|V|)max =', f8.1, ' (', 3i4, ')', & + ' ==> update nt_Mix(=', i4, ');:=', i4, ' at iteration', i8, & + ' Time is ', i2, '-', a3, '-', i4, & + '/', i2, '.', i2, '.', i2, ' UT') + endif + + ! +--Begin of the Fast Time Loop + ! + =========================== + + nt_tmp1 = max(2, min(5, nt_Mix / 2 + 1)) + nt_tmp2 = max(1, min(3, ntFast / 2 + 1)) + + do it_Mix = 1, nt_Mix + do itFast = 1, ntFast + 1 + if(.not. brocam) then + ! +--Integration of the Hydrostatic Relation + ! + ======================================= + ! cCA : in classic config, brocam = .true., we don't go here + ! + ****** + call dyngpo_mp + ! + ****** + ! + WARNING : Place of this routine DYNgpo in the organigram depends + ! + if Brown-Campana (1978, MWR, p.1125) time scheme is used or not! + ! + Here is the place when the Brown-Campana time scheme is not used. + endif + ! +--Mass Continuity + ! + =============== + norder_0 = nordps + ! + ****** + call DYNdps_mp(norder_0) + ! + ****** + + ! +--Filtering + ! + --------- + if(FIfstp > 0. .and. mod(it_mix, nt_tmp1) == 0) then + do j = 1, my + do i = 1, mx + dumy3D(i, j, 1) = pstDYn(i, j) - pstDY1(i, j) + enddo + enddo + dumeps(1) = FIfstp + kdim = 1 + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********* + call DYNfil_3D(dumy3D, dumeps, kdim) + ! + ********* + endif + do j = 1, my + do i = 1, mx + pstDYn(i, j) = dumy3D(i, j, 1) + pstDY1(i, j) + enddo + enddo + endif + + if(brocam) then + ! +--Integration of the Hydrostatic Relation + ! + ======================================= + ! cCA : in classic config, brocam = .true. + ! + WARNING : The place of routine DYNgpo in the organigram depends + ! + if Brown-Campana (1978, MWR, p.1125) time scheme is used or not! + ! + Here is the place when Brown-Campana time scheme is used. + ! + ********* + if(itFast == 1 .and. it_mix == 1) call dyngpo_mp + ! + ********* + endif + + ! +--Contribution of Horizontal Pressure Gradient Force + ! + ================================================== + if(track_wind) then + uairDY_save = uairDY + vairDY_save = vairDY + ! track_wind also inside dyndgz_mp with track_dgz + endif + norder_0 = nordps + ! + ********** + call dyndgz_mp(norder_0) + ! + ********** + + if(track_wind) then + delta_u(:, :, :, i_dyndgz) = delta_u(:, :, :, i_dyndgz) + (uairDY - uairDY_save) + delta_v(:, :, :, i_dyndgz) = delta_v(:, :, :, i_dyndgz) + (vairDY - vairDY_save) + endif + + if(itFast == nt_tmp2) then + ! +--Filtering of the Horizontal Wind Speed Components + ! + ================================================= + if(FIk_fu(1) > 0.0 .and. mod(it_Mix, nt_tmp1) == 0) then + if(mmy <= 1) stop + do k = 1, mz + dumeps(k) = FIk_fu(k) + enddo + kdim = mz + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = uairDY(i, j, k) + if(track_wind) then + uairDY_save(i, j, k) = uairDY(i, j, k) + endif + enddo + enddo + enddo + ! + ************ + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ************ + do k = 1, mz + do j = 1, my + do i = 1, mx + uairDY(i, j, k) = dumy3D(i, j, k) + dumy3D(i, j, k) = vairDY(i, j, k) + if(track_wind) then + delta_u(i, j, k, i_dynfil) = delta_u(i, j, k, i_dynfil) + & + (uairDY(i, j, k) - uairDY_save(i, j, k)) + vairDY_save(i, j, k) = vairDY(i, j, k) + endif + enddo + enddo + enddo + + ! + ************ + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ************ + do k = 1, mz + do j = 1, my + do i = 1, mx + vairDY(i, j, k) = dumy3D(i, j, k) + if(track_wind) then + delta_v(i, j, k, i_dynfil) = delta_v(i, j, k, i_dynfil) + & + (vairDY(i, j, k) - vairDY_save(i, j, k)) + endif + enddo + enddo + enddo + endif + else + if(itFast == ntFast + 1) then + ! +--Filtering of the Vertical H Wind Speed Component + ! + ================================================ + if(FIk_fp(1) > 0.0 .and. mod(it_Mix, nt_tmp1) == 0) then + if(mmy <= 1) then + do k = 1, mz + do i = 1, mx + dumy3D(i, 1, k) = psigDY(i, 1, k) + enddo + dumeps(k) = FIk_fp(k) + enddo + kdim = mz + + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + + ! + The PGF does not contribute to v in the 2-D version + ! + making the filtering of v unnecessary. + do k = 1, mz + do i = 1, mx + psigDY(i, 1, k) = dumy3D(i, 1, k) + enddo + enddo + else + do k = 1, mz + dumeps(k) = FIk_fp(k) + enddo + kdim = mz + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = psigDY(i, j, k) + enddo + enddo + enddo + + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + + do k = 1, mz + do j = 1, my + do i = 1, mx + psigDY(i, j, k) = dumy3D(i, j, k) + enddo + enddo + enddo + endif + endif + endif + endif + enddo + enddo +#if(iso) + iso_label = 't_loop ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) ! 4 +#endif(iso) + ! +--Update of nt_Mix parameter (CFL criterion on Max Wind Speed) + ! + ============================================================ + ! +--Local Wind Speed + ! + ---------------- + VLocmx = 0. + TLocmn = 273.15 + iLocmx = 0 + jLocmx = 0 + kLocmx = 0 + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = (abs(uairDY(i, j, k)) & + + min(1, my - 1) * abs(vairDY(i, j, k))) + enddo + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + VLocmx = max(VLocmx, WKxyz1(i, j, k)) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + TLocmn = min(TLocmn, tairDY(i, j, mz - 1)) + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + if(WKxyz1(i, j, k) > VLocmx - epsi) then + iLocmx = i + jLocmx = j + kLocmx = k + endif + enddo + enddo + enddo + + TLocmn = TLocmn - 273.15 + nt_sig = 1 + CFLzDY / ntFast + nt_BAK = nt_Mix + nt_Mix = max(nt_sig, int(rtFact + CFLinv * VLocmx)) + nt_Mix = max(nt_Mix, nt_BAK - 1) + nt_Mix = max(nt_Mix, nt_Mix_min) + if(nt_mix > 10 .and. ntFast == 1) then + ntFast = 3 + nt_Mix = 4 + nt_BAK = 4 + endif + if(nt_mix > 10 .and. ntFast == 3) then + ntFast = 5 + nt_Mix = 4 + nt_BAK = 4 + endif + if(nt_mix > 20) stop 'Nt_mix is too high !! MAR is too instable !!' + + nt_smooth = max(0, nt_smooth - 1) + ! nt_Mix can not decrease during at least 15 min + if(nt_smooth > 0) nt_Mix = max(nt_Mix, nt_BAK) + if(nt_Mix /= nt_BAK) then + nt_smooth = sqrt(real(nt_Mix)) * 900. / dt ! 15 min + nt_smooth = max(nt_smooth, 15) + dtFast = dt / ((ntFast + 1) * nt_Mix) ! see inigen + FIfstu = FIslou / ((ntFast + 1)) ! see grdmar + FIfstp = FIslop / ((ntFast + 1)) ! see grdmar + + if(ntFast == 1) then + do k = 1, mz + FIk_fu(k) = max(FIk_fu(k), FIfstu / max(0.1, sigma(k))) ! see grdmar + FIk_fp(k) = max(FIk_fp(k), FIfstp / max(0.1, sigma(k))) ! see grdmar + enddo + else + do k = 1, mz + FIk_fu(k) = FIfstu / max(0.1, sigma(k)) ! see grdmar + FIk_fp(k) = FIfstp / max(0.1, sigma(k)) ! see grdmar + enddo + endif + + if(nt_Mix > nt_BAK) then + do i = 1, nt_BAK + nt_Mix_nbr(i) = nt_Mix_nbr(i) + 1 + if(nt_Mix_nbr(i) > 3) nt_Mix_min = min(4, i + 1) + enddo + write(6, 1001) & + TLocmn, VLocmx, iLocmx, jLocmx, kLocmx & + , nt_BAK, nt_Mix, itexpe & + , jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, jsecGE + endif + endif + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of FAST PROPAGATING WAVES DYNAMICS (HYDROSTATIC PART) ++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#if(NH) + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of FAST PROPAGATING WAVES DYNAMICS (NON-HYDROSTATIC PART) ++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Non-Hydrostatic Dynamics + ! + ======================== + ! + ****** + call DYN_NH + ! + ****** + ! +--Filtering + ! + --------- + ! + ********* + call DYNfil_NH + ! + ********* + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of FAST PROPAGATING WAVES DYNAMICS (NON-HYDROSTATIC PART) ++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#endif + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of SLOW PROPAGATING WAVES DYNAMICS +++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Advection + ! + ========= + + ! +--Leapfrog Backward Scheme + ! + ------------------------ + if(DYNadv == 'LFB') then + ! cCA : in classic config, DYNadv == 'LFB' + if(track_water) then + qvDY_save = qvDY + endif +#if(iso) + iso_label = 'LFB__0 ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) ! 5 +#endif(iso) + norder_0 = nordps + ! + ********** + call DYNadv_LFB(norder_0) + ! + ********** + if(track_water) then + delta_qv(:, :, :, j_dynadv) = delta_qv(:, :, :, j_dynadv) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'LFB__1 ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + endif + + ! +--Forward Scheme + ! + -------------- + if(DYNadv == 'UPW') then + ! cCA : in classic config, DYNadv == 'LFB' + ! +--Vertical Advection: (Thermo)Dynamics + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ********** + call DYNadv_ver + ! + ********** + + ! +--Vertical Advection: Water Species + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(.not. micphy) then + ! + *********** + call DYNadv_verq + ! + *********** + + else + ! + ********** + call HYDadv_ver + ! + ********** + + endif +#if(TC) + ! +--Vertical Advection: Tracers + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ********** + call TRCadv_ver + ! + ********** +#endif + ! +--Horizontal Advection: Momentum + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FirstC = .false. + qqmass = .false. + ! + ********** + call DYNadv_hor(qqmass, uairDY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! + ********** + call DYNadv_hor(qqmass, vairDY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! +--Horizontal Advection: (Thermo)dynamics + ! + ~~~~~~~~~~~~~~~~~~~~~ Water Species + ! + ~~~~~~~~~~~~~~~~ + FirstC = .true. + qqmass = .true. + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + + ! + ********** + call DYNadv_hor(qqmass, dumy3D, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + do k = 1, mz + do j = 1, my + do i = 1, mx + pktaDY(i, j, k) = dumy3D(i, j, k) + enddo + enddo + enddo + + FirstC = .false. + + ! + ********** + call DYNadv_hor(qqmass, qvDY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + if(micphy) then + + ! + ********** + call DYNadv_hor(qqmass, ccniHY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! + ********** + call DYNadv_hor(qqmass, qiHY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! + ********** + call DYNadv_hor(qqmass, qsHY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! + ********** + call DYNadv_hor(qqmass, qwHY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + ! + ********** + call DYNadv_hor(qqmass, qrHY, opstDY, pstDYn, uairDY, vairDY) + ! + ********** + + endif +#if(BS) + ! +--Horizontal Advection: Saltating Snow + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ********** + call DYNadv_sal + ! + ********** +#endif +#if(TC) + ! +--Horizontal Advection: Tracers + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(mod(itexpe, jtAdvH) == 0) then + qqmass = .true. + ! + ********** + call TRCadv_hor + ! + ********** + ! +--New Time Step + ! + ~~~~~~~~~~~~~ + cfladv = epsi + do k = 1, mz + do j = 1, my + do i = 1, mx + cfladv = max(cfladv, abs(uairDY(i, j, k))) + cfladv = max(cfladv, abs(vairDY(i, j, k))) + enddo + enddo + enddo + dtAdvH = demi * dx / cfladv + dtAdvH = min(dtAdvH, dt_ODE) + dtAdvH = max(dtAdvH, dt) + ! jtAdvH : Number of Dynamical Steps for 1 Advection Step + jtAdvH = dtAdvH / dt + ! dtAdvH : Calibrated Advection Time Step + dtAdvH = dt * jtAdvH + ntAdvH = 1 + endif +#endif + endif + + ! +--Rayleigh Friction (Ref. ARPS 4.0 User's Guide, para 6.4.3 p.152) + ! + ================= + do k = 1, mzabso + do j = 1, my + do i = 1, mx + pktaDY(i, j, k) = (pktaDY(i, j, k) + Ray_UB(k) * dt * pktaUB(i, j, k) & + / min(10, max(1, k - mzhyd + 2))) & + / (1.0 + Ray_UB(k) * dt / min(10, max(1, k - mzhyd + 2))) + + enddo + enddo + enddo + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of SLOW PROPAGATING WAVES DYNAMICS +++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + else !cCA not(if (mmx > 1 .and. log_1D == 1)) + !cCA +++++++++++++++++++++++++++++++++++++++++++++++++++ + !cCA First initialization (log_1D == 0) ++++++++++++++++ + !cCA +++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + ****** + call dyngpo_mp + ! + ****** + + ! +--Mid-Level Geopotential + ! + ---------------------- + k = 1 + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = 0.5 * (3.5 * gplvDY(i, j, 1) - 0.5d0 * gplvDY(i, j, 2)) + enddo + enddo + + do k = kp1(1), mz + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = 0.5 * (gplvDY(i, j, k - 1) + gplvDY(i, j, k)) + enddo + enddo + enddo + + k = mzz + do j = 1, my + do i = 1, mx + gpmiDY(i, j, k) = (0.5 * z__SBL + sh(i, j)) * gravit + enddo + enddo + !cCA +++++++++++++++++++++++++++++++++++++++++++++++++++ + !cCA END of First initialization (log_1D == 0) +++++++++ + !cCA +++++++++++++++++++++++++++++++++++++++++++++++++++ + endif + + ! +--Specific Mass + ! + ============= + ! + ****** + call dynrho + ! + ****** + + ! +--Saturation Specific Humidity + ! + ============================ + ! + ****** + call qsat3d + ! + ****** + + ! +--Vertical Velocity in Cartesian Coordinates + ! + ========================================== + if(convec .and. mmx > 1) then + ! + ****** + call dynwww + ! + ****** + endif + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of MAR "SUBGRID ZONE" (INCLUDING CORIOLIS FORCE) +++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Local Temporal Parameters + ! + ========================= + + if(log_1D == 0 .and. tequil > 0.) then + ! +--Boundary Layer Initialisation over time tequil + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + tequil = tequil * 3600. + ! +... Conversion [h]->[s] + dt_Loc = dtquil + nt_Loc = tequil / dtquil + jt_Loc = 1 + else + ! +--Boundary Layer is iterated over time dt + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dt_Loc = dtDiff + nt_Loc = ntDiff + jt_Loc = jtDiff + endif + + ! +--Begin of Subgrid Loop + ! + ===================== + if(mod(itexpe, jt_Loc) == 0) then + do it_Loc = 1, nt_Loc + ! +--Coriolis Force Contribution (Implicit Scheme) + ! + --------------------------------------------- + if(track_wind) then + uairDY_save = uairDY + vairDY_save = vairDY + endif + + do i = 1, mx + do j = 1, my + do k = 1, mz + uairDY(i, j, k) = uairDY(i, j, k) & + + fcorDY(i, j) * (vairDY(i, j, k) - vgeoDY(i, j, k)) * dt_Loc + vairDY(i, j, k) = vairDY(i, j, k) & + - fcorDY(i, j) * (uairDY(i, j, k) - ugeoDY(i, j, k)) * dt_Loc + enddo + enddo + enddo + + if(track_wind) then + delta_u(:, :, :, i_coriol) = delta_u(:, :, :, i_coriol) + (uairDY - uairDY_save) + delta_v(:, :, :, i_coriol) = delta_v(:, :, :, i_coriol) + (vairDY - vairDY_save) + endif + + ! +--Horizontal Subgrid Processes + ! + ---------------------------- + if(turhor .and. log_1D == 1 .and. mmx > 1) then + ! +--Horizontal Diffusion Coefficient + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ********* + call turhor_kh + ! + ********* + + ! +--Contribution of Horizontal Diffusion + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(track_wind) then + uairDY_save = uairDY + vairDY_save = vairDY + endif + if(track_water) then + qvDY_save = qvDY + end if + ! + ********** + call turhor_dyn(dtDifH) + ! + ********** + if(track_wind) then + delta_u(:, :, :, i_turhor) = delta_u(:, :, :, i_turhor) + (uairDY - uairDY_save) + delta_v(:, :, :, i_turhor) = delta_v(:, :, :, i_turhor) + (vairDY - vairDY_save) + endif + if(track_water) then + delta_qv(:, :, :, j_turhor) = delta_qv(:, :, :, j_turhor) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'turhor_dyn' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + endif + ! +--Water Vapor and Precipitation Loading + ! + ------------------------------------- + ! + ****** + call dynloa + ! + ****** + + ! +--Vertical Subgrid Processes + ! + -------------------------- + if(dtDiff > 0.) then + ! +--Turbulent Kinetic Energy + ! + ~~~~~~~~~~~~~~~~~~~~~~~~ + if(jt_Loc > 1) then + dtLLoc = min(dt_Loc, dtAdvH) + ! CAUTION: dtDifH computed in turhor_dyn + dtLLoc = min(dtLLoc, dtDifH) + dtLLoc = max(dtLLoc, dt) + ntLLoc = dt_Loc / dtLLoc + ntLLoc = max(ntLLoc, iun) + dtLLoc = dt_Loc / ntLLoc + else + dtLLoc = dt_Loc + ntLLoc = 1 + endif + do itLLoc = 1, ntLLoc + ! + **************** + if(mmx > 1) call turtke_advh(dtLLoc) + if(mmx > 1) call turtke_advv(dtLLoc) + if(mmx > 1) call turtke_difh(dtLLoc) + call turtke_difv(dtLLoc, 0.) + call turtke_gen(dtLLoc) + ! + *************** + enddo + + ! +--Surface Layer + ! + ~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + ssvSL(i, j, k) = sqrt(max(uairDY(i, j, k) * uairDY(i, j, k) & + + vairDY(i, j, k) * vairDY(i, j, k) & + , epsi)) + enddo + enddo + enddo + + itConv = itexpe * nt_Loc / jt_Loc + it_Loc + ! if (convec.and.itexpe*dt> 24*3600) then + + ! end if + + ! +--Contribution of Turbulent Vertical Diffusion + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(track_wind) then + uairDY_save = uairDY + vairDY_save = vairDY + endif + if(track_water) then + qvDY_save = qvDY + endif + ! + ****** + call TURabl + ! + ****** + if(track_wind) then + delta_u(:, :, :, i_turabl) = delta_u(:, :, :, i_turabl) + (uairDY - uairDY_save) + delta_v(:, :, :, i_turabl) = delta_v(:, :, :, i_turabl) + (vairDY - vairDY_save) + endif + if(track_water) then + delta_qv(:, :, :, j_turabl) = delta_qv(:, :, :, j_turabl) + (qvDY - qvDY_save) + endif + +#if(iso) + ! todo : qi, qw, qr, qs, rain, snow, ... + iso_label = 'turabl ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + if(track_water) then + qvDY_save = qvDY + endif + ! + ****** + call sspray + ! + ****** + if(track_water) then + delta_qv(:, :, :, j_sspray) = delta_qv(:, :, :, j_sspray) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'sspray ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) +#if(NH) + ! +--Contribution of Turbulent Vertical Diffusion (Non Hydrostatic Variables) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call TURvNH + ! + ****** +#endif + endif + enddo + endif + +#if(TC) + ! +--Tracers Turbulent Transfert + ! + =========================== + if(dt_ODE /= dtDiff) then + if(mod(itexpe, jt_ODE) == 0) then + dt_Loc = dt_ODE + nt_Loc = nt_ODE + do it_Loc = 1, nt_Loc + ! + ********* + call TURabl_TC + ! + ********* + enddo + endif + endif +#endif + + ! +--Initialized Temperature Vertical Profiles + ! + ========================================= + if(IO_loc >= 2 .and. log_1D == 0) then + do i = 1, 5 + tta(i) = tsrfSL(igrdIO(i), jgrdIO(i), 1) - TfSnow + enddo + write(21, 607)(igrdIO(i), jgrdIO(i), i = 1, 5), & + (sh(igrdIO(i), jgrdIO(i)), tta(i), i = 1, 5) + do kk = 1, mz + k = mzz - kk + do i = 1, 5 + zza(i) = gplvDY(igrdIO(i), jgrdIO(i), k) * grvinv + tta(i) = pktaDY(igrdIO(i), jgrdIO(i), k) * pcap + enddo + write(21, 609)(zza(i), tta(i), i = 1, 5) + enddo + write(21, 611) + endif + ! log_1D = 1 <==> PBL initialisation is performed + log_1D = 1 + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of MAR "SUBGRID ZONE" (INCLUDING CORIOLIS FORCE) +++++++++++++++ + ! +++ EXPLICIT HYDROLOGICAL CYCLE +++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Cloud Microphysical Processes + ! + ============================= + if(micphy) then + if(track_water) then + qvDY_save = qvDY + endif + ! + ****** + call HYDgen + ! + ****** + if(track_water) then + delta_qv(:, :, :, j_hydgen) = delta_qv(:, :, :, j_hydgen) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'hydgen ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + else + ! +--Elimination of Water Vapor in Excess + ! + ==================================== + do k = 1, mz + do j = 1, my + do i = 1, mx + qvDY(i, j, k) = max(zero, qvDY(i, j, k)) + qvDY(i, j, k) = min(qvswDY(i, j, k), qvDY(i, j, k)) + enddo + enddo + enddo + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ BEGIN of LATERAL BOUNDARY CONDITIONS and FILTERING +++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +--Modification of the External Forcing + ! + ==================================== + if(mmx > 1) then + if(reaLBC) then + ! +--LBC are provided by a Large Scale (3-D) Model + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call INIlbc(ihamr, nhamr, newlbc_0) + call INIubc(ihamr, nhamr, newlbc_0) + ! + ****** + ! + ********** + if(newlbc_0 == 1) call lbcnud_par + ! + ********** + else + ! +--LBC are provided by one Sounding (Horizontal Homogeneity is assumed) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call inisnd + ! + ****** + + ! + ********** + call lbcnud_par + ! + ********** + endif + + ! +--Lateral Boundary Conditions for Mass Continuity p* + ! + ("Nudging" Type / Davies, QJRMS, 1976, pp.405--418) + ! + ("Open" Lateral Boundary Condition is possible) + ! + =================================================== + ksig = 1 + iv = 5 + + do j = 1, my + do i = 1, mx + dumy3D(i, j, 1) = pstDYn(i, j) + enddo + enddo + ! + ********** + call LBCnud_atm(dumy3D, iv, ksig) + ! + ********** + do j = 1, my + do i = 1, mx + pstDYn(i, j) = dumy3D(i, j, 1) + enddo + enddo + + ! +--START of: + ! +--Lateral Boundary Conditions for Wind, Temperature, Specific Humidity + ! + ("Nudging" Type / Davies, QJRMS, 1976, pp.405--418) + ! + ===================================================================== + + ! +--Radiative Lateral Boundary Conditions: Auxiliary Variables + ! + ========================================================== + kdim = mz + + ! +--Lateral Boundary Conditions and Horizontal Filter + ! + ================================================= + ! +--Wind x-Direction + ! + ---------------- + iv = 1 + ! +--Dummy Variable + ! + ~~~~~~~~~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = uairDY(i, j, k) + if(track_wind) then + uairDY_save(i, j, k) = uairDY(i, j, k) + endif + enddo + enddo + enddo + + ! + ********** + call LBCnud_atm(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIk_fu(1) > 0.0) then + do k = 1, mz + dumeps(k) = FIk_fu(k) + enddo + kdim = mz + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + ! +--Update + ! + ~~~~~~ + do k = 1, mz + do j = 1, my + do i = 1, mx + uairDY(i, j, k) = dumy3D(i, j, k) + if(track_wind) then + delta_u(i, j, k, i_lbcnud) = delta_u(i, j, k, i_lbcnud) + & + (uairDY(i, j, k) - uairDY_save(i, j, k)) + endif + enddo + enddo + enddo + + ! +--Wind y-Direction + ! + ---------------- + iv = 2 + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = vairDY(i, j, k) + if(track_wind) then + vairDY_save(i, j, k) = vairDY(i, j, k) + endif + enddo + enddo + enddo + + ! + ********** + call LBCnud_atm(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIk_fu(1) > 0.0) then + if(mmy <= 1) then + do k = 1, mz + dumeps(k) = FIk_su(k) + enddo + kdim = mz + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + do k = 1, mz + dumeps(k) = FIk_fu(k) + enddo + kdim = mz + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + vairDY(i, j, k) = dumy3D(i, j, k) + if(track_wind) then + delta_v(i, j, k, i_lbcnud) = delta_v(i, j, k, i_lbcnud) + & + (vairDY(i, j, k) - vairDY_save(i, j, k)) + endif + enddo + enddo + enddo + + ! +--Specific Humidity + ! + ----------------- + iv = 3 + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = qvDY(i, j, k) + enddo + enddo + enddo + + if(track_water) then + qvDY_save = qvDY + endif + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, 1, 'BAK', 'FIL_Qv') + ! + ****** + + ! + ********** + call LBCnud_atm(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIk_st(1) > 0.0) then + do k = 1, mz + ! dumeps(k) = FIslot/max(0.1,sigma(k)) ! too high filtering + dumeps(k) = FIslot / max(0.1, sqrt(sigma(k))) + enddo + kdim = mz + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), epsq) + enddo + enddo + enddo + + ! +--Restore the Water Vapor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, 1, 'SET', 'FIL_Qv') + ! + ****** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qvDY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo + if(track_water) then + delta_qv(:, :, :, j_lbcnud) = delta_qv(:, :, :, j_lbcnud) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'DYNqqm_qv ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + + ! +--Potential Temperature + ! + --------------------- + iv = 4 + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = pktaDY(i, j, k) + enddo + enddo + enddo + + ! + ********** + call LBCnud_atm(dumy3D, iv, kdim) + ! + ********** + + ! + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIk_st(1) > 0.0) then + do k = 1, mz + dumeps(k) = FIk_st(k) + enddo + kdim = mz + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + pktaDY(i, j, k) = dumy3D(i, j, k) + enddo + enddo + enddo + + ! +--TKE (Filtering only) + ! + -------------------- + + ! +--Lateral Boundary Conditions and Horizontal Filter (Microphysics) + ! + ================================================================ + + if(iterun == 0) then + FIsloQ = FIslot + endif + + if(micphy) then + ! +--Filter Parameter, H2O Variables + ! + ------------------------------- + do k = 1, mz + + dumeps(k) = FIsloQ / max(0.1, sqrt(sigma(k))) + !XF + enddo + kdim = mz + + ! +--Cloud Ice Crystals Number + ! + ------------------------- + iv = 3 + kdim = mz + ! + + do k = 1, mz + dumeps(k) = FIsloQ * 10. + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = ccniHY(i, j, k) + enddo + enddo + enddo + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, mzhyd, 'BAK', 'FIL_CN') + ! + ****** + + ! +--Nudging LBC + ! + ~~~~~~~~~~~~~ + ! + ********** + call LBCnud_000(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIsloQ > 0.0) then + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), zero) + enddo + enddo + enddo + + ! +--Restore the Hydrometeor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, mzhyd, 'SET', 'FIL_CN') + ! + ****** + do k = 1, mz + do j = 1, my + do i = 1, mx + ccniHY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo + + ! +--Cloud Ice Crystals Concentration + ! + -------------------------------- + iv = 3 + kdim = mz + do k = 1, mz + dumeps(k) = FIsloQ * 10. + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = qiHY(i, j, k) + enddo + enddo + enddo + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, mzhyd, 'BAK', 'FIL_Qi') + ! + ****** + + ! +--Nudging LBC + ! + ~~~~~~~~~~~ + ! + ********** + call LBCnud_000(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIsloQ > 0.0) then + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), zero) + enddo + enddo + enddo + + ! +--Restore the Hydrometeor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, mzhyd, 'SET', 'FIL_Qi') + ! + ****** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qiHY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo +#if(iso) + iso_label = 'DYNqqm_qi ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + + ! +--Snow Flakes + ! + ----------- + iv = 3 + kdim = mz + do k = 1, mz + dumeps(k) = FIsloQ / max(0.1, sqrt(sigma(k))) + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = qsHY(i, j, k) + enddo + enddo + enddo + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, mzhyd, 'BAK', 'FIL_Qs') + ! + ****** + + ! +--Nudging LBC + ! + ~~~~~~~~~~~ + ! + ********** + call LBCnud_000(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIsloQ > 0.0) then + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), zero) + enddo + enddo + enddo + + ! +--Restore the Hydrometeor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, mzhyd, 'SET', 'FIL_Qs') + ! + ****** + do k = 1, mz + do j = 1, my + do i = 1, mx + qsHY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo +#if(iso) + iso_label = 'DYNqqm_qs ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + + ! +--Cloud Droplets + ! + -------------- + iv = 3 + kdim = mz + do k = 1, mz + dumeps(k) = FIsloQ * 10. + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = qwHY(i, j, k) + enddo + enddo + enddo + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, mzhyd, 'BAK', 'FIL_Qw') + ! + ****** + + ! +--Nudging LBC + ! + ~~~~~~~~~~~~~ + ! + ********** + call LBCnud_000(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIsloQ > 0.0) then + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), zero) + enddo + enddo + enddo + + ! +--Restore the Hydrometeor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, mzhyd, 'SET', 'FIL_Qw') + ! + ****** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qwHY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo +#if(iso) + iso_label = 'DYNqqm_qw ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + ! +--Rain Drops + ! + ---------- + iv = 3 + kdim = mz + do k = 1, mz + dumeps(k) = FIsloQ / max(0.1, sqrt(sigma(k))) + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = qrHY(i, j, k) + enddo + enddo + enddo + + ! +--Water Mass + ! + ~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3D, mzhyd, 'BAK', 'FIL_Qr') + ! + ****** + + ! +--Nudging LBC + ! + ~~~~~~~~~~~~~ + ! + ********** + call LBCnud_000(dumy3D, iv, kdim) + ! + ********** + + ! +--Horizontal Filter + ! + ~~~~~~~~~~~~~~~~~ + if(FIsloQ > 0.0) then + if(mmy <= 1) then + ! + ********* + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ********* + else + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + endif + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3Q(i, j, k) = max(dumy3D(i, j, k), zero) + enddo + enddo + enddo + + ! +--Restore the Hydrometeor total Mass + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + ****** + call DYNqqm(dumy3Q, mzhyd, 'SET', 'FIL_Qr') + ! + ****** + + do k = 1, mz + do j = 1, my + do i = 1, mx + qrHY(i, j, k) = dumy3Q(i, j, k) + enddo + enddo + enddo + endif +#if(iso) + iso_label = 'DYNqqm_qr ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + + ! +--Filtering of Tracer Variables + ! + ============================== + if(ntracr > 0) then +#if(TC) + do n = 1, ntrac + ! +--Mass + ! + ---- + do k = 1, mz + sumv(k) = 0.0 + dumeps(k) = FIsloQ + do j = 1, my + do i = 1, mx + sumv(k) = qxTC(i, j, k, n) * pstDYn(i, j) + sumv(k) + dumy3D(i, j, k) = qxTC(i, j, k, n) + enddo + enddo + enddo + ! +--Filtering (2D) + ! + -------------- + if(mmy <= 1) then + ! + ************** + call DYNfil_1D(dumy3D, dumeps, kdim) + ! + ************** + else + ! +--Filtering (3D) + ! + -------------- + if(no_vec) then + if(openmp) then + ! + ********** + call DYNfil_3D_mp(dumy3D, dumeps, kdim) + ! + ********** + else + ! + ********** + call DYNfil_3D(dumy3D, dumeps, kdim) + ! + ********** + endif + else + ! + ************** + call DYNfilv3D(dumy3D, dumeps, kdim) + ! + ************** + endif + endif + ! +--Restore Mass + ! + ------------ + do k = 1, mz + sumvn = 0.0 + do j = 1, my + do i = 1, mx + qxTC(i, j, k, n) = max(zero, dumy3D(i, j, k)) + sumvn = qxTC(i, j, k, n) * pstDYn(i, j) + sumvn + enddo + enddo + if(sumvn > 0.0) then + sumvn = sumv(k) / sumvn + do j = 1, my + do i = 1, mx + qxTC(i, j, k, n) = qxTC(i, j, k, n) * sumvn + enddo + enddo + else + do j = 1, my + do i = 1, mx + qxTC(i, j, k, n) = 0.0 + enddo + enddo + endif + enddo + enddo +#endif + endif + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of DIABATIC INITIALISATION +++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Global Correction for p* + ! + ======================== + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ PHYSICS ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Radiative Processes and 1D Surface Physics + ! + ========================================== + if(physic) then + if(track_water) then + qvDY_save = qvDY + endif + ! + ********** + call CVAgen_MNH + ! + ********** + if(track_water) then + delta_qv(:, :, :, j_cvagen) = delta_qv(:, :, :, j_cvagen) + (qvDY - qvDY_save) + endif +#if(iso) + iso_label = 'CVAgen_MNH' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + if(mod(iterun, jtRadi) == 0) then + ! + ********** + call PHYrad_top(DistST) + call PHYrad_CEP_mp(DistST) + ! + ********** + ave_swd = 0 + do i = 2, mx - 1 + do j = 2, my - 1 + ave_swd = ave_swd + RAdsol(i, j) + enddo + enddo + + ave_swd = ave_swd / real((mx - 2) * (my - 2)) + + jtRadi = jtRadi2 + if(ave_swd <= 50) jtRadi = nint(jtRadi2 * 1.5) + if(ave_swd <= 10) jtRadi = nint(jtRadi2 * 2.0) + if(ave_swd <= 1) jtRadi = nint(jtRadi2 * 3.0) + + dtRadi = max(600., min(7200., dt * jtRadi)) + jtRadi = nint(real(dtRadi) / dt) + !cCA #if(MR) + ! cCA : MR does not exist ? + ! end if + !cCA #endif + endif + if(mod(iterun, jtPhys) == 0) then + call PHY_SISVAT_MP(ihamr, nhamr) +#if(iso) + iso_label = 'PHY_SISVAT' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + endif + endif + + ! +--Update of Surface Temperature + ! + ============================= + do n = 1, mw + do j = 1, my + do i = 1, mx + tsrfSL(i, j, n) = tsrfSL(i, j, n) + dtgSL(i, j, n) + enddo + enddo + enddo + if(reaLBC) then + ! + ********** + call LBCnud_srf + ! + ********** + + endif + + do j = 1, my + do i = 1, mx + TairSL(i, j) = 0. + enddo + enddo + do iw = 1, mw + do j = 1, my + do i = 1, mx + TairSL(i, j) = TairSL(i, j) + SLsrfl(i, j, iw) * tsrfSL(i, j, iw) + enddo + enddo + enddo + do j = 1, my + do i = 1, mx + pktaDY(i, j, mzz) = TairSL(i, j) / exp(cap * log(pstDY(i, j) + ptopDY)) + enddo + enddo + do k = 1, mz + do j = 1, my + do i = 1, mx +#if(GR) + ! 2D Gravity Current Simulation (Forcing : -10C/jour) + ! if (i >= imez-2.and. & + ! i <= imez+2 ) & + ! pktRAd(i,j,k) = pktRAd(i,j,k) -31.d-6*dt +#endif + pktaDY(i, j, k) = pktaDY(i, j, k) + pktRAd(i, j, k) + enddo + enddo + enddo +#if(AO) + ! +--cpl : GIVE FIELDS TO OASIS + ! + ========================== + !$OMP BARRIER + !$OMP MASTER + ! + *********** + call MAR_2_OASIS + ! + *********** + !$OMP END MASTER + !$OMP BARRIER +#endif + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ TIME BASE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + itexpe = itexpe + 1 + iterun = iterun + 1 + + ! + ****** + call timgeo + call timcur + ! + ****** + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ OUTPUT +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--Ice-Sheet Surface Mass Balance + ! + ============================== + if(iterun <= 1) then + nbr_call_outice = ((3600. * 24. / OutdyIB) / (dt * 144.)) ! every 10min if 1 day + nbr_call_outice = max(1, min(10, nbr_call_outice)) + do while(mod(int(real(3600. * 24. / OutdyIB) / dt) & + , nbr_call_outice) /= 0 .and. nbr_call_outice /= 1) + nbr_call_outice = nbr_call_outice - 1 + enddo + endif + if(iterun == 1 .or. mod(iterun, nbr_call_outice) == 0) then + ! + ****** + call OUTice + ! + ****** + endif + + ! +--Particular Output for Wind Vector + ! + ================================= + iout = 0 + + if(mmy > 1 .and. mod(jmmMAR, 2) == 0 .and. jssMAR == 0) iout = 1 + if(mmy == 1 .and. mod(jmmMAR, 10) == 0 .and. jssMAR == 0) iout = 1 + + if(iout == 1) then + idum = 1 + jdum = 1 + adum = 0.0 + do i = ip11, mx1 + do j = 1, my + if(adum < abs(uairDY(ip1(i), j, mz) - uairDY(im1(i), j, mz))) then + idum = i + jdum = j + adum = abs(uairDY(ip1(i), j, mz) - uairDY(im1(i), j, mz)) + endif + enddo + enddo +#if(NH) + ! +--Non-Hydrostatic Pressure Perturbation + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + pnhLav = 0. + pnh_av = 0. + do k = 1, mz + do j = jp11, my1 + pnhLav = pnhLav + pairNH(ip11, j, k) * pstDYn(ip11, j) * sigma(k) & + + pairNH(mx1, j, k) * pstDYn(mx1, j) * sigma(k) + enddo + if(mmy > 1) then + do i = ip11, mx1 + pnhLav = pnhLav + pairNH(i, jp11, k) * pstDYn(i, jp11) * sigma(k) & + + pairNH(i, my1, k) * pstDYn(i, my1) * sigma(k) + enddo + endif + do j = jp11, my1 + do i = ip11, mx1 + pnh_av = pnh_av + pairNH(i, j, k) * pstDYn(i, j) * sigma(k) + enddo + enddo + enddo + if(mmy == 1) then + pnhLav = pnhLav / (2 * mz) + pnh_av = pnh_av / ((mx - 2) * mz) + else + pnhLav = pnhLav / ((2 * (mx - 2) + 2 * (my - 2)) * mz) + pnh_av = pnh_av / ((mx - 2) * (my - 2) * mz) + endif +#endif + ! 2-D and 3-D Simulations + id6 = 6 + idum = max(idum, 7) + idum = min(idum, mx - 6) +#if(GR) + ! idum = mx - 6 +#endif +#if(BS) + if(mmy == 1) idum = imez +#endif + if(mmx == 1) then + ! 1-D Simulations + id6 = 0 + idum = 1 + endif + do i = idum - id6, idum + id6 + vecx1(i) = 10.0 * (pstDYn(i, jdum) + ptopDY) +#if(NH) + vecx3(i) = 10.0 * pstDYn(i, jdum) * pairNH(i, jdum, mz) +#endif +#if(BS) + vecx4(i) = 0.0 + do k = 1, mz + vecx4(i) = vecx4(i) + ssvSL(i, jdum, k) * qsHY(i, jdum, k) & + * pstDY(i, jdum) * dsigm1(k) & + * 1.0e3 * grvinv + enddo +#endif + enddo + if(mmx > 1 .and. mmy == 1) then + do i = imez - 10, imez + 30 + vecx2(i) = 10.0 * (pstDYn(i, 1) - pstDYn(imez - 10, 1) & + - pstDY1(i, 1) + pstDY1(imez - 10, 1)) + enddo + endif + if(mmx == 1) then + write(21, 21) itexpe, jdarGE, labmGE(mmarGE), iyrrGE, & + jhlrGE(iSND, jSND), minuGE, jsecGE, & + (uairDY(1, 1, k), k = mz - 9, mz), & + (vairDY(1, 1, k), k = mz - 9, mz) + 21 format(i5, i3, '-', a3, '-', i4, '/', i2, '.', i2, '.', i2, ' ||', 10f6.2, & + /, 24x, 'LT ||', 10f6.2) + else + if(mmy > 1) then + + write(21, 22) itexpe, jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, & + (uairDY(i, jdum, mz), i = idum - 6, idum - 1), & + idum, jdum, (uairDY(i, jdum, mz), i = idum, idum + 5), & + ttime, itizGE(idum, jdum), & + (vecx1(i), i = idum - 6, idum - 1), & + xxkm(idum) / 1000., (vecx1(i), i = idum, idum + 5) + + 22 format(i7, i3, '-', a3, '-', i4, '/', i2, '.', i2, '.', i2, ' ||', 6f7.1, & + ' | (', i3, ',', i3, ')', f5.1, ' |', 5f7.1, & + /, 3x, a8, 9x, 'UT (', i3, ') ||', 6f7.1, & + ' |', f6.0, 'km', f7.1, ' |', 5f7.1 & + ) + else + + write(21, 23) itexpe, jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE, & + (uairDY(i, jdum, mz), i = idum - 6, idum - 1), & + idum, jdum, (uairDY(i, jdum, mz), i = idum, idum + 5), & + ttime, itizGE(idum, jdum), & + (vecx1(i), i = idum - 6, idum - 1), & + xxkm(idum), (vecx1(i), i = idum, idum + 5) + + 23 format(i7, i3, '-', a3, '-', i4, '/', i2, '.', i2, '.', i2, ' ||', 6f7.1, & + ' | (', i4, ',', i2, ')', f5.1, ' |', 5f7.1, & + /, 3x, a8, 9x, 'UT (', i3, ') ||', 6f7.1, & + ' |', f6.0, 'km', f7.1, ' |', 5f7.1 & + ) + endif +#if(NH) + write(21, 24)(vecx3(i), i = idum - 6, idum - 1), & + (vecx3(i), i = idum, idum + 5) +#endif + 24 format(3x, 8x, 9x, ' ', 3x, ' ||', 6f7.1, & + ' |', 6x, ' ', f7.1, ' |', 5f7.1) + + 25 format(' p_HN Averages (Domain/LB) ||', 42x, & + ' | [Pa] ', f7.1, ' |', f7.1) + endif + ! + + if(mmx > 1 .and. mmy == 1) then + ppp = 10 * pstDY(imez - 10, 1) + write(22, 221) itexpe, (uairDY(i, 1, mz), i = imez - 10, imez + 30) + write(23, 221) itexpe, ((tairDY(i, 1, mz) - TfSnow), i = imez - 10, imez + 30) + 221 format(i10, 20f5.1, /, 10x, 21f5.1) + write(24, 223) itexpe, (vecx2(i), i = imez - 10, imez + 30) + 223 format(i10, 20f5.2, /, 10x, 21f5.2) + endif + ! + + + endif + + ! + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of the INTERNAL TIME INCREMENTATION (nboucl over dt) +++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! + +#if(iso) + iso_label = 'TIME end ' + iso_time = iso_time + 1 + call mariso_write_file(iso_time, iso_label) +#endif(iso) + enddo + !cCA iboucl = iboucl + 1 + !cCA if (iboucl <= nboucl) go to 2 + ! + + ! +--Vertical Wind Speed wairDY (z Coordinate system) + ! + ================================================ + ! + + ! cCA : stand alone surface model disactivated for simplification (GO TO) + ! #if(SA) + ! if (sALONE) go to 40 + ! #endif + ! + + ! + ****** + if(.not. convec .and. mmx > 1) call dynwww + ! + ****** + ! + + ! + + + !cCA 40 continue + + ! +--OUTPUT for Graphs + ! + ================= + !cCA iprint = iprint + 1 + if(log_nc == 1) then + ! + dt_Loc is assumed + ! + ****** + ipr_nc = ipr_nc + 1 + call out_nc(ipr_nc) + ! + ****** + else + ! + ****** + call OUTgks + ! + ****** + endif + + ! +--Save of Model Variables + ! + ======================= + if(safVAR .and. jdh_LB /= -1) then + ! + ****** + call outsav + ! + ****** + else if(jdh_LB == -1) then + write(6, 6600) + 6600 format(/, '############################################', & + /, '# NO LATERAL BOUNDARY CONDITIONS AVAILABLE #', & + /, '############################################', /, 1x) + stop + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end of the EXTERNAL TIME INCREMENTATION (nprint over dt * nboucl) ++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + enddo + !cCA if (iprint >= nprint) go to 30 + !cCA go to 3 + !cCA 30 continue + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ CLOSE FILES ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + close(unit = 4) + close(unit = 21) + + if(mx > 1 .and. my <= 1) then + close(unit = 22) + close(unit = 23) + close(unit = 24) + endif + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ end OF RUN +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +#if(SB) + ! + ****** + call sbcnew + ! + ****** +#endif +#if(AO) + ! +--Coupling termination + ! + ==================== + !$OMP BARRIER + !$OMP MASTER + ! + ********************* + call oasis_terminate(info) + ! + ********************* + if(info /= OASIS_Ok) then + WRITE(6, *) 'An error occured in ' + WRITE(6, *) 'oasis_terminate = ' + WRITE(6, *) info + endif + !$OMP END MASTER + !$OMP BARRIER +#endif + + ! +--MAR termination + ! + =============== + open(unit = 1, status = 'unknown', file = 'MAR.OK') + write(1, 1000) itexpe, jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE + write(6, 1000) itexpe, jdarGE, labmGE(mmarGE), iyrrGE, & + jhurGE, minuGE, jsecGE + 1000 format('MAR execution stopped normaly at iteration', i8, & + /, 'Time is', i13, '-', a3, '-', i4, & + '/', i2, '.', i2, '.', i2, ' UT') + close(unit = 1) + + stop +endprogram mar diff --git a/MAR/code_mar/mar0sv_mod.f90 b/MAR/code_mar/mar0sv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a26332182eddbb065eb13658710a4a85670e57cd --- /dev/null +++ b/MAR/code_mar/mar0sv_mod.f90 @@ -0,0 +1,49 @@ +module mar0sv + use mardim + use mar_sv + use mardsv + implicit none + integer, save :: islpSV(-nsol:0) + integer, save :: isnpSV(nsno) + integer, save :: islmSV(-nsol:0) + integer, parameter :: nkhy = 50 + real, save :: Implic, Explic + ! dzmiSV : dz_(i-1/2) + real, save :: dzmiSV(-nsol:0) + ! dzi_SV : dz_(i-1)/(dz_(i)+dz_(i-1)) + real, save :: dzi_SV(-nsol:0) + ! dziiSV : dz_(i) /(dz_(i)+dz_(i-1)) + real, save :: dziiSV(-nsol:0) + ! dtz_SV : dt / dz + real, save :: dtz_SV(-nsol:0) + ! dtz_SV2 : dt / dz + real, save :: dtz_SV2(-nsol:0) + ! dz78SV : 7/8 (dz) + real, save :: dz78SV(-nsol:0) + ! dz34SV : 3/4 (dz) + real, save :: dz34SV(-nsol:0) + ! dz_8SV : 1/8 (dz) + real, save :: dz_8SV(-nsol:0) + ! dzAvSV : 1/8dz_(-1)+3/4dz+1/8dz_(+1) + real, save :: dzAvSV(-nsol:0) + ! OcndSV : Swab Ocean / Soil Ratio + real, save :: OcndSV + ! RF__SV : Root Fraction + real, save :: RF__SV(0:nvgt, -nsol:0) + ! rocsSV : Soil Contribution to (ro c)_s + real, save :: rocsSV(0:nsot) + ! etamSV : Soil Minimum Humidity + real, save :: etamSV(0:nsot) + ! s1__SV : ... X eta**( b+2), DR97(3.36) + real, save :: s1__SV(0:nsot) + ! s2__SV : ... X eta**(2b+3), DR97(3.35) + real, save :: s2__SV(0:nsot) + ! aKdtSV : Khyd=a*eta+b: a * dt + real, save :: aKdtSV(0:nsot, 0:nkhy) + ! bKdtSV : Khyd=a*eta+b: b * dt + real, save :: bKdtSV(0:nsot, 0:nkhy) + ! aKdtSV2 : Khyd=a*eta+b: a * dt + real, save :: aKdtSV2(0:nsot, 0:nkhy) + ! bKdtSV2 : Khyd=a*eta+b: b * dt + real, save :: bKdtSV2(0:nsot, 0:nkhy) +endmodule mar0sv diff --git a/MAR/code_mar/mar_2_oasis.f90 b/MAR/code_mar/mar_2_oasis.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5ff32f3796adf5013be93617f56ed582b6119737 --- /dev/null +++ b/MAR/code_mar/mar_2_oasis.f90 @@ -0,0 +1,227 @@ +subroutine MAR_2_OASIS + ! +--------------------------------------------------------------------------+ + ! | 1-12-2019 | + ! | subroutine MAR_2_OASIS transfers MAR variables to OASIS | + ! | | + ! | | + ! | A chaque pas de tps, apres fromcpl, intocpl est appele ici; | + ! | si il_time_secs correspond au pas de temps precedant le couplage, | + ! | alors son action est effective (via prism_put), | + ! | et MAR envoie ses champs via givfld (oasis) | + ! | a NEMO au pas de temps du couplage. | + ! | L'appel a chaque pas de temps sert au moins au calcul de moyennes | + ! | (cf AVERAGE dans namcouple) | + ! | | + ! | cf mar_module.f90 | + ! | cf OASIS-3 user guide (december 2004) | + ! +--------------------------------------------------------------------------+ + USE mod_oasis + USE mar_module + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_hy + use mar_ra + use mar_sl + use mar_ao + use mar_wk + + implicit none + + ! +--MAR Variables + ! + ---------------- + + integer i, j, k, m, n + + ! +--cpl-1 Let's extract or calculate the usefull fields + ! + =================================================== + + if(iterun == 0) then + write(6, *) 'Ini summed precip for OASIS' + write(6, *) 'MAR first time step : iterun = ', iterun + do i = 1, mx; do j = 1, my + lprecipAO_t2(i, j) = 0 + sprecipAO_t2(i, j) = 0 + enddo; + enddo + endif + + !cleaning + do i = 1, mx; do j = 1, my + evapAO(i, j) = 0. + ievpAO(i, j) = 0. + lprecipAO(i, j) = 0. + sprecipAO(i, j) = 0. + enddo; + enddo + + !rotation of wind on a regular grid + call wind_rot(UairDY(:, :, mz), VairDY(:, :, mz), uuao, vvao) + + do i = 2, mx - 1 + do j = 2, my - 1 + lprecipAO_t1(i, j) = lprecipAO_t2(i, j) !total liq. precip since iterun=0 at dt-1 + lprecipAO_t2(i, j) = rainHY(i, j) !total liq. precip since iterun=0 at dt + lprecipAO(i, j) = (lprecipAO_t2(i, j) - lprecipAO_t1(i, j)) !liquid precip between dt-1 and dt (mm.w.e) + + sprecipAO_t1(i, j) = sprecipAO_t2(i, j) !total sol. precip since iterun=0 dt-1 + sprecipAO_t2(i, j) = snowHY(i, j) + crysHY(i, j) !total sol. precip since iterun=0 (at itexpe) + sprecipAO(i, j) = (sprecipAO_t2(i, j) - sprecipAO_t1(i, j)) !solid precip between dt-1 and dt (mm.w.e) + + !Conversion m.w.e to kg.m-2.s-1 + lprecipAO(i, j) = lprecipAO(i, j) * 1000./dt + sprecipAO(i, j) = sprecipAO(i, j) * 1000./dt + + ! for blowing snow ? + ! if (sprecipAO(i,j).ge.0.) then + ! upsnowAO(i,j) = 0. + ! else + ! upsnowAO(i,j) = -sprecipAO(i,j) + ! sprecipAO(i,j) = 0. + ! end if + + evapAO(i, j) = -SLuqsl(i, j, 1) * rolvDY(i, j, mz) * 1.e3 !evaporation over ocean (negative, kg.m-2.s-1) + ievpAO(i, j) = -SLuqsl(i, j, 2) * rolvDY(i, j, mz) * 1.e3 !sublimation over sea ice (negative, kg.m-2.s-1) + evapAO(i, j) = evapAO(i, j) + ievpAO(i, j) !Evap total (ocean + sublimation) + + !Utilise maintenant vent rot au lieu de uairDY, vairDY + + do n = 1, 2 + if(n == 1) then ! ocean + cpa = cp * (1 + qvswDY(i, j, mz) * cpvir) + + ! downward solar (W.m-2) + radsolAO(i, j, n) = RAdsol(i, j) * (1.0 - albAO(i, j, n)) + ! downward IR (net, W.m-2) + radirAO(i, j, n) = RAd_ir(i, j) & + - EmiWatao * stefan * tsrfsl(i, j, n)**4 + ! downward sensible (W.m-2) + hsenAO(i, j, n) = SLutsl(i, j, n) * cpa * rolvDY(i, j, mz) * 1.e3 + ! downward latent (W.m-2) + hlatAO(i, j, n) = SLuqsl(i, j, n) * rolvDY(i, j, mz) * 1.e3 * Lv_H2O + ! downward non solar (W.m-2) + radtotAO(i, j, n) = radirAO(i, j, n) & + + hsenAO(i, j, n) & + + hlatAO(i, j, n) + + ! UoceAO en dehors de domaine NEMO mais dans MAR = valeur plus proche voisin + ! dans NEMO lors du couplage. Evite les 0 sur les bords? + + normdUAO = sqrt((uuao(i, j) - UoceAO(i, j))**2 & + + (vvao(i, j) - VoceAO(i, j))**2) + ! wind stress on T grid (N.m-2) + TauxtAO(i, j, n) = cdmSL(i, j, n)**2 * normdUAO * rolvDY(i, j, mz) & + * (uuao(i, j) - UoceAO(i, j)) * 1.e3 + TauytAO(i, j, n) = cdmSL(i, j, n)**2 * normdUAO * rolvDY(i, j, mz) & + * (vvao(i, j) - VoceAO(i, j)) * 1.e3 + + endif + if(n == 2) then ! sea ice + ! moist air heat capacity for ice + cpa = cp * (1 + qvsiDY(i, j, mz) * cpvir) + + ! downward solar (W.m-2) + radsolAO(i, j, n) = RAdsol(i, j) * (1.0 - albAO(i, j, n)) + ! downward IR (net, W.m-2) + radirAO(i, j, n) = RAd_ir(i, j) & + - Emisnoao * stefan * tsrfsl(i, j, n)**4 + ! downward sensible (W.m-2) + hsenAO(i, j, n) = SLutsl(i, j, n) * cpa * rolvDY(i, j, mz) * 1.e3 + ! downward latent (W.m-2) + hlatAO(i, j, n) = SLuqsl(i, j, n) * rolvDY(i, j, mz) * 1.e3 * Ls_H2O + ! downward non solar (W.m-2) + radtotAO(i, j, n) = radirAO(i, j, n) & + + hsenAO(i, j, n) & + + hlatAO(i, j, n) + + ! Derivee des flux non solaire selon la temperature pour eviter les oscillations + ! latent flux derivative/T Clausius-Clapeyron for Dqsat/DT + DFlAO(i, j, n) = -rolvDY(i, j, mz) * SLuusl(i, j, n) & + * cdhSL(i, j, n) * R_Rv * 1.e3 & + * (Ls_H2O)**2 & + * (qvsiDY(i, j, mzz)) & + / (RDryAi * tsrfsl(i, j, n)**2) + ! sensible flux derivative/T + DFsAO(i, j, n) = -rolvDY(i, j, mz) * cpa * 1.e+3 & + * cdhSL(i, j, n) * SLuusl(i, j, n) + ! IR flux derivative/T + DFiAO(i, j, n) = -4 * epsAO * stefan * tsrfsl(i, j, n)**3 + ! total derivative/T + DFtotAO(i, j, n) = DFlAO(i, j, n) + DFsAO(i, j, n) + DFiAO(i, j, n) + + ! UiceAO ViceAO en dehors de domaine NEMO mais dans MAR = valeur plus proche + ! voisin dans NEMO lors du couplage. Evite les 0 sur les bords? + normdUAO = sqrt((uuao(i, j) - UiceAO(i, j))**2 & + + (vvao(i, j) - ViceAO(i, j))**2) + + !uairday and vairday has been changed by rorated wind + !wind stress on T grid (N.m-2) + TauxtAO(i, j, n) = cdmSL(i, j, n)**2 * normdUAO * rolvDY(i, j, mz) & + * (uuao(i, j) - UiceAO(i, j)) * 1.e3 + TauytAO(i, j, n) = cdmSL(i, j, n)**2 * normdUAO * rolvDY(i, j, mz) & + * (vvao(i, j) - ViceAO(i, j)) * 1.e3 + + endif + + enddo + + enddo + enddo + + do n = 1, 2 + do i = 1, mx - 1 + do j = 1, my - 1 + TauxuAO(i, j, n) = 0.5 * (TauxtAO(i, j, n) + TauxtAO(i + 1, j, n)) ! U grid + TauyuAO(i, j, n) = 0.5 * (TauytAO(i, j, n) + TauytAO(i + 1, j, n)) ! U grid + TauxvAO(i, j, n) = 0.5 * (TauxtAO(i, j, n) + TauxtAO(i, j + 1, n)) ! V grid + TauyvAO(i, j, n) = 0.5 * (TauytAO(i, j, n) + TauytAO(i, j + 1, n)) ! V grid + enddo + enddo + do i = 1, mx !bord des grilles + TauxvAO(i, my, n) = TauxtAO(i, my, n) + TauyvAO(i, my, n) = TauxtAO(i, my, n) + enddo + do j = 1, my + TauxuAO(mx, j, n) = TauxtAO(mx, j, n) + TauyuAO(mx, j, n) = TauxtAO(mx, j, n) + enddo + enddo + + do i = 1, mx + do j = 1, my + do n = 1, 2 + if(maskSL(i, j) /= 1) then + TauxuAO(i, j, n) = 0. + TauyuAO(i, j, n) = 0. + TauxvAO(i, j, n) = 0. + TauyvAO(i, j, n) = 0. + DFtotAO(i, j, n) = 0. + endif + enddo + enddo + enddo + + ! +--cpl-2 Now let's give the fields to oasis + ! + ======================================== + + il_time_secs = iterun * idt + ! temps en sec depuis le debut du run, au pas precedant + ! write(*, *) ' call intocpl, itexpe =', itexpe !for debug + + call intocpl(il_time_secs, radsolAO(:, :, 2), radsolAO(:, :, 1), & + radtotAO(:, :, 2), radtotAO(:, :, 1), DFtotAO(:, :, 2), & + evapAO, lprecipAO, sprecipAO, & + ievpAO, & + TauxuAO(:, :, 1), TauxuAO(:, :, 2), & + TauyuAO(:, :, 1), TauyuAO(:, :, 2), & + TauxvAO(:, :, 1), TauxvAO(:, :, 2), & + TauyvAO(:, :, 1), TauyvAO(:, :, 2)) + ! + ******* + + return +endsubroutine MAR_2_OASIS + diff --git a/MAR/code_mar/mar_2d_mod.f90 b/MAR/code_mar/mar_2d_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6f94e7c994ad81888e14bfdc7f0d9dcf765f4cb5 --- /dev/null +++ b/MAR/code_mar/mar_2d_mod.f90 @@ -0,0 +1,64 @@ +module mar_2d + use mardim + implicit none +!! integer, save :: indx(klon) +!! integer, save :: indy(klon) +! integer, save :: jhlr2D(klon) +! integer, save :: ioutIO(5) +! character(len = 20) :: mphy2D(klon) +! real, save :: pkta2D(klon, klev) +! real, save :: tair2D(klon, klev) +! real, save :: rolv2D(klon, klev) +! real, save :: pst2D(klon) +! real, save :: gpmi2D(klon, klev + 1) +! real, save :: gplv2D(klon, klev + 1) +! real, save :: uair2D(klon, klev) +! real, save :: vair2D(klon, klev) +! real, save :: qv2D(klon, klev) +! real, save :: pk2D(klon, klev) +! real, save :: pst2Dn(klon) +! real, save :: wair2D(klon, klev) +! real, save :: qg2D(klon, klev) +! real, save :: qw2D(klon, klev) +! real, save :: qr2D(klon, klev) +! real, save :: qi2D(klon, klev) +! real, save :: qs2D(klon, klev) +! real, save :: cfra2D(klon, klev) +! real, save :: dqi2D(klon, klev) +! real, save :: dqw2D(klon, klev) +! real, save :: qvsw2D(klon, klev + 1) +! real, save :: qvsi2D(klon, klev + 1) +! real, save :: ccni2D(klon, klev) +! real, save :: ccnw2D(klon, klev) +! real, save :: rain2D(klon) +! real, save :: snow2D(klon) +! real, save :: crys2D(klon) +! real, save :: hlat2D(klon, klev) +! real, save :: snf2D(klon, klev) +! real, save :: sbl2D(klon, klev) +! real, save :: rnf2D(klon, klev) +! real, save :: evp2D(klon, klev) +! real, save :: smt2D(klon, klev) +! real, save :: ect_2D(klon, klev) +! real, save :: TUkv2D(klon, klev) +! real, save :: prec2D(klon) +! real, save :: snoh2D(klon) +! real, save :: tsrf2D(klon) + real, save :: W2xyz1(klon, klev) + real, save :: W2xyz2(klon, klev) + real, save :: W2xyz3(klon, klev) + real, save :: W2xyz4(klon, klev) + real, save :: W2xyz5(klon, klev + 1) + real, save :: W2xyz6(klon, klev + 1) + real, save :: W2xyz7(klon, klev + 1) + real, save :: W2xyz8(klon, klev + 1) + real, save :: W2xyz9(klon, klev) + real, save :: W2xyz0(klon, klev) +! real, save :: wat01D(klon) +! real, save :: wat11D(klon) +! real, save :: wat21D(klon) +! real, save :: watf1D(klon) +! real, save :: enr01D(klon) +! real, save :: enr11D(klon) +! real, save :: enr21D(klon) +endmodule mar_2d diff --git a/MAR/code_mar/mar_allocate.f90 b/MAR/code_mar/mar_allocate.f90 new file mode 100644 index 0000000000000000000000000000000000000000..594967f9f846eae2e90f2c53b94d9b302df7f49b --- /dev/null +++ b/MAR/code_mar/mar_allocate.f90 @@ -0,0 +1,59 @@ +subroutine mar_allocate + + ! +------------------------------------------------------------------------+ + ! | MAR initialization 28-11-2022 MAR | + ! | subroutine mar_allocate is used to initialize allocatable variables | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_ra + use mar_sl + use mar_sv + use mar_tv + use mar_hy + use mar_ca + use marssn + use mar_ib + use marsib + use mar_wk + use mar_io + use mardsv + use mar_te + use mar_ao + use mar0sv + use mar_tu + use radcep + use mar_lb + use marvec + use mar_ao + use mar_ub + use mar_bs + + implicit none + + call mar_ao_init() + call mar_bs_init() + call mar_ca_init() + call mar_dy_init() + call mar_hy_init() + call mar_ib_init() + call mar_lb_init() + call mar_ra_init() + call mar_sl_init() + call marssn_init() + call mar_te_init() + call mar_tu_init() + call mar_tv_init() + call mar_ub_init() + call marvec_init() + call mar_wk_init() + call radcep_init() + + return + +endsubroutine diff --git a/MAR/code_mar/mar_ao_mod.f90 b/MAR/code_mar/mar_ao_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a5c8595d0ee042ee2549a137fa55279325f10ecf --- /dev/null +++ b/MAR/code_mar/mar_ao_mod.f90 @@ -0,0 +1,174 @@ +! mar_ao : atmosphere-ocean (MAR-NEMO) coupling +! ============================================= +! Sea Ice/Snow albedo for SISVAT albAOsisv is defined in MARySV.inc +module mar_ao + use mardim + implicit none + ! fields given by ocean/ice model + ! =============================== + ! sicsAO: sea ice fraction (from 0 to 1) + real(kind=8), save, allocatable :: sicsAO(:, :) + ! hicAO : sea ice thickness + real(kind=8), save, allocatable :: hicAO(:, :) + ! hsnoAO : snow thickness over sea ice + real(kind=8), save, allocatable :: hsnoAO(:, :) + ! albAO : weighted albedo on sea-ice (2) or on open-water (1) + real(kind=8), save, allocatable :: albAO(:, :, :) + ! UoceAO : surface ocean velocity along X-axis + real(kind=8), save, allocatable :: UoceAO(:, :) + ! VoceAO : surface ocean velocity along Y-axis + real(kind=8), save, allocatable :: VoceAO(:, :) + ! UiceAO : surface ice velocity along X-axis + real(kind=8), save, allocatable :: UiceAO(:, :) + ! ViceAO : surface ice velocity along Y-axis + real(kind=8), save, allocatable :: ViceAO(:, :) + ! srftAO : surf. temperature (K) + real(kind=8), save, allocatable :: srftAO(:, :, :) + integer, save :: aoss + integer, save :: aogla + integer, save :: aoalb + integer, save :: aotic + integer, save :: aohic + integer, save :: aohsn + integer, save :: ao_uo + integer, save :: ao_vo + ! if gt 0 then MAR has receveid the field => update of the value + integer, save :: ao_ui + integer, save :: ao_vi + ! fields used to feat the ocean/ice model + ! ======================================= + ! hlatAO : downard latent turbulent heat flux (W.m-2) + real(kind=8), save, allocatable :: hlatAO(:, :, :) + ! hsenAO : downard sensible turbulent heat flux (W.m-2) + real(kind=8), save, allocatable :: hsenAO(:, :, :) + ! radsolAO : downard solar heat flux (W.m-2) + real(kind=8), save, allocatable :: radsolAO(:, :, :) + ! radirAO : downard infrared heat flux (W.m-2) + real(kind=8), save, allocatable :: radirAO(:, :, :) + ! radtotAO : downard total non solar heat flux (W.m-2) + real(kind=8), save, allocatable :: radtotAO(:, :, :) + ! DFlAO : latent flux derivative /temperature (W.m-2.K-1) + real(kind=8), save, allocatable :: DFlAO(:, :, :) + ! DFsAO : sensible flux derivative /temperature (W.m-2.K-1) + real(kind=8), save, allocatable :: DFsAO(:, :, :) + ! DFiAO : infrared flux derivative /temperature (W.m-2.K-1) + real(kind=8), save, allocatable :: DFiAO(:, :, :) + ! DFtotAO : total non solar heat flux derivative /temperature (W.m-2.K-1) + real(kind=8), save, allocatable :: DFtotAO(:, :, :) + real(kind=8), save :: normdUAO + real(kind=8), save, allocatable :: ievpAO(:, :) + ! lp_accuAO,sp_accuAO,lprecipAO_t1,lprecipAO_t2,sprecipAO_t1,sprecipAO_t2 + ! (usefull to express lprecip and sprecip in kg.m-2.s-1) + real(kind=8), save, allocatable :: lp_accuAO(:, :) + real(kind=8), save, allocatable :: sp_accuAO(:, :) + ! evapAO : evaporation on ice or water (kg.m-2.s-1) + real(kind=8), save, allocatable :: evapAO(:, :) + ! lprecipAO : liquid precipitation (kg.m-2.s-1) + real(kind=8), save, allocatable :: lprecipAO(:, :) + real(kind=8), save, allocatable :: lprecipAO_t1(:, :) + real(kind=8), save, allocatable :: lprecipAO_t2(:, :) + ! sprecipAO : solid precipitation (kg.m-2.s-1) + real(kind=8), save, allocatable :: sprecipAO(:, :) + real(kind=8), save, allocatable :: sprecipAO_t1(:, :) + real(kind=8), save, allocatable :: sprecipAO_t2(:, :) + ! upsnowAO : surface upward snow flux where sea ice (kg.m-2.s-1) + ! UsrfAO : surface wind following the X-axis (m.s-1) + real(kind=8), save, allocatable :: UsrfAO(:, :) + ! VsrfAO : surface wind following the Y-axis (m.s-1) + real(kind=8), save, allocatable :: VsrfAO(:, :) + ! TauxuAO : weighted surface downward X-axis stress on U-grid (Pa) + real(kind=8), save, allocatable :: TauxuAO(:, :, :) + ! TauyuAO : weighted surface downward Y-axis stress on U-grid (Pa) + real(kind=8), save, allocatable :: TauyuAO(:, :, :) + ! TauxvAO : weighted surface downward X-axis stress on V-grid (Pa) + real(kind=8), save, allocatable :: TauxvAO(:, :, :) + ! TauyvAO : weighted surface downward Y-axis stress on V-grid (Pa) + real(kind=8), save, allocatable :: TauyvAO(:, :, :) + ! TauxtAO : weighted surface downward X-axis stress on T-grid (Pa) + real(kind=8), save, allocatable :: TauxtAO(:, :, :) + ! TauytAO : weighted surface downward Y-axis stress on T-grid (Pa) + real(kind=8), save, allocatable :: TauytAO(:, :, :) + ! usefull fields for coupling + ! =========================== + ! il_time_secs : time counter for coupling + integer, save :: il_time_secs + ! jtCpl : frequency of coupling (in time steps) + integer, save :: jtCpl + ! iH2O : time counter usefull for precip calculation + integer, save :: iH2O + integer, save :: info + integer, save :: il_time_exp0 + integer, save :: tocken_AO + ! t_Cpl : time between 2 intocpl call (s) + real, save :: t_Cpl + ! epsAO : emissivity + real, save :: epsAO + ! cpv : water vapor specific heat (J/kg/K) + real, save :: cpv + ! cpa : air specific heat (wet air) (J/kg/K) + real, save :: cpa + ! cpvir : [cpv/cp - 1] (usefull value for qsat) (-) + real, save :: cpvir + ! R_Rv : [gas cste dry air=287.0] / [gas cste moist air=461.5] + real, save :: R_Rv + ! uuao: uair_dy (u component of the wind) on a regular grid + real, save :: uuao(mx, my) + ! vvao: vair_dy (v component of the wind) on a regular grid + real, save :: vvao(mx, my) + logical coupling_ao + real, save :: weightao(mx, my) + real, save :: weightao_sst(mx, my) + real, save :: weightao_sic(mx, my) + real, save :: weightao_st(mx, my) + real, save :: weightao_al(mx, my) + real, save :: weightao_sit(mx, my) + real, save :: weightao_snt(mx, my) + character(len=300) fileao + +contains + + subroutine mar_ao_init() + + use mardim, only: mx, my, mw + implicit none + + allocate(sicsAO(mx, my)) + allocate(hicAO(mx, my)) + allocate(hsnoAO(mx, my)) + allocate(albAO(mx, my, mw)) + allocate(UoceAO(mx, my)) + allocate(VoceAO(mx, my)) + allocate(UiceAO(mx, my)) + allocate(ViceAO(mx, my)) + allocate(srftAO(mx, my, mw)) + allocate(hlatAO(mx, my, mw)) + allocate(hsenAO(mx, my, mw)) + allocate(radsolAO(mx, my, mw)) + allocate(radirAO(mx, my, mw)) + allocate(radtotAO(mx, my, mw)) + allocate(DFlAO(mx, my, mw)) + allocate(DFsAO(mx, my, mw)) + allocate(DFiAO(mx, my, mw)) + allocate(DFtotAO(mx, my, mw)) + allocate(ievpAO(mx, my)) + allocate(lp_accuAO(mx, my)) + allocate(sp_accuAO(mx, my)) + allocate(evapAO(mx, my)) + allocate(lprecipAO(mx, my)) + allocate(lprecipAO_t1(mx, my)) + allocate(lprecipAO_t2(mx, my)) + allocate(sprecipAO(mx, my)) + allocate(sprecipAO_t1(mx, my)) + allocate(sprecipAO_t2(mx, my)) + allocate(UsrfAO(mx, my)) + allocate(VsrfAO(mx, my)) + allocate(TauxuAO(mx, my, mw)) + allocate(TauyuAO(mx, my, mw)) + allocate(TauxvAO(mx, my, mw)) + allocate(TauyvAO(mx, my, mw)) + allocate(TauxtAO(mx, my, mw)) + allocate(TauytAO(mx, my, mw)) + + endsubroutine mar_ao_init + +endmodule mar_ao diff --git a/MAR/code_mar/mar_bs_mod.f90 b/MAR/code_mar/mar_bs_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..579d93a39bdc449a2bcc55aa8c01aafc771d8bb8 --- /dev/null +++ b/MAR/code_mar/mar_bs_mod.f90 @@ -0,0 +1,40 @@ +! mar_bs : mar blowing snow +! ========================= +module mar_bs + use mardim + implicit none + integer, parameter :: nn_pro = 30 + ! BS_pro : Normalized Blowing Snow Profile (Suspension Layer) + real, save :: BS_pro(nn_pro) + ! z0SaBS : Z0 due to Sastrugi Height [m] + real, save, allocatable :: z0SaBS(:, :, :) + ! z0emBS : Z0 due to Snow Erosion [m] + real, save, allocatable :: z0emBS(:, :, :) + ! hSalBS : Height above the Surface (Top of Saltation Layer) [m] + real, save :: hSalBS(mx, my) + ! u_stBS : Time Ave. Frict. Vel. for Blowing Snow Surface Turbulent Flux [m/s] + real, save :: u_stBS(mx, my) + ! wSalBS : Blowing Snow Sedimentation (Top of Saltation Layer) [m/s] + real, save :: wSalBS(mx, my) + real, save :: FracBS + real, save :: ua_0BS(mx, my) + real, save :: va_0BS(mx, my) + real, save :: VVs_BS(mx, my) + real, save :: DDs_BS(mx, my) + real, save :: RRs_BS(mx, my) + + +contains + + subroutine mar_bs_init() + + use mardim, only: mx, my,mw + implicit none + + allocate(z0SaBS(mx, my, mw)) + allocate(z0emBS(mx, my, mw)) + + endsubroutine mar_bs_init + + +endmodule mar_bs diff --git a/MAR/code_mar/mar_ca_mod.f90 b/MAR/code_mar/mar_ca_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..679a73aa7ef70b2a07d84e89e681aa8a2e178787 --- /dev/null +++ b/MAR/code_mar/mar_ca_mod.f90 @@ -0,0 +1,37 @@ +! mar_ca : convective adjustment scheme +! ===================================== +module mar_ca + use mardim + implicit none + ! Time interval (transformed in number of iterations) + ! between two checks of convective unstability + integer, save :: adj_CA(mx, my) + integer, save :: int_CA + ! Characteristic Time Scale for Convection + real, save :: capeCA(mx, my) + real, save, allocatable :: dpktCA(:, :, :) + real, save, allocatable :: dqv_CA(:, :, :) + real, save, allocatable :: dqw_CA(:, :, :) + real, save, allocatable :: dqi_CA(:, :, :) + real, save :: drr_CA(mx, my) + real, save :: dss_CA(mx, my) + real, save :: dsn_CA(mx, my) + real, save :: rainCA(mx, my) + real, save :: snowCA(mx, my) + real, save :: tau_CA(mx, my) + +contains + + subroutine mar_ca_init() + + use mardim, only: mx, my, mz + implicit none + + allocate(dpktCA(mx, my, mz)) + allocate(dqv_CA(mx, my, mz)) + allocate(dqw_CA(mx, my, mz)) + allocate(dqi_CA(mx, my, mz)) + + endsubroutine mar_ca_init + +endmodule mar_ca diff --git a/MAR/code_mar/mar_cu_mod.f90 b/MAR/code_mar/mar_cu_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1f6129cc6c42b94519ed38bcc5e3f83dbee9155f --- /dev/null +++ b/MAR/code_mar/mar_cu_mod.f90 @@ -0,0 +1,16 @@ +! mar_cu : cubic spline interpolation +! =================================== +module mar_cu + use mardim + implicit none + ! Xh and Xb are cubic spline auxiliary variables + ! used for HORIZONTAL advection (blank->x,w->y) + real, save :: CUspxh(mx) + real, save :: CUspxb(mx) + real, save :: CUspyh(my) + real, save :: CUspyb(my) + ! Xh and Xb are cubic spline auxiliary variables + ! used for VERTICAL advection (routine cubver) + real, save :: CUspzh(mz) + real, save :: CUspzb(mz) +endmodule mar_cu diff --git a/MAR/code_mar/mar_dy_mod.f90 b/MAR/code_mar/mar_dy_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5fc6588e2fbaeb78bbc3fa3f62956e0625e744a5 --- /dev/null +++ b/MAR/code_mar/mar_dy_mod.f90 @@ -0,0 +1,105 @@ +! mar_dy: mar dynamical variables +! =============================== +module mar_dy + use mardim + implicit none + logical, save :: openmp + ! iyrDYN: Year + integer, save :: iyrDYN + ! mmaDYN: Month + integer, save :: mmaDYN + ! jdaDYN: Day + integer, save :: jdaDYN + ! jhuDYN: Hour (UT) + integer, save :: jhuDYN + ! uairDY : x-wind speed component (m/s) + real, save :: uairDY(mx, my, mz) + ! vairDY : y-wind speed component (m/s) + real, save :: vairDY(mx, my, mz) + ! pktaDY : potential temperature divided by 100.[kPa]**(R/Cp) + real, save :: pktaDY(mx, my, mzz) + ! tairDY : real temperature (K) + real, save :: tairDY(mx, my, mz) + ! pkDY : Exner Potential = p[kPa]**(R/Cp) + real, save, allocatable :: pkDY(:, :, :) + ! qvsiDY : Saturation Specific Humidity over Ice (kg/kg) + real, save, allocatable :: qvsiDY(:, :, :) + ! qvDY : Specific Humidity (kg/kg) + real, save :: qvDY(mx, my, mz) + ! qvswDY : Saturation Specific Humidity over Water (kg/kg) + real, save, allocatable :: qvswDY(:, :, :) + ! pstDY1 : Model Pressure Depth at INITIAL Time Step (kPa) + real, save :: pstDY1(mx, my) + ! opstDY : Model Pressure Depth at previous Time Step (kPa) + real, save :: opstDY(mx, my) + ! pstDY : Model Pressure Depth at current Time Step (kPa) + real, save :: pstDY(mx, my) + ! pstDYn: Model Pressure Depth at next Time Step (kPa) + real, save :: pstDYn(mx, my) + ! pstDY2: Model Pressure Depth (current) (squared) (kPa2) + real, save :: pstDY2(mx, my) + ! ptopDY: Pressure at Model Top (kPa) + real, save :: ptopDY + ! fcorDY: Coriolis Parameter (s-1) + real, save :: fcorDY(mx, my) + ! SFm_DY: Map Scale Factor (-) + real, save :: SFm_DY(mx, my) + ! rolvDY: air specific mass index (i,j,k) at (i,j,k) (Ton/m3) + real, save :: rolvDY(mx, my, mz) + ! romiDY: air specific mass index (i,j,k) at (i,j,k+1/2) (Ton/m3) + real, save, allocatable :: romiDY(:, :, :) + ! virDY: air loading by water (vapor, liquid and solid) + real, save :: virDY(mx, my, mz) + ! ubefDY: uairDY at Previous Time Step (in the Leap-Frog) + real, save, allocatable :: ubefDY(:, :, :) + ! vbefDY: vairDY at Previous Time Step (in the Leap-Frog) + real, save, allocatable :: vbefDY(:, :, :) + ! dgzXDY is the geopotential gradient just before current time step + ! X=(x->x direction, y->y direction) + real, save, allocatable :: dgzxDY(:, :, :) + real, save, allocatable :: dgzyDY(:, :, :) + ! dg1XDY is the geopotential gradient just before previous time step + ! X=(x->x direction, y->y direction) + real, save, allocatable :: dg1xDY(:, :, :) + real, save, allocatable :: dg1yDY(:, :, :) + ! wairDY : Vertical Wind Speed (in z coordinate) (cm/s) + real, save :: wairDY(mx, my, mz) + ! psigDY : p* X Vertical Wind Speed (in sigma coordinate) + real, save :: psigDY(mx, my, mz) + ! wsigDY : Vertical Wind Speed (in sigma coordinate) + real, save :: wsigDY(mx, my, mz) + ! CFLzDY : Vertical CFL (in sigma coordinate) + real, save :: CFLzDY + ! gplvDY: Geopotential of sigma Levels (= g z) + real, save :: gplvDY(mx, my, mzz) + ! gpmiDY: Geopotential between sigma Levels (i,j,k)->layer(i,j,k-1/2) + real, save :: gpmiDY(mx, my, mzz) + ! ugeoDY: x-geostrophic wind speed (assumed external) (m/s) + real, save, allocatable :: ugeoDY(:, :, :) + ! vgeoDY: y-geostrophic wind speed (assumed external) (m/s) + real, save, allocatable :: vgeoDY(:, :, :) + +contains + + subroutine mar_dy_init() + + use mardim, only: mx, my, mz,mzz + implicit none + + allocate( pkDY(mx, my, mz)) + allocate(qvsiDY(mx, my, mzz)) + allocate(qvswDY(mx, my, mzz)) + allocate(romiDY(mx, my, mz)) + allocate(ubefDY(mx, my, mz)) + allocate(vbefDY(mx, my, mz)) + allocate(dgzxDY(mx, my, mz)) + allocate(dgzyDY(mx, my, mz)) + allocate(ugeoDY(mx, my, mz)) + allocate(vgeoDY(mx, my, mz)) + allocate(dg1xDY(mx, my, mz)) + allocate(dg1yDY(mx, my, mz)) + + endsubroutine mar_dy_init + +endmodule mar_dy + diff --git a/MAR/code_mar/mar_ew_mod.f90 b/MAR/code_mar/mar_ew_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..765f0733936463b3f8f94e94a3390c45739a0502 --- /dev/null +++ b/MAR/code_mar/mar_ew_mod.f90 @@ -0,0 +1,18 @@ +! Energy and Water Balance Variables +module mar_ew + use mardim + implicit none + ! wat*EW: Total Precipitable Water in the Air Column [m] + real, save :: wat0EW(mx, my) + real, save :: wat1EW(mx, my) + real, save :: wat2EW(mx, my) + ! watfEW: Water Flux (Atm. --> Srf.) during 1 Time Step [m] + real, save :: watfEW(mx, my) + ! enr*EW: Total Energy (Sens. +Lat.) in the Air Column [m] + real, save :: enr0EW(mx, my) + real, save :: enr1EW(mx, my) + real, save :: enr2EW(mx, my) + ! labels + character(len=20), save :: mphyEW(mx, my) + character(len=20), save :: mauxEW +endmodule mar_ew diff --git a/MAR/code_mar/mar_fi_mod.f90 b/MAR/code_mar/mar_fi_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..68bab8b521c25a4afa8801ea56002098dd7e0b14 --- /dev/null +++ b/MAR/code_mar/mar_fi_mod.f90 @@ -0,0 +1,30 @@ +! mar_fi : mar filter parameters +! ============================== +module mar_fi + use mardim + implicit none + ! FIsloq : Implicit Filter Parameter (Slow mPHYS) + real, save :: FIsloq + ! FIslot, FIk_st(mz) : Implicit Filter Parameter (Slow Dyn./Temperature) + real, save :: FIslot + real, save :: FIk_st(mz) + ! FIslou, FIk_su(mz) : Implicit Filter Parameter (Slow Dyn./Wind Speed) + real, save :: FIslou + real, save :: FIk_su(mz) + ! FIfstu, FIk_fu(mz) : Implicit Filter Parameter (Fast Dyn./Wind Speed) + real, save :: FIfstu + real, save :: FIk_fu(mz) + real, save :: FIfstt + real, save :: FIk_ft(mz) + ! FIslop : Implicit Filter Parameter (Slow Dyn./Pressure) + real, save :: FIslop + ! FIfstp, FIk_fp(mz): Implicit Filter Parameter (Fast Dyn./Pressure) + real, save :: FIfstp + real, save :: FIk_fp(mz) + ! FIkhmn : Horizontal Diffusion Coefficient + ! equivalent to the Filter Effect on Long Waves + real, save :: FIkhmn + ! FIspon : Implicit Filter Parameter (Top Absorber) + real, save :: FIspon(mzabso) + logical, parameter :: FIBord = .true. +endmodule mar_fi diff --git a/MAR/code_mar/mar_ge_mod.f90 b/MAR/code_mar/mar_ge_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..966db66ba6ec6bf8406b53560d70808bc3b2432a --- /dev/null +++ b/MAR/code_mar/mar_ge_mod.f90 @@ -0,0 +1,127 @@ +module mar_ge + + use mardim + + implicit none + + ! labmGE : Month Label + character(len=3), parameter :: labmGE(0:12) = (/'---', 'Jan', 'Feb', & + 'Mar', 'Apr', 'May', 'Jun', 'Jul', & + 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/) + ! iyr0GE : Initial Year + integer, save :: iyr0GE + ! iyrrGE : Current Year + integer, save :: iyrrGE + ! mma0GE : Initial Month + integer, save :: mma0GE + ! mmarGE : Current Month + integer, save :: mmarGE + ! jda0GE : Initial Day + integer, save :: jda0GE + ! jdarGE : Current Day + integer, save :: jdarGE + ! jhu0GE : Initial Hour (UT) + integer, save :: jhu0GE + ! jhurGE : Current Hour (UT) + integer, save :: jhurGE + ! jhl0GE : Initial Hour (LT) + integer, save :: jhl0GE + ! jhlrGE : Current Hour (LT) + integer, save :: jhlrGE(mx, my) + ! minuGE : Minute + integer, save :: minuGE + ! jsecGE : second + integer, save :: jsecGE + ! ksecGE : Cent.of second + integer, save :: ksecGE + ! itizGE : Time Zone (numero du fuseau horaire) + integer, save :: itizGE(mx, my) + ! njyrGE : Number of Days since Begin of the Year before Current Month + integer, save :: njyrGE(0:12) + ! njybGE : Leap Year Correction to current Day of the Year + integer, save :: njybGE(0:12) + ! njmoGE : Number of Days in each Month of the Year + integer, save :: njmoGE(0:12) + ! njmbGE : Leap Year Correction to each Month of the Year + integer, save :: njmbGE(0:12) + ! nhyrGE : Number of Hours in one Year + integer, save :: nhyrGE + ! GElat0 : Latitude (Degrees) + real, save :: GElat0 + ! GElon0 : Longitude (Degrees) + real, save :: GElon0 + ! GElatr : Latitude (Radians) + real, save :: GElatr(mx, my) + ! GElonh : Longitude (Hours) + real, save :: GElonh(mx, my) + ! GEtrue : On Oblique Stereographic Projection: + ! Relative CoLatitude where distances (Degrees) + ! on Proj.plane = distances on sphere + real, save :: GEtrue + ! GEddxx : Direction x-axis (Degrees) + real, save :: GEddxx + ! slatGE : Sine of Latitude + real, save :: slatGE(mx, my) + ! clatGE : Cosine of Latitude + real, save :: clatGE(mx, my) + real, save :: deglon2D(mx, my) + real, save :: deglat2D(mx, my) + integer, parameter :: n_azim = 8 + ! czenGE : Cosine of Solar Zenith Angle + real, save :: czenGE(mx, my) + ! cz0_GE : Cosine of Solar Zenith Angle (Minimum Value for solari call) + real, save :: cz0_GE + ! omenGE : Azimuth of Fall Line (Radians) + real, save :: omenGE(mx, my) + ! slopGE : Cosine of Fall Line Angle + real, save :: slopGE(mx, my) + ! cmntGE : Cosine of Solar Zenith Angle + ! (Minimum Value from Mountains Mask / All Directions) + real, save :: cmntGE(mx, my, n_azim) + ! daziGE : Unit Angle for Mountains Mask (Radians) + real, save :: daziGE + ! czmnGE : Cosine of Solar Zenith Angle (Minimum Value from Mountains Mask) + real, save :: czmnGE(mx, my) + ! cverGE : Cosine of Solar Normal Angle + real, save :: cverGE(mx, my) + ! rsunGE : Insolation (Top of the Atmosphere) (W/m2) + real, save :: rsunGE + ! tlsrGE : Sun Rise Local Time / (iSND,jSND) (hour) + real, save :: tlsrGE + ! tlssGE : Sun Set Local Time / (iSND,jSND) (hour) + real, save :: tlssGE + ! tl__GE : Current Local Time / (iSND,jSND) (hour) + real, save :: tl__GE + +contains + + integer(kind=8) function ou2sGE(yr, mo, da, hh, mm, ss) + ! +----------------------------------------------------------------+ + ! | MAR INPUT 31-11-2012-XF MAR | + ! +----------------------------------------------------------------+ + + implicit none + + integer, intent(in) :: yr + integer, intent(in) :: mo + integer, intent(in) :: da + integer, intent(in) :: hh + integer, intent(in) :: mm + integer, intent(in) :: ss + integer :: y + + ou2sGE = 0 + do y = iyr0GE, yr - 1 + ou2sGE = ou2sGE + 365 + njmbGE(2) * max(0, 1 - mod(y, 4)) + enddo + + ou2sGE = ou2sGE + njyrGE(mo) + & + njybGE(mo) * max(0, 1 - mod(yr, 4)) + da - 1 + + ou2sGE = ou2sGE * 24 + hh + ou2sGE = ou2sGE * 3600 + mm * 60 + ss + + return + endfunction ou2sGE + +endmodule mar_ge diff --git a/MAR/code_mar/mar_hy_mod.f90 b/MAR/code_mar/mar_hy_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3d91886f16bfc1eaab3362739132a182dc74360f --- /dev/null +++ b/MAR/code_mar/mar_hy_mod.f90 @@ -0,0 +1,125 @@ +! mar_hy : mar microphysics (hydrometeors) +! ======================================== +module mar_hy + use mardim + implicit none + ! turnHY: set = T when rhcrHY is reached => microphysics turned on + logical, save :: turnHY + ! cminHY : cloud fraction (minimum) + real, save :: cminHY + ! rhcrHY: critical relative humidity value for condensation + real, save :: rhcrHY + ! tim_HY: time at which microphysics are taken into account + real, save :: tim_HY + ! cfraHY : cloud fraction + real, save, allocatable :: cfraHY(:, :, :) + ! ccnwHY : cloud dropplets number concentration (Nb/m3) + real, save, allocatable :: ccnwHY(:, :, :) + ! ccniHY : cloud ice crystals number concentration (Nb/m3) + real, save, allocatable :: ccniHY(:, :, :) + ! qwHY : cloud dropplets concentration (kg/kg) + real, save, allocatable :: qwHY(:, :, :) + ! qiHY : cloud ice crystals concentration (kg/kg) + real, save, allocatable :: qiHY(:, :, :) + ! qrHY : rain concentration (kg/kg) + real, save, allocatable :: qrHY(:, :, :) + ! qsHY : snow flakes concentration (kg/kg) + real, save, allocatable :: qsHY(:, :, :) + ! qgHY : graupels concentration (kg/kg) + ! (translucent snow pellets encased in a thin layer of ice) + real, save, allocatable :: qgHY(:, :, :) + ! snfHY : qsHY to snowfall in the atmosphere [m w.e.] + real, save, allocatable :: snfHY(:, :, :) + ! sblHY : snowfall sublimation in the atmosphere [m w.e.] + real, save, allocatable :: sblHY(:, :, :) + ! rnfHY : qrHY to rainfall in the atmosphere [m w.e.] + real, save, allocatable :: rnfHY(:, :, :) + ! evpHY : rainfall evaporation in the atmosphere [m w.e.] + real, save, allocatable :: evpHY(:, :, :) + real, save, allocatable :: smtHY(:, :, :) + ! depHY : snowfall condensation in the atmosphere [m w.e.] + real, save, allocatable :: depHY(:, :, :) + ! qssblHY : snow sublimated mass in the atmosphere (kg/kg) + real, save, allocatable :: qssblHY(:, :, :) + ! rainHY : integrated precipited rain + real, save :: rainHY(mx, my) + ! rai0HY : integrated precipited rain (previous time step) + real, save, allocatable :: rai0HY(:, :) + ! snowHY : integrated precipited/eroded snow + real, save :: snowHY(mx, my) + ! sno0HY : integrated precipited/eroded snow (previous time step) + real, save, allocatable :: sno0HY(:, :) + real, save, allocatable :: crysHY(:, :) + ! sfa0HY : integrated precipited snow (previous time step) + real, save, allocatable :: sfa0HY(:, :) + ! qsrfHY : Blowing Snow Concentration (0.325 m above the surface) + real, save, allocatable :: qsrfHY(:, :) + ! uss_HY : Blowing Snow Turbulent Flux (0.325 m above the surface) + real, save, allocatable :: uss_HY(:, :) + real, save, allocatable :: qbs_HY(:, :) + ! hlatHY : latent heat release [K/s] & + ! BLOWN * SUBLIMATION [m w.e.] (for k=1) + real, save, allocatable :: hlatHY(:, :, :) + ! dqiHY : Sublimation(-) / Deposition(+) [m w.e.] + real, save, allocatable :: dqiHY(:, :, :) + ! dqwHY : Vaporisation(-) / Condensation(+) [m w.e.] + real, save, allocatable :: dqwHY(:, :, :) + ! Hcd_HY : latent heat release [mm w.e.] + real, save, allocatable :: Hcd_HY(:, :) + ! Tcd_HY : latent heat release weighted Air Temperature [K] + real, save, allocatable :: Tcd_HY(:, :) + real, save, allocatable :: zcd_HY(:, :) + ! Hsb_HY : latent heat absorb. [mm w.e.] + real, save, allocatable :: Hsb_HY(:, :) + ! Tsb_HY : latent heat absorb. weighted Air Temperature [K] + real, save, allocatable :: Tsb_HY(:, :) + real, save, allocatable :: zsb_HY(:, :) + ! hsubHY : latent heat release [K/s] & + ! BLOWN * SUBLIMATION [kg/kg] per vertical level + real, save, allocatable :: hsubHY(:, :, :) + integer, save :: icntHY + +contains + + subroutine mar_hy_init() + + use mardim, only: mx, my, mz + implicit none + + allocate(cfraHY(mx, my, mz)) + allocate(ccnwHY(mx, my, mz)) + allocate(ccniHY(mx, my, mz)) + allocate(qwHY(mx, my, mz)) + allocate(qiHY(mx, my, mz)) + allocate(qrHY(mx, my, mz)) + allocate(qsHY(mx, my, mzz)) + allocate(qgHY(mx, my, mz)) + allocate(snfHY(mx, my, mz)) + allocate(sblHY(mx, my, mz)) + allocate(rnfHY(mx, my, mz)) + allocate(evpHY(mx, my, mz)) + allocate(smtHY(mx, my, mz)) + allocate(depHY(mx, my, mz)) + allocate(qssblHY(mx, my, mz)) + allocate(rai0HY(mx, my)) + allocate(sno0HY(mx, my)) + allocate(crysHY(mx, my)) + allocate(sfa0HY(mx, my)) + allocate(qsrfHY(mx, my)) + allocate(uss_HY(mx, my)) + allocate(qbs_HY(mx, my)) + allocate(hlatHY(mx, my, mz)) + allocate(dqiHY(mx, my, mz)) + allocate(dqwHY(mx, my, mz)) + allocate(Hcd_HY(mx, my)) + allocate(Tcd_HY(mx, my)) + allocate(zcd_HY(mx, my)) + allocate(Hsb_HY(mx, my)) + allocate(Tsb_HY(mx, my)) + allocate(zsb_HY(mx, my)) + allocate(hsubHY(mx, my, mz)) + + endsubroutine mar_hy_init + + +endmodule mar_hy diff --git a/MAR/code_mar/mar_ib_mod.f90 b/MAR/code_mar/mar_ib_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..285afe38f1e16c3e0b54a99ac9fb7165e23ab741 --- /dev/null +++ b/MAR/code_mar/mar_ib_mod.f90 @@ -0,0 +1,797 @@ +! mar_ib : mar integrated outputs +! =============================== +module mar_ib + use mardim + use marssn + implicit none + integer, save :: nbr_call_outice + integer, save :: itrdIB + ! OutdyIB : Number of Outputs by Day + integer, parameter :: OutdyIB = 1 + ! ml : Number of *sigma* levels for atm. var. + integer, parameter :: ml = 3 + ! mlhh : Number of outputs by Day for the X-hourly output: 8 => every 3h, 24 => every hour + integer, parameter :: mlhh = 8 + ! mlb : Number of sigma *surface* levels for atm. var. (boundary layer) + integer, parameter :: mlb = min(3, ml) + ! mp : Number of *pressure* levels for atm. var. + integer, parameter :: mp = 7 + ! OutPLevIB : Pressure levels (in hPa) + real, parameter :: OutPLevIB(mp) = (/925., 850., 800., 700., 600., 500., 200./) + ! mztq : Number of *height* levels for temperature and humidity + integer, parameter :: mztq = 5 + ! OutZTQLevIB : Height levels (in m above surface) + real, parameter :: OutZTQLevIB(mztq) = (/2., 10., 50., 80., 100./) + ! mzuv : Number of *height* levels for wind + integer, parameter :: mzuv = 4 + ! OutZUVLevIB : Height levels (in m above surface) + real, parameter :: OutZUVLevIB(mzuv) = (/10., 50., 80., 100./) + ! mi : Nbr snow height levels. Initial value: mi = 12 + integer, parameter :: mi = 18 + ! OutshIB : Snow height levels (in m) + real, parameter :: OutshIB(mi) = (/0.00, 0.05, 0.10, 0.20, 0.30, 0.40, 0.50, & + 0.65, 0.80, 1.00, 1.50, 2.00, 3.00, 5.00, 7.5, 10.0, 15.0, 20.0/) + ! real, parameter :: OutshIB(mi) = (/0.0,0.1,0.2,0.4,0.6,0.8,1.0,2.0,3.0,5.0,10.,15./) + ! Vertical axis + ! ------------- + ! dsigmaIB : sigma layer thickness + real, save :: dsigmaIB(ml) + ! Surface Mass Balance + ! -------------------- + ! SIm_IB : Current Snow/Ice Mass (mmWE) + real, save, allocatable :: SIm_IB(:, :, :) + ! S_m_IB : Current Snow Mass (mmWE) + real, save, allocatable :: S_m_IB(:, :, :) + ! SIh_IB : Current Snow/Ice Height (m) + real, save, allocatable :: SIh_IB(:, :, :) + ! S_h_IB : Current Snow Height (m) + real, save, allocatable :: S_h_IB(:, :, :) + ! SSh_IB : Current Non-Superimposed H (m) + real, save, allocatable :: SSh_IB(:, :, :) + ! wet_IB : Total (mmWE) + real, save, allocatable :: wet_IB(:, :, :), wet0IB(:, :, :) + ! wee_IB : water flux (mmWE) + real, save, allocatable :: wee_IB(:, :, :, :), wee0IB(:, :, :, :) + ! wem_IB : Melting (mmWE) + real, save, allocatable :: wem_IB(:, :, :), wem0IB(:, :, :) + ! wer_IB : Refreezing (mmWE) + real, save, allocatable :: wer_IB(:, :, :), wer0IB(:, :, :) + ! weu_IB : Run-off (mmWE) + real, save, allocatable :: weu_IB(:, :, :), weu0IB(:, :, :) + ! weo_IB : Run-off (mmWE) + real, save, allocatable :: weo_IB(:, :, :, :), weo0IB(:, :, :, :) + ! wec0IB, wel0IB : Canopy/soil water + real, save, allocatable :: wec0IB(:, :, :), wel0IB(:, :, :) + ! snf_IB : Atmospheric snowfall (mmWE) + real, save, allocatable :: snf_IB(:, :, :), snf0IB(:, :, :) + ! sbl_IB : Atmospheric sublimation (mmWE) + real, save, allocatable :: sbl_IB(:, :, :), sbl0IB(:, :, :) + ! qssbl_IB : Atmospheric sublimation ratio (kg/kg) + real, save, allocatable :: qssbl_IB(:, :, :), qssbl0IB(:, :, :) + ! dep_IB : Atmospheric condensation (mmWE) + real, save, allocatable :: dep_IB(:, :, :), dep0IB(:, :, :) + ! rnf_IB : Atmospheric rainfall (mmWE) + real, save, allocatable :: rnf_IB(:, :, :), rnf0IB(:, :, :) + ! evp_IB : Atmospheric evaporation (mmWE) + real, save, allocatable :: evp_IB(:, :, :), evp0IB(:, :, :) + ! werr0IB : Rain (mmWE) + real, save, allocatable :: werr0IB(:, :) + ! wesf0IB : Snow (mmWE) + real, save, allocatable :: wesf0IB(:, :) + ! wecp0IB : Convective precip (mmWE) + real, save, allocatable :: wecp0IB(:, :) + ! wero0IB : RunOff (mmWE) + real, save, allocatable :: wero0IB(:, :) + ! wecr0IB : Ice crystals (mmWE) + real, save, allocatable :: wecr0IB(:, :) + ! wesw0IB : Surface Water (mmWE) + real, save, allocatable :: wesw0IB(:, :, :) + ! wei0IB : Bottom Ice Added (mmWE) + real, save, allocatable :: wei0IB(:, :, :) + ! weacIB : #BS accu. + real, save, allocatable :: weacIB(:, :, :), weac0IB(:, :, :) + ! weerIB : #BS erosion + real, save, allocatable :: weerIB(:, :, :), weer0IB(:, :, :) + ! Atmospheric Variables averaged + ! ------------------------------ + ! mintIB : Min. Temp. (C) + real, save, allocatable :: mintIB(:, :, :) + ! maxtIB : Max. Temp. (C) + real, save, allocatable :: maxtIB(:, :, :) + ! maxwIB : Max. wind. speed (m/s) + real, save, allocatable :: maxwIB(:, :, :) + ! ttIB : Temperature (C) + real, save, allocatable :: ttIB(:, :, :) + ! tdIB : Dew Temperature (C) + real, save, allocatable :: tdIB(:, :, :) + ! uuIB : x-Wind Speed component (m/s) + real, save, allocatable :: uuIB(:, :, :) + ! vvIB : y-Wind Speed component (m/s) + real, save, allocatable :: vvIB(:, :, :) + ! uvIB : Horizontal Wind Speed (m/s) + real, save, allocatable :: uvIB(:, :, :) + ! wwIB : w-Wind Speed component (cm/s) + real, save, allocatable :: wwIB(:, :, :) + ! psigIB : SP x w-Wind Speed (SP Ds/Dt) (kPa/s) + real, save, allocatable :: psigIB(:, :, :) + ! wsigIB : w-Wind Speed Dsigma / Dt (1/s) + real, save, allocatable :: wsigIB(:, :, :) + ! ruuIB : x-Wind Speed component on regular grid (m/s) + real, save, allocatable :: ruuIB(:, :, :) + ! rotuuIB : instantaneous rotated wind on a regular grid (m/s) + real, save, allocatable :: rotuuIB(:, :, :) + ! rotvvIB : instantaneous rotated wind on a regular grid (m/s) + real, save, allocatable :: rotvvIB(:, :, :) + ! rvvIB : y-Wind Speed component on regular grid (m/s) + real, save, allocatable :: rvvIB(:, :, :) + ! ruvIB : Horizontal Wind Speed on regular grid (m/s) + real, save, allocatable :: ruvIB(:, :, :) + ! qqIB : Specific Humidity (g/kg) + real, save, allocatable :: qqIB(:, :, :) + ! rolvIB : Air specific mass (kg/m3) + real, save, allocatable :: rolvIB(:, :, :) + ! rhIB : Specific Humidity (%) + real, save, allocatable :: rhIB(:, :, :) + ! zzIB : Model Levels Height (m) + real, save, allocatable :: zzIB(:, :, :) + ! smt_IB : Integrated snow mass transport (kg/m) + real, save, allocatable :: smt_IB(:, :, :) + real, save, allocatable :: smt0IB(:, :, :) + ! pddIB : PDD quantity (C) + real, save, allocatable :: pddIB(:, :) + ! spIB : Surface Pressure (hPa) + real, save, allocatable :: spIB(:, :) + ! slpIB : Sea Surface Pressure (hPa) + real, save, allocatable :: slpIB(:, :) + ! ccIB : Cloud cover (-) + real, save, allocatable :: ccIB(:, :) + ! cuIB : Cloud cover Up (-) + real, save, allocatable :: cuIB(:, :) + ! cmIB : Cloud cover Middle (-) + real, save, allocatable :: cmIB(:, :) + ! cdIB : Cloud cover Low (-) + real, save, allocatable :: cdIB(:, :) + ! codIB : Cloud Optical Depth (-) + real, save, allocatable :: codIB(:, :) + ! qwIB : Cl Dropplets Concent. (kg/kg) + real, save, allocatable :: qwIB(:, :) + ! qiIB : Cl Ice Crystals Concent.(kg/kg) + real, save, allocatable :: qiIB(:, :) + ! qsIB : Snow Flakes Concent. (kg/kg) + real, save, allocatable :: qsIB(:, :) + ! qrIB : Rain Concentration (kg/kg) + real, save, allocatable :: qrIB(:, :) + ! water path: old computation [cCA 02/08/2022] + ! =========================================== + ! wvpIB : Water Vapour Path (kg/m2) / Old computation [cCA 02/08/2022] + real, save, allocatable :: wvpIB(:, :) + ! cwpIB : Condensed Water Path (kg/m2) / Old computation [cCA 02/08/2022] + real, save, allocatable :: cwpIB(:, :) + ! iwpIB : Ice Water Path (kg/m2) / Old computation [cCA 02/08/2022] + real, save, allocatable :: iwpIB(:, :) + ! water path: standard computation [cCA 02/08/2022] + ! ================================================= + ! rhodzIB : air density x delta_z + ! rhodz : rho dz = dp / g = dsigma * SP / g (kg m-2) + ! rhodz : for staggered grid (usual MAR setting), dsigma = dsigm1 + real, save, allocatable :: rhodzIB(:, :, :) + ! cloud_liquid_total_content tccl + ! cloud_ice_total_content tcci + ! precipitation_liquid_total_content tcpl + ! precipitation_ice_total_content tcpi + ! tcwvIB : total content water vapor = Integrated Water Vapor (IWV) or Precipitable Water (prw) (kg/m2) / Standard computation [cCA 02/08/2022] + real, save, allocatable :: tcwvIB(:, :) + ! tclcIB : total content of liquid cloud (kg/m2) cloud_liquid_total_content / Standard computation [cCA 02/08/2022] + real, save, allocatable :: tclcIB(:, :) + ! tcicIB : total content of ice cloud (kg/m2) cloud_ice_total_content / Standard computation [cCA 02/08/2022] + real, save, allocatable :: tcicIB(:, :) + ! tclpIB : total content of liquid precipitation (kg/m2) precipitation_liquid_total_content / Standard computation [cCA 02/08/2022] + real, save, allocatable :: tclpIB(:, :) + ! tcipIB : total content of ice precipitation (kg/m2) precipitation_ice_total_content / Standard computation [cCA 02/08/2022] + real, save, allocatable :: tcipIB(:, :) + ! ================================================= + ! iwfe : eastward vertically integrated water vapor flux (water vapor * zonal wind) + ! iwfn : northward vertically integrated water vapor flux (water vapor * meridional wind) + ! ihfe : eastward vertically integrated heat flux (temperature * zonal wind) + ! ihfn : northward vertically integrated heat flux (temperature * meridional wind) + ! pblIB : height of the Primary and Secondary Seeing Layer (m) + real, save, allocatable :: pblIB(:, :, :) + ! lqsIB : Snow Part. Concent. per vertical level (kg/kg) + real, save, allocatable :: lqsIB(:, :, :) + ! lqiIB : Ice Part. Concent. per vertical level (kg/kg) + real, save, allocatable :: lqiIB(:, :, :) + ! lqrIB : Rain Part. Concent. per vertical level (kg/kg) + real, save, allocatable :: lqrIB(:, :, :) + ! lqwIB : Water Part. Concent. per vertical level (kg/kg) + real, save, allocatable :: lqwIB(:, :, :) + ! qsbIB : Sublimation of Snow Part. per vertical level (kg/kg) + real, save, allocatable :: qsbIB(:, :, :) + ! lsbIB : Vert. Integrated Sublimation of Qs (m w.e.) + real, save, allocatable :: lsbIB(:, :, :) + ! tkeIB : TKE (m2/s2) + real, save, allocatable :: tkeIB(:, :, :) + ! qbrIB : Snow ratio between kb level (~100m) and 0 + real, save, allocatable :: qbrIB(:, :) + ! swn3DIB : Net SW Rad. per vertical level (W/m2) + real, save, allocatable :: swn3DIB(:, :, :) + ! lwn3DIB : Net LW Rad. per vertical level (W/m2) + real, save, allocatable :: lwn3DIB(:, :, :) + ! swnc3DIB : Clear-sky Net SW Rad. per vertical level (W/m2) + real, save, allocatable :: swnc3DIB(:, :, :) + ! lwnc3DIB : Clear-sky Net LW Rad. per vertical level (W/m2) + real, save, allocatable :: lwnc3DIB(:, :, :) + ! cod3DIB : Could Optical Depth per vertical level (-) + real, save, allocatable :: cod3DIB(:, :, :) + ! cc3DIB : Could Cover per vertical level (-) + real, save, allocatable :: cc3DIB(:, :, :) + ! Atmospheric Variables on surface levels (boundary layer) + ! ----------------------------------------------- + ! ttbIB : Temperature (C)--------- + real, save, allocatable :: ttbIB(:, :, :) + ! txbIB : Temperature (C) + real, save, allocatable :: txbIB(:, :, :) + ! tnbIB : Temperature (C) + real, save, allocatable :: tnbIB(:, :, :) + ! qqbIB : Specific Humidity (g/kg) + real, save, allocatable :: qqbIB(:, :, :) + ! uubIB : x-Wind Speed component (m/s) + real, save, allocatable :: uubIB(:, :, :) + ! vvbIB : y-Wind Speed component (m/s) + real, save, allocatable :: vvbIB(:, :, :) + ! uvbIB : Horizontal Wind Speed (m/s) + real, save, allocatable :: uvbIB(:, :, :) + ! zzbIB : Model Levels Height (m) + real, save, allocatable :: zzbIB(:, :, :) + ! timehIB : Time + real, save :: timehIB(mlhh) + ! tnh : Minimum temperature (C) + real, save, allocatable :: tnh(:, :, :) + ! txh : Maximum temperature (C) + real, save, allocatable :: txh(:, :, :) + ! tdh : Dewpoint temperature (C) + real, save, allocatable :: tdh(:, :, :) + ! uuh : X-Wind speed component (m/s) + real, save, allocatable :: uuh(:, :, :) + ! vvh : Y-Wind speed component (m/s) + real, save, allocatable :: vvh(:, :, :) + ! slth : Soil temperature (C) + real, save, allocatable :: slth(:, :, :) + ! slqch : Total soil moisture content (g/kg) + real, save, allocatable :: slqch(:, :, :) + ! wvph : Water vapor path (kg/m�) + real, save, allocatable :: wvph(:, :, :) + ! cphIB : Convective precipitation (mmWE) + real, save, allocatable :: cphIB(:, :, :) + ! cph0IB : Convective precipitation (mmWE) + real, save, allocatable :: cph0IB(:, :) + ! wehIB : Evapotranspiration (mmWE) + real, save, allocatable :: wehIB(:, :, :) + ! weh0IB : Evapotranspiration (mmWE) + real, save, allocatable :: weh0IB(:, :, :) + ! ztdh : Zenithal Tropospheric Delay (m) + real, save, allocatable :: ztdh(:, :, :) + ! zhdh : Zenithal Hydrostatic Delay (m) + real, save, allocatable :: zhdh(:, :, :) + ! zwdh : Zenithal Wet Delay (m) + real, save, allocatable :: zwdh(:, :, :) + ! tmh : Weighted Mean Temperature (C) + real, save, allocatable :: tmh(:, :, :) + ! capeh : Convective Av. Pot. Energy (J/kg) + real, save, allocatable :: capeh(:, :, :) + ! ssth : Sea Surface Temperature ( ) + real, save, allocatable :: ssth(:, :, :) + ! sphIB : Surface pressure (hPa) + real, save, allocatable :: sphIB(:, :, :) + ! sthIB : Surface temperature (C) + real, save, allocatable :: sthIB(:, :, :) + ! tthIB : Temperature (C) + real, save, allocatable :: tthIB(:, :, :) + ! txhIB : Temperature (C) + real, save, allocatable :: txhIB(:, :, :) + ! txhIB0 : Temperature (C) + real, save, allocatable :: txhIB0(:, :) + ! tnhIB : Temperature (C) + real, save, allocatable :: tnhIB(:, :, :) + ! tnhIB0 : Temperature (C) + real, save, allocatable :: tnhIB0(:, :) + ! qqhIB : Specific Humidity (g/kg) + real, save, allocatable :: qqhIB(:, :, :) + ! uuhIB : x-Wind Speed component (m/s) + real, save, allocatable :: uuhIB(:, :, :) + ! vvhIB : y-Wind Speed component (m/s) + real, save, allocatable :: vvhIB(:, :, :) + ! swdhIB : Shortwave inc. Rad. (W/m2) + real, save, allocatable :: swdhIB(:, :, :) + ! lwdhIB : Longwave inc. Rad. (W/m2) + real, save, allocatable :: lwdhIB(:, :, :) + ! lwuhIB : Longwave out. Rad. (W/m2) + real, save, allocatable :: lwuhIB(:, :, :) + ! shfhIB : Sensible Heat (W/m2) + real, save, allocatable :: shfhIB(:, :, :) + ! lhfhIB : Latent Heat (W/m2) + real, save, allocatable :: lhfhIB(:, :, :) + ! alhIB : Albedo (temporal mean) (-) + real, save, allocatable :: alhIB(:, :, :) + ! prhIB : Precipitation (mmWE) + real, save, allocatable :: prhIB(:, :, :) + ! rfhIB : Rainfall (mmWE) + real, save, allocatable :: rfhIB(:, :, :) + ! prh0IB : Precipitation (mmWE) + real, save, allocatable :: prh0IB(:, :) + ! snfhIB : Snowfall (mmWE) + real, save, allocatable :: snfhIB(:, :, :) + ! snfh0IB : Snowfall (mmWE) + real, save, allocatable :: snfh0IB(:, :) + ! clhIB : Cloud Fraction (-) + real, save, allocatable :: clhIB(:, :, :) + ! mehIB : Surface Melt (mmWE) + real, save, allocatable :: mehIB(:, :, :) + ! meh0IB : Surface Melt (mmWE) + real, save, allocatable :: meh0IB(:, :) + ! suhIB : Sublimation (mmWE) + real, save, allocatable :: suhIB(:, :, :) + ! suh0IB : Sublimation (mmWE) + real, save, allocatable :: suh0IB(:, :) + ! ruhIB : Run-off (mmWE) + real, save, allocatable :: ruhIB(:, :, :) + ! ruh0IB : Run-off (mmWE) + real, save, allocatable :: ruh0IB(:, :) + ! smbhIB : SMB (mmWE) + real, save, allocatable :: smbhIB(:, :, :) + ! smbh0IB : SMB (mmWE) + real, save, allocatable :: smbh0IB(:, :) + ! swhIB : Surface water (mmWE) + real, save, allocatable :: swhIB(:, :, :) + ! swh0IB : Surface water (mmWE) + real, save, allocatable :: swh0IB(:, :) + ! lwc1mhIB : Total Liquid Water Content to 1m (kg/m2) + real, save, allocatable :: lwc1mhIB(:, :, :) + ! lwc2mhIB : Total Liquid Water Content to 2m (kg/m2) + real, save, allocatable :: lwc2mhIB(:, :, :) + ! t5hIB : Temperature at 50m (C) + real, save, allocatable :: t5hIB(:, :, :) + ! u5hIB : Wind at 50m (m/s) + real, save, allocatable :: u5hIB(:, :, :) + ! v5hIB : Wind at 50m (m/s) + real, save, allocatable :: v5hIB(:, :, :) + ! q5hIB : Specific Humidity at 50m (g/kg) + real, save, allocatable :: q5hIB(:, :, :) + ! p5hIB : Pressure at 50m (hPa) + real, save, allocatable :: p5hIB(:, :, :) + ! Atmospheric Variables averaged on pressure levels + ! ------------------------------------------------- + ! nbpIB : Count number of valid data on pressure levels + real, save, allocatable :: nbpIB(:, :, :) + ! ttpIB : Temperature on pressure levels (C) + real, save, allocatable :: ttpIB(:, :, :) + ! qqpIB : Specific Humidity on pressure levels (g/kg) + real, save, allocatable :: qqpIB(:, :, :) + ! zzpIB : Model Levels Height on pressure levels (m) + real, save, allocatable :: zzpIB(:, :, :) + ! uupIB : x-Wind Speed component on pressure levels (m/s) + real, save, allocatable :: uupIB(:, :, :) + ! vvpIB : y-Wind Speed component on pressure levels (m/s) + real, save, allocatable :: vvpIB(:, :, :) + ! wwpIB : w-Wind Speed component on pressure levels (m/s) + real, save, allocatable :: wwpIB(:, :, :) + ! uvpIB : Horizontal Wind Speed on pressure levels (m/s) + real, save, allocatable :: uvpIB(:, :, :) + ! tairDYp : temperature on pressure levels (K) + real, allocatable :: tairDYp(:, :, :) + ! gplvDYp : Geopotential on pressure levels (= g z) + real, allocatable :: gplvDYp(:, :, :) + ! qvDYp : Specific Humidity on pressure levels (kg/kg) + real, allocatable :: qvDYp(:, :, :) + ! uairDYp : x-Wind Speed component on pressure levels (m/s) + real, allocatable :: uairDYp(:, :, :) + ! vairDYp : y-Wind Speed component on pressure levels (m/s) + real, allocatable :: vairDYp(:, :, :) + ! wairDYp : w-Wind Speed component on pressure levels (m/s) + real, allocatable :: wairDYp(:, :, :) + ! Atmospheric Variables averaged on height levels + ! ----------------------------------------------- + ! ttzIB : Temperature on height levels (C) + real, save, allocatable :: ttzIB(:, :, :) + ! qqzIB : Specific Humidity on height levels (g/kg) + real, save, allocatable :: qqzIB(:, :, :) + real, save, allocatable :: rhzIB(:, :, :) + ! uuzIB : x-Wind Speed component on height levels (m/s) + real, save, allocatable :: uuzIB(:, :, :) + ! vvzIB : y-Wind Speed component on height levels (m/s) + real, save, allocatable :: vvzIB(:, :, :) + ! uvzIB : Horizontal Wind Speed on height levels (m/s) + real, save, allocatable :: uvzIB(:, :, :) + ! u2zIB : x-Wind Speed component on height levels (m/s) + real, save, allocatable :: u2zIB(:, :, :) + ! v2zIB : y-Wind Speed component on height levels (m/s) + real, save, allocatable :: v2zIB(:, :, :) + ! rozIB : Air density on height levels (Ton/m3) + real, save, allocatable :: rozIB(:, :, :) + ! ttzIB_0 : Temperature on height levels (C) + real, allocatable :: ttzIB_0(:, :, :) + ! qqzIB_0 : Specific Humidity on height levels (g/kg) + real, allocatable :: qqzIB_0(:, :, :) + real, allocatable :: rhzIB_0(:, :, :) + ! uuzIB_0 : x-Wind Speed component on height levels (m/s) + real, allocatable :: uuzIB_0(:, :, :) + ! vvzIB_0 : y-Wind Speed component on height levels (m/s) + real, allocatable :: vvzIB_0(:, :, :) + ! uvzIB_0 : Horizontal Wind Speed on height levels (m/s) + real, allocatable :: uvzIB_0(:, :, :) + ! u2zIB_0 : x-Wind Speed component on height levels (m/s) + real, allocatable :: u2zIB_0(:, :, :) + ! v2zIB_0 : y-Wind Speed component on height levels (m/s) + real, allocatable :: v2zIB_0(:, :, :) + ! ppzIB_0 : Pressure on height levels (m/s) + real, allocatable :: ppzIB_0(:, :, :) + ! rozIB_0 : Air density on height levels (Ton/m3) + real, allocatable :: rozIB_0(:, :, :) + ! Surface Variables averaged + ! -------------------------- + ! swdIB : Shortwave inc. Rad. (W/m2) + real, save, allocatable :: swdIB(:, :) + ! swuIB : Shortwave out. Rad. (W/m2) + real, save, allocatable :: swuIB(:, :) + ! lwdIB : Longwave inc. Rad. (W/m2) + real, save, allocatable :: lwdIB(:, :) + ! lwuIB : Longwave out. Rad. (W/m2) + real, save, allocatable :: lwuIB(:, :) + ! sunIB : Sunshine (SWD>120) (s) + real, save, allocatable :: sunIB(:, :) + ! swdtIB : TOA Shortwave inc. Rad. (W/m2) + real, save, allocatable :: swdtIB(:, :) + ! swutIB : TOA Shortwave out. Rad. (W/m2) + real, save, allocatable :: swutIB(:, :) + ! lwutIB : TOA Longwave out. Rad. (W/m2) + real, save, allocatable :: lwutIB(:, :) + ! shfIB : Sensible Heat (W/m2) + real, save, allocatable :: shfIB(:, :) + ! lhfIB : Latent Heat (W/m2) + real, save, allocatable :: lhfIB(:, :) + ! alIB : Albedo (temporal mean) (-) + real, save, allocatable :: alIB(:, :) + ! al1IB : Albedo (SW out/SW in) (-) + real, save, allocatable :: al1IB(:, :, :) + ! al2IB : Albedo (temporal mean) (-) + real, save, allocatable :: al2IB(:, :, :) + ! frvIB : ifraTV (temporal mean) (-) + real, save, allocatable :: frvIB(:, :, :) + ! stIB : Surface Temperature (C) + real, save, allocatable :: stIB(:, :) + ! st2IB : Surface Temperature (C) + real, save, allocatable :: st2IB(:, :, :) + ! z0IB : Roughness length for Moment.(m) + real, save, allocatable :: z0IB(:, :, :) + ! r0IB : Roughness length for Heat (m) + real, save, allocatable :: r0IB(:, :, :) + ! uusIB : Friction Velocity (m/s) + real, save, allocatable :: uusIB(:, :, :) + ! utsIB : Sfc Pot. Tp. Turb. Flux (K.m/s) + real, save, allocatable :: utsIB(:, :, :) + ! uqsIB : Water Vapor Flux (kg/kg.m/s) + real, save, allocatable :: uqsIB(:, :, :) + ! ussIB : Blowing Snow Flux (kg/kg.m/s) + real, save, allocatable :: ussIB(:, :, :) + ! uusthIB : Threshold friction velocity (m/s) + real, save, allocatable :: uusthIB(:, :, :) + ! sltIB : Soil Temperature (C) + real, save, allocatable :: sltIB(:, :, :, :) + ! slqIB : Soil Humidity Content (g/kg) + real, save, allocatable :: slqIB(:, :, :, :) + ! slqcIB : Total Soil Humidity Content (g/kg) + real, save, allocatable :: slqcIB(:, :, :) + ! slqmIB : Max Soil Humidity Content (g/kg) + real, save, allocatable :: slqmIB(:, :, :) + ! sicIB : SIC (-) + real, save, allocatable :: sicIB(:, :) + real, save, allocatable :: alb1IB(:, :) + real, save, allocatable :: as1_IB(:, :) + real, save, allocatable :: alb2IB(:, :) + real, save, allocatable :: as2_IB(:, :) + real, save, allocatable :: alb3IB(:, :) + real, save, allocatable :: as3_IB(:, :) + ! *CL* + real, save, allocatable :: gradTIB(:, :) + real, save, allocatable :: maxgrTIB(:, :) + real, save, allocatable :: mingrTIB(:, :) + real, save, allocatable :: gradQIB(:, :) + real, save, allocatable :: maxgrQIB(:, :) + real, save, allocatable :: mingrQIB(:, :) + real, save, allocatable :: tt_intIB(:, :, :) + real, save, allocatable :: qq_intIB(:, :, :) + ! Snow pack Variables averaged + ! ---------------------------- + real, save, allocatable :: agIB(:, :, :, :) ! ag (-) + real, save, allocatable :: g1IB(:, :, :, :) ! g1 (-) + real, save, allocatable :: g2IB(:, :, :, :) ! g2 (-) + real, save, allocatable :: roIB(:, :, :, :) ! Density (kg/m3) + real, save, allocatable :: tiIB(:, :, :, :) ! Temperature (C) + real, save, allocatable :: waIB(:, :, :, :) ! Water Content (%) + real, save, allocatable :: zn0IB(:, :, :), zn1IB(:, :, :) ! Snow Height (m) + real, save, allocatable :: zn2IB(:, :, :), zn3IB(:, :, :) + real, save, allocatable :: zn4IB(:, :, :), zn5IB(:, :, :) + real, save, allocatable :: zn6IB(:, :, :) + ! mb0IB : Mass Balance (mmWE) + real, save, allocatable :: mb0IB(:, :, :), mbIB(:, :, :) + + ! Variables averaged from OASIS + ! ----------------------------- + real, save, allocatable :: st2aoIB(:, :, :) + real, save, allocatable :: sicaoIB(:, :) + real, save, allocatable :: albaoIB(:, :, :) + real, save, allocatable :: sitaoIB(:, :) + real, save, allocatable :: sntaoIB(:, :) + +contains + + subroutine mar_ib_init() + + use mardim, only: mx, my, mz, mzz + implicit none + + integer i,j,k,m + + allocate(SIm_IB(mx, my, nsx)) + allocate(S_m_IB(mx, my, nsx)) + allocate(SIh_IB(mx, my, nsx)) + allocate(S_h_IB(mx, my, nsx)) + allocate(SSh_IB(mx, my, nsx)) + allocate(wet_IB(mx, my, nsx)) + allocate(wet0IB(mx, my, nsx)) + allocate(wee_IB(mx, my, nsx, 4)) + allocate(wee0IB(mx, my, nsx, 4)) + allocate(wem_IB(mx, my, nsx)) + allocate(wem0IB(mx, my, nsx)) + allocate(wer_IB(mx, my, nsx)) + allocate(wer0IB(mx, my, nsx)) + allocate(weu_IB(mx, my, nsx)) + allocate(weu0IB(mx, my, nsx)) + allocate(weo_IB(mx, my, nsx, 6)) + allocate(weo0IB(mx, my, nsx, 6)) + allocate(wec0IB(mx, my, nsx)) + allocate(wel0IB(mx, my, nsx)) + allocate(snf_IB(mx, my, ml)) + allocate(snf0IB(mx, my, ml)) + allocate(sbl_IB(mx, my, ml)) + allocate(sbl0IB(mx, my, ml)) + allocate(qssbl_IB(mx, my, ml)) + allocate(qssbl0IB(mx, my, ml)) + allocate(dep_IB(mx, my, ml)) + allocate(dep0IB(mx, my, ml)) + allocate(rnf_IB(mx, my, ml)) + allocate(rnf0IB(mx, my, ml)) + allocate(evp_IB(mx, my, ml)) + allocate(evp0IB(mx, my, ml)) + allocate(werr0IB(mx, my)) + allocate(wesf0IB(mx, my)) + allocate(wecp0IB(mx, my)) + allocate(wero0IB(mx, my)) + allocate(wecr0IB(mx, my)) + allocate(wesw0IB(mx, my, nsx)) + allocate(wei0IB(mx, my, nsx)) + allocate(weacIB(mx, my, nsx)) + allocate(weac0IB(mx, my, nsx)) + allocate(weerIB(mx, my, nsx)) + allocate(weer0IB(mx, my, nsx)) + allocate(mintIB(mx, my, ml)) + allocate(maxtIB(mx, my, ml)) + allocate(maxwIB(mx, my, ml)) + allocate(ttIB(mx, my, ml)) + allocate(tdIB(mx, my, ml)) + allocate(uuIB(mx, my, ml)) + allocate(vvIB(mx, my, ml)) + allocate(uvIB(mx, my, ml)) + allocate(wwIB(mx, my, ml)) + allocate(psigIB(mx, my, ml)) + allocate(wsigIB(mx, my, ml)) + allocate(ruuIB(mx, my, ml)) + allocate(rotuuIB(mx, my, mz)) + allocate(rotvvIB(mx, my, mz)) + allocate(rvvIB(mx, my, ml)) + allocate(ruvIB(mx, my, ml)) + allocate(qqIB(mx, my, ml)) + allocate(rolvIB(mx, my, ml)) + allocate(rhIB(mx, my, ml)) + allocate(zzIB(mx, my, ml)) + allocate(smt_IB(mx, my, ml)) + allocate(smt0IB(mx, my, ml)) + allocate(pddIB(mx, my)) + allocate(spIB(mx, my)) + allocate(slpIB(mx, my)) + allocate(ccIB(mx, my)) + allocate(cuIB(mx, my)) + allocate(cmIB(mx, my)) + allocate(cdIB(mx, my)) + allocate(codIB(mx, my)) + allocate(qwIB(mx, my)) + allocate(qiIB(mx, my)) + allocate(qsIB(mx, my)) + allocate(qrIB(mx, my)) + allocate(wvpIB(mx, my)) + allocate(cwpIB(mx, my)) + allocate(iwpIB(mx, my)) + allocate(rhodzIB(mx, my, ml)) + allocate(tcwvIB(mx, my)) + allocate(tclcIB(mx, my)) + allocate(tcicIB(mx, my)) + allocate(tclpIB(mx, my)) + allocate(tcipIB(mx, my)) + allocate(pblIB(mx, my, nsx)) + allocate(lqsIB(mx, my, ml)) + allocate(lqiIB(mx, my, ml)) + allocate(lqrIB(mx, my, ml)) + allocate(lqwIB(mx, my, ml)) + allocate(qsbIB(mx, my, ml)) + allocate(lsbIB(mx, my, ml)) + allocate(tkeIB(mx, my, ml)) + allocate(qbrIB(mx, my)) + allocate(swn3DIB(mx, my, ml)) + allocate(lwn3DIB(mx, my, ml)) + allocate(swnc3DIB(mx, my, ml)) + allocate(lwnc3DIB(mx, my, ml)) + allocate(cod3DIB(mx, my, ml)) + allocate(cc3DIB(mx, my, ml)) + allocate(ttbIB(mx, my, mlb)) + allocate(txbIB(mx, my, mlb)) + allocate(tnbIB(mx, my, mlb)) + allocate(qqbIB(mx, my, mlb)) + allocate(uubIB(mx, my, mlb)) + allocate(vvbIB(mx, my, mlb)) + allocate(uvbIB(mx, my, mlb)) + allocate(zzbIB(mx, my, mlb)) + allocate(tnh(mx, my, mlhh)) + allocate(txh(mx, my, mlhh)) + allocate(tdh(mx, my, mlhh)) + allocate(uuh(mx, my, mlhh)) + allocate(vvh(mx, my, mlhh)) + allocate(slth(mx, my, mlhh)) + allocate(slqch(mx, my, mlhh)) + allocate(wvph(mx, my, mlhh)) + allocate(cphIB(mx, my, mlhh)) + allocate(cph0IB(mx, my)) + allocate(wehIB(mx, my, mlhh)) + allocate(weh0IB(mx, my, nsx)) + allocate(ztdh(mx, my, mlhh)) + allocate(zhdh(mx, my, mlhh)) + allocate(zwdh(mx, my, mlhh)) + allocate(tmh(mx, my, mlhh)) + allocate(capeh(mx, my, mlhh)) + allocate(ssth(mx, my, mlhh)) + allocate(sphIB(mx, my, mlhh)) + allocate(sthIB(mx, my, mlhh)) + allocate(tthIB(mx, my, mlhh)) + allocate(txhIB(mx, my, mlhh)) + allocate(txhIB0(mx, my)) + allocate(tnhIB(mx, my, mlhh)) + allocate(tnhIB0(mx, my)) + allocate(qqhIB(mx, my, mlhh)) + allocate(uuhIB(mx, my, mlhh)) + allocate(vvhIB(mx, my, mlhh)) + allocate(swdhIB(mx, my, mlhh)) + allocate(lwdhIB(mx, my, mlhh)) + allocate(lwuhIB(mx, my, mlhh)) + allocate(shfhIB(mx, my, mlhh)) + allocate(lhfhIB(mx, my, mlhh)) + allocate(alhIB(mx, my, mlhh)) + allocate(prhIB(mx, my, mlhh)) + allocate(rfhIB(mx, my, mlhh)) + allocate(prh0IB(mx, my)) + allocate(snfhIB(mx, my, mlhh)) + allocate(snfh0IB(mx, my)) + allocate(clhIB(mx, my, mlhh)) + allocate(mehIB(mx, my, mlhh)) + allocate(meh0IB(mx, my)) + allocate(suhIB(mx, my, mlhh)) + allocate(suh0IB(mx, my)) + allocate(ruhIB(mx, my, mlhh)) + allocate(ruh0IB(mx, my)) + allocate(smbhIB(mx, my, mlhh)) + allocate(smbh0IB(mx, my)) + allocate(swhIB(mx, my, mlhh)) + allocate(swh0IB(mx, my)) + allocate(lwc1mhIB(mx, my, mlhh)) + allocate(lwc2mhIB(mx, my, mlhh)) + allocate(t5hIB(mx, my, mlhh)) + allocate(u5hIB(mx, my, mlhh)) + allocate(v5hIB(mx, my, mlhh)) + allocate(q5hIB(mx, my, mlhh)) + allocate(p5hIB(mx, my, mlhh)) + allocate(nbpIB(mx, my, mp)) + allocate(ttpIB(mx, my, mp)) + allocate(qqpIB(mx, my, mp)) + allocate(zzpIB(mx, my, mp)) + allocate(uupIB(mx, my, mp)) + allocate(vvpIB(mx, my, mp)) + allocate(wwpIB(mx, my, mp)) + allocate(uvpIB(mx, my, mp)) + allocate(tairDYp(mx, my, mp)) + allocate(gplvDYp(mx, my, mp)) + allocate(qvDYp(mx, my, mp)) + allocate(uairDYp(mx, my, mp)) + allocate(vairDYp(mx, my, mp)) + allocate(wairDYp(mx, my, mp)) + allocate(ttzIB(mx, my, mztq)) + allocate(qqzIB(mx, my, mztq)) + allocate(rhzIB(mx, my, mztq)) + allocate(uuzIB(mx, my, mzuv)) + allocate(vvzIB(mx, my, mzuv)) + allocate(uvzIB(mx, my, mzuv)) + allocate(u2zIB(mx, my, mzuv)) + allocate(v2zIB(mx, my, mzuv)) + allocate(rozIB(mx, my, mzuv)) + allocate(ttzIB_0(mx, my, mztq)) + allocate(qqzIB_0(mx, my, mztq)) + allocate(rhzIB_0(mx, my, mztq)) + allocate(uuzIB_0(mx, my, mzuv)) + allocate(vvzIB_0(mx, my, mzuv)) + allocate(uvzIB_0(mx, my, mzuv)) + allocate(u2zIB_0(mx, my, mzuv)) + allocate(v2zIB_0(mx, my, mzuv)) + allocate(ppzIB_0(mx, my, mztq)) + allocate(rozIB_0(mx, my, mzuv)) + allocate(swdIB(mx, my)) + allocate(swuIB(mx, my)) + allocate(lwdIB(mx, my)) + allocate(lwuIB(mx, my)) + allocate(sunIB(mx, my)) + allocate(swdtIB(mx, my)) + allocate(swutIB(mx, my)) + allocate(lwutIB(mx, my)) + allocate(shfIB(mx, my)) + allocate(lhfIB(mx, my)) + allocate(alIB(mx, my)) + allocate(al1IB(mx, my, nsx)) + allocate(al2IB(mx, my, nsx)) + allocate(frvIB(mx, my, nsx)) + allocate(stIB(mx, my)) + allocate(st2IB(mx, my, nsx)) + allocate(z0IB(mx, my, nsx)) + allocate(r0IB(mx, my, nsx)) + allocate(uusIB(mx, my, nsx)) + allocate(utsIB(mx, my, nsx)) + allocate(uqsIB(mx, my, nsx)) + allocate(ussIB(mx, my, nsx)) + allocate(uusthIB(mx, my, nsx)) + allocate(sltIB(mx, my, nsx, nsol + 1)) + allocate(slqIB(mx, my, nsx, nsol + 1)) + allocate(slqcIB(mx, my, nsx)) + allocate(slqmIB(mx, my, nsx)) + allocate(sicIB(mx, my)) + allocate(alb1IB(mx, my)) + allocate(as1_IB(mx, my)) + allocate(alb2IB(mx, my)) + allocate(as2_IB(mx, my)) + allocate(alb3IB(mx, my)) + allocate(as3_IB(mx, my)) + allocate(gradTIB(mx, my)) + allocate(maxgrTIB(mx, my)) + allocate(mingrTIB(mx, my)) + allocate(gradQIB(mx, my)) + allocate(maxgrQIB(mx, my)) + allocate(mingrQIB(mx, my)) + allocate(tt_intIB(mx, my, mw)) + allocate(qq_intIB(mx, my, mw)) + allocate(agIB(mx, my, nsx, mi)) + allocate(g1IB(mx, my, nsx, mi)) + allocate(g2IB(mx, my, nsx, mi)) + allocate(roIB(mx, my, nsx, mi)) + allocate(tiIB(mx, my, nsx, mi)) + allocate(waIB(mx, my, nsx, mi)) + allocate(zn0IB(mx, my, nsx)) + allocate(zn1IB(mx, my, nsx)) + allocate(zn2IB(mx, my, nsx)) + allocate(zn3IB(mx, my, nsx)) + allocate(zn4IB(mx, my, nsx)) + allocate(zn5IB(mx, my, nsx)) + allocate(zn6IB(mx, my, nsx)) + allocate(mb0IB(mx, my, nsx)) + allocate(mbIB(mx, my, nsx)) + allocate(st2aoIB(mx, my, nsx)) + allocate(sicaoIB(mx, my)) + allocate(albaoIB(mx, my, nsx)) + allocate(sitaoIB(mx, my)) + allocate(sntaoIB(mx, my)) + + endsubroutine mar_ib_init + +endmodule mar_ib diff --git a/MAR/code_mar/mar_io_mod.f90 b/MAR/code_mar/mar_io_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0f8203c8ceefab45d45768ce41e8ec30c5792193 --- /dev/null +++ b/MAR/code_mar/mar_io_mod.f90 @@ -0,0 +1,42 @@ +! mar_io +! ====== +module mar_io + implicit none + ! explIO: Experiment Label + character(len=3), save :: explIO + ! igrdIO: i (x-direc.) Index Ref. Grid Point (for detailed Output) + integer, save :: igrdIO(5) + ! jgrdIO: j (y-direc.) Index Ref. Grid Point (for detailed Output) + integer, save :: jgrdIO(5) + integer, save :: IO_gen + ! IO_loc = 1 : Initialisation: General: sigma, z_amsl, (ug,vg) + ! 2 : Initialisation: Details: Soundings (Ref.) + ! Insolation (PHYrad_top) (Synop) + ! Radiative Transfer (PHYrad_int) (Ref. ,Synop) + ! Turbulent Transfer (turtke_gen) (Ref.!,Synop) + ! Polynyas (SRFmod_pol) (RES. ,Synop) + ! Snow Pack (SRFmod_sno) (Ref. ,Synop) + ! Surface Energy Balance (SRFfrm_xxx) (Ref. ,Synop) + ! Surface Mass Balance (OUTice) (Synop) + ! 3 : Blowing Snow (HYDblo) (Ref.!,Synop) + ! Cloud mPhy (HYDmic) (Ref. ,Synop) + ! Polynyas (SRFmod_pol) (Synop) + ! 7 : Surface Turbulent Flux (TURsbl) + integer, save :: IO_loc + ! mxw1IO, mxw2IO, ixw_IO: x-domain to be printed (from mxw1 to mxw2 by ixw) + integer, save :: mxw1IO + integer, save :: mxw2IO + integer, save :: ixw_IO + ! myw1IO, myw2IO, iyw_IO: y-domain to be printed (from myw1 to myw2 by iyw) + integer, save :: myw1IO + integer, save :: myw2IO + integer, save :: iyw_IO + ! mzw1IO, mzw2IO, izw_IO: z-domain to be printed (from mzw1 to mzw2 by izw) + integer, save :: mzw1IO + integer, save :: mzw2IO + integer, save :: izw_IO + ! kkatIO : Low Level scaned in the meso animation + integer, save :: kkatIO + ! kmidIO : Mid Level scaned in the meso animation + integer, save :: kmidIO +endmodule mar_io diff --git a/MAR/code_mar/mar_lb_mod.f90 b/MAR/code_mar/mar_lb_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..47878bf15daab4abac7f9d3435d8c72e7bdbc6ff --- /dev/null +++ b/MAR/code_mar/mar_lb_mod.f90 @@ -0,0 +1,94 @@ +! mar_lb : mar lateral boundaries +module mar_lb + use mardim + implicit none + ! n6 et n7 determine a relaxation zone towards lateral boundaries + ! (large scale values of the variables). + ! This zone extends over n6-1 points. + ! Davies (1976) propose 5 points (i.e. n6=6 and n7=7) + ! iyr_LB: Year + integer, save :: iyr_LB + ! mma_LB: Month + integer, save :: mma_LB + ! jda_LB: Day + integer, save :: jda_LB + ! jhu_LB: Hour (UT) + integer, save :: jhu_LB + ! jdh_LB: Time Interval before next GCM/NWP LBC (hour) + ! jdh_LB=0 ==> NO further GCM/NWP LBC available + integer, save :: jdh_LB + ! tim1LB: Time of the previous LBC (second) + integer(kind=8), save :: tim1LB + ! tim2LB: Time of the next LBC (second) + integer(kind=8), save :: tim2LB + ! n6mxLB, n6myLB, ... define the effective length of the lateral sponge + integer, save :: n40xLB, n50xLB, n5mxLB, n6mxLB, n7mxLB, & + n40yLB, n50yLB, n5myLB, n6myLB, n7myLB + ! vaXX : large scale values of relevant dependant variables + ! ^X=(x->x axis border, y->y axis border) + ! ^X=(g->x small, d->x large, b->y small, h->y large) + real, save, allocatable :: vaxgLB(:, :, :, :) + real, save, allocatable :: vaxdLB(:, :, :, :) + real, save, allocatable :: v1xgLB(:, :, :, :) + real, save, allocatable :: v1xdLB(:, :, :, :) + real, save, allocatable :: v2xgLB(:, :, :, :) + real, save, allocatable :: v2xdLB(:, :, :, :) + real, save, allocatable :: tixgLB(:, :, :) + real, save, allocatable :: tixdLB(:, :, :) + real, save, allocatable :: vayiLB(:, :, :, :) + real, save, allocatable :: vaysLB(:, :, :, :) + real, save, allocatable :: v1yiLB(:, :, :, :) + real, save, allocatable :: v1ysLB(:, :, :, :) + real, save, allocatable :: v2yiLB(:, :, :, :) + real, save, allocatable :: v2ysLB(:, :, :, :) + ! tiXXLB : independant term of semi-implicit numerical scheme + real, save, allocatable :: tiyiLB(:, :, :) + real, save, allocatable :: tiysLB(:, :, :) + ! wiXXLB : coefficient used in semi-implicit numerical scheme + real, save, allocatable :: wixgLB(:, :) + real, save, allocatable :: wixdLB(:, :) + real, save, allocatable :: wiyiLB(:, :) + real, save, allocatable :: wiysLB(:, :) + ! rXLB : nudging coefficients of the relaxation zone + real, save :: rxLB(mx) + real, save :: ryLB(my) + ! sst_LB : external SST + real, save :: sst_LB(mx, my) + real, save :: sst1LB(mx, my) + real, save :: sst2LB(mx, my) + ! Tfr_LB : Freezing Temperature + ! (corrected when using Reynolds data set) + real, save :: Tfr_LB + +contains + + subroutine mar_lb_init() + + use mardim, only: mx, my, mz,n7,n6 + implicit none + + allocate(vaxgLB(1:n7, my, mz, 5)) + allocate(vaxdLB(mx - n6:mx, my, mz, 5)) + allocate(v1xgLB(1:n7, my, mz, 5)) + allocate(v1xdLB(mx - n6:mx, my, mz, 5)) + allocate(v2xgLB(1:n7, my, mz, 5)) + allocate(v2xdLB(mx - n6:mx, my, mz, 5)) + allocate(tixgLB(2:n7, my, mz)) + allocate(tixdLB(mx - n6:mx1, my, mz)) + allocate(vayiLB(mx, 1:n7, mz, 5)) + allocate(vaysLB(mx, my - n6:my, mz, 5)) + allocate(v1yiLB(mx, 1:n7, mz, 5)) + allocate(v1ysLB(mx, my - n6:my, mz, 5)) + allocate(v2yiLB(mx, 1:n7, mz, 5)) + allocate(v2ysLB(mx, my - n6:my, mz, 5)) + allocate(tiyiLB(mx, 2:n7, mz)) + allocate(tiysLB(mx, my - n6:my1, mz)) + allocate(wixgLB(2:n7, 2:n7)) + allocate(wixdLB(mx - n6:mx1, mx - n6:mx1)) + allocate(wiyiLB(2:n7, 2:n7)) + allocate(wiysLB(my - n6:my1, my - n6:my1)) + + endsubroutine mar_lb_init + + +endmodule mar_lb diff --git a/MAR/code_mar/mar_module.f90 b/MAR/code_mar/mar_module.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7997fb41cc007aee283fc4c653c67f33f3499200 --- /dev/null +++ b/MAR/code_mar/mar_module.f90 @@ -0,0 +1,526 @@ +module mar_module + use mardim + use mar_ge + use marphy + use mar_ao + implicit none + private + public :: inicma, fromcpl, intocpl, atm2geo, atm2geo2 + integer, parameter, public :: im = mx, jm = my + integer, parameter, public :: ntot = mx * my + integer, parameter, public :: nout = 6 + ! i_timemax : Nombre de pas de temps dans les fichiers Netcdf de forcage + integer, parameter, public :: i_timemax = 30 + ! i_ReadFieldNb : Nombre de champs du fichier Netcdf de forcage + integer, parameter, public :: i_ReadFieldNb = 11 + ! i_WriteFieldNb : Nombre de champs du fichier Netcdf de sorties oceaniques + integer, parameter, public :: i_WriteFieldNb = 5 + ! jpflda2o1 : Number of fields exchanged from atmosphere to ocean via flx.F + integer, parameter, public :: jpflda2o1 = 9 !9 if coupsnow // 8 if not + ! jpflda2o2 : Number of fields exchanged from atmosphere to ocean via tau.F + integer, parameter, public :: jpflda2o2 = 8 !!COTAU... + ! jpfldo2a : Number of fields exchanged from ocean to atmosphere + integer, parameter, public :: jpfldo2a = 10 + ! Define symbolic name for fields exchanged from atmos to coupler, + ! must be the same as (1) of the field definition in namcouple: + ! real, dimension(im,jm), save :: uuao,vvao + ! character(len=8), parameter, dimension(16), public :: cl_writ=(/ 'COSHFICE', & + ! & 'COSHFOCE', 'CONSFICE', 'CONSFOCE', 'CODFLXDT', 'COEVAPWA', 'COLIQPRE', & + ! & 'COSOLPRE', 'COTAUXUW', 'COTAUXUI', 'COTAUYUW', & + ! & 'COTAUYUI', 'COTAUXVW', 'COTAUXVI', 'COTAUYVW', 'COTAUYVI' /) + !avec coupsnow + character(len=8), parameter, dimension(17), public :: cl_writ = (/ & + 'COSHFICE', 'COSHFOCE', 'CONSFICE', 'CONSFOCE', 'CODFLXDT', & + 'COEVATOT', 'COLIQPRE', 'COSOLPRE', 'COEVAICE', 'COTAUXUW', & + 'COTAUXUI', 'COTAUYUW', 'COTAUYUI', 'COTAUXVW', 'COTAUXVI', & + 'COTAUYVW', 'COTAUYVI'/) + ! COSHFICE = COupled Solar Heat Flux on ICE (SWD on ice) + ! COSHFOCE = COupled Solar Heat Flux on OCEan (SWD on ice) + ! CONSFICE = COupled Non Solar Flux on ICE (LWD on ice) + ! CONSFOCE = Coupled Non Solar Flux on OCEan (LWD on ocean) + ! CODFLXDT = COupled down Latent x(?) DerivaTive + ! COEVAPWA = COupled EVAPoration on WAter + ! COLIQPRE = COupled LIQuid PREcipitation + ! COSOLPRE = COupled SOLid PREcipitation + ! COUPSNOW = COupled UPward Snow !BS + ! COTAUXUW = COupled downward TAUx X-axis X-axis stress on U-grid on Water + ! COTAUXUI = COupled downward TAUx X-axis X-axis stress on U-grid on Ice + ! COTAUYUW = COupled downward TAUx X-axis Y-axis stress on U-grid on Water + ! COTAUYUI = COupled downward TAUx X-axis Y-axis stress on U-grid on Ice + ! COTAUXVW = COupled downward TAUx X-axis X-axis stress on V-grid on Water + ! COTAUXVI = COupled downward TAUx X-axis X-axis stress on V-grid on Ice + ! COTAUYVW = COupled downward TAUx X-axis Y-axis stress on U-grid on Water + ! COTAUYVI = COupled downward TAUx X-axis Y-axis stress on V-grid on Ice + ! + ! Define symbolic name for fields exchanged from coupler to atmosphere, + ! must be the same as (2) of the field definition in namcouple: + character(len=8), parameter, dimension(10), public :: cl_read = (/ & + 'SISUTESW', 'SIICECOV', 'SIICEALW', 'SIICTEMW', 'SIHEIGHT', & + 'SISNOWHT', 'OCECURTU', 'OCECURTV', 'ICECURTU', 'ICECURTV'/) + integer, dimension(jpfldo2a), save :: ig_var_id_in + integer, dimension(jpflda2o1 + jpflda2o2), save :: ig_var_id_out + +contains + subroutine inicma + use mod_oasis + implicit none + ! comp_id : component identification + integer :: comp_id + character(len=6) :: comp_name = 'mara' + integer :: ierror + ! localComm : local MPI communicator and Initialized + integer :: localComm + ! Global grid parameters : + ! nlon, nlat : dimensions in the 2 directions of space + ! integer :: nlon, nlat + ! MAR Antarctic since first MAR-NEMO coupling over the AIS. + ! NB character(len=4) used for historical oasis reasons userguidep16 + character(len=4) :: cgrid = 'mara' + ! ntot : total dimension (=mx*my) defined above + ! integer :: ntot + integer :: il_paral_size + ! nc : number of corners + ! integer :: nc + ! integer :: indi_beg, indi_end, indj_beg, indj_end + + ! if OASIS has to define grids.nc, masks.nc and areas.nc (do not use it) + ! real :: deglon2D(mx,my),deglat2D(mx,my) + ! real :: globalgrid_clo(mx,my), globalgrid_cla(mx,my), globalgrid_srf(mx,my),indice_mask(mx,my) + + ! il_paral : Decomposition for each proc !cf uiserguide p12 + integer, dimension(:), ALLOCATABLE :: il_paral + + ! Grid parameters definition + ! il_part_id : use to connect the partition to the variables + integer :: il_part_id + + ! some messy paramaters still not classified + ! il_flag : Flag for grid writing by proc 0 + integer :: il_flag + integer il_var_nodims(2), il_var_shape(4) + integer jf, info + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + !* 1. Initializations + ! --------------- + + write(nout, *) ' ' + write(nout, *) ' ' + write(nout, *) ' ROUTINE INICMA' + write(nout, *) ' **************' + write(nout, *) ' ' + write(nout, *) ' ' + + call oasis_init_comp(comp_id, comp_name, ierror) ! model name = MAR + + if(ierror /= 0) then + write(6, *) 'oasis_init_comp abort by ', comp_name, ' compid ', comp_id + call oasis_abort(comp_id, comp_name, 'Problem init in oasis_init_comp') + else + write(6, *) 'inicma: init oasis ok' + endif + + !* 1.1 Oasis get localcomm + ! --------------- + ! Attribution by Oasis of a local communicator for each component + !WARNING WARNING! + call oasis_get_localcomm(localComm, ierror) + if(ierror /= 0) then + write(6, *) 'oasis_get_localcomm abort by', comp_name, ' compid ', comp_id + call oasis_abort(comp_id, comp_name, 'Problem ') + endif + + !Probably not Needed (at least it works without...) + ! call MPI_Comm_Size ( localComm, npes, ierror ) + ! if (ierror /= 0) then + ! write(w_unit,*) 'MPI_comm_size abort by model1 compid ',comp_id + ! call oasis_abort(comp_id,comp_name,'Problem at line 131') + ! end if + ! ! + ! call MPI_Comm_Rank ( localComm, mype, ierror ) + ! if (ierror /= 0) then + ! write (w_unit,*) 'MPI_Comm_Rank abort by model1 compid ',comp_id + ! call oasis_abort(comp_id,comp_name,'Problem at line 137') + ! end if + + !* 1.2 Grid partition + ! --------------- + ! Definition of the partition of the grid (serial, apple, box and orange) + ! CHECK for OPEN-MP/ MPI compatibility !!!! CK 20/02/2020 + ! Firsly coded to use a serial partition (= no partition) = one box + ! works but only with one CPU (probably link to oasis get localcomm?) + + ! ntot = mx * my ! mx and my from mardim_mod.f90 + + ! il_paral_size = 3 ! for apple + ! il_paral_size = 5 ! for box + ! il_paral_size = ! N segments for orange + ! il_paral_size = ! N points for points + il_paral_size = 3 !no partition Serial userguide p12 + ALLOCATE(il_paral(il_paral_size)) + + !WARNING!!! if Serial + if(il_paral_size == 3) then + il_paral(1) = 0 + il_paral(2) = 0 + il_paral(3) = ntot + endif + + call oasis_def_partition(il_part_id, il_paral, ierror) + + DEALLOCATE(il_paral) + + !* 1.3 Grid definition + ! --------------- + ! Definition of grids (grids.nc, masks.nc and areas.nc) if not previously defined by users + ! => do IT AND do NOT LET OASIS TO do IT + + ! deglon2D = GElonh * 15. !Gelonh(mx,my) = longitude in hours + ! deglat2D = GElatr / degrad !Gelatr(mx,my) = lat in radian + ! should be corrected as OASIS needs lon and lat corner not lon and lat from the center of the pixel !CK6/12/18 + + ! call oasis_start_grids_writing(il_flag) + ! call oasis_write_grid(cgrid, mx, my, deglon2D, deglat2D) + ! call oasis_write_corner(cgrid, mx, my, 4, globalgrid_clo, globalgrid_cla) + ! call oasis_write_area(cgrid, mx, my, globalgrid_srf) + ! call oasis_write_mask(cgrid, mx, my, indice_mask(:,:)) + ! call oasis_terminate_grids_writing() + + !* 1.4 Coupling field declaration + ! --------------- + il_var_nodims(1) = 1 + il_var_nodims(2) = 1 + + il_var_shape(1) = 1 + il_var_shape(2) = mx + il_var_shape(3) = 1 + il_var_shape(4) = my + + ! 1.4.1 Declare each field received by atm + + do jf = 1, jpfldo2a + call oasis_def_var(ig_var_id_in(jf), cl_read(jf), il_part_id, il_var_nodims, & + OASIS_In, il_var_shape, OASIS_real, ierror) + !var_id, name= nom namcouple, partition ID, varnodims always 1, + ! OASIS_in defined in parameters.f90 (see userguide p18),dimension,type du field, + if(ierror /= 0) then + write(6, *) ' inicma : pb o define O to A ' & + &, cl_read(jf), ' for jf = ', jf + write(6, *) ' error code is = ', ierror + write(6, *) ' STOP in inicma' + call FLUSH(6) + call abort + else + write(6, *) 'inicma : oasis define O to A OK ', jf, ' : ' & + &, cl_read(jf) + endif + enddo + + ! 1.4.2 Declare each field sent by atm + + do jf = 1, jpflda2o1 + jpflda2o2 + call oasis_def_var(ig_var_id_out(jf), cl_writ(jf), il_part_id, il_var_nodims, & + OASIS_Out, il_var_shape, OASIS_real, ierror) + + if(ierror /= 0) then + write(6, *) ' inicma : pb oasis def var A to O ' & + &, cl_writ(jf), ' for jf = ', jf + write(6, *) ' error code is = ', ierror + write(6, *) ' STOP in inicma' + call FLUSH(6) + call abort + else + write(6, *) 'inicma : oasis define OK A to O ', jf, ' : ' & + &, cl_writ(jf) + endif + enddo + write(6, *) 'inicma : oasis_def_var ok ' + + !* 1.5 end of declaration phase + ! --------------- + + call oasis_enddef(ierror) + + if(ierror /= 0) then + write(6, *) 'inicma : pb oasis_enddef ' + write(6, *) ' error code is = ', ierror + write(6, *) ' STOP in inicma' + coupling_ao = .false. + call FLUSH(6) + call abort + else + write(6, *) 'inicma : start ierror ok ' + coupling_ao = .true. + endif + + endsubroutine inicma + + !========================================================================== + ! + subroutine fromcpl(kt, sst, iss, gla, igla, albedo, ialb, tice, itic, hice, ihic, & + hsnow, ihsn, u_oce, i_uo, v_oce, i_vo, u_ice, i_ui, v_ice, i_vi) + + use mod_oasis + + implicit none + + integer kt ! in seconds + real(kind=8) sst(im, jm) ! -sea-surface-temperature + real(kind=8) gla(im, jm) ! -sea-ice fraction + real(kind=8) tice(im, jm) ! -ice surf temperature + real(kind=8) albedo(im, jm) ! -albedo over sea ice + real(kind=8) hice(im, jm) ! -sea ice height + real(kind=8) hsnow(im, jm) ! -surface snow thickness over sea ice + real(kind=8) u_oce(im, jm) ! -surface ocean velocity along X + real(kind=8) v_oce(im, jm) ! -surface ocean velocity along Y + real(kind=8) u_ice(im, jm) ! -surface ice velocity along X + real(kind=8) v_ice(im, jm) ! -surface ice velocity along Y + + integer info, jf + ! flag used in MAR so that MAR can know if there was a coupling + ! for that variable at its timestep + integer iss, igl, igla, ialb, itic, ihic, ihsn, i_uo, i_vo, i_ui, i_vi + + call flush(6) + + ! Get interpolated oceanic fields from Oasis + ! (only if kt=coupling time, cf oasis_get_proto) + + do jf = 1, jpfldo2a + if(jf == 1) then + call oasis_get(ig_var_id_in(1), kt, sst, iss) + info = iss + endif + if(jf == 2) then + call oasis_get(ig_var_id_in(2), kt, gla, igla) + info = igla + endif + if(jf == 3) then + call oasis_get(ig_var_id_in(3), kt, albedo, ialb) + info = ialb + endif + if(jf == 4) then + call oasis_get(ig_var_id_in(4), kt, tice, itic) + info = itic + endif + if(jf == 5) then + call oasis_get(ig_var_id_in(5), kt, hice, ihic) + info = ihic + endif + if(jf == 6) then + call oasis_get(ig_var_id_in(6), kt, hsnow, ihsn) + info = ihsn + endif + if(jf == 7) then + call oasis_get(ig_var_id_in(7), kt, u_oce, i_uo) + info = i_uo + endif + if(jf == 8) then + call oasis_get(ig_var_id_in(8), kt, v_oce, i_vo) + info = i_vo + endif + + if(jf == 9) then + call oasis_get(ig_var_id_in(9), kt, u_ice, i_ui) + info = i_ui + endif + + if(jf == 10) then + call oasis_get(ig_var_id_in(10), kt, v_ice, i_vi) + info = i_vi + endif + + if(info /= OASIS_Ok .and. info /= OASIS_Recvd & + & .and. info /= OASIS_FromRest .and. info /= OASIS_Input & + & .and. info /= OASIS_RecvOut .and. & + & info /= OASIS_FromRestOut) then + write(nout, *) 'Pb in reading ', cl_read(jf), jf + write(nout, *) 'Couplage kt is = ', kt + write(nout, *) 'PSMILe error code is = ', info + write(nout, *) ' STOP in fromcpl' + call FLUSH(nout) + call abort + endif + enddo + + endsubroutine fromcpl + ! + !========================================================================== + ! + ! subroutine intocpl(kt, fsolice, fsolwat, fnsolice, fnsolwat, & + ! & fnsicedt, evwat, lpre, spre, & + ! & taux_u_oce, taux_u_ice, tauy_u_oce, tauy_u_ice, & + ! & taux_v_oce, taux_v_ice, tauy_v_oce, tauy_v_ice) + + ! with upsnpw(coupsnow) + + subroutine intocpl(kt, fsolice, fsolwat, fnsolice, fnsolwat, & + & fnsicedt, evtot, lpre, spre, ievp, & + & taux_u_oce, taux_u_ice, tauy_u_oce, tauy_u_ice, & + & taux_v_oce, taux_v_ice, tauy_v_oce, tauy_v_ice) + + use mod_oasis + + implicit none + + ! time in seconds + integer, intent(in) :: kt + ! solar heat flux on sea ice + real(kind=8), dimension(im, jm), intent(in) :: fsolice + ! solar heat flux on water + real(kind=8), dimension(im, jm), intent(in) :: fsolwat + ! total non-solar heat flux on sea ice + real(kind=8), dimension(im, jm), intent(in) :: fnsolice + ! total non-solar heat flux on water + real(kind=8), dimension(im, jm), intent(in) :: fnsolwat + ! non solar heat flux derivative + real(kind=8), dimension(im, jm), intent(in) :: fnsicedt + ! evaporation over ocean and sea ice + real(kind=8), dimension(im, jm), intent(in) :: evtot + ! liquid precip + real(kind=8), dimension(im, jm), intent(in) :: lpre + ! snow fall + real(kind=8), dimension(im, jm), intent(in) :: spre + ! sea ice sublimation + real(kind=8), dimension(im, jm), intent(in) :: ievp + ! weighted surface downward X-axis stress on U-grid + real(kind=8), dimension(im, jm), intent(in) :: taux_u_oce + ! weighted surface downward X-axis stress over ice on U-grid + real(kind=8), dimension(im, jm), intent(in) :: taux_u_ice + ! weighted surface downward Y-axis stress on U-grid + real(kind=8), dimension(im, jm), intent(in) :: tauy_u_oce + ! weighted surface downward Y-axis stress over ice on U-grid + real(kind=8), dimension(im, jm), intent(in) :: tauy_u_ice + ! weighted surface downward X-axis stress on V-grid + real(kind=8), dimension(im, jm), intent(in) :: taux_v_oce + ! weighted surface downward X-axis stress over ice on V-grid + real(kind=8), dimension(im, jm), intent(in) :: taux_v_ice + ! weighted surface downward Y-axis stress on V-grid + real(kind=8), dimension(im, jm), intent(in) :: tauy_v_oce + ! weighted surface downward Y-axis stress over ice on V-grid + real(kind=8), dimension(im, jm), intent(in) :: tauy_v_ice + + integer :: icstep, info, jn + ! + icstep = kt + ! + + ! + ! -Give atmospheric fields to Oasis + ! (only if kt+idt=coupling time, cf prism_put_proto) + ! (else, prism_put_prot usefull for averages in oasis) + + do jn = 1, jpflda2o1 + jpflda2o2 + if(jn == 1) call oasis_put(ig_var_id_out(jn), & + & kt, fsolice, info) + if(jn == 2) call oasis_put(ig_var_id_out(jn), kt, & + & fsolwat, info) + if(jn == 3) call oasis_put(ig_var_id_out(jn), kt, & + & fnsolice, info) + if(jn == 4) call oasis_put(ig_var_id_out(jn), kt, & + & fnsolwat, info) + if(jn == 5) call oasis_put(ig_var_id_out(jn), kt, & + & fnsicedt, info) + if(jn == 6) call oasis_put(ig_var_id_out(jn), kt, & + & evtot, info) + if(jn == 7) call oasis_put(ig_var_id_out(jn), kt, & + & lpre, info) + if(jn == 8) call oasis_put(ig_var_id_out(jn), kt, & + & spre, info) + if(jn == 9) call oasis_put(ig_var_id_out(jn), kt, & + & ievp, info) !WARNING NOT useD ANYMORE 03/05 (CK? maybe still used actually) + if(jn == 10) call oasis_put(ig_var_id_out(jn), kt, & + & taux_u_oce, info) + if(jn == 11) call oasis_put(ig_var_id_out(jn), kt, & + & taux_u_ice, info) + if(jn == 12) call oasis_put(ig_var_id_out(jn), kt, & + & tauy_u_oce, info) + if(jn == 13) call oasis_put(ig_var_id_out(jn), kt, & + & tauy_u_ice, info) + if(jn == 14) call oasis_put(ig_var_id_out(jn), kt, & + & taux_v_oce, info) + if(jn == 15) call oasis_put(ig_var_id_out(jn), kt, & + & taux_v_ice, info) + if(jn == 16) call oasis_put(ig_var_id_out(jn), kt, & + & tauy_v_oce, info) + if(jn == 17) call oasis_put(ig_var_id_out(jn), kt, & + & tauy_v_ice, info) + + if(info /= OASIS_Ok .and. info /= OASIS_Sent & + .and. info /= OASIS_ToRest .and. info /= OASIS_LocTrans & + .and. info /= OASIS_Output .and. info /= OASIS_SentOut & + .and. info /= OASIS_ToRestOut) then + write(nout, *) 'STEP : Pb giving ', cl_writ(jn), ':', jn + write(nout, *) ' at timestep = ', icstep, 'kt = ', kt + write(nout, *) 'OASIS error code is = ', info + write(nout, *) ' STOP in intocpl' + call FLUSH(nout) + call abort + endif + enddo + endsubroutine intocpl + ! + !========================================================================== + ! + subroutine atm2geo(pte, ptn, plon, plat, pxx, pyy, pzz) + ! + !! Change wind local atmospheric coordinates to geocentric + !! + ! + real, dimension(im, jm), intent(in) :: pte, ptn + real, dimension(im, jm), intent(in) :: plon, plat + real, dimension(im, jm), intent(out) :: pxx, pyy, pzz + ! + real, parameter :: rpi = 3.141592653E0 + real, parameter :: rad = rpi / 180.0E0 + ! + real, dimension(im, jm), save :: zsinlon, zcoslon + real, dimension(im, jm), save :: zsinlat, zcoslat + ! + logical, save :: linit = .false. + ! + if(.not. linit) then + zsinlon = SIN(rad * plon) + zcoslon = COS(rad * plon) + zsinlat = SIN(rad * plat) + zcoslat = COS(rad * plat) + linit = .true. + endif + ! + pxx = -zsinlon * pte - zsinlat * zcoslon * ptn + pyy = zcoslon * pte - zsinlat * zsinlon * ptn + pzz = zcoslat * ptn + ! + ! Value at North Pole + pxx(:, 1) = -ptn(1, 1) + pyy(:, 1) = -pte(1, 1) + pzz(:, 1) = 0.0 + ! Value at South Pole + pxx(:, jm) = +ptn(1, jm) + pyy(:, jm) = +pte(1, jm) + pzz(:, jm) = 0.0 + ! + endsubroutine atm2geo + + subroutine atm2geo2(ua, va, lon, uo, vo) + ! Reproj wind vectors from MAR grid to NEMO grid ... need to be improved ! PV + ! MAR uses wind_rot.f90 now + + real, dimension(im, jm), intent(in) :: ua, va + real, dimension(im, jm), intent(in) :: lon + real, dimension(im, jm), intent(out) :: uo, vo + real, parameter :: rpi = 3.141592653E0 + real, parameter :: rad = rpi / 180.0E0 + real, dimension(im, jm), save :: cosphi, sinphi, phi + real, parameter :: lon0 = 140.0E0 + real, parameter :: deltaphi = 90 - lon0 + + phi = -1 * (lon + deltaphi) * rad + cosphi = COS(phi) + sinphi = SIN(phi) + + uo = sinphi * va + cosphi * ua + vo = cosphi * va - sinphi * ua + endsubroutine atm2geo2 +endmodule mar_module diff --git a/MAR/code_mar/mar_nh_mod.f90 b/MAR/code_mar/mar_nh_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..354652b053fd63fe29a31e2628c53a29dec36448 --- /dev/null +++ b/MAR/code_mar/mar_nh_mod.f90 @@ -0,0 +1,28 @@ +! mar_nh : mar non-hydrostatic +! ============================ +module mar_nh + use mardim + implicit none + ! ua0_NH : Horizontal (x-Direction) Wind Speed (m/s) / Previous Time Step + real, save :: ua0_NH(mx, my, mz) + ! va0_NH : Horizontal (y-Direction) Wind Speed (m/s) / Previous Time Step + real, save :: va0_NH(mx, my, mz) + ! wa0_NH : Vertical (z-Direction) Wind Speed (m/s) / Previous Time Step + real, save :: wa0_NH(mx, my, mz) + ! wairNH : Vertical Non-Hydrostatic Wind Speed (m/s) + real, save :: wairNH(mx, my, mz) + ! pairNH : Non-Hydrostatic Pressure (kPa) + real, save :: pairNH(mx, my, mz) + ! dt_ONH : Non-Hydrostatic Time Step (s) + real, save :: dt_ONH + ! dtxONH = dt_ONH / dx (s/m) + real, save :: dtxONH + ! dtyONH = dt_ONH / dy (s/m) + real, save :: dtyONH + ! gamaNH : Cp / Cv + real, save :: gamaNH + ! c2NH : Prescribed Squared Sound Speed (m2/s2) + real, save :: c2NH + ! taNH : Reference Surface Air Temperature (K) + real, save :: taNH +endmodule mar_nh diff --git a/MAR/code_mar/mar_ol_mod.f90 b/MAR/code_mar/mar_ol_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..871689fae72e8c5f533f54de099be42c412af0af --- /dev/null +++ b/MAR/code_mar/mar_ol_mod.f90 @@ -0,0 +1,10 @@ +! mar_ol +! ====== +module mar_ol + use mardim + implicit none + real, save :: urefOL(mx, my, mz) + real, save :: trefOL(mx, my, mz) + real, save :: gp00OL(mx, my, mz) + real, save :: gplvOL(mx, my, mz) +endmodule mar_ol diff --git a/MAR/code_mar/mar_pb_mod.f90 b/MAR/code_mar/mar_pb_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4f95a2231ed1b6c66eef67e597e8dd1fb030b8d4 --- /dev/null +++ b/MAR/code_mar/mar_pb_mod.f90 @@ -0,0 +1,29 @@ +module mar_pb + use mardim + implicit none + ! Kstep1 : convective counter + integer, save :: Kstep1(klon) + ! K_CbT1 : cloud top level + integer, save :: K_CbT1(klon) + ! K_CbB1 : cloud base level + integer, save :: K_CbB1(klon) + integer, parameter :: KTCCH0 = 1 + real, save :: P_CH_0(klon, klev, KTCCH0) + real, save :: PdCH_1(klon, klev, KTCCH0) + real, save :: PdTa_1(klon, klev) + real, save :: PdQa_1(klon, klev) + real, save :: PdQw_1(klon, klev) + real, save :: PdQi_1(klon, klev) + real, save :: Pdrr_1(klon) + real, save :: Pdss_1(klon) + ! PuMF_1 : Upward Mass Flux + real, save :: PuMF_1(klon, klev) + ! PdMF_1 : Downward Mass Flux + real, save :: PdMF_1(klon, klev) + ! Pfrr_1 : Liquid Precipitation Flux + real, save :: Pfrr_1(klon, klev) + ! Pfss_1 : Solid Precipitation Flux + real, save :: Pfss_1(klon, klev) + ! Pcape1 : CAPE [J/kg] + real, save :: Pcape1(klon) +endmodule mar_pb diff --git a/MAR/code_mar/mar_po_mod.f90 b/MAR/code_mar/mar_po_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9657ce65f26f4eb00ab29d6dc6bded03ebb804bd --- /dev/null +++ b/MAR/code_mar/mar_po_mod.f90 @@ -0,0 +1,56 @@ +! mar_po : mar polynya model +! ========================== +module mar_po + use mardim + implicit none + ! dtPO : Polynya Model Time Step + real, save :: dtPO + ! silfPO : Sea Ice Solidification: Latent Heat + real, save :: silfPO + ! sw00PO, si00PO: water, sea-ice salinities (TN Bay) + ! (Bromwich and Kurtz, 1984, JGR, p.3568; + ! Cavalieri and Martin, 1985, p. 248) + real, save :: sw00PO + real, save :: si00PO + ! aPOlyn : Initial (observed) Lead Fraction + real, save :: aPOlyn(mx, my) + ! iPO1,iPO2,iPO3,iPO4 define output area (x-axis) + ! jPO1,jPO2,jPO3,jPO4 define output area (y-axis) + integer, save :: iPO1, iPO2, jPO1, jPO2, iPO3, iPO4, jPO3, jPO4 + ! uocnPO: Oceanic Current (prescribed, x-direction) + real, save :: uocnPO(mx, my) + ! vocnPO: Oceanic Current (prescribed, y-direction) + real, save :: vocnPO(mx, my) + ! focnPO: Oceanic Heat Flux (in the oceanic mixed layer) + real, save :: focnPO(mx, my) + ! albwPO: Open Water Surface Albedo + real, save :: albwPO(mx, my) + ! hatmPO: Heat Losses from Open Water Area + real, save :: hatmPO(mx, my) + ! swsaPO: Oceanic Salinity (in the oceanic mixed layer) + real, save :: swsaPO(mx, my) + ! tsswPO: Sea Water Freezing Temperature + real, save :: tsswPO(mx, my) + ! cwswPO: Sea Water Heat Capacity + real, save :: cwswPO(mx, my) + ! awmxPO: Max Fraction of Open Water + real, save :: awmxPO(mx, my) + ! uicePO : Sea-Ice Velocity + real, save :: uicePO(mx, my) + ! vicePO : Sea-Ice Velocity + real, save :: vicePO(mx, my) + ! ufraPO : Fraizil Velocity + real, save :: ufraPO(mx, my) + ! vfraPO : Fraizil Velocity + real, save :: vfraPO(mx, my) + ! hfraPO : Fraizil Thickness + real, save :: hfraPO(mx, my) + ! hicePO : Sea-Ice Thickness (Old Ice) + real, save :: hicePO(mx, my) + ! aicePO : Sea-Ice Fraction (Old Ice) + real, save :: aicePO(mx, my) + ! hiavPO : Sea-Ice Thickness (Average) + real, save :: hiavPO(mx, my) + ! vgriPO : Grease Ice Volume (New Ice) + real, save :: vgriPO(mx, my) +endmodule mar_po diff --git a/MAR/code_mar/mar_ra_mod.f90 b/MAR/code_mar/mar_ra_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7a54ff52dc90f5f6f353994622cfb258243d545a --- /dev/null +++ b/MAR/code_mar/mar_ra_mod.f90 @@ -0,0 +1,71 @@ +! mar_ra : mar radiative scheme +! ============================= +module mar_ra + use mardim + implicit none + ! pktRAd: Radiation Divergence ==> Diabatic Heating + real, save :: pktRAd(mx, my, mz) + ! RAdsol: Surface Downward Solar Heat Flux + real, save :: RAdsol(mx, my) + ! RAd_ir: Surface Downward IR Heat Flux + real, save :: RAd_ir(mx, my) + ! RAdOLR: Outgoing Longwave Radiation + real, save :: RAdOLR(mx, my) + ! RAdOSR: Outgoing Shortwave Radiation + real, save :: RadOSR(mx, my) + ! RAfnSO: Net Shortwave Radiation + real, save, allocatable :: RAfnSO(:, :, :) + ! RAfnIR: Net Longwave Radiation + real, save, allocatable :: RAfnIR(:, :, :) + ! RAfncSO: Clearsky Net Shortwave Radiation + real, save, allocatable :: RAfncSO(:, :, :) + ! RAfncIR: Clearsky Net Longwave Radiation + real, save, allocatable :: RAfncIR(:, :, :) + ! tviRA: Radiating Surface Temperature + real, save :: tviRA(mx, my) + ! IRsoil: Soil upward IR + real, save, allocatable :: IRsoil(:, :, :) + ! RAcd_O, RAcdtO: Cloud Optical Depth [-] + real, save, allocatable :: RAcd_O(:, :, :) + real, save :: RAcdtO(mx, my) + ! RAer_O, RAertO: Aeros.Optical Depth [-] + real, save, allocatable :: RAer_O(:, :, :) + real, save :: RAertO(mx, my) + ! pmb_RA: Pressure (hPa) + real, save :: pmb_RA(mzir) + ! tairRA: Temperature (K) + real, save :: tairRA(mzir) + ! qvapRA: Specific Humidity (kg/kg) + real, save :: qvapRA(mzir) + ! cld_RA: Cloudiness at level k + real, save :: cld_RA(mzir) + ! qlwpRA: Cloud Liquid Water Path (level k) + real, save :: qlwpRA(mzir) + ! toptRA: Cloud Optical Depth (level k) + real, save :: toptRA(mzir) + ! wo3_RA: Ozone Content (cm STP) + real, save :: wo3_RA(mzir) + ! dwo3RA: Ozone Content (Divergence) + real, save :: dwo3RA(mzir) + ! htngRA: Radiative Heating (K/s) + real, save :: htngRA(mzir) + +contains + + subroutine mar_ra_init() + + use mardim, only: mx, my, mz,mzz + implicit none + + allocate(RAfnSO(mx, my, mz)) + allocate(RAfnIR(mx, my, mzz)) + allocate(RAfncSO(mx, my, mz)) + allocate(RAfncIR(mx, my, mzz)) + allocate(IRsoil(mx, my, mw)) + allocate(RAcd_O(mx, my, mz)) + allocate(RAer_O(mx, my, mz)) + + endsubroutine mar_ra_init + + +endmodule mar_ra diff --git a/MAR/code_mar/mar_sl_mod.f90 b/MAR/code_mar/mar_sl_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fdf5fd3dcc7d294253efec8d4a80f44d16fa403b --- /dev/null +++ b/MAR/code_mar/mar_sl_mod.f90 @@ -0,0 +1,301 @@ +! mar_sl : mar surface air layers +! =============================== +module mar_sl + use mardim + implicit none + ! Ta2mSL : interpolated 2 meter air temperature + real, save, allocatable :: Ta2mSL(:, :, :) + ! TminSL : minimum 2 meter air temperature + real, save, allocatable :: TminSL(:, :, :) + ! TmaxSL : maximum 2 meter air temperature + real, save, allocatable :: TmaxSL(:, :, :) + ! Ta3mSL : interpolated 3 meter air temperature + real, save, allocatable :: Ta3mSL(:, :, :) + ! V03mSL : interpolated 3 meter wind speed + real, save, allocatable :: V03mSL(:, :, :) + ! V10mSL : interpolated 10 meter wind speed + real, save, allocatable :: V10mSL(:, :, :) + ! tairSL : extrapolation of the sounding tempature to the surface. (K) + real, save :: tairSL(mx, my) + ! dtagSL : Air-Surface Temperature Difference (K) + real, save :: dtagSL + ! tsrfSL : Surface Temperature (K) + real, save :: tsrfSL(mx, my, mw) + ! qvapSL : specific humidity close to the surface (kg/kg) + real, save :: qvapSL(mx, my) + ! isolSL : Surface Type : 1 -> open ocean + ! 2 -> glacier + ice sheet + snow + ! 3 -> sea ice (+ snow) + ! 4 -> soil (+ snow) + ! 5 -> soil + vegetation + integer, save :: isolSL(mx, my) + ! maskSL : Land--Sea Mask 0 -> Continent 1 -> Ocean + integer, save :: maskSL(mx, my) + ! sol_SL : Absorbed Solar Heat Flux (W/m2) + real, save :: sol_SL(mx, my) + ! firdSL : Downward IR Heat Flux (W/m2) + real, save :: firdSL(mx, my) + ! firmSL : Upward IR Heat Flux (W/m2) + real, save :: firmSL(mx, my) + ! hsenSL : Downward Sensible Heat Flux (W/m2) + real, save :: hsenSL(mx, my) + ! hlatSL : Evapora. Latent Heat Flux (W/m2) + real, save :: hlatSL(mx, my) + ! fmelSL : Melting Latent Heat Flux (W/m2) + real, save :: fmelSL(mx, my) + ! freeSL : Freezing Latent Heat Flux (W/m2) + real, save :: freeSL(mx, my) + ! hbalSL : Total Surface Heat Loss (W/m2) + real, save :: hbalSL(mx, my) + ! cld_SL: Total Cloudiness above the Surface + real, save :: cld_SL(mx, my) + real, save :: clduSL(mx, my) + real, save :: cldmSL(mx, my) + real, save :: clddSL(mx, my) + ! CldFRA: Cloud Fraction [-] + real, save, allocatable :: CldFRA(:, :, :) + ! alb0SL : Background Surface Albedo + real, save :: alb0SL(mx, my) + ! albeSL : Grid Mesh Surface Albedo + real, save :: albeSL(mx, my) + ! albsSL : Underlaying Soil Albedo + real, save :: albsSL(mx, my) + ! albxSL : Mosaic Surface Albedo + real, save, allocatable :: albxSL(:, :, :) + ! alb0SL_1: Background Surface Albedo for first spectral band [0.3-0.8um] + real, save, allocatable :: alb0SL_1(:, :) + ! alb0SL_2: Background Surface Albedo for second spectral band [0.8-1.5um] + real, save, allocatable :: alb0SL_2(:, :) + ! alb0SL_3: Background Surface Albedo for third spectral band [1.5-2.8um] + real, save, allocatable :: alb0SL_3(:, :) + ! tgirSL : Effective Surface Radiative Temperature + real, save, allocatable :: tgirSL(:, :) + ! eps0SL : Surface IR Emissivity + real, save, allocatable :: eps0SL(:, :) + ! nSLsrf : Number of Sectors in a Grid Box (m/s) + integer, save :: nSLsrf(mx, my) + integer, parameter :: ntavSL = 20 + ! SLsrfl : Normalized Sector Area (m/s) + real, save :: SLsrfl(mx, my, mw) + ! SLzoro : Roughness Length for Momentum (Orography) (m/s) + real, save, allocatable :: SLzoro(:, :, :) + ! SL_z0 : Roughness Length for Momentum (m/s) + real, save, allocatable :: SL_z0(:, :, :) + real, save, allocatable :: SLn_z0(:, :, :, :) + ! SL_r0 : Roughness Length for Heat (m/s) + real, save, allocatable :: SL_r0(:, :, :) + real, save, allocatable :: SLn_b0(:, :, :, :) + real, save, allocatable :: SLn_r0(:, :, :, :) + ! SLlmo : Monin-Obukhov Length (Average) (m/s) + real, save, allocatable :: SLlmo(:, :) + ! SLlmol : Monin-Obukhov Length (m/s) + real, save, allocatable :: SLlmol(:, :, :) + ! SLuus : Friction Velocity (Average) (m/s) + real, save, allocatable :: SLuus(:, :) + ! SLuusl : Friction Velocity (m/s) + real, save, allocatable :: SLuusl(:, :, :) + ! duusSL : Correct. Friction Velocity (Average) (m2/s2) + real, save, allocatable :: duusSL(:, :) + ! SLuts : Surface Potential Temperature Turbulent Flux (Average) (K.m/s) + real, save, allocatable :: SLuts(:, :) + ! SLutsl : Surface Potential Temperature Turbulent Flux (K.m/s) + real, save, allocatable :: SLutsl(:, :, :) + ! SLdSdT : Sensible Turbulent Heat Flux T-Derivative (W/m2/K) + real, save, allocatable :: SLdSdT(:, :, :) + ! dutsSL : Correct. Potential Temperature Turbulent Flux (Average) (K.m/s) + real, save, allocatable :: dutsSL(:, :) + ! cutsSL : Correct. Potential Temperature Turbulent Flux (K.m/s) + real, save, allocatable :: cutsSL(:, :, :) + ! SLuqs : Surface Specific Humidity Turbulent Flux (Av.) (kg/kg.m/s) + real, save, allocatable :: SLuqs(:, :) + ! SLuqsl : Surface Specific Humidity Turbulent Flux (kg/kg.m/s) + real, save, allocatable :: SLuqsl(:, :, :) + ! SLdLdT : Latent Turbulent Heat Flux T-Derivative (W/m2/K) + real, save, allocatable :: SLdLdT(:, :, :) + ! SaltSL : Friction Velocity Saltation Threshold (m/s) + real, save, allocatable :: SaltSL(:, :) + ! SLussl : Surface Blowing Snow Turbulent Flux (kg/kg.m/s) + real, save, allocatable :: SLussl(:, :, :) + ! SLubsl : Surface Blowing Dust Turbulent Flux (kg/kg.m/s) + real, save, allocatable :: SLubsl(:, :, :) + ! virSL : Air Loading for SBL Parameterization + real, save, allocatable :: virSL(:, :) + ! fracSL : Fractional Time used in Blowing Snow Surface Flux Computation + real, save :: fracSL + ! u*, u*T*, u*s* Time Moving Averages + integer, parameter :: ntaver = 4 ! 9 in the old MAR version + real, save, allocatable :: u_0aSL(:, :, :, :) + real, save, allocatable :: uT0aSL(:, :, :, :) + real, save, allocatable :: us0aSL(:, :, :, :) + ! V, dT(a-s) Time Moving Averages + real, save, allocatable :: V_0aSL(:, :, :) + real, save, allocatable :: dT0aSL(:, :, :, :) + ! cdnSL : Square Root of Momentum Neutral Drag Coefficient (-) + real, save, allocatable :: cdnSL(:, :, :) + ! cdmSL : Contribution of Momentum to Drag Coefficient (-) + real, save, allocatable :: cdmSL(:, :, :) + ! cdhSL : Contribution of Heat to Drag Coefficient (-) + real, save, allocatable :: cdhSL(:, :, :) + ! zs_SL : Typical Sea Roughness Length (m) + real, save :: zs_SL + ! zn_SL : Typical Snow Roughness Length (m) + real, save :: zn_SL + ! zl_SL : Typical Land Roughness Length (m) + real, save :: zl_SL + ! u*, u*T*, u*s* Time Moving Averages + ! aeCdSL : Aerodynamic Conductance + real, save, allocatable :: aeCdSL(:, :) + ! Kv__SL : Equivalent Turbulent Diffusivity + real, save, allocatable :: Kv__SL(:, :) + ! pktaSL : SBCTurbulence Pot. Temp. + real, save, allocatable :: pktaSL(:, :) + ! ssvSL: Wind Speed Norm (m/s) + real, save, allocatable :: ssvSL(:, :, :) + ! ch0SL : Bulk Aerodynamic Coefficient Air/Surface Humidity Flux + real, save, allocatable :: ch0SL(:, :) + ! roseSL : Depletion of water vapor in the surface layer (kg/kg) + ! due to deposition of dew or rime on ground + real, save, allocatable :: roseSL(:, :) + ! raerSL :`Bulk' Stomatal Resistance (Thom & Oliver, 1977, p. 347) + real, save, allocatable :: raerSL(:, :) + ! rsurSL : Aerodynamic Resistance + real, save, allocatable :: rsurSL(:, :) + ! precSL : Rain + real, save, allocatable :: precSL(:, :) + integer, parameter :: nLimit = 10 + ! WV__SL : Water Vapor Flux Limitor + real, save, allocatable :: WV__SL(:, :, :) + ! bsnoSL : cumulative snow erosion height (m) + real, save, allocatable :: bsnoSL(:, :) + ! snobSL : snow erosion height (m) + real, save, allocatable :: snobSL(:, :) + ! hsnoSL : cumulative snow accumulation height (m) + real, save, allocatable :: hsnoSL(:, :) + ! snohSL : snow precipitation height (m) + real, save, allocatable :: snohSL(:, :) + ! hmelSL : cumulative snowmelt height (m water equivalent) + real, save, allocatable :: hmelSL(:, :) + ! ro_SL0 : rhos (Initial Surface Density) (kg/m3) + real, save, allocatable :: ro_SL0(:, :) + ! ro_SL : rhos (Surface Density) (kg/m3) + real, save, allocatable :: ro_SL(:, :) + ! d1_SL : rhos * cs *(Depth diurnal Wave) (J/m2/K) + real, save, allocatable :: d1_SL(:, :) + ! cs2SL : Soil Temperature Variation Time Scale (s) + ! (usually 86400 s, i.e. diurnal cycle) + real, save :: cs2SL + ! t2SLtn, t2SLtd: time constants for t2_SL time integration + real, save :: t2SLtn + real, save :: t2SLtd + ! t2_SL : Soil Deep Layers Temperature (K) + real, save, allocatable :: t2_SL(:, :) + ! dtgSL : Soil Temperature Variation during time interval dt (K) + ! is renewed every 6 minutes + real, save, allocatable :: dtgSL(:, :, :) + logical, save :: qsolSL + ! hwatSL Rain Accumulation (m) + real, save, allocatable :: hwatSL(:, :) + real, save :: w20SL + ! wg_SL and w2_SL Adimensional Numbers measuring Soil Water Content + ! w2_SL Rain Accumulation over a large Soil Thickness + real, save, allocatable :: w2_SL(:, :) + ! wg_SL Rain Accumulation near the Surface + real, save, allocatable :: wg_SL(:, :) + real, save :: wg0SL + real, save :: wk0SL + real, save, allocatable :: wk_SL(:, :) + real, save :: wx0SL + real, save, allocatable :: wx_SL(:, :) + ! sst_SL : Sea Surface Temperature + real, save :: sst_SL + ! SL_wge : wind gust estimate + real, save, allocatable :: SL_wge(:, :) + ! SLlwge : lower bound of the bounding interval around the estimate + real, save, allocatable :: SLlwge(:, :) + ! SLuwge : upper bound of the bounding interval around the estimate + real, save, allocatable :: SLuwge(:, :) + +contains + + subroutine mar_sl_init() + + use mardim, only: mx, my, mw + implicit none + + allocate(Ta2mSL(mx, my, mw)) + allocate(TminSL(mx, my, mw)) + allocate(TmaxSL(mx, my, mw)) + allocate(Ta3mSL(mx, my, mw)) + allocate(V03mSL(mx, my, mw)) + allocate(V10mSL(mx, my, mw)) + allocate(CldFRA(mx, my, mz)) + allocate(albxSL(mx, my, mw)) + allocate(alb0SL_1(mx, my)) + allocate(alb0SL_2(mx, my)) + allocate(alb0SL_3(mx, my)) + allocate(tgirSL(mx, my)) + allocate(eps0SL(mx, my)) + allocate(SLzoro(mx, my, mw)) + allocate(SL_z0(mx, my, mw)) + allocate(SLn_z0(mx, my, mw, ntavSL)) + allocate(SL_r0(mx, my, mw)) + allocate(SLn_b0(mx, my, mw, ntavSL)) + allocate(SLn_r0(mx, my, mw, ntavSL)) + allocate(SLlmo(mx, my)) + allocate(SLlmol(mx, my, mw)) + allocate(SLuus(mx, my)) + allocate(SLuusl(mx, my, mw)) + allocate(duusSL(mx, my)) + allocate(SLuts(mx, my)) + allocate(SLutsl(mx, my, mw)) + allocate(SLdSdT(mx, my, mw)) + allocate(dutsSL(mx, my)) + allocate(cutsSL(mx, my, mw)) + allocate(SLuqs(mx, my)) + allocate(SLuqsl(mx, my, mw)) + allocate(SLdLdT(mx, my, mw)) + allocate(SaltSL(mx, my)) + allocate(SLussl(mx, my, mw)) + allocate(SLubsl(mx, my, mw)) + allocate(virSL(mx, my)) + allocate(u_0aSL(mx, my, mw, ntaver)) + allocate(uT0aSL(mx, my, mw, ntaver)) + allocate(us0aSL(mx, my, mw, ntaver)) + allocate(V_0aSL(mx, my, ntaver)) + allocate(dT0aSL(mx, my, mw, ntaver)) + allocate(cdnSL(mx, my, mw)) + allocate(cdmSL(mx, my, mw)) + allocate(cdhSL(mx, my, mw)) + allocate(aeCdSL(mx, my)) + allocate(Kv__SL(mx, my)) + allocate(pktaSL(mx, my)) + allocate(ssvSL(mx, my, mz)) + allocate(ch0SL(mx, my)) + allocate(roseSL(mx, my)) + allocate(raerSL(mx, my)) + allocate(rsurSL(mx, my)) + allocate(precSL(mx, my)) + allocate(WV__SL(mx, my, nLimit)) + allocate(bsnoSL(mx, my)) + allocate(snobSL(mx, my)) + allocate(hsnoSL(mx, my)) + allocate(snohSL(mx, my)) + allocate(hmelSL(mx, my)) + allocate(ro_SL0(mx, my)) + allocate(ro_SL(mx, my)) + allocate(d1_SL(mx, my)) + allocate(t2_SL(mx, my)) + allocate(dtgSL(mx, my, mw)) + allocate(hwatSL(mx, my)) + allocate(w2_SL(mx, my)) + allocate(wg_SL(mx, my)) + allocate(wk_SL(mx, my)) + allocate(wx_SL(mx, my)) + allocate(SL_wge(mx, my)) + allocate(SLlwge(mx, my)) + allocate(SLuwge(mx, my)) + + endsubroutine mar_sl_init + + +endmodule mar_sl diff --git a/MAR/code_mar/mar_sv_mod.f90 b/MAR/code_mar/mar_sv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1e22202ee12754c38608ae0b2905cb2051852f02 --- /dev/null +++ b/MAR/code_mar/mar_sv_mod.f90 @@ -0,0 +1,7 @@ +module mar_sv + implicit none + integer, parameter :: klonv = 1 + integer, parameter :: nsol = 6 + integer, parameter :: nsno = 40 + integer, parameter :: nb_wri = 10 +endmodule mar_sv diff --git a/MAR/code_mar/mar_tc_mod.f90 b/MAR/code_mar/mar_tc_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..bbb8e86b816aaeaf5361a8e948bef385dae0b152 --- /dev/null +++ b/MAR/code_mar/mar_tc_mod.f90 @@ -0,0 +1,38 @@ +! mar_tc +! ====== +module mar_tc + use mardim + implicit none + integer, parameter :: ntrac = 28 + integer, parameter :: nfxTC = 1 + integer, parameter :: kinTC = 59 + integer, parameter :: nPhot = 5 + integer, parameter :: nkWri = 4 + logical, save :: ldepTC + logical, save :: locaTC + real(kind=8), save :: chTC(mx, ntrac) + real(kind=8), save :: fxTC(nfxTC) + real(kind=8), save :: qvTC(mx) + real(kind=8), save :: tairTC(mx) + real(kind=8), save :: suTC(mx, nPhot) + real(kind=8), save :: raTC(mx, kinTC) + real(kind=8), save :: cochTC(mx, ntrac, ntrac) + real, save :: qxTC(mx, my, mz, ntrac) + real, save :: qsTC(mx, my, ntrac) + real, save :: uqTC(mx, my, ntrac) + real, save :: ch0TC(ntrac, 4) + real, save :: dchTC(ntrac, 4) + real, save :: efacTC(mx, my) + real, save :: vdepTC(ntrac) + real, save :: hhTC(mx) + real :: dt_ODE, dt2ODE + integer, save :: ikTC(nkWri) + integer, save :: krouTC(mx, my) + integer, save :: nt_ODE + integer, save :: jt_ODE + character(len=9), save :: namTC(ntrac) + character(len=9), save :: fixTC + ! Unity : [Molec./cm3] + real, parameter :: Unity = 1. + real, parameter :: cminTC = 1.e-8 +endmodule mar_tc diff --git a/MAR/code_mar/mar_te_mod.f90 b/MAR/code_mar/mar_te_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d801983d99d3e4867d5cb5cbeb8c9cc2c48d2c07 --- /dev/null +++ b/MAR/code_mar/mar_te_mod.f90 @@ -0,0 +1,34 @@ +! mar_te : mar turbulent kinetic energy +! ===================================== +module mar_te + use mardim + implicit none + logical, save :: ini_KA_TE + ! ect_TE(i,j,k): turbulent kinetic energy (i,j,k+1/2) (m2/s2) + real, save, allocatable :: ect_TE(:, :, :) + ! zi__TE(i,j) : Inversion Height (i,j) (m) + real, save, allocatable :: zi__TE(:, :) + ! eps_TE(i,j,k) : dissipation of T.K.E. (i,j,k+1/2) (m2/s3) + real, save, allocatable :: eps_TE(:, :, :) + ! edt_TE(i,j) : minimum dissipation time (i,j) (s) + real, save, allocatable :: edt_TE(:, :) + ! tranTE(i,j,k) : transport of T.K.E. (i,j,k+1/2) (m2/s3) + real, save, allocatable :: tranTE(:, :, :) + +contains + + subroutine mar_te_init() + + use mardim, only: mx, my, mz + implicit none + + allocate(ect_TE(mx, my, mz)) + allocate(zi__TE(mx, my)) + allocate(eps_TE(mx, my, mz)) + allocate(edt_TE(mx, my)) + allocate(tranTE(mx, my, mz)) + + endsubroutine mar_te_init + + +endmodule mar_te diff --git a/MAR/code_mar/mar_tu_mod.f90 b/MAR/code_mar/mar_tu_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d05e12bfdc750f9f187369a521e969ed4e805858 --- /dev/null +++ b/MAR/code_mar/mar_tu_mod.f90 @@ -0,0 +1,39 @@ +! mar_tu : +! ========= +module mar_tu + use mardim + implicit none + ! TUkvm : Vertical Diffusion Coefficient (Momentum) [m2/s] + real, save, allocatable :: TUkvm(:, :, :) + ! TUkvh : Vertical Diffusion Coefficient (Heat) [m2/s] + real, save, allocatable :: TUkvh(:, :, :) + ! TUmin : Vertical Diffusion Coefficient (Minimum) [m2/s] + real, save :: TUmin(mz) + ! TU_Pra : Prandtl Number (TUkvm/TUkvh) [-] + real, save, allocatable :: TU_Pra(:, :, :) + ! TUkhx : Horizont.Diffusion Coefficient (x-direct.) [m2/s] + real, save, allocatable :: TUkhx(:, :, :) + real, save :: TUkhff + real, save :: TUkhmx + ! TUkhy : Horizont.Diffusion Coefficient (y-direct.) [m2/s] + real, save, allocatable :: TUkhy(:, :, :) + ! TUspon: Horizont.Diffusion Coefficient (Top Sponge)[m2/s] + real, save :: TUspon(mzabso) + +contains + + subroutine mar_tu_init() + + use mardim, only: mx, my, mz + implicit none + + allocate(TUkvm(mx, my, mz)) + allocate(TUkvh(mx, my, mz)) + allocate(TU_Pra(mx, my, mz)) + allocate(TUkhx(mx, my, mz)) + allocate(TUkhy(mx, my, mz)) + + endsubroutine mar_tu_init + + +endmodule mar_tu diff --git a/MAR/code_mar/mar_tv_mod.f90 b/MAR/code_mar/mar_tv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..146ccebc353626d2ebccbcc7260d4eb74bbb5642 --- /dev/null +++ b/MAR/code_mar/mar_tv_mod.f90 @@ -0,0 +1,78 @@ +! mar_tv : vegetation +! =================== +module mar_tv + use mardim + use mar_sv + implicit none + integer, parameter :: nvx = mw + integer, parameter :: llx = nsol + 1 + integer, parameter :: iptx = 5 + integer, parameter :: imx = mx + integer, parameter :: jmx = my + ! deptTV: Soil Level Depth + real, save :: deptTV(0:llx) + ! dep2TV: Soil Layer Depth + real, save :: dep2TV(0:llx) + ! slopTV: Surface Slope + real, save :: slopTV(mx, my) + ! AlbSTV: Dry Soil Albedo + real, save :: AlbSTV(mx, my) + ! alaiTV: Leaf Area Index + real, save, allocatable :: alaiTV(:, :, :) + ! glf_TV: Green Leaf Fraction + real, save, allocatable :: glf_TV(:, :, :) + ! CaWaTV: Canopy Intercepted Water Content + real, save, allocatable :: CaWaTV(:, :, :) + ! CaSnTV: Canopy Intercepted Snow Content + real, save, allocatable :: CaSnTV(:, :, :) + ! TvegTV: Skin Vegetation Temperature + real, save, allocatable :: TvegTV(:, :, :) + ! TgrdTV: Skin Soil Temperature + real, save, allocatable :: TgrdTV(:, :, :) + ! TsolTV: Layer Soil Temperature + real, save, allocatable :: TsolTV(:, :, :, :) + ! eta_TV: Soil Moisture Content + real, save, allocatable :: eta_TV(:, :, :, :) + ! psigTV: Soil Hydraulic Potential + real, save, allocatable :: psigTV(:, :, :) + ! psivTV: Vegetation Hydraulic Potential + real, save, allocatable :: psivTV(:, :, :) + ! evapTV: Time Integrated Evapotranspiration [mm w.e.] + real, save :: evapTV(imx, jmx) + ! runoTV: Time Integrated (Sub)surface Flow + real, save :: runoTV(imx, jmx) + ! draiTV: Time Integrated Drainage Flow + real, save :: draiTV(imx, jmx) + ! iWaFTV=0 ==> no Water Flux; iWaFTV=1 ==> free drainage + integer, save :: iWaFTV(imx, jmx) + ! ivegTV: Vegetation Type Index + integer, save :: ivegTV(imx, jmx, nvx) + ! isolTV: Soil Type Index + integer, save :: isolTV(imx, jmx) + ! ifraTV: Vegetation Class Coverage (3 Class, Last One is Open Water) + real, save :: ifraTV(imx, jmx, nvx) + ! IO Grid Indices + integer, save :: IOi_TV(iptx), IOj_TV(iptx) + integer, save :: itx, ivg + +contains + + subroutine mar_tv_init() + implicit none + + allocate(alaiTV(imx, jmx, nvx)) + allocate(glf_TV(imx, jmx, nvx)) + allocate(CaWaTV(imx, jmx, nvx)) + allocate(CaSnTV(imx, jmx, nvx)) + allocate(TvegTV(imx, jmx, nvx)) + allocate(TgrdTV(imx, jmx, nvx)) + allocate(TsolTV(imx, jmx, nvx, llx)) + allocate(eta_TV(imx, jmx, nvx, llx)) + allocate(psigTV(imx, jmx, nvx)) + allocate(psivTV(imx, jmx, nvx)) + + endsubroutine mar_tv_init + + +endmodule mar_tv + diff --git a/MAR/code_mar/mar_ub_mod.f90 b/MAR/code_mar/mar_ub_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..01fc31966c5762e0239bf6e61b0fd550c12dd9ee --- /dev/null +++ b/MAR/code_mar/mar_ub_mod.f90 @@ -0,0 +1,46 @@ +! mar_ub : include upper sponge [2-03-2004] +! mar_ub save variables are used to follow Reference State in MAR upper sponge +! Reference: ARPS 4.0 User's Guide, para 6.4.3 p.152 +! ================================================== +module mar_ub + use mardim + implicit none + real, save :: Ray_UB(mzabso) + real, save, allocatable :: uairUB(:, :, :) + real, save, allocatable :: vairUB(:, :, :) + real, save, allocatable :: pktaUB(:, :, :) + real, save, allocatable :: ua1_UB(:, :, :) + real, save, allocatable :: va1_UB(:, :, :) + real, save, allocatable :: pkt1UB(:, :, :) + real, save, allocatable :: ua2_UB(:, :, :) + real, save, allocatable :: va2_UB(:, :, :) + real, save, allocatable :: pkt2UB(:, :, :) + integer, save :: iyr_UB + integer, save :: mma_UB + integer, save :: jda_UB + integer, save :: jhu_UB + integer, save :: jdh_UB + integer(kind=8), save :: tim1UB + integer(kind=8), save :: tim2UB + +contains + + subroutine mar_ub_init() + + use mardim, only: mx, my, mzabso + implicit none + + allocate(uairUB(mx, my, mzabso)) + allocate(vairUB(mx, my, mzabso)) + allocate(pktaUB(mx, my, mzabso)) + allocate(ua1_UB(mx, my, mzabso)) + allocate(va1_UB(mx, my, mzabso)) + allocate(pkt1UB(mx, my, mzabso)) + allocate(ua2_UB(mx, my, mzabso)) + allocate(va2_UB(mx, my, mzabso)) + allocate(pkt2UB(mx, my, mzabso)) + + + endsubroutine mar_ub_init + +endmodule mar_ub diff --git a/MAR/code_mar/mar_vb_mod.f90 b/MAR/code_mar/mar_vb_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a26de4a51ca25349d6ec73e1bc6e660e1584a7a0 --- /dev/null +++ b/MAR/code_mar/mar_vb_mod.f90 @@ -0,0 +1,22 @@ +! mar_vb : follow MAR Vegetation Fraction (13-05-2002) +! ==================================================== +module mar_vb + use mardim + use mar_tv + implicit none + ! glf1VB: Vegetation Class Coverage / Time Step n (3 Class, Last One is Open Water) + real, save :: glf1VB(mx, my, nvx) + ! LAI1VB: Leaf Area Index / Time Step n + real, save :: LAI1VB(mx, my, nvx) + ! glf2VB: Vegetation Class Coverage / Time Step n+1 (3 Class, Last One is Open Water) + real, save :: glf2VB(mx, my, nvx) + ! LAI2VB: Leaf Area Index / Time Step n+1 + real, save :: LAI2VB(mx, my, nvx) + integer, save :: iyr_VB + integer, save :: mma_VB + integer, save :: jda_VB + integer, save :: jhu_VB + integer, save :: jdh_VB + integer(kind=8), save :: tim1VB + integer(kind=8), save :: tim2VB +endmodule mar_vb diff --git a/MAR/code_mar/mar_wk_mod.f90 b/MAR/code_mar/mar_wk_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9e894c2fa252d9ab8f34b0600e0ebe2a4124c613 --- /dev/null +++ b/MAR/code_mar/mar_wk_mod.f90 @@ -0,0 +1,64 @@ +! mar_wk : work variables +! ======================= +! wkXXX variables define a work area in order to minimize memory requirements +module mar_wk + use mardim + implicit none + real, save :: WKxyz1(mx, my, mz), WKxyz2(mx, my, mz), & + WKxyz3(mx, my, mz), WKxyz4(mx, my, mz), & + WKxyz5(mx, my, mzz), WKxyz6(mx, my, mzz), & + WKxyz7(mx, my, mzz), WKxyz8(mx, my, mzz) + real, save :: WRKxys(mx, my, mw) + real, save :: WKxy1(mx, my), WKxy2(mx, my), WKxy3(mx, my), & + WKxy4(mx, my), WKxy5(mx, my), WKxy6(mx, my), & + WKxy7(mx, my), WKxy8(mx, my), WKxy9(mx, my), & + WKxy0(mx, my) + real :: WTxy1(mx, my), WTxy2(mx, my), WTxy3(mx, my), & + WTxy4(mx, my), WTxy5(mx, my), WTxy6(mx, my), & + WTxy7(mx, my), WTxy8(mx, my), WTxy9(mx, my), & + WTxy0(mx, my) + real, save :: WKxza(mx, mz), WKxzb(mx, mz), WKxzc(mx, mz), & + WKxzd(mx, mz), WKxzx(mx, mz), & + WKxzp(mx, mz), WKxzq(mx, mz) + + real, allocatable :: WPxyz1(:, :, :) + real, allocatable :: WPxyz2(:, :, :) + real, allocatable :: WPxyz3(:, :, :) + real, allocatable :: WPxyz4(:, :, :) + real, allocatable :: WPxyz5(:, :, :) + real, allocatable :: WPxyz6(:, :, :) + real, allocatable :: WPxyz7(:, :, :) + real, allocatable :: WPxyz8(:, :, :) + + real, allocatable :: WTxyz1(:, :, :), WTxyz2(:, :, :), & + WTxyz3(:, :, :), WTxyz4(:, :, :), & + WTxyz5(:, :, :), WTxyz6(:, :, :), & + WTxyz7(:, :, :), WTxyz8(:, :, :) + +contains + + subroutine mar_wk_init() + + use mardim, only: mx, my, mz,mzz + implicit none + + allocate(WPxyz1(mx, my, mz)) + allocate(WPxyz2(mx, my, mz)) + allocate(WPxyz3(mx, my, mz)) + allocate(WPxyz4(mx, my, mz)) + allocate(WPxyz5(mx, my, mzz)) + allocate(WPxyz6(mx, my, mzz)) + allocate(WPxyz7(mx, my, mzz)) + allocate(WPxyz8(mx, my, mzz)) + allocate(WTxyz1(mx, my, mz)) + allocate(WTxyz2(mx, my, mz)) + allocate(WTxyz3(mx, my, mz)) + allocate(WTxyz4(mx, my, mz)) + allocate(WTxyz5(mx, my, mzz)) + allocate(WTxyz6(mx, my, mzz)) + allocate(WTxyz7(mx, my, mzz)) + allocate(WTxyz8(mx, my, mzz)) + + endsubroutine mar_wk_init + +endmodule mar_wk diff --git a/MAR/code_mar/marcdp_mod.f90 b/MAR/code_mar/marcdp_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..45c862318fd4d547d59fa793b3fb90a0f87bce0e --- /dev/null +++ b/MAR/code_mar/marcdp_mod.f90 @@ -0,0 +1,34 @@ +#include "MAR_pp.def" +! marcdp : Col de Porte specific Constants +! ======================================== +module marcdp + implicit none + ! +--Col de Porte specific Constants + ! + =============================== + ! ColPrt : Col de Porte Switch +#if(CP) + logical, parameter :: ColPrt = .true. +#else + logical, parameter :: ColPrt = .false. +#endif + ! +--Fractions of total solar irradiances in 3 spectral intervals + ! + ------------------------------------------------------------ + ! 0.3--0.8micr.m 0.8--1.5micr.m 1.5--2.8micr.m + ! (see Eric Martin Sept. 1996, CROCUS, subroutine METEO) + ! Dr_1SN, Dr_2SN, Dr_3SN : Direct Radiation + real, parameter :: Dr_1SN = 0.59 + real, parameter :: Dr_2SN = 0.31 + real, parameter :: Dr_3SN = 0.10 + ! Df_1SN, Df_2SN, Df_3SN : Diffuse Radiation, Clear Sky + real, parameter :: Df_1SN = 0.95 + real, parameter :: Df_2SN = 0.05 + real, parameter :: Df_3SN = 0.00 + ! Dfc1SN, Dfc2SN, Dfc3SN : Diffuse Radiation, Cloudy Sky + real, parameter :: Dfc1SN = 0.66 + real, parameter :: Dfc2SN = 0.27 + real, parameter :: Dfc3SN = 0.07 + real, save :: DirSol + real, save :: DifSol + real, save :: TotSol + real, save :: Clouds +endmodule marcdp diff --git a/MAR/code_mar/marctr_mod.f90 b/MAR/code_mar/marctr_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..83d70fac0dfecedda4c637829ceb9fa68cd06324 --- /dev/null +++ b/MAR/code_mar/marctr_mod.f90 @@ -0,0 +1,67 @@ +module marctr + implicit none + ! reaVAR: input INI: Previous Dyn. Simulation (MAR, GCM) + logical, save :: reaVAR + ! reaLBC: Input LBC: Previous Dyn. Simulation (MAR, GCM) + logical, save :: reaLBC + ! safVAR: Full Output on Saving Files MARxxx.DAT + logical, save :: safVAR + logical, save :: sALONE + logical, save :: geoNST + ! conmas: Mass Conservartion Constraint Initial Switch + logical, save :: conmas + ! potvor: Potential Vorticity Conservation Constraint Initial Switch + logical, save :: potvor + ! hamfil: Initial Filtered Fields (Time, Hamming) + logical, save :: hamfil + ! brocam: Brown and Campana Time Scheme Switch + logical, save :: brocam + ! LFrBAK: Leap-Frog Backward Advection Scheme Switch + logical, save :: LFrBAK + logical, save :: openLB + logical, save :: sommlb + logical, save :: FirstC + ! turhor: Horizontal Diffusion (Smagorinsky) Switch + logical, save :: turhor + logical, save :: SBLitr + logical, save :: tur_25 + ! convec: Convective Adjustment Switch + logical, save :: convec + ! MFLX_d: Convective Adjustment (deep) Switch + logical, save :: MFLX_d + ! MFLX_s: Convective Adjustment (shallow) Switch + logical, save :: MFLX_s + ! micphy: Cloud Microphysics Switch + logical, save :: micphy + ! fracld: Fractional Cloudiness Switch + logical, save :: fracld + ! chimod: Atmospheric Chemical Model Switch + logical, save :: chimod + ! physic: Atmospheric/Surface Physics Switch + logical, save :: physic + ! polmod: Interactive Polynya Switch + logical, save :: polmod + ! snomod: Interactive Snow Model Switch + logical, save :: snomod + logical, save :: BloMod + ! vegmod: Interactive SVAT Switch + logical, save :: vegmod + logical, save :: VSISVAT + ! no_vec: Scalar (NO Vectorization) Switch + logical, save :: no_vec + integer(kind=4),save :: itexpe + !integer(kind=8),save :: itexpe ! for run longer than 30 years + integer, save :: iterun, nterun, nbhour, itConv + integer, save :: iboucl, nboucl, nprint, npr_nc + integer, save :: maptyp + integer, save :: log_1D + real, save :: Robert + real, save :: rrmin, rrmax + real, save :: rxbase, rxfact + real, save :: fxlead + ! tMFLXd: d(time) between 2 deep convection CALL + real, save :: tMFLXd + ! aMFLXd, aMFLXs: adjustment times (deep, shallow) + real, save :: aMFLXd, aMFLXs + character(len=16), save :: fnam +endmodule marctr diff --git a/MAR/code_mar/mardim_mod.f90 b/MAR/code_mar/mardim_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..27f501d8518a78e115b021f1b09bba252b5d0669 --- /dev/null +++ b/MAR/code_mar/mardim_mod.f90 @@ -0,0 +1,36 @@ +module mardim + implicit none + integer, parameter :: mx = 80 + integer, parameter :: my = 140 + integer, parameter :: ip11 = 2 + integer, parameter :: jp11 = 2 + integer, parameter :: mz = 25 + ! mzir1 may be chosen much larger than mz, + ! if the model vertical domain covers a small part of the air column + integer, parameter :: mzir1 = mz + 1 + integer, parameter :: mzir = mz + 2 + integer, parameter :: mx1 = 79 + integer, parameter :: mx2 = 78 + integer, parameter :: my1 = 139 + integer, parameter :: my2 = 138 + integer, parameter :: myd2 = 1 + my / 2 + integer, parameter :: mz1 = mz - 1 + integer, parameter :: mzz = mz + 1 + integer, parameter :: i_2 = mx - mx1 + 1 + integer, parameter :: j_2 = my - my1 + 1 + integer, parameter :: mzabso = 6 + integer, parameter :: mzhyd = mzabso + 1 + ! if #NV removed (NO vectorization) then klon = 1 + integer, parameter :: klon = 1 + integer, parameter :: klev = mz + integer, parameter :: kdlon = klon + integer, parameter :: kflev = klev + ! n6 et n7 determine a relaxation zonetowards lateral boundaries + ! (large scale values of the variables). + ! This zone extends over n6-1 points. + ! Davies (1976) propose 5 points (i.e. n6=6 and n7=7) + integer, parameter :: n6 = 6 + integer, parameter :: n7 = 7 + ! mw is the total number of mosaics + integer, parameter :: mw = 2 +endmodule mardim diff --git a/MAR/code_mar/mardsv_mod.f90 b/MAR/code_mar/mardsv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..62107e994532348ad50c3d081b5165023cfc1e61 --- /dev/null +++ b/MAR/code_mar/mardsv_mod.f90 @@ -0,0 +1,229 @@ +#include "MAR_pp.def" +! +------------------------------------------------------------------------+ +! | MAR SISVAT_dat 20-07-2021 MAR | +! | SubRoutine SISVAT_dat contains the constants of the | +! | Soil/Ice Snow Vegetation Atmosphere Transfer Scheme | +! +------------------------------------------------------------------------+ +module mardsv + use mar_sv + implicit none + ! +--SISVAT Global Variables + ! + ======================= + ! INI_SV :Initialisation Switch + logical, save :: INI_SV = .false. + ! eps_21 : Arbitrary very small value + real, parameter :: eps_21 = 1.e-21 + ! +--Snow + ! + ---- + ! istdSV : Snow History + ! 1: faceted cristal + ! 2: liq.watr/no faceted cristal before + ! 3: liq.watr/ faceted cristal before + integer, parameter :: istdSV(5) = (/1, 2, 3, 4, 5/) + ! Cn_dSV : Snow Heat Capacity [J/kg/K] + ! Loth et al. 1993, JGR 98 D6 2.2.2 2e para p.10453 + real, parameter :: Cn_dSV = 2105. + ! SMndSV : Minimum Thickness of new Layers [mmWE] + real, parameter :: SMndSV = 1.0 + ! G1_dSV : Conversion 0/99-->0/1 Sphericity/Dendricity + real, parameter :: G1_dSV = 99. + ! DDcdSV, DFcdSV, DScdSV : Snow Grains Optical Diameter [1e-4m] + ! DDcdSV : Dendritic Crystals [0.0001 m] + real, parameter :: DDcdSV = 1. + ! DFcdSV : Young Faceted Crystals [0.0001 m] + real, parameter :: DFcdSV = 4. + ! Small Crystals [0.0001 m] + real, parameter :: DScdSV = 3. + ! ADSdSV : Snow Grains Actual Diameter [1e-4m] + real, parameter :: ADSdSV = 4. + ! So1dSV, So2dSV, So3dSV : Total Solar Irradiance Fractions [-] + ! Fractions of total Solar Irradiance in 3 spectral Intervals + ! (see Feagle and Businger 1981, Int.Geoph.Ser. 25, p.215-222) + ! So1dSV : 0.3--0.8mim Interval + real, parameter :: So1dSV = 0.6 + ! So2dSV : 0.8--1.5mim Interval + real, parameter :: So2dSV = 0.3 + ! So3dSV : 1.5--2.8mim Interval + real, parameter :: So3dSV = 0.1 + ! initial values + ! real, parameter :: So1dSV = 0.606 + ! real, parameter :: So2dSV = 0.301 + ! real, parameter :: So3dSV = 0.093 + ! Tuning ETH camp + !XF real, parameter :: So1dSV = 0.580 + !XF real, parameter :: So2dSV = 0.320 + !XF real, parameter :: So3dSV = 0.100 + ! aI1dSV, aI2dSV, aI3dSV : Bare Ice Albedo [-] + ! aI1dSV : Minimum bare ICE albedo [-] + real, parameter :: aI1dSV = 0.50 + ! aI2dSV : Maximum bare ICE albedo [-] + real, parameter :: aI2dSV = 0.55 + ! aI3dSV : ICE lense albedo at roCdSV kg/m3 and and minimum pure snow albedo + real, parameter :: aI3dSV = 0.70 + ! ws0dSV : Irreducible Water Saturation in Snow + ! ws0dSV = 0.07: Coleou et al., 1998, A.Gl + ! ws0dSV = 0.08-0.15 : Greuell & Konzelmann (199 +#if(AC) + real, parameter :: ws0dSV = 0.05 +#else + real, parameter :: ws0dSV = 0.07 ! Greenland +#endif + ! roCdSV : Pore hole close-off density [kg/m3] + ! roCdSV = 800: Greuell & Konzelmann (1994), Glo + ! roCdSV = 830: Harper et al. (2012), Nature + real, parameter :: roCdSV = 830. + ! roSdSV : Max pure snow density [kg/m3] + real, parameter :: roSdSV = 450. + ! roBdSV : Max blowing snow density [kg/m3] + real, parameter :: roBdSV = 450. + ! ru_dSV : Surficial Water Scale Factor [kg/m2] + real, parameter :: ru_dSV = 50. + ! +--Ice + ! + --- + ! CdidSV : Conductivity of pure Ice [W/m/K] + real, parameter :: CdidSV = 2.1 + ! +--Vegetation + ! + ---------- + ! nvgt : number of vegetation classes + integer, parameter :: nvgt = 13 + ! DH_dSV : Displacement Height [m] + real, parameter :: DH_dSV(0:nvgt) = (/ & + ! 0 NO VEGETATION + 0.00, & + ! 1 CROPS LOW | 2 CROPS MEDIUM | 3 CROPS HIGH + 0.07, 0.21, 0.70, & + ! 4 GRASS LOW | 5 GRASS MEDIUM | 6 GRASS HIGH + 0.07, 0.21, 0.70, & + ! 7 BROADLEAF LOW | 8 BROADLEAF MEDIUM | 9 BROADLEAF HIGH + 1.40, 5.60, 14.00, & + ! 10 NEEDLELEAF LOW | 11 NEEDLELEAF MEDIUM | 12 NEEDLELEAF HIGH + 1.40, 5.60, 14.00, & + ! 13 City + 21.00/) + ! Z0mdSV : Roughness Length for Momentum [m] + real, parameter :: Z0mdSV(0:nvgt) = (/ & + ! 0 NO VEGETATION + 0.01, & + ! 1 CROPS LOW | 2 CROPS MEDIUM | 3 CROPS HIGH + 0.01, 0.03, 0.10, & + ! 4 GRASS LOW | 5 GRASS MEDIUM | 6 GRASS HIGH + 0.01, 0.03, 0.10, & + ! 7 BROADLEAF LOW | 8 BROADLEAF MEDIUM | 9 BROADLEAF HIGH + 0.20, 0.80, 2.00, & + ! 10 NEEDLELEAF LOW | 11 NEEDLELEAF MEDIUM | 12 NEEDLELEAF HIGH + 0.20, 0.80, 2.00, & + ! 13 City + 3.00/) + ! StodSV : Minimum Stomatal Resistance [s/m] + real, parameter :: StodSV(0:nvgt) = (/ & + ! 0 NO VEGETATION + 5000., & + ! 1 CROPS LOW | 2 CROPS MEDIUM | 3 CROPS HIGH + 50., 50., 50., & + ! 4 GRASS LOW | 5 GRASS MEDIUM | 6 GRASS HIGH + 50., 50., 50., & + ! 7 BROADLEAF LOW | 8 BROADLEAF MEDIUM | 9 BROADLEAF HIGH + 10., 10., 10., & + ! 10 NEEDLELEAF LOW | 11 NEEDLELEAF MEDIUM | 12 NEEDLELEAF HIGH + 10., 10., 10., & + ! 13 City + 5000./) + ! PR_dSV : Internal Plant Resistance [s] + real, parameter :: PR_dSV(0:nvgt) = (/ & + ! 0 NO VEGETATION + 0.0, & + ! 1 CROPS LOW | 2 CROPS MEDIUM | 3 CROPS HIGH + 0.5e9, 0.5e9, 0.5e9, & + ! 4 GRASS LOW | 5 GRASS MEDIUM | 6 GRASS HIGH + 0.5e9, 0.5e9, 0.5e9, & + ! 7 BROADLEAF LOW | 8 BROADLEAF MEDIUM | 9 BROADLEAF HIGH + 1.0e9, 1.0e9, 1.0e9, & + ! 10 NEEDLELEAF LOW | 11 NEEDLELEAF MEDIUM | 12 NEEDLELEAF HIGH + 1.0e9, 1.0e9, 1.0e9, & + ! 13 City + 0.0/) + ! rbtdSV : Roots Fraction Beta Coefficient [-] + real, parameter :: rbtdSV(0:nvgt) = (/ & + ! 0 NO VEGETATION + 0.000, & + ! 1 CROPS LOW | 2 CROPS MEDIUM | 3 CROPS HIGH + 0.961, 0.961, 0.961, & + ! 4 GRASS LOW | 5 GRASS MEDIUM | 6 GRASS HIGH + 0.943, 0.964, 0.972, & + ! 7 BROADLEAF LOW | 8 BROADLEAF MEDIUM | 9 BROADLEAF HIGH + 0.968, 0.962, 0.962, & + ! 10 NEEDLELEAF LOW | 11 NEEDLELEAF MEDIUM | 12 NEEDLELEAF HIGH + 0.971, 0.976, 0.976, & + ! 13 City + 0.000/) + ! pscdSV : Critical Leaf Water Potential [m] + real, parameter :: pscdSV = 250. + ! StxdSV : maximum Stomatal Resistance [s/m] + real, parameter :: StxdSV = 5000. + ! LAIdSV : maximum LAI + real, parameter :: LAIdSV = 4. + ! +--Soil + ! + ---- + ! rcwdSV : Density * Water Specific Heat + real, parameter :: rcwdSV = 4.180e+6 + ! dz_dSV : Soil Vertical Discretization (Layer's Thickness) + real, save :: dz_dSV(-nsol:0) + ! zz_dSV : Soil Thickness + real, save :: zz_dSV + ! number of soil layers + integer, parameter :: nsot = 12 + ! etadSV : Water Content at Saturation [m3/m3] + real, parameter :: etadSV(0:nsot) = (/ & + ! 0 WATER ! 1 SAND ! 2 LOAMY SAND + 1.000, 0.395, 0.410, & + ! 3 SANDY LOAM ! 4 SILT LOAM ! 5 LOAM + 0.435, 0.485, 0.451, & + ! 6 SANDY CLAY LOAM ! 7 SILTY CLAY LOAM ! 8 CLAY LOAM + 0.420, 0.477, 0.476, & + ! 9 SANDY CLAY ! 10 SILTY CLAY ! 11 CLAY very wet + 0.426, 0.492, 0.482, & + ! 12 ICE + 0.001/) + ! psidSV : Water Succion at Saturation [m] + real, parameter :: psidSV(0:nsot) = (/ & + ! 0 WATER ! 1 SAND ! 2 LOAMY SAND + 1.000, 0.121, 0.090, & + ! 3 SANDY LOAM ! 4 SILT LOAM ! 5 LOAM + 0.218, 0.786, 0.478, & + ! 6 SANDY CLAY LOAM ! 7 SILTY CLAY LOAM ! 8 CLAY LOAM + 0.299, 0.356, 0.630, & + ! 9 SANDY CLAY ! 10 SILTY CLAY ! 11 CLAY very wet + 0.153, 0.490, 0.405, & + ! 12 ICE + 0.001/) + ! Ks_dSV : Hydraulic Conductivity at Saturation [m/s] + real, parameter :: Ks_dSV(0:nsot) = (/ & + ! 0 WATER ! 1 SAND ! 2 LOAMY SAND + 0.0e00, 176.0e-8, 156.3e-8, & + ! 3 SANDY LOAM ! 4 SILT LOAM ! 5 LOAM + 34.1e-8, 7.2e-8, 7.0e-8, & + ! 6 SANDY CLAY LOAM ! 7 SILTY CLAY LOAM ! 8 CLAY LOAM + 6.3e-8, 1.7e-8, 2.5e-8, & + ! 9 SANDY CLAY ! 10 SILTY CLAY ! 11 CLAY very wet + 2.2e-8, 1.0e-8, 1.3e-8, & + ! 12 ICE + 0.0e00/) + ! bCHdSV : Clapp-Hornberger Coefficient b [-] + real, parameter :: bCHdSV(0:nsot) = (/ & + ! 0 WATER ! 1 SAND ! 2 LOAMY SAND + 1.00, 2.05, 2.38, & + ! 3 SANDY LOAM ! 4 SILT LOAM ! 5 LOAM + 2.90, 3.30, 3.39, & + ! 6 SANDY CLAY LOAM ! 7 SILTY CLAY LOAM ! 8 CLAY LOAM + 5.12, 5.75, 6.52, & + ! 9 SANDY CLAY ! 10 SILTY CLAY ! 11 CLAY very wet + 8.40, 8.40, 9.40, & + ! 12 ICE + 0.02/) + ! +--Water Bodies + ! + ------------ + ! vK_dSV : Diffusivity in Water [m2/s] + real, parameter :: vK_dSV = 1000. + ! TSIdSV : Sea-Ice Fraction: SST Scale [K] + real, parameter :: TSIdSV = 0.50 +endmodule mardsv diff --git a/MAR/code_mar/margau.f90 b/MAR/code_mar/margau.f90 new file mode 100644 index 0000000000000000000000000000000000000000..deac02a397617cd61aff972f5add66b050c4ba17 --- /dev/null +++ b/MAR/code_mar/margau.f90 @@ -0,0 +1,149 @@ +subroutine MARgau_x(i1, i2, j1, j2, k1, k2) + + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS 17-12-2000 MAR | + ! | subroutine MARgau_x performs Gaussian Elimination Algorithm along x | + ! | (e.g. Pielke (1984), pp.302--303) | + ! | (needed to solve the implicit scheme developped for filtering) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: i1,i2,j1,j2,k1,k2: i,j,k Loops Limits | + ! | ^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_wk + + implicit none + + integer i, j, k, m + integer i1, i2, j1, j2, k1, k2, ix + + data ix/0/ + + ! +--Forward Sweep + ! + ============== + + if(ix /= 1) then + do k = k1, k2 + do j = j1, j2 + WKxyz5(i1, j, k) = WKxyz2(i1, j, k) + WKxyz6(i1, j, k) = -WKxyz1(i1, j, k) / WKxyz5(i1, j, k) + enddo + enddo + do i = ip1(i1), i2 + do k = k1, k2 + do j = j1, j2 + WKxyz5(i, j, k) = WKxyz3(i, j, k) * WKxyz6(i - 1, j, k) + WKxyz2(i, j, k) + WKxyz6(i, j, k) = -WKxyz1(i, j, k) / WKxyz5(i, j, k) + enddo + enddo + enddo + endif + + do k = k1, k2 + do j = j1, j2 + WKxyz7(i1, j, k) = WKxyz4(i1, j, k) / WKxyz5(i1, j, k) + enddo + enddo + + do i = ip1(i1), i2 + do k = k1, k2 + do j = j1, j2 + WKxyz7(i, j, k) = (WKxyz4(i, j, k) - WKxyz3(i, j, k) * WKxyz7(i - 1, j, k)) & + / WKxyz5(i, j, k) + enddo + enddo + enddo + + ! +--Backward Sweep + ! + ============== + + do i = im1(i2), i1, -1 + do k = k1, k2 + do j = j1, j2 + WKxyz7(i, j, k) = WKxyz6(i, j, k) * WKxyz7(i + 1, j, k) + WKxyz7(i, j, k) + enddo + enddo + enddo + + return +endsubroutine MARgau_x + +subroutine MARgau_y(i1, i2, j1, j2, k1, k2) + + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS 17-12-2000 MAR | + ! | subroutine MARgau_y performs Gaussian Elimination Algorithm along y | + ! | (e.g. Pielke (1984), pp.302--303) | + ! | (needed to solve the implicit scheme developped for filtering) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: i1,i2,j1,j2,k1,k2: i,j,k Loops Limits | + ! | ^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_wk + + implicit none + + integer i, j, k, m + integer i1, i2, j1, j2, k1, k2, ix + + data ix/0/ + + ! +--Forward Sweep + ! + ============== + + if(ix /= 1) then + do k = k1, k2 + do i = i1, i2 + WKxyz5(i, j1, k) = WKxyz2(i, j1, k) + WKxyz6(i, j1, k) = -WKxyz1(i, j1, k) / WKxyz5(i, j1, k) + enddo + enddo + do j = jp1(j1), j2 + do k = k1, k2 + do i = i1, i2 + WKxyz5(i, j, k) = WKxyz3(i, j, k) * WKxyz6(i, j - 1, k) + WKxyz2(i, j, k) + WKxyz6(i, j, k) = -WKxyz1(i, j, k) / WKxyz5(i, j, k) + enddo + enddo + enddo + endif + + do k = k1, k2 + do i = i1, i2 + WKxyz7(i, j1, k) = WKxyz4(i, j1, k) / WKxyz5(i, j1, k) + enddo + enddo + + do j = jp1(j1), j2 + do k = k1, k2 + do i = i1, i2 + WKxyz7(i, j, k) = (WKxyz4(i, j, k) - WKxyz3(i, j, k) * WKxyz7(i, j - 1, k)) & + / WKxyz5(i, j, k) + enddo + enddo + enddo + + ! +--Backward Sweep + ! + ============== + + do j = jm1(j2), j1, -1 + do k = k1, k2 + do i = i1, i2 + WKxyz7(i, j, k) = WKxyz6(i, j, k) * WKxyz7(i, j + 1, k) + WKxyz7(i, j, k) + enddo + enddo + enddo + + return +endsubroutine MARgau_y diff --git a/MAR/code_mar/margrd_mod.f90 b/MAR/code_mar/margrd_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..99c2d137240677d5334587487d86272a9b17719b --- /dev/null +++ b/MAR/code_mar/margrd_mod.f90 @@ -0,0 +1,165 @@ +! margrd: mar grid +! ================ +module margrd + use mardim + implicit none + ! dt : Time Step for Slow Dynamics (s) + real, save :: dt + ! dt_Loc: Time Step (dummy) (s) + real, save :: dt_Loc + ! dtquil: Time Step for 1-D Initialisation (s) + real, save :: dtquil + ! tequil: Time Span for 1-D Initialisation (s) + real, save :: tequil + ! dtfast: Time Step for Fast Dynamics (s) + real, save :: dtfast + ! dtAdvH: Time Step for Tracer Advection (s) + real, save :: dtAdvH + ! dtDiff: Time Step for Subgrid Scale Processes (s) + real, save :: dtDiff + real, save :: dtPhys + real, save :: dtRadi + real, save :: dthyd + ! idt : Time Step for Slow Dynamics (s) + integer, save :: idt + integer, save :: jdt + ! ntFast: Nb Fast Dyn.Tim.Steps for one Mix Dyn.Tim.Step + integer, save :: ntFast + ! nt_Mix: Nb Mix Dyn.Tim.Steps for one Slow Dyn.Tim.Step + integer, save :: nt_Mix + ! ntAdvH: Nb Trac.Adv.Tim.Steps for one Slow Dyn.Tim.Step + integer, save :: ntAdvH + ! ntDiff: Nb Turbul. Tim.Steps for one Slow Dyn.Tim.Step + integer, save :: ntDiff + ! ntPhys: Nb Srf.Phys.Tim.Steps for one Slow Dyn.Tim.Step + integer, save :: ntPhys + ! ntRadi: Nb Rad.Phys.Tim.Steps for one Slow Dyn.Tim.Step + integer, save :: ntRadi + integer, save :: nthyd + ! itFast: No Fast Dyn.Tim.Step + integer, save :: itFast + ! it_Mix: No Mix Dyn.Tim.Step + integer, save :: it_Mix + ! jtAdvH: Nb Slow Dyn.Tim.Steps for one Trac.Adv.Tim.Step + integer, save :: jtAdvH + ! jtDiff: Nb Slow Dyn.Tim.Steps for one Turbul. Tim.Step + integer, save :: jtDiff + ! jtPhys: Nb Slow Dyn.Tim.Steps for one Srf.Phys.Tim.Step + integer, save :: jtPhys + ! jtRadi: Nb Slow Dyn.Tim.Steps for one Rad.Phys.Tim.Step + integer, save :: jtRadi + integer, save :: jtRadi2 + ! kssMAR: Nb of simul. % Second + integer, save :: kssMAR + ! jdplus: Day Offset + integer, save :: jdplus + ! mmplus: Month Offset + integer, save :: mmplus + ! jdaMAR: Nb of simulated Days + integer(kind=8), save :: jdaMAR + ! jhaMAR: Nb of simulated Hours in Day jdaMAR+1 + integer(kind=8), save :: jhaMAR + ! jmmMAR: Nb of simulated Minutes in Hour jhaMAR+1 + integer(kind=8), save :: jmmMAR + ! jssMAR: Nb of simulated Seconds in Minute jmmMAR+1 + integer(kind=8), save :: jssMAR + integer(kind=8), save :: jhaRUN + integer(kind=8), save :: dt_new + integer(kind=8), save :: dt_old + ! center: Pressure Spatial Scheme centered or not + logical, save :: center + ! tsplit: Advection Time Scheme splitted or not + logical, save :: tsplit + ! staggr: Vertical Grid staggered or not + logical, save :: staggr + ! nordps: Pressure Spatial Scheme Precision (-1 or 4) + integer, save :: nordps + ! norhyd: Advection H2O Spatial Scheme Precision (-1 or 4) + integer, save :: norhyd + ! nortra: Advection Trac.Spatial Scheme Precision (-1 or 4) + integer, save :: nortra + ! fac43 = 4.d0 / 3.d0 (used in 4th order horizontal difference scheme) + real, save :: fac43 + ! rxy = 1.d-3/(mx*my) + real, save :: rxy + ! dx : horizontal grid size (x direction) + real, save :: dx + ! dx2 = 2 dx + real, save :: dx2 + ! dtx = dt / dx + real, save :: dtx + ! dxinv = 1 / dx + real, save :: dxinv + ! dxinv2 = 1 / (2 dx) + real, save :: dxinv2 + ! dx3 dy3 : distance between lon / lat + real, save :: dx3(mx, my), dy3(mx, my) + ! dxy3 = (dx3 + dy3) / 2. + real, save :: dxy3(mx, my) + ! dxinv3 = 1. / (2 dx3) + ! dyinv3 = 1. / (2 dy3) + real, save :: dxinv3(mx, my), dyinv3(mx, my) + ! mez : origin grid point number (x direction) + integer, save :: imez + integer, save :: m1, m2, m3, m4 + ! im1,2 : max(i-1, 1), max(i-2, 1), etc... + ! ip1,2 : min(i+1,mx), min(i+2,mx), etc... + integer, save :: im1(mx), ip1(mx), im2(mx), ip2(mx) + integer, save :: im3(mx), ip3(mx), im4(mx), ip4(mx) + integer, save :: mmx, mmx1, mmx2, mmx3, mmx4, mmx5, mmx6 + integer, save :: m0x1, m0x2, m0x3, m0x4, m0x5, m0x6 + ! dy : horizontal grid size (y direction) + real, save :: dy + ! dy2 = 2 dy + real, save :: dy2 + ! dty = dt / dy + real, save :: dty + ! dyinv = 1 / dy + real, save :: dyinv + ! dyinv2 = 2 / dy + real, save :: dyinv2 + ! jmez : origin grid point number (y direction) + integer, save :: jmez + integer, save :: mn, mn1, mn2, mn3, mn4 + ! jm1,2 : max(j-1, 1), max(j-2, 1), etc... + ! jp1,2 : min(j+1,my), min(j+2,my), etc... + integer, save :: jm1(my), jp1(my), jm2(my), jp2(my) + integer, save :: jm3(my), jp3(my), jm4(my), jp4(my) + integer, save :: mmy, mmy1, mmy2, mmy3, mmy4, mmy5, mmy6 + integer, save :: m0y1, m0y2, m0y3, m0y4, m0y5, m0y6 + integer, save :: mmz, mmz1, mmz2 + integer, save :: km1(mz), kp1(mz), km2(mz) + ! THE VERTICAL DISCRETIZATION IS DEFINED in subroutine iniver and auxgri + ! sigma : independant variable sigma on sigma levels (k) + real, save :: sigma(mz) + ! dsig_1 : difference ds(k+1/2) + real, save :: dsig_1(0:mzz) + ! qsig_1 : 1 / [difference ds(k+1/2) X 2] + real, save :: qsig_1(0:mzz) + ! dsig_2 : difference ds(k+1/2) X 2 + real, save :: dsig_2(mzz) + ! sigmid : independant variable sigma between levels (k-1/2) + real, save :: sigmid(mzz) + ! dsigm1 : difference ds(k) + real, save :: dsigm1(mz) + ! qsigm1 : 1 / [difference ds(k)] + real, save :: qsigm1(mz) + ! dsigm2 : difference ds(k) X 2 + real, save :: dsigm2(mz) + ! qsigm2 : 1 / [difference ds(k) X 2] + real, save :: qsigm2(mz) + ! zsigma : height of sigma levels + real, save :: zsigma(mz) + real, save :: z__SBL + ! xxkm : distance to the x axis origin (km) + ! this is generally taken as the coast + ! when studying land-sea interactions + real, save :: xxkm(mx) + ! yykm : distance to the y axis origin (km) + real, save :: yykm(my) + real, save :: xxkm2(mx), yykm2(my) + ! area : area of each grid cell + real, save :: area(mx, my) + ! sh : surface height (m) + real, save :: sh(mx, my) +endmodule margrd diff --git a/MAR/code_mar/margxyz.f90 b/MAR/code_mar/margxyz.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7ce98ed9b5d3f5e7e18254ab6e1ee864cc680e9a --- /dev/null +++ b/MAR/code_mar/margxyz.f90 @@ -0,0 +1,149 @@ +subroutine MARgz_1mx1my(k1, k2, jj, var3d_1, var3d_2, var3d_3, var3d_4, var3d_out) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS 08-09-2017 MAR | + ! | subroutine MARgz_1mx1my performs Gaussian Elimination along s-Dir. | + ! | (e.g. Pielke (1984), pp.302--303) | + ! | (needed to solve the implicit scheme developped for filtering) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: k1,k2: k Loops Limits | + ! | ^^^^^ | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + use mar_wk + implicit none + ! input + integer, intent(in) :: k1, k2, jj + real, intent(in) :: var3d_1(mx, my, mz) + real, intent(in) :: var3d_2(mx, my, mz) + real, intent(in) :: var3d_3(mx, my, mz) + real, intent(in) :: var3d_4(mx, my, mz) + ! output + real, intent(out) :: var3d_out(mx, my, mz) + ! local + real :: var2d_tmp1(mx, mz) + real :: var2d_tmp2(mx, mz) + integer ii, kk + + ! +--Forward Sweep + ! + ============== + + ! do j=1,my + do ii = 1, mx + var2d_tmp1(ii, k1) = var3d_2(ii, jj, k1) + var2d_tmp2(ii, k1) = -var3d_1(ii, jj, k1) / var2d_tmp1(ii, k1) + enddo + ! end do + do kk = kp1(k1), k2 + ! do j=1,my + do ii = 1, mx + var2d_tmp1(ii, kk) = var3d_3(ii, jj, kk) * var2d_tmp2(ii, kk - 1) & + + var3d_2(ii, jj, kk) + var2d_tmp2(ii, kk) = -var3d_1(ii, jj, kk) / var2d_tmp1(ii, kk) + enddo + ! end do + enddo + ! do j=1,my + do ii = 1, mx + var3d_out(ii, jj, k1) = var3d_4(ii, jj, k1) / var2d_tmp1(ii, k1) + enddo + ! end do + do kk = kp1(k1), k2 + ! do j=1,my + do ii = 1, mx + var3d_out(ii, jj, kk) = (var3d_4(ii, jj, kk) - var3d_3(ii, jj, kk) & + * var3d_out(ii, jj, kk - 1)) / var2d_tmp1(ii, kk) + enddo + ! end do + enddo + + ! +--Backward Sweep + ! + ============== + + do kk = km1(k2), k1, -1 + ! do j=1,my + do ii = 1, mx + var3d_out(ii, jj, kk) = var2d_tmp2(ii, kk) * var3d_out(ii, jj, kk + 1) & + + var3d_out(ii, jj, kk) + enddo + ! end do + enddo + + return +endsubroutine MARgz_1mx1my + +subroutine MARgz_2mx1y1_mp(kk1, kk2, jj, var3d_1, var3d_2, var3d_3, var3d_4, var3d_out) + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS 03-07-2004 MAR | + ! | subroutine MARgz_2mx1y1 performs Gaussian Elimination along s-Dir. | + ! | (e.g. Pielke (1984), pp.302--303) | + ! | (needed to solve the implicit scheme developped for filtering) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: k1,k2: k Loops Limits | + ! | ^^^^^ | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + implicit none + ! inputs + integer, intent(in) :: kk1, kk2, jj + real, intent(in) :: var3d_1(mx, my, mz) + real, intent(in) :: var3d_2(mx, my, mz) + real, intent(in) :: var3d_3(mx, my, mz) + real, intent(in) :: var3d_4(mx, my, mz) + ! outputs + real, intent(out) :: var3d_out(mx, my, mz) + ! local + real :: var2d_tmp1(mx, mz) + real :: var2d_tmp2(mx, mz) + integer :: ii, kk + + ! +--Forward Sweep + ! + ============== + + ! do jj=jjp11,my1 + do ii = ip11, mx1 + var2d_tmp1(ii, kk1) = var3d_2(ii, jj, kk1) + var2d_tmp2(ii, kk1) = -var3d_1(ii, jj, kk1) / var2d_tmp1(ii, kk1) + enddo + ! end do + do kk = kp1(kk1), kk2 + ! do jj=jjp11,my1 + do ii = ip11, mx1 + var2d_tmp1(ii, kk) = var3d_3(ii, jj, kk) * var2d_tmp2(ii, kk - 1) + var3d_2(ii, jj, kk) + var2d_tmp2(ii, kk) = -var3d_1(ii, jj, kk) / var2d_tmp1(ii, kk) + enddo + ! end do + enddo + ! do jj=jjp11,my1 + do ii = ip11, mx1 + var3d_out(ii, jj, kk1) = var3d_4(ii, jj, kk1) / var2d_tmp1(ii, kk1) + enddo + ! end do + do kk = kp1(kk1), kk2 + ! do jj=jjp11,my1 + do ii = ip11, mx1 + var3d_out(ii, jj, kk) = (var3d_4(ii, jj, kk) - & + var3d_3(ii, jj, kk) * var3d_out(ii, jj, kk - 1)) / var2d_tmp1(ii, kk) + enddo + ! end do + enddo + + ! +--Backward Sweep + ! + ============== + do kk = km1(kk2), kk1, -1 + ! do jj=jjp11,my1 + do ii = ip11, mx1 + var3d_out(ii, jj, kk) = var2d_tmp2(ii, kk) * var3d_out(ii, jj, kk + 1) + var3d_out(ii, jj, kk) + enddo + enddo + ! end do + + return +endsubroutine MARgz_2mx1y1_mp diff --git a/MAR/code_mar/mariso_init.f90 b/MAR/code_mar/mariso_init.f90 new file mode 100644 index 0000000000000000000000000000000000000000..918612175c17aca6a104a52993a6478289fb7175 --- /dev/null +++ b/MAR/code_mar/mariso_init.f90 @@ -0,0 +1,205 @@ +! Created by Cécile Agosta on 04/03/2021. +! initialization routines for mariso + +subroutine mariso_init_sno(iso_init_type, rosSNo, wasSNo, SWaSNo, rosSNo_iso, wasSNo_iso, SWaSNo_iso) + ! isotopic initialization of sivat snowpack + ! iso_init_type = 0 : R = Rdefault + ! iso_init_type = 1 : R from observed delta + use mardim, only: mx, my, mz + use marssn, only: nsx + use mar_sv, only: nsno + use mariso, only: niso, Rdefault + implicit none + ! inputs + integer, intent(in) :: iso_init_type + real, intent(in) :: rosSNo(mx, my, nsx, nsno) + real, intent(in) :: wasSNo(mx, my, nsx, nsno) + real, intent(in) :: SWaSNo(mx, my, nsx) + ! outputs + real, intent(out) :: rosSNo_iso(niso, mx, my, nsx, nsno) + real, intent(out) :: wasSNo_iso(niso, mx, my, nsx, nsno) + real, intent(out) :: SWaSNo_iso(niso, mx, my, nsx) + ! local + integer wiso, i, j, k, n + + ! isotopic initialization of sivat snowpack + if(iso_init_type == 0) then + ! iso_init_type = 0 : R = Rdefault + ! ================================ + do n = 1, nsno + do k = 1, nsx + do j = 1, my + do i = 1, mx + do wiso = 1, niso + rosSNo_iso(wiso, i, j, k, n) = Rdefault(wiso) * rosSNo(i, j, k, n) + wasSNo_iso(wiso, i, j, k, n) = Rdefault(wiso) * wasSNo(i, j, k, n) + enddo + enddo + enddo + enddo + enddo + do k = 1, nsx + do j = 1, my + do i = 1, mx + do wiso = 1, niso + SWaSNo_iso(wiso, i, j, k) = Rdefault(wiso) * SWaSNo(i, j, k) + enddo + enddo + enddo + enddo + + else if(iso_init_type == 1) then + ! TODO : add realistic initialization + ! iso_init_type = 1 : R from observed delta + ! ========================================= + ! rosSNo_iso : Snow Volumic Mass kg/m3][ + ! delta in per mil as a function of temperature + ! for Antarctica : Masson-Delmotte et al. 2008 https://dx.doi.org/10.1175/2007jcli2139.1 (Fig. 6) + ! delta_iso(iso18) = + ! delta_iso(isoD) = + ! R_iso(iso) = delta_iso(iso) + ! rosSNo_iso(i, j, n, k, iso) = R_iso(iso) * rosSNo(i, j, n, k) + else + write(6, *) "mariso ERROR: iso_init_type must be 0 or 1" + stop + endif + +endsubroutine mariso_init_sno + +subroutine mariso_init_tv(iso_init_type, eta_TV, eta_TV_iso) + ! isotopic initialization of sivat soil + ! iso_init_type = 0 : R = Rdefault + ! iso_init_type = 1 : R from observed delta + use mar_tv, only: imx, jmx, nvx, llx + use mariso, only: niso, Rdefault + implicit none + ! inputs + integer, intent(in) :: iso_init_type + real, intent(in) :: eta_TV(imx, jmx, nvx, llx) + ! outputs + real, intent(out) :: eta_TV_iso(niso, imx, jmx, nvx, llx) + ! local + integer wiso, i, j, k, n + + ! isotopic initialization of sivat snowpack + if(iso_init_type == 0) then + ! iso_init_type = 0 : R = Rdefault + ! ================================ + do n = 1, llx + do k = 1, nvx + do j = 1, jmx + do i = 1, imx + do wiso = 1, niso + eta_TV_iso(wiso, i, j, k, n) = Rdefault(wiso) * eta_TV(i, j, k, n) + enddo + enddo + enddo + enddo + enddo + else if(iso_init_type == 1) then + ! TODO : add realistic initialization + ! iso_init_type = 1 : R from observed delta + ! ========================================= + ! rosSNo_iso : Snow Volumic Mass kg/m3][ + ! delta in per mil as a function of temperature + ! for Antarctica : Masson-Delmotte et al. 2008 https://dx.doi.org/10.1175/2007jcli2139.1 (Fig. 6) + ! delta_iso(iso18) = + ! delta_iso(isoD) = + ! R_iso(iso) = delta_iso(iso) + ! rosSNo_iso(i, j, n, k, iso) = R_iso(iso) * rosSNo(i, j, n, k) + else + write(6, *) "mariso ERROR: iso_init_type must be 0 or 1" + stop + endif + +endsubroutine mariso_init_tv + +subroutine mariso_init_sl(iso_init_type, qvapSL, qvapSL_iso) + ! isotopic initialization of sivat soil + ! iso_init_type = 0 : R = Rdefault + ! iso_init_type = 1 : R from observed delta + use mardim, only: mx, my + use mariso, only: niso, Rdefault + implicit none + ! inputs + integer, intent(in) :: iso_init_type + real, intent(in) :: qvapSL(mx, my) + ! outputs + real, intent(out) :: qvapSL_iso(niso, mx, my) + ! local + integer wiso, i, j + + ! isotopic initialization of sivat snowpack + if(iso_init_type == 0) then + ! iso_init_type = 0 : R = Rdefault + ! ================================ + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qvapSL_iso(wiso, i, j) = Rdefault(wiso) * qvapSL(i, j) + enddo + enddo + enddo + else if(iso_init_type == 1) then + ! TODO : add realistic initialization + ! iso_init_type = 1 : R from observed delta + ! ========================================= + ! rosSNo_iso : Snow Volumic Mass kg/m3][ + ! delta in per mil as a function of temperature + ! for Antarctica : Masson-Delmotte et al. 2008 https://dx.doi.org/10.1175/2007jcli2139.1 (Fig. 6) + ! delta_iso(iso18) = + ! delta_iso(isoD) = + ! R_iso(iso) = delta_iso(iso) + ! rosSNo_iso(i, j, n, k, iso) = R_iso(iso) * rosSNo(i, j, n, k) + else + write(6, *) "mariso ERROR: iso_init_type must be 0 or 1" + stop + endif + +endsubroutine mariso_init_sl + +subroutine mariso_init_dy(iso_init_type, qvDY, qvDY_iso) + ! isotopic initialization of sivat soil + ! iso_init_type = 0 : R = Rdefault + ! iso_init_type = 1 : R from observed delta + use mardim, only: mx, my, mz + use mariso, only: niso, Rdefault + implicit none + ! inputs + integer, intent(in) :: iso_init_type + real, intent(in) :: qvDY(mx, my, mz) + ! outputs + real, intent(out) :: qvDY_iso(niso, mx, my, mz) + ! local + integer wiso, i, j, k + + ! isotopic initialization of sivat snowpack + if(iso_init_type == 0) then + ! iso_init_type = 0 : R = Rdefault + ! ================================ + do k = 1, mz + do j = 1, my + do i = 1, mx + do wiso = 1, niso + qvDY_iso(wiso, i, j, k) = Rdefault(wiso) * qvDY(i, j, k) + enddo + enddo + enddo + enddo + else if(iso_init_type == 1) then + ! TODO : add realistic initialization + ! iso_init_type = 1 : R from observed delta + ! ========================================= + ! rosSNo_iso : Snow Volumic Mass kg/m3][ + ! delta in per mil as a function of temperature + ! for Antarctica : Masson-Delmotte et al. 2008 https://dx.doi.org/10.1175/2007jcli2139.1 (Fig. 6) + ! delta_iso(iso18) = + ! delta_iso(isoD) = + ! R_iso(iso) = delta_iso(iso) + ! rosSNo_iso(i, j, n, k, iso) = R_iso(iso) * rosSNo(i, j, n, k) + else + write(6, *) "mariso ERROR: iso_init_type must be 0 or 1" + stop + endif + +endsubroutine mariso_init_dy diff --git a/MAR/code_mar/mariso_io.f90 b/MAR/code_mar/mariso_io.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9784aef116131a6c4a0e25458b41cf2bf2d7a351 --- /dev/null +++ b/MAR/code_mar/mariso_io.f90 @@ -0,0 +1,278 @@ +subroutine mariso_create_file + ! create a netcdf and fill it will isotopic variables + use mardim, only: mx, my, mz + use margrd, only: xxkm, yykm, sigma + use mariso, only: niso, lab_iso + use libUN_mod + implicit none + + ! local + character * 100 fileout + logical file_exists + ! ndim : number of defined dimensions (without time) + integer, parameter :: ndim = 3 + ! dim_lenght : length of each dimension + integer dim_lenght(0:ndim) + ! dim_lmax : maximum length for all dims: recorded Time Steps + ! and also maximum of spatial grid points for each direction. + integer, parameter :: dim_lmax = 2000 + ! Llnam, Lnam, Luni : Length of char strings + integer, parameter :: Lnam = 13 + integer, parameter :: Luni = 30 + integer, parameter :: Llnam = 50 + ! dim_name : name of each dimension + character*(Lnam) :: dim_name(0:ndim) + ! dim_units : units of each dimension + character*(Luni) :: dim_units(0:ndim) + ! dim_values : values of dimension vectors + real :: dim_values(dim_lmax, 0:ndim) + ! nvar_max : Maximum Number of Variables + integer, parameter :: nvar_max = 36 + ! nvar : total number of variables writen in the NetCDF file + integer :: nvar + ! var_name : variable name + character*(Lnam) :: var_name(nvar_max) + ! var_dimnames : dimension names of the variable + character*(Lnam) :: var_dimnames(4, nvar_max) + ! var_units : variable unit + character*(Luni) :: var_units(nvar_max) + ! var_longname : variable long name + character*(Llnam) :: var_longname(nvar_max) + ! NattNC_ice : number of real attributes given to all variables + integer, parameter :: NattNC_ice = 1 + ! att_name : name of attribute + character*12, parameter :: att_name(1) = (/'actual_range'/) + ! att_ndim : "actual_range" is (min, max) of all data for each variable + integer, parameter :: att_ndim(1) = (/2/) + + integer i, j, k, wiso, file_id + + fileout = 'ISO_check.nc' + + ! initialisation + ! ============== + file_id = -1 ! NetCDF File is not open + + ! define dimensions + ! ================= + ! time + dim_lenght(0) = 0 + dim_name(0) = 'time' + dim_units(0) = 'number of increment since start of run' + ! x dimension + dim_lenght(1) = mx + dim_name(1) = 'x' + dim_units(1) = 'km' + do i = 1, mx + dim_values(i, 1) = xxkm(i) + enddo + ! y dimension + dim_lenght(2) = my + dim_name(2) = 'y' + dim_units(2) = 'km' + do j = 1, my + dim_values(j, 2) = yykm(j) + enddo + ! z dimension + dim_lenght(3) = mz + dim_name(3) = 'sigma' + dim_units(3) = '-' + do k = 1, mz + dim_values(k, 3) = sigma(k) + enddo + + ! define variables + ! ================ + nvar = 0 + ! qvDY + nvar = nvar + 1 + var_name(nvar) = 'qvDY' + var_longname(nvar) = 'specific humidity' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qvDY_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' specific humidity' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! qiHY + nvar = nvar + 1 + var_name(nvar) = 'qiHY' + var_longname(nvar) = 'cloud ice' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qiHY_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' cloud ice' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! qsHY + nvar = nvar + 1 + var_name(nvar) = 'qsHY' + var_longname(nvar) = 'precipitation ice' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qsHY_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' precipitation ice' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! qwHY + nvar = nvar + 1 + var_name(nvar) = 'qwHY' + var_longname(nvar) = 'cloud liquid' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qwHY_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' cloud liquid' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! qrHY + nvar = nvar + 1 + var_name(nvar) = 'qrHY' + var_longname(nvar) = 'precipitation liquid' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qrHY_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' precipitation liquid' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! qvapSL + nvar = nvar + 1 + var_name(nvar) = 'qvapSL' + var_longname(nvar) = 'surface specific humidity' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', '-', 'time'] + var_units(nvar) = 'kg kg-1' + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'qvapSL_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' surface specific humidity' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', '-', 'time'] + var_units(nvar) = 'kg kg-1' + enddo + ! tmp1 var + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'tmp1_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' tmp1' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = '-' + enddo + ! tmp2 var + do wiso = 1, niso + nvar = nvar + 1 + var_name(nvar) = 'tmp2_'//lab_iso(wiso) + var_longname(nvar) = lab_iso(wiso)//' tmp2' + var_dimnames(:, nvar) = [character(len=nvar_max) :: 'x', 'y', 'sigma', 'time'] + var_units(nvar) = '-' + enddo + + call UNscreate(fileout, 'output file to check water isotopes', & + ndim, dim_lenght, dim_lmax, dim_name, dim_units, dim_values, & + nvar_max, nvar, var_name, var_dimnames, var_units, var_longname, & + 1, att_name, att_ndim, file_id) + + call UNclose(file_id) + +endsubroutine mariso_create_file + +subroutine mariso_write_file(iso_time, iso_label) + use mardim, only: mx, my, mz + use mar_dy, only: qvDY + use mar_hy, only: qiHY, qsHY, qwHY, qrHY + use mar_sl, only: qvapSL + use mariso, only: niso, lab_iso, qvDY_iso, qvapSL_iso, qiHY_iso, qsHY_iso, qwHY_iso, qrHY_iso + use libUN_mod + implicit none + ! iso_label : label of the increment + character*10, intent(in) :: iso_label + ! iso_time : number of the increment + integer, intent(in) :: iso_time + ! local + integer file_id, wiso + + ! open file + call UNwopen('ISO_check.nc', file_id) + ! write time increment + call UNwrite(file_id, 'time', iso_time, 1, 1, 1, iso_time) + ! write isotopic variables + ! qvDY + call UNwrite(file_id, 'qvDY', iso_time, mx, my, mz, qvDY) + do wiso = 1, niso + call UNwrite(file_id, 'qvDY_'//lab_iso(wiso), iso_time, mx, my, mz, qvDY_iso(wiso, :, :, :)) + enddo + ! qiHY + call UNwrite(file_id, 'qiHY', iso_time, mx, my, mz, qiHY) + do wiso = 1, niso + call UNwrite(file_id, 'qiHY_'//lab_iso(wiso), iso_time, mx, my, mz, qiHY_iso(wiso, :, :, :)) + enddo + ! qsHY + call UNwrite(file_id, 'qsHY', iso_time, mx, my, mz, qsHY) + do wiso = 1, niso + call UNwrite(file_id, 'qsHY_'//lab_iso(wiso), iso_time, mx, my, mz, qsHY_iso(wiso, :, :, :)) + enddo + ! qwHY + call UNwrite(file_id, 'qwHY', iso_time, mx, my, mz, qwHY) + do wiso = 1, niso + call UNwrite(file_id, 'qwHY_'//lab_iso(wiso), iso_time, mx, my, mz, qwHY_iso(wiso, :, :, :)) + enddo + ! qrHY + call UNwrite(file_id, 'qrHY', iso_time, mx, my, mz, qrHY) + do wiso = 1, niso + call UNwrite(file_id, 'qrHY_'//lab_iso(wiso), iso_time, mx, my, mz, qrHY_iso(wiso, :, :, :)) + enddo + ! qvapSL + call UNwrite(file_id, 'qvapSL', iso_time, mx, my, 1, qvapSL) + do wiso = 1, niso + call UNwrite(file_id, 'qvapSL_'//lab_iso(wiso), iso_time, mx, my, 1, qvapSL_iso(wiso, :, :)) + enddo + ! close file + call UNclose(file_id) + + ! write increment and label + open(unit=222, file='iso_label.txt', action='write', position='append') + write(222, '(i10, A4, A10)') iso_time, ' :: ', iso_label + close(unit=222) + +endsubroutine mariso_write_file + +subroutine mariso_write_var3d(var3d_iso, var_name, iso_time) + use mardim, only: mx, my, mz + use mar_dy, only: qvDY + use mar_hy, only: qiHY, qsHY, qwHY, qrHY + use mar_sl, only: qvapSL + use mariso, only: niso, lab_iso + use libUN_mod + implicit none + ! var3d : 3d variable to be writen + real, intent(in) :: var3d_iso(niso, mx, my, mz) + ! var_name : variable name + character*4, intent(in) :: var_name + ! iso_time : number of the increment + integer, intent(in) :: iso_time + ! local + integer wiso, file_id + + ! open file + call UNwopen('ISO_check.nc', file_id) + ! write time increment + call UNwrite(file_id, 'time', iso_time, 1, 1, 1, iso_time) + ! write 3d variables + do wiso = 1, niso + call UNwrite(file_id, var_name//'_'//lab_iso(wiso), iso_time, mx, my, mz, var3d_iso(wiso, :, :, :)) + enddo + ! close file + call UNclose(file_id) +endsubroutine mariso_write_var3d diff --git a/MAR/code_mar/mariso_mod.f90 b/MAR/code_mar/mariso_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1c300fcfc04d0fed4f5b4d63d5153b713bddb9b3 --- /dev/null +++ b/MAR/code_mar/mariso_mod.f90 @@ -0,0 +1,434 @@ +module mariso + use mardim, only: mx, my, mz, mw + use marssn, only: nsx + ! klonv = 1, because not + use mar_sv, only: nsno, klonv + use mar_tv, only: imx, jmx, nvx, llx + implicit none + ! niso_all : number of defined isotopes + integer, parameter :: niso_all = 5 + ! niso : effective number of isotopes [2 to 4] + integer, parameter :: niso = 3 + ! iso_wat : index of water + integer, parameter :: iso_wat = 1 + ! iso_HDO : index of HDO + integer, parameter :: iso_HDO = 2 + ! iso_O18 : index of H218O + integer, parameter :: iso_O18 = 3 + ! iso_O17 : index of H217O + integer, parameter :: iso_O17 = 4 + ! iso_HTO : index of tritium + integer, parameter :: iso_HTO = 5 + + ! local variables + ! wiso : local loop + integer :: wiso + + ! options + ! ======= + ! options for initialization + ! iso_init_type = 0 : R = Rdefault + ! iso_init_type = 1 : R from observed delta + integer, parameter :: iso_init_type = 0 + + ! parameters + ! ========== + + ! constants + ! ========= + ! initialized in mariso_constants() + ! negligible : minimal value for a mixing ratio to be considered as negligible + ! LMDZ : negligible = ridicule + ! if negligible, we don't test if isotopic composition is aberrant + real, parameter :: negligible = 1e-12 + ! negligible_rain : negligible value for rain fluxes + ! negligible_rain in kg m-2 s-1 <-> 1e-3 mm day-1 + real, parameter :: negligible_rain = 1e-8 + ! negligible_evap : negligible value for evap fluxes + real, parameter :: negligible_evap = 1e-8 * 1e-2 + ! q_minsol : negligible value for qsol + real, parameter :: q_minsol = 1e-8 + ! negligible_snow : negligible value for snowpack + real, parameter :: negligible_snow = 1e-8 + ! q_min : negligible value for specific humidity + ! LMDZ : q_min = qperemin in dyn3dmem/infotrac.f90 + ! real, parameter :: q_min = 1.e-16 + ! ratio_min : negligible value for isotopic ratio (q_iso / q) + ! LMDZ : ratio_min = ratiomin in dyn3dmem/infotrac.f90 + ! real, parameter :: ratio_min = 1.e-16 + ! TODO : add details on expb_max + real, parameter :: expb_max = 30.0 + ! deltaO18 at ocean surface + real, parameter :: deltaO18_ocean = 0. + ! lab_iso : isotope label + character(len=3), save :: lab_iso(niso_all) + ! RNsmow : Vienna Standard Mean Ocean Water (SMOW) [mol mol-1] + ! LMDZ : RNsmow = tnat + real, save :: RNsmow(niso_all) + ! Rsmow : Vienna Standard Mean Ocean Water (SMOW) in mass [kg kg-1] + ! in the code, R is the mass ratio, so Rsmow must be converted in mass + ! LMDZ : Rsmow = tnat * Miso / M16 + real, save :: Rsmow(niso_all) + ! Rdefault : initial ratio for all water components [mol mol-1] + ! TODO : check Rdefault, why these values? + ! todo : check if valid with the mass definition of Rsmow + ! LMDZ : Rdefault = Rdefault for Rdefault_smow = .true. + real, save :: Rdefault(niso_all) + ! mwl_slope : slope of meteoric water line of delta_iso vs. delta_18O [-] + ! LMDZ : mwl_slope = pente_MWL + real, save :: mwl_slope(niso_all) + ! fac_Rocean : correction factor for R at ocean surface [-] + ! Rocean = Rsmow * (1 + delta_ocean / 1000.) * (1 + fac_Rocean) + ! LMDZ : fac_Rocean = fac_enrichoce18 * mwl_slope + real, save :: fac_Rocean(niso_all) + ! Rocean : isotopic ratio at ocean surface [mol mol-1] + ! todo : check if valid with the mass definition of Rsmow + ! LMDZ : Rocean = toce * tcorr + real, save :: Rocean(niso_all) + ! alpha_liq_0, alpha_liq_1, alpha_liq_2 : coeff of equilibrium fractionation for liquid/vapor phases (Majoube, 1971b) + ! alpha_liq_0 [-], alpha_liq_1 [K], alpha_liq_2 [K2] + ! LMDZ : alpha_liq_0, alpha_liq_1, alpha_liq_2 = talph3, talph2, talph1 + real, save :: alpha_liq_0(niso_all), alpha_liq_1(niso_all), alpha_liq_2(niso_all) + ! alpha_ice_0, alpha_ice_1, alpha_ice_2 : coeff of equilibrium fractionation for ice/vapor phases (Majoube, 1971b) + ! alpha_ice_0 [-], alpha_ice_1 [K], alpha_ice_2 [K2] + ! LMDZ : alpha_ice_0, alpha_ice_1, alpha_ice_2 = talps2, talps1 + ! TODO : update with Ellehøj et al. (2013) ? (see with M. Casado) + real, save :: alpha_ice_0(niso_all), alpha_ice_1(niso_all), alpha_ice_2(niso_all) + ! kcin [-] : kinetic factor for surface evaporation, with alphak = 1 / (1 - kcin) + ! ws0cin : wind speed limit for computing kcin [m s-1] + ! todo : update the equation of evaporation over ocean kcin with Françoise + ! kcin_0, kcin_1, kcin_2 : kcin = kcin0 for ws < ws0cin and kcin = kcin1 * ws + kcin2 for ws > ws0cin + ! LMDZ : kcin_0, kcin_1, kcin_2 = tkcin0, tkcin1, tkcin2 ; ws0cin = tv0cin + real, parameter :: ws0cin = 7. + real, save :: kcin_0(niso_all), kcin_1(niso_all), kcin_2(niso_all) + ! diffus_rel : ratio of molecular diffusivities D/Di, with alphak = (D/Di)**diffus_exp + ! in LMDZ : from Merlivat (1978), here updated with Barkan and Luz (2007) + ! LMDZ : diffus_rel = tdifrel + real, save :: diffus_rel(niso_all) + ! diffus_exp : exponent of relative diffusivity in Stewart (1975), alpha_eff for equilibrium below cloud base + ! LMDZ : diffus_exp = tdifexp + real, parameter :: diffus_exp = 0.58 + ! diffus_exp_sol : exponent of relative diffusivity, parametrization of turbulence. + ! Usually equal to 0.58, but Mathieu and Bariac find the exponent to be between 0.67 and 1 + ! diffus_exp = 0.67 for dry soils and diffus_exp = 1. for saturated soils. + ! LMDZ : diffus_exp_sol = tdifexp_sol + ! todo : check tdifexp_sol in LMDZ wateriso, might be equal to 0.8 + real, parameter :: diffus_exp_sol = 0.67 + ! rapport des ln(alphaeq) entre O18 et O17, donné par Amaelle + real, parameter :: fac_coeff_eq17_liq = 0.529 + real, parameter :: fac_coeff_eq17_ice = 0.529 + + !-------------------------------------------------------------- + ! Parameters that do not depend on the nature of water isotopes + !-------------------------------------------------------------- + ! tmelt : temperature at which ice condensate starts to form (valeur ECHAM?) (K) + ! LMDZ : tmelt = pxtmelt + real, parameter :: tmelt = 273.15 + ! tice : temperature at which all condensate is ice (K) + ! LMDZ : tice = pxtice + real, parameter :: tice = 273.15 - 10.0 + ! frac_tmin, frac_tmax : minimum and maximun temperature to calculate fractionation coeff (K) + ! note : coeffs were measured only above -40! + ! LMDZ : frac_tmin = pxtmin, frac_tmax = pxtmax + ! frac_tmin : valeur minimum de la température en K. Si elle est de l'ordre de quelques K seulement, + ! les coeffs de fractionnement deviennent démesurément grands, et en plus ça fait planter l'execution à l'idris. + real, parameter :: frac_tmin = 273.15 - 120.0 + real, parameter :: frac_tmax = 273.15 + 60.0 + ! factors lambda_sursat and mu in Si = musi - lambda_sursat * T + real, parameter :: musi = 1.0 + ! Kd : diffusion in soil (m2/s) + real, parameter :: Kd = 2.5e-9 ! + ! main isotopic parameters, from LMDZ DefLists/iso.def + ! ==================================================== + ! lambda_sursat : supersaturation. Typical value: 0.002. Range: 0 (no supersaturation) to 0.004 (high supersaturation) + real, parameter :: lambda_sursat = 0.002 + ! thumxt1: modulate cinetic fractionation during droplets re-evaporations. Typical value: 0.9. Range: 0 (rh near droplets = rh around droplets, strong cinetic fractionation) - 1 (rh = 1 near droplets, no cinetic fractionation) + real, parameter :: thumxt1 = 0.9 + ! h_land_ice // todo : h_land_ice not relevant for MAR (?) + ! P_veg: fraction de l'evaporation continentale provenant de la transpiration sans fractionnement de la végétation, au lieu de l évaporation avec fractionnement de sol nu ou d"eau libre. Valeur standard: 1 (comme autres GCMs). Range: 0 - 1. + ! P_veg = 1.0 // todo : P_veg not relevant for MAR (?) + ! iso_nudging: if .true. isotope H2O16 is nudged toward normal water. If .false., no nudging. In general, set to .true., but we check if H2O16 = iso_wat is not too far from normal water. + ! LMDZ : iso_nudging = bidouille_anti_divergence + logical, parameter :: iso_nudging = .true. + ! essai_convergence: si T, on fait tout exactement comme pour l eau normale, pour que les 2 versions convergent. Si F, on modifie un peu: ex: initialisations suppl�mentaires de variables, on zappe l homog�n�isation sous le nuage dans cv3_yield... + ! essai_convergence = .false. // todo : essai_convergence not relevant for MAR (?) + ! initialisation_iso: la façon dont les isos sont initialisés. + ! - Lors du lancement de gcm: + ! Pour la physique: + ! 0: lecture d un fichier, souvent de start (phyiso_etat0_fichier.F) + ! > 0: initialisation des isotopes académique, donnée dans phyiso_etat0_dur.F + ! Pour la dynamique: + ! 0: lecture d un fichier (dyniso_etat0_fichier.F) + ! > 0: initialisation académique: + ! 1: isos à 0 sauf H2016 = eau normale + ! 2: distill de Rayleigh + ! 3: tout est uniforme au SMOW + ! En général, on met initialisation_iso = 0 + ! - Lors du lancement de create_etat0_limit: + ! Pour la physique: initialisation en dure, toujours + ! Pour la dynamique: initialisation académique toujours: + ! 1: isos à 0 sauf H2016 = eau normale + ! 2 ou 0: distill de Rayleigh + ! 3: tout est uniforme au SMOW + ! En général, on laisse à initialisation_iso=0 + ! initialisation_iso = 2 // todo : iso_init_type = initialisation_iso -> test different initializations? + ! initialisation_isotrac: comment initialiser les traceurs d'eau? + ! 1: idéalisé: on met toute l'eau dans le tag izone_init, 0 ailleurs + ! 0: en lisant dans un fichier. Possible seulement si initialisation_iso = 0 + ! initialisation_isotrac = 1 // todo : add water tracers? + ! deltaO18_oce: ocean deltaO18: +1.1 for LGM, 0. for current days. Ocean dexcess and O17excess are supposed null. + real, parameter :: deltaO18_oce = 0. + ! deltaP_BL: boundary layer height for which soil water tends to equilibrate. Default: 10 mb (optim in ORCHIDEE_LMDZ) + real, parameter :: deltaP_BL = 10.0 + ! ruissellement_pluie: qu'est-ce qui ruisselle? si 1: c'est la pluie qui ruisselle. elle ne s'infiltre. elle ne s'infiltre donc jamais dans un sol satur�. si 0: c'est le sol qui ruisselle. La pluie s'inglitre donc dans le sol satur�. + ! ruissellement_pluie = 1 // todo : ruissellement_pluie not relevant for MAR (?) + ! alphak_stewart: if 1, alphak=(D/Diso)^nsol ; if 0: alphak=1/(1-kcin(vsurf)) + integer, parameter :: alphak_stewart = 1 + ! tdifexp_sol: tdifexp_sol is the exponent of D/Diso, it parameterize turbulence. Usually equal to 0.58, but Mathieu and Bariac estimate it to be between 0.67 and 1: 0.67 for dry soils and 1 for saturated soils. + real, parameter :: tdifexp_sol = 0.67 + ! deltaD_max : maximum value of deltaD, if deltaD greater than deltaD_max, model crash + ! LMDZ : deltaD_max = deltalim = deltalimtrac + real, parameter :: deltaD_max = 1000000. + ! dexcess_max : maximum value of dexcess_max, if dexcess greater than dexcess_max, model crash + real, parameter :: dexcess_max = 2000 + ! O17 limits : todo O17 limits + ! O17_verif = y + ! o17excess_bas = -1000.0 + ! o17excess_haut = 900.0 + ! nlevmaxO17 = 18 + ! water tagging : todo water tagging + ! quand on utilise tag 17, on taggue la vapeur résiduelle quand la fraction condensée est supérieure à seuil_tag_tmin, c'est à dire quand l'évènement de condensation affecte suffisemment la compo de la vapeur résiduelle. + ! Si seuil_tag_tmin=0, le moindre évènement de condensation même très faible agit sur les tags, et les proportions de sfc, condensat et rev sont presques nulles. + ! par defaut: seuil_tag_tmin=0.01: 1% de condensation <-> 0.1 permil d'effet sur la vapeur résiduelle. + ! seuil_tag_tmin = 0.01 + ! idem pour condensation dans LS: par defaut égal à seuil_tag_tmin + ! seuil_tag_tmin_ls = 0.01 + ! option_seuil_tag_tmin: si 1, on recolorise la vapeur résiduelle dès que cond/qt>seuil_tag_tmin. + ! Ca taggue bien la vap résiduelle mais le problème est que plus on humidifie par la microphysique, plus le seuil est facilement atteint -> plus on retaggue -> au final, on n'a pas plus de tag mcrophysique alors que c'est la source d'humdification. + ! dans l'option 2: on taggue si (cond-qmicro)/((qt-qmicro)>seuil + ! option_seuil_tag_tmin = 2 + ! lim_tag20 : latitude de taggage des extra-tropiques quand option de taggage no 20 + ! 35.0 b defaut + ! lim_tag20 = 35.0 + ! quand tag9, recolorise t'on que le condensat convectif (option 2) ou aussi le condensat starti (otion 1) + ! option_cond = 2 + ! quand tag 22, on recolorise la vapeur dans les zones ou precip>lim_precip_tag22 + ! 10.0 par défaut + ! lim_precip_tag22 = 10.0 + ! no_pce : if =1, no post-condensational exchanges as in Field, Jones and Brown. no_pce = 0 : fractionation as usual. + ! integer, parameter :: no_pce = 0 + ! quand adv 14, saturation limiter tel que on advec min (q,A_satlim*qs) + ! par defaut, A_satlim=1: c'est le code original de Francis Codron + ! ce param n'a d'effet que quand adv 14. + ! A_satlim = 0.8 + ! si ok_restrict_A_satlim=1, alors on n'active adv 14 que dans les extra-tropiques + ! si ok_restrict_A_satlim=2, alors on n'active adv 14 que dans les tropiques + ! si ok_restrict_A_satlim=3, alors on n'active adv 14 nulle part + ! ok_restrict_A_satlim = 0 + ! defaut: 2; pour adv 10: 0 + ! slope_limiter = 2. + ! on multiplie par 3 ratqs aux extraropiques si modif_ratqs=1. + ! modif_ratqs = 0 + + ! variables + ! ========= + + ! svasav : sisvat snow water + ! -------------------------- + ! rosSNo_iso : Snow Volumic Mass [kg/m3] + real, save :: rosSNo_iso(niso, mx, my, nsx, nsno) + ! wasSNo_iso: Soil humidity content (=> in the snow cover ) [kg/kg] + real, save :: wasSNo_iso(niso, mx, my, nsx, nsno) + ! SWaSNo_iso: Surficial Water Mass [kg/m2] + real, save :: SWaSNo_iso(niso, mx, my, nsx) + ! snohSN_iso : Snow Buffer Layer Thickness [mmWE] + real, save :: snohSN_iso(niso, mx, my, nsx) + + ! soil water + ! ---------- + ! eta_TV : Soil Moisture Content [m3/m3] + real, save :: eta_TV_iso(niso, imx, jmx, nvx, llx) + ! evapTV: Time Integrated Evapotranspiration [mm w.e.] + real, save :: evapTV_iso(niso, imx, jmx) + + ! surface air water (for soil) + ! ---------------------------- + ! qvapSL : specific humidity close to the surface (kg/kg) + real, save :: qvapSL_iso(niso, mx, my) + ! SLuqs_iso :: Surface Specific Humidity Turbulent Flux (Av.) (kg/kg m/s) + ! evaporation flux from the surface + real, save :: SLuqs_iso(niso, mx, my) + ! SLuqsl_iso :: Surface Specific Humidity Turbulent Flux by mosaic (kg/kg m/s) + ! evaporation flux from the surface by mosaic + real, save :: SLuqsl_iso(niso, mx, my, mw) + ! uqs_SV <-> SLuqsl_iso in sisvat + real, save :: uqs_SV_iso(niso, klonv) + + ! dynamical variables + ! ------------------- + ! qvDY_iso : Specific Humidity (kg/kg) + real, save :: qvDY_iso(niso, mx, my, mz) + + ! microphysics water + ! ------------------ + !cCA : quid de : snfHY = 0.0, sblHY, rnfHY, evpHY? (see iniphy) + ! qiHY : cloud ice crystals concentration (kg/kg) + real, save :: qiHY_iso(niso, mx, my, mz) + ! qsHY : snow flakes concentration (kg/kg) + real, save :: qsHY_iso(niso, mx, my, mz) + ! qwHY : cloud dropplets concentration (kg/kg) + real, save :: qwHY_iso(niso, mx, my, mz) + ! qrHY : rain concentration (kg/kg) + real, save :: qrHY_iso(niso, mx, my, mz) + ! rainHY : integrated precipited rain + real, save :: rainHY_iso(niso, mx, my) + ! rai0HY : integrated precipited rain (previous time step) + real, save :: rai0HY_iso(niso, mx, my) + ! snowHY : integrated precipited/eroded snow + real, save :: snowHY_iso(niso, mx, my) + ! sno0HY : integrated precipited/eroded snow (previous time step) + real, save :: sno0HY_iso(niso, mx, my) + ! sfa0HY : integrated precipited snow (previous time step) + real, save :: sfa0HY_iso(niso, mx, my) + real, save :: crysHY_iso(niso, mx, my) + ! qsrfHY : Blowing Snow Concentration (0.325 m above the surface) + real, save :: qsrfHY_iso(niso, mx, my) + ! qSalSV <-> qsrfHY in sisvat + real, save :: qSalSV_iso(niso, klonv) + + ! convective water + ! ---------------- + real, save :: dqv_CA_iso(niso, mx, my, mz) + real, save :: dqw_CA_iso(niso, mx, my, mz) + real, save :: dqi_CA_iso(niso, mx, my, mz) + real, save :: drr_CA_iso(niso, mx, my) + real, save :: dss_CA_iso(niso, mx, my) + real, save :: dsn_CA_iso(niso, mx, my) + real, save :: rainCA_iso(niso, mx, my) + real, save :: snowCA_iso(niso, mx, my) + +contains + + subroutine mariso_constants() + ! initialization of constant values for water isotopes + implicit none + ! lab_iso : isotope label + lab_iso(iso_wat) = 'wat' + lab_iso(iso_O18) = 'O18' + lab_iso(iso_HDO) = 'HDO' + lab_iso(iso_O17) = 'O17' + lab_iso(iso_HTO) = 'HTO' + ! RNsmow : Vienna Standard Mean Ocean Water (SMOW) [mol mol-1] + RNsmow(iso_wat) = 1. + RNsmow(iso_O18) = 2005.2e-6 + RNsmow(iso_HDO) = 155.76e-6 + RNsmow(iso_O17) = 379.9e-6 + RNsmow(iso_HTO) = 0. + ! Rsmow : SMOW in mass [kg kg-1] + Rsmow(iso_wat) = 1. + Rsmow(iso_O18) = RNsmow(iso_O18) * (18.+2.) / (16.+2.) + Rsmow(iso_HDO) = RNsmow(iso_HDO) * (16.+3.) / (16.+2.) + Rsmow(iso_O17) = RNsmow(iso_O17) * (17.+2.) / (16.+2.) + Rsmow(iso_HTO) = 0. + ! mwl_slope : slope of meteoric water line of delta_iso vs. delta_18O [-] + mwl_slope(iso_wat) = 0. + mwl_slope(iso_O18) = 1. + mwl_slope(iso_HDO) = 8. + mwl_slope(iso_O17) = 0.528 + mwl_slope(iso_HTO) = 0. + ! Rdefault : initial ratio for all water components [mol mol-1] + Rdefault(iso_wat) = Rsmow(iso_wat) * 1. + Rdefault(iso_O18) = Rsmow(iso_O18) * (1.-6./1000.) + Rdefault(iso_HDO) = Rsmow(iso_HDO) * (1.-(6.*mwl_slope(iso_HDO) + 10.) / 1000.) + Rdefault(iso_O17) = Rsmow(iso_O17) * (1.-3.15 / 1000.) + Rdefault(iso_HTO) = 0. + ! fac_Rocean : correction factor for R at ocean surface [-] + fac_Rocean(iso_wat) = 0. + fac_Rocean(iso_O18) = 0.0005 + fac_Rocean(iso_HDO) = fac_Rocean(iso_O18) * mwl_slope(iso_HDO) + fac_Rocean(iso_O17) = fac_Rocean(iso_O18) * mwl_slope(iso_O17) + fac_Rocean(iso_HTO) = 0. + ! Rocean : isotopic ratio for ocean [mol mol-1] + ! Rocean : todo : check why these formulas + Rocean(iso_wat) = Rsmow(iso_wat) + Rocean(iso_O18) = Rsmow(iso_O18) * (1.+deltaO18_ocean / 1000.) * (1.+fac_Rocean(iso_O18)) + Rocean(iso_HDO) = Rsmow(iso_HDO) * (1.+deltaO18_ocean * mwl_slope(iso_HDO) / 1000.) * (1.+fac_Rocean(iso_HDO)) + Rocean(iso_O17) = Rsmow(iso_O17) * (1.+deltaO18_ocean / 1000.)**mwl_slope(iso_O17) * (1.+fac_Rocean(iso_O17)) + ! Rocean(iso_HTO) : rapport T/H = 0.2 TU Dreisigacker and Roether 1978 (corrigé par Alex Cauquoin) + ! todo : Rocean(iso_HTO), verify the ratio (16. + 4.) / (16. + 2.) here + Rocean(iso_HTO) = 4.e-19 * (16.+4.) / (16.+2.) + ! alpha_liq_0, alpha_liq_1, alpha_liq_2 : coeff of equilibrium fractionation for liquid/vapor phases (Majoube, 1971b) + alpha_liq_0(iso_wat) = 0. + alpha_liq_1(iso_wat) = 0. + alpha_liq_2(iso_wat) = 0. + alpha_liq_0(iso_O18) = -2.0667e-3 + alpha_liq_1(iso_O18) = -0.4156 + alpha_liq_2(iso_O18) = 1137. + alpha_liq_0(iso_HDO) = 52.612e-3 + alpha_liq_1(iso_HDO) = -76.248 + alpha_liq_2(iso_HDO) = 24844. + alpha_liq_0(iso_O17) = alpha_liq_0(iso_O18) + alpha_liq_1(iso_O17) = alpha_liq_1(iso_O18) + alpha_liq_2(iso_O17) = alpha_liq_2(iso_O18) + alpha_liq_0(iso_HTO) = 0. + alpha_liq_1(iso_HTO) = -103.87 + alpha_liq_2(iso_HTO) = 46480. + ! alpha_ice_0, alpha_ice_1, alpha_ice_2 : coeff of equilibrium fractionation for ice/vapor phases (Majoube, 1971b) + ! TODO : update with Ellehøj et al. (2013) ? (see with M. Casado) + alpha_ice_0(iso_wat) = 0. + alpha_ice_1(iso_wat) = 0. + alpha_ice_2(iso_wat) = 0. + alpha_ice_0(iso_O18) = -0.028244 + alpha_ice_1(iso_O18) = 11.839 + alpha_ice_2(iso_O18) = 0. + alpha_ice_0(iso_HDO) = -0.0934 + alpha_ice_1(iso_HDO) = 0. + alpha_ice_2(iso_HDO) = 16288. + alpha_ice_0(iso_O17) = alpha_ice_0(iso_O18) + alpha_ice_1(iso_O17) = alpha_ice_1(iso_O18) + alpha_ice_2(iso_O17) = alpha_ice_2(iso_O18) + alpha_ice_0(iso_HTO) = 0. + alpha_ice_1(iso_HTO) = -103.87 + alpha_ice_2(iso_HTO) = 46480. + ! diffus_rel : ratio of molecular diffusivities D/Di, with alphak = (D/Di)**diffus_exp + diffus_rel(iso_wat) = 1. + ! diffus_rel(iso_O18) = 1. / 0.9723 ! Merlivat (1978) + diffus_rel(iso_O18) = 1./0.9691 + ! diffus_rel(iso_HDO) = 1. / 0.9755 ! Merlivat (1978) + diffus_rel(iso_HDO) = 1./0.9839 + ! diffus_rel(iso_O17) = 1. / 0.985452 ! donné par Amaelle + diffus_rel(iso_O17) = 1./0.98555 ! valeur utilisée en 1D et dans modèle de LdG + diffus_rel(iso_HTO) = 1./0.968 + ! kcin_0, kcin_1, kcin_2 : kinetic factors for surface evaporation, with alphak = 1 / (1 - kcin) + kcin_0(iso_wat) = 0. + kcin_1(iso_wat) = 0. + kcin_2(iso_wat) = 0. + kcin_0(iso_O18) = 0.006 + kcin_1(iso_O18) = 0.000285 + kcin_2(iso_O18) = 0.00082 + kcin_0(iso_HDO) = kcin_0(iso_O18) * (diffus_rel(iso_HDO) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_1(iso_HDO) = kcin_1(iso_O18) * (diffus_rel(iso_HDO) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_2(iso_HDO) = kcin_2(iso_O18) * (diffus_rel(iso_HDO) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_0(iso_O17) = kcin_0(iso_O18) * (diffus_rel(iso_O17) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_1(iso_O17) = kcin_1(iso_O18) * (diffus_rel(iso_O17) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_2(iso_O17) = kcin_2(iso_O18) * (diffus_rel(iso_O17) - 1.) / (diffus_rel(iso_O18) - 1.) + kcin_0(iso_HTO) = 0.01056 + kcin_1(iso_HTO) = 0.0005016 + kcin_2(iso_HTO) = 0.0014432 + endsubroutine mariso_constants + + real function R_to_delta(iso, Riso) result(delta) + implicit none + integer, intent(in) :: iso + real, intent(in) :: Riso + delta = (Riso / Rsmow(iso) - 1.) / 1000. + endfunction R_to_delta + + real function delta_to_R(iso, delta) result(Riso) + implicit none + integer, intent(in) :: iso + real, intent(in) :: delta + Riso = (delta / 1000.+1.) * Rsmow(iso) + endfunction delta_to_R + +endmodule mariso diff --git a/MAR/code_mar/mariso_routines.f90 b/MAR/code_mar/mariso_routines.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7ff65385012420474678d6f3cfe54009c92828da --- /dev/null +++ b/MAR/code_mar/mariso_routines.f90 @@ -0,0 +1,384 @@ +! Created by Cécile Agosta on 21/09/2021 +! isotopic routines, taken from LMDZ6iso (Camille Risi, LMD) + +subroutine stewart_sublim_nofrac(qa, qa_iso, qr, qr_iso, qevap, qr_new, qr_iso_new, qa_iso_new, qevap_iso) + ! q, xt, rfl, xtrfl, qevfl, rfln, xtrfln, xtnew, Exi + ! ============================================================================================ ! + ! From C. Risi phylmdiso/isotopes_routines_mod.F90/stewart_sublim_nofrac_vectall + ! sublimation (re-evaporation) of ice: we suppose no fractionation during ice sublimation + ! ============================================================================================ ! + use mariso, only: niso, iso_wat, iso_nudging, negligible + implicit none + + ! inputs + ! ====== + ! qa : specific humidity (kg kg-1) + ! LMDZ : qa = zq + real, intent(in) :: qa + ! qa_iso : isotopic specific humidity (kg kg-1) + ! LMDZ : qa_iso = zxt + real, intent(in) :: qa_iso(niso) + ! qr : precipitation flux in the atmosphere (kg kg-1) *before evaporation* + ! LMDZ : qr = Pqisup or zrfl + real, intent(in) :: qr + ! qr_iso : isotopic precipitation flux in the atmosphere (kg kg-1) + ! LMDZ : qr_iso = Pxtisup or zxtrfl + real, intent(in) :: qr_iso(niso) + ! qevap : evaporation flux (kg kg-1) + ! LMDZ : qevap = (Eqi or zqevfl) * (fac_ftmr = fac_fluxtomixratio) for conversion from flux to mixing ratio + ! fac_ftmr = fac_fluxtomixratio = factor for conversion from flux to mixing ratio = g.dt/dp (1 / (kg m-2 s-1)) + ! todo : qevap, verify the unit. Coded here in kg/kg, in LMDZ it was in flux so to be multiplied by fac_fluxtomixratio = g.dt/dp + real, intent(in) :: qevap + ! qr_new : precipitation flux in the atmosphere (kg kg-1) *after evaporation* + ! LMDZ : qr_new = Pqiinf or zrfln (zrfln = zrfl new = rainfall flux new) + real, intent(in) :: qr_new + + ! outputs + ! ======= + ! qr_iso_new : isotopic precipitation flux in the atmosphere (kg kg-1) *after evaporation* + ! LMDZ : qr_iso_new = Pxtiinf or zxtrfln (zxtrfln = zxtrfl new) + real, intent(out) :: qr_iso_new(niso) + ! qa_iso_new : isotopic specific humidity after sublimation (kg kg-1) + ! LMDZ : qa_iso_new = xtnew + real, intent(out) :: qa_iso_new(niso) + ! qevap_iso : isotopic evaporation (kg kg-1) + ! LMDZ : qevap_iso = Exi + real, intent(out) :: qevap_iso(niso) + + ! local variables + real Rb0(niso) + integer wiso + !#ifdef ISOVERIF + !#ifdef ISOVERIF + + ! traitement rapide de quelques cas particuliers + ! todo : check if a threshold is needed here + if(qr <= 0) then + ! no precipitation, no qr_new, no change in water vapor + !#ifdef ISOVERIF + do wiso = 1, niso + qr_iso_new(wiso) = 0. + enddo + if(iso_nudging) then + qr_iso_new(iso_wat) = qr_new + endif + if(abs(qevap) > negligible) then + ! attention: pour des raisons obscures, il y a parfois + ! de le réévaporation significative alors qu'il n'y a + ! aucun cristal à réévaporer. + ! Dans ce cas, on admet cette réévaporation obscure et + ! on suppose qu'elle ne change pas la composition + ! isotopique de la vapeur. + if(qa > negligible) then + do wiso = 1, niso + Rb0(wiso) = qa_iso(wiso) / qa + enddo + else + ! there is no water vapor. + ! It's anoying, but we hope water vapor will be loaded soon. + do wiso = 1, niso + Rb0(wiso) = 0. + enddo + Rb0(iso_wat) = 1. + endif + do wiso = 1, niso + qevap_iso(wiso) = Rb0(wiso) * qevap + qa_iso_new(wiso) = qa_iso(wiso) + qevap_iso(wiso) + enddo + else + ! all is coherent, all fluxes are null + do wiso = 1, niso + qa_iso_new(wiso) = qa_iso(wiso) + qevap_iso(wiso) = 0. + enddo + endif + !#ifdef ISOVERIF + else + ! qr is greater than 0. + ! qr_iso_new and qevap_iso computed without fractionation + do wiso = 1, niso + qr_iso_new(wiso) = qr_iso(wiso) / qr * qr_new + qevap_iso(wiso) = qr_iso(wiso) / qr * qevap + enddo + !#ifdef ISOVERIF + if(iso_nudging) then + qevap_iso(iso_wat) = qevap + qr_iso_new(iso_wat) = qr_new + endif + ! qa_iso_new + do wiso = 1, niso + qa_iso_new(wiso) = qa_iso(wiso) + qevap_iso(wiso) + qa_iso_new(wiso) = max(0., qa_iso_new(wiso)) + enddo + !#ifdef ISOVERIF + endif +endsubroutine stewart_sublim_nofrac + +subroutine iso_surf_ocean(psurf, tsurf, qas, wsas, qas_iso, fevap, fevap_iso) + ! LMDZ : iso_surf_ocean = calcul_iso_surf_oce_vectall + use mariso, only: wiso, niso, Rocean, Rdefault, negligible + ! ptopDY : Pressure at Model Top (kPa) + use mar_dy, only: ptopDY + + !#ifdef ISOVERIF + !#ifdef ISOTRAC + implicit none + + ! input + ! ===== + ! psurf : surface pressure (kPa) + real, intent(in) :: psurf + ! tsurf : surface temperature (K) + real, intent(in) :: tsurf + ! qas : surface air specific humidity (kg/kg) + real, intent(in) :: qas + ! wsas : surface air wind speed (m s-1) + real, intent(in) :: wsas + ! qas_iso : isotopes in near surface water vapor + real, intent(in) :: qas_iso(niso) + ! fevap : evaporation flux (kg s-1) + real, intent(in) :: fevap + ! output + ! ====== + ! fevap_iso : isotopic evaporation flux (kg s-1) + real, intent(out) :: fevap_iso(niso) + ! function + ! ======== + real qsat0D + ! local + ! ===== + ! rh : relative humidity + real :: rh + ! qsat : saturation specific humidity (kg/kg) + real qsat + ! alpha : fractionation factor + real alpha(niso) + ! Riso : isotopic ratio + real Riso(niso) + ! kcin : cinetic fractionation coefficient + real kcin(niso) + + !#ifdef ISOVERIF + !#ifdef ISOTRAC + !#ifdef ISOVERIF + + if(fevap > 0.) then + ! evaporation case + qsat = qsat0D(tsurf, 1., psurf, ptopDY, 1) + rh = qas / qsat + rh = min(1., max(0., rh)) + ! fractionation vapor/liquid + call fractcalk(tsurf, alpha) + ! R of surface air + if(qas > negligible) then + do wiso = 1, niso + Riso(wiso) = qas_iso(wiso) / qas + enddo + else + !#ifdef ISOVERIF + do wiso = 1, niso + Riso(wiso) = Rdefault(wiso) + enddo + endif + call calcul_kcin(wsas, kcin) + if(rh < 0.98) then + do wiso = 1, niso + fevap_iso(wiso) = fevap * (Rocean(wiso) / alpha(wiso) - rh * Riso(wiso)) / (1.-rh) * (1.-kcin(wiso)) + enddo + else + do wiso = 1, niso + fevap_iso(wiso) = fevap * Rocean(wiso) / alpha(wiso) + enddo + endif + !#ifdef ISOTRAC + !#ifdef ISOVERIF + !#ifdef ISOVERIF + !#ifdef ISOTRAC + else if(fevap == 0.) then + ! no evaporation case + do wiso = 1, niso + fevap_iso(wiso) = 0. + enddo + else + ! condensation case + ! call iso_rosee_givre(qas_iso, qas, tsurf, fevap, fevap_iso) + if(qas > negligible) then + call fractcalk(tsurf, alpha) + do wiso = 1, niso + ! methode 1: condensation à l'équilibre, approx 1er ordre + Riso(wiso) = qas_iso(wiso) / qas + fevap_iso(wiso) = fevap * alpha(wiso) * Riso(wiso) + ! methode 2: condensation, approche sans approximation + ! call condiso_liq_ice(wiso, qas_iso(wiso), qas, qevap, tsurf, 0.0, zxtice, zxtliq) + ! fevap_iso(wiso) = -zxtliq / dtime * Mair + enddo + else + do wiso = 1, niso + Riso(wiso) = Rdefault(wiso) + fevap_iso(wiso) = fevap * alpha(wiso) * Riso(wiso) + enddo + endif + endif + + return +endsubroutine iso_surf_ocean + +subroutine calcul_kcin(ws, kcin) + use mariso, only: wiso, niso, ws0cin, kcin_0, kcin_1, kcin_2 + implicit none + ! ========================================== + ! computes kcin as a function of wind speed + ! ========================================== + ! input + ! ===== + ! ws : surface wind speed (m s-1) + real, intent(in) :: ws + ! output + ! ====== + ! kcin : cinetic fractionation coefficient + real, intent(out) :: kcin(niso) + + if(ws < ws0cin) then + do wiso = 1, niso + kcin(wiso) = kcin_0(wiso) + enddo + else + do wiso = 1, niso + kcin(wiso) = kcin_1(wiso) * ws + kcin_2(wiso) + enddo + endif +endsubroutine calcul_kcin + +subroutine iso_rosee_givre(qas_iso, qas, tsurf, fevap, fevap_iso) + use mariso, only: wiso, niso, negligible + !#ifdef ISOVERIF + !#ifdef ISOTRAC + implicit none + ! input + ! ===== + ! fevap : evaporation flux (kg s-1) + real, intent(in) :: fevap + ! qas : surface air specific humidity (kg kg-1) + real, intent(in) :: qas + ! qas_iso : isotopic surface air specific humidity (kg kg-1) + real, intent(in) :: qas_iso(niso) + ! tsurf : surface temperature (K) + real, intent(in) :: tsurf + ! output + ! ====== + ! fevap_iso : isotopic evaporation flux (kg s-1) + real, intent(out) :: fevap_iso(niso) + ! local + ! ===== + ! alpha : fractionation factor + real alpha(niso) + real Riso + ! real zxtliq, zxtice ! (kg kg-1) + + if(fevap == 0.) then + !#ifdef ISOVERIF + do wiso = 1, niso + fevap_iso(wiso) = 0. + enddo + return + endif + + if(qas > negligible) then + call fractcalk(tsurf, alpha) + do wiso = 1, niso + ! methode 1: condensation à l'équilibre, approx 1er ordre + Riso = qas_iso(wiso) / qas + fevap_iso(wiso) = fevap * alpha(wiso) * Riso + ! methode 2: condensation, approche sans approximation + ! call condiso_liq_ice(wiso, qas_iso(wiso), qas, qevap, tsurf, 0.0, zxtice, zxtliq) + ! fevap_iso(wiso) = -zxtliq / dtime * Mair + enddo + else + write(*, *) 'iso_surf>iso_rosee_givre 3189: fevap=', fevap + write(*, *) 'qas=', qas + stop + endif +endsubroutine iso_rosee_givre + +subroutine fractcalk(ta, alpha) + use mariso, only: wiso, niso, niso_all, iso_O17, iso_HTO, iso_HDO, iso_O18, iso_O17, iso_wat, frac_tmin, tmelt, & + alpha_liq_0, alpha_liq_1, alpha_liq_2, fac_coeff_eq17_liq, & + alpha_ice_0, alpha_ice_1, alpha_ice_2, fac_coeff_eq17_ice, diffus_rel, & + musi, lambda_sursat + implicit none + ! ------------------------------------------------------------------------- + ! Calculation of the fractionation coefficient of water isotopes. + ! March 2003 + ! Sandrine Bony (LMD/CNRS), after MPI code from Georg Hoffmann (LSCE) + ! ------------------------------------------------------------------------- + ! input + ! ===== + ! ta : temperature (K) + real, intent(in) :: ta + ! output + ! ====== + ! alpha : fractionation factor for liquid/vapor if (ta > tfreeze) and for ice/vapor if (ta < tfreeze) + ! alpha liquid/vapor > 1. and alpha ice/vapor > 1. + real alpha(niso) + ! local + ! ===== + real tt ! temperature (K) = max(ta, frac_tmin) + real, parameter :: alpha_max = 10. + ! tfreeze : freezing temperature (K) + real, parameter :: tfreeze = 273.15 + ! supersat : supersaturation (> 1.) + real :: supersat + real :: alphatot(niso_all) + + if(ta >= tfreeze) then + ! fractionation over liquid water (Majoube, 1971b) + ! alpha liquid/vapor = Rliquid/Rvapor > 1. + ! ------------------------------------------------ + tt = max(ta, frac_tmin) + do wiso = 1, niso + alpha(wiso) = exp(alpha_liq_0(wiso) + alpha_liq_1(wiso) / tt + alpha_liq_2(wiso) / (tt**2)) + if(wiso == iso_O17) then + alpha(wiso) = (alpha(wiso))**fac_coeff_eq17_liq + endif + alpha(wiso) = max(min(alpha(wiso), alpha_max), 0.) + enddo + else + ! fractionation over ice (Majoube, 1971b) + ! alpha ice/vapor = Rice/Rvapor > 1. + ! --------------------------------------- + tt = max(ta, frac_tmin) + ! todo : verify fractionation over ice formulas + do wiso = 1, niso + alpha(wiso) = exp(alpha_ice_0(wiso) + alpha_ice_1(wiso) / tt + alpha_ice_2(wiso) / (tt**2)) + if(wiso == iso_O17) then + alpha(wiso) = (alpha(wiso))**fac_coeff_eq17_ice + endif + alpha(wiso) = max(min(alpha(wiso), alpha_max), 0.0) + ! effective fractionation over ice if necessary + ! --------------------------------------------- + if(wiso == iso_wat) then + alpha(wiso) = 1. + else + if(tt < tmelt) then + supersat = musi - lambda_sursat * (tt - tmelt) + alpha(wiso) = alpha(wiso) * (supersat / (1.+alpha(wiso) * (supersat - 1.) * diffus_rel(wiso))) + endif + endif + alpha(wiso) = max(min(alpha(wiso), alpha_max), 0.) + enddo + endif +endsubroutine fractcalk + +subroutine Riso_from_qiso(wiso, qa_iso, qa, Riso) + use mariso, only: negligible, Rdefault + implicit none + integer, intent(in) :: wiso + real, intent(in) :: qa_iso, qa + real, intent(out) :: Riso + + if(qa > negligible) then + Riso = qa_iso / qa + else + Riso = Rdefault(wiso) + endif +endsubroutine Riso_from_qiso diff --git a/MAR/code_mar/mariso_test.py b/MAR/code_mar/mariso_test.py new file mode 100644 index 0000000000000000000000000000000000000000..31c0edcde1f10ddc88d7ea04a7f4a1636543b1ae --- /dev/null +++ b/MAR/code_mar/mariso_test.py @@ -0,0 +1,37 @@ +import numpy as np +import matplotlib.pyplot as plt + +coeffl = {'iso_wat': {'0': 0., '1': 0., '2': 0.}, + 'iso_O18': {'0': -2.0667e-3, '1': -0.4156, '2': 1137.}, + 'iso_HDO': {'0': 52.612e-3, '1': -76.248, '2': 24844.}, + 'iso_O17': {'0': -2.0667e-3, '1': -0.4156, '2': 1137.}, + 'iso_HTO': {'0': 0., '1': -103.87, '2': 46480.}} + +coeffi = {'iso_wat': {'0': 0., '1': 0., '2': 0.}, + 'iso_O18': {'0': -0.028244, '1': 11.839, '2': 0.}, + 'iso_HDO': {'0': -0.0934, '1': 0., '2': 16288.}, + 'iso_O17': {'0': -0.028244, '1': 11.839, '2': 0.}, + 'iso_HTO': {'0': 0., '1': -103.87, '2': 46480.}} + +ttm = np.linspace(273.15-40, 273.15, 100) +ttp = np.linspace(273.15, 273.15+100, 100) + +alphai_m, alphal_p = {}, {} +for wiso in list(coeffl): + alphai_m[wiso] = np.exp(coeffi[wiso]['2'] / (ttm**2) + coeffi[wiso]['1'] / ttm + coeffi[wiso]['0']) + alphal_p[wiso] = np.exp(coeffl[wiso]['2'] / (ttp**2) + coeffl[wiso]['1'] / ttp + coeffl[wiso]['0']) + +plt.clf() +wiso = 'iso_O18' +for wiso in ['iso_O18', 'iso_HDO']: + plt.figure() + plt.plot(ttm, alphai_m[wiso]) + plt.plot(ttp, alphal_p[wiso]) + plt.title(wiso) + +plt.close('all') +for wiso in list(coeffl): + plt.figure() + plt.plot(ttm, alphai_m[wiso]) + plt.plot(ttp, alphal_p[wiso]) + plt.title(wiso) diff --git a/MAR/code_mar/mariso_visu.jnl b/MAR/code_mar/mariso_visu.jnl new file mode 100644 index 0000000000000000000000000000000000000000..4e81410c0c8d74a621872bee03cbe6213bedcfea --- /dev/null +++ b/MAR/code_mar/mariso_visu.jnl @@ -0,0 +1,14 @@ +let RNsmow_wat = 1. +let RNsmow_O18 = 2005.2e-6 +let RNsmow_HDO = 155.76e-6 +let RNsmow_O17 = 379.9e-6 +let RNsmow_HTO = 0. + ! Rsmow : SMOW in mass [kg kg-1] +let Rsmow_wat = 1. +let Rsmow_O18 = `RNsmow_O18` * (18. + 2.) / (16. + 2.) +let Rsmow_HDO = `RNsmow_HDO` * (16. + 3.) / (16. + 2.) +let Rsmow_O17 = `RNsmow_O17` * (17. + 2.) / (16. + 2.) +let Rsmow_HTO = 0. + +let dD = ((qvDY_HDO/qvDY_wat)/Rsmow_HDO-1.)*1000. +let dO18 = ((qvDY_O18/qvDY_wat)/Rsmow_O18-1.)*1000. \ No newline at end of file diff --git a/MAR/code_mar/mariso_visu.jnl.f90 b/MAR/code_mar/mariso_visu.jnl.f90 new file mode 100644 index 0000000000000000000000000000000000000000..89b31495b78ac0d11ce1a935ca575cb5e34f4eab --- /dev/null +++ b/MAR/code_mar/mariso_visu.jnl.f90 @@ -0,0 +1,14 @@ +let RNsmow_wat = 1. +let RNsmow_O18 = 2005.2e-6 +let RNsmow_HDO = 155.76e-6 +let RNsmow_O17 = 379.9e-6 +let RNsmow_HTO = 0. +! Rsmow : SMOW in mass [kg kg-1] +let Rsmow_wat = 1. +let Rsmow_O18 = `RNsmow_O18`*(18.+2.) / (16.+2.) +let Rsmow_HDO = `RNsmow_HDO`*(16.+3.) / (16.+2.) +let Rsmow_O17 = `RNsmow_O17`*(17.+2.) / (16.+2.) +let Rsmow_HTO = 0. + +let dD = ((qvDY_HDO / qvDY_wat) / Rsmow_HDO - 1.) * 1000. +let dO18 = ((qvDY_O18 / qvDY_wat) / Rsmow_O18 - 1.) * 1000. diff --git a/MAR/code_mar/marlsv_mod.f90 b/MAR/code_mar/marlsv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..861805a2519becb63200a4082c052a8f36c7733e --- /dev/null +++ b/MAR/code_mar/marlsv_mod.f90 @@ -0,0 +1,7 @@ +! marslv +! ====== +module marlsv + implicit none + logical, save :: iniIRs, iniOUT +endmodule marlsv + diff --git a/MAR/code_mar/marmagic_mod.f90 b/MAR/code_mar/marmagic_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d8d47c50faeacf9f9cb1a5e570c24fac4f1b9ede --- /dev/null +++ b/MAR/code_mar/marmagic_mod.f90 @@ -0,0 +1,50 @@ +! marmagic : The famous ROCHEFORT_10 parameters ;-) +! ================================================== + +! 1. To have more precipitation, humidty and LWD: +! - cnos,cnos2 (#ur,#up, ...) in hydmic.f impact the ratio inland/margin precip +! and the amount of precipitation +! - uncomment the 2 lines BUGBUG in DYNadv_LFB_2p + +! 2. In cvagen_mnh, if OsetA0=T, +! - higher PTdcv0 is, lower precip is +! - lower PTscv0 is, lower precip is +! - lower pdtCV0 is, higher precip is + +! 3. In PHYrad_CEP_mp.f, the cloud amount can be artificially increased +! e.g. qw_CEP(ikl,lkl) = qw_CEP(ikl,lkl) * 1.1 + +! 4. if MAR is too warm, you can increase the temperature filtering FIslot in grdmar.f +module marmagic + implicit none + ! humidity_magic : [ 0 - 25 ] + ! =========================== + ! This parameter (formerly FacFIk) impacts the dissipation of humidity + ! higher this parameter is, higher the humdity is but warmer MAR is + ! About precipitation, it is dependant of the resolution. + ! Belgium : humidity_magic = 15. + ! Greenland: humidity_magic = 20. + real, parameter :: humidity_magic = 20. + ! cloud_magic : [ 0 - 1 ] + ! ======================= + ! This paremeter converts x % part of QS/QR (precip) into QI/QW (clouds). + ! higher this parameter is, higher the cloudiness is, lower precip inland is there. + ! A value of 0.1 means +10% + ! Belgium : cloud_magic = 0.15 + ! Greenland: cloud_magic = 0.0 + real, parameter :: cloud_magic = 0. + ! correction_humidity_boundary : [ -0.3 - +0.3 ] + ! ============================================== + ! At high resolution, you need to increase the humidity at the MAR lateral boundaries. + ! Normally, this correction is done in NESTOR (see subroutine NSTint.f) + ! But here you have the possibility, to change add an additionnal correction. + ! A value of 0.1 means +10% + real, parameter :: correction_humidity_boundary = 0.0 + ! rain_snow_limit : [271.15 - 272.15] deg K + ! ========================================== + ! for temperature = rain_snow_limit + 2 => rainfall + ! for temperature = rain_snow_limit => snowfall + real, parameter :: rain_snow_limit = 271.15 ! polar climate + ! Europe :: rain_snow_limit = 272.15 +endmodule marmagic + diff --git a/MAR/code_mar/marpen_mod.f90 b/MAR/code_mar/marpen_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..45db300f2eb1997b950ef3cef8d3f07c685e96a4 --- /dev/null +++ b/MAR/code_mar/marpen_mod.f90 @@ -0,0 +1,14 @@ +module marpen + use mardim + implicit none + ! pente1, pente2 and pente3 are used in the correction + ! towards horizontal diffusion (hdiff and vdiff) + real, save :: akhm(mx, my, mz) + real, save :: pente1(mx, my, mz) + real, save :: pente2(mx, my, mz) + real, save :: pente3(mx, my, mz) + ! slopex and slopey are the slope of the sigma surfaces + ! in the x and y direction respectively + real, save :: slopex(mx, my, mzz) + real, save :: slopey(mx, my, mzz) +endmodule marpen diff --git a/MAR/code_mar/marphy_mod.f90 b/MAR/code_mar/marphy_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2c2c348f1656384d968bedfa75d103c6498d7c88 --- /dev/null +++ b/MAR/code_mar/marphy_mod.f90 @@ -0,0 +1,170 @@ +#include "MAR_pp.def" +module marphy + implicit none + ! labnum: Alphanumeric Character + character(len=1), parameter :: labnum(0:10) = (/ & + '0', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'/) + ! ================= + ! Numeric Constants + ! ================= + ! izr = 0 + integer, parameter :: izr = 0 + ! iun = 1 + integer, parameter :: iun = 1 + ! zero = 0.0 + real, parameter :: zero = 0. + ! demi = 0.5 + real, parameter :: demi = 0.5 + ! unun = 1.0 + real, parameter :: unun = 1. + ! epsi = 1.0e-6 + real, parameter :: epsi = 0.000001 + ! eps9 = 1.0e-9 + real, parameter :: eps9 = 0.000000001 + ! eps12 = 1.0e-12 + real, parameter :: eps12 = 0.000000000001 + ! third = 1/3 + real, parameter :: third = 1./3. + ! thous = 1.e3 + real, parameter :: thous = 1000. + ! argmin: Function exp(x) Minimum Argument + real, save :: argmin + ! argmax: Function exp(x) Maximum Argument (Min/Max are Machine Dependant) + real, save :: argmax + ! =================== + ! Geometric Constants + ! =================== + ! pi = 3.141592653589793238462643e0 !cCA-to-be-changed + real, parameter :: pi = acos(-1.) + ! degrad = pi / 180. + real, parameter :: degrad = pi / 180. + ! hourad = pi / 12. + real, parameter :: hourad = pi / 12. + ! =============== + ! Earth Constants + ! =============== + ! earthr: Earth Radius = 6371.d+3 m + real, parameter :: earthr = 6378.1370e+3 + ! earthv: Earth Angular Velocity = 7.29d-5 s-1 !cCA-verify-10-5-or-10-7 + real, parameter :: earthv = 729.217e-7 + ! gravit: Earth Gravity Acceleration = 9.81 m/s2 + real, parameter :: gravit = 9.81 + ! gravi2: gravit ** 2 + real, parameter :: gravi2 = gravit**2. + ! grvinv: 1 / gravit + real, parameter :: grvinv = 1 / gravit + ! =================== + ! Dynamical Constants + ! =================== + ! akmol : Air Viscosity = 1.35d-5 m2/s + real, parameter :: akmol = 1.35e-5 + ! vonkar: von Karman constant = 0.4 + real, parameter :: vonkar = 0.4 + ! A_Turb: Stability Coefficient Moment = 5.8 + ! Stability Coefficient in the SBL Universal Stable Function + ! for Momentum (Cheng et al., 2005, 2004JD004923, p.3, eq.9: 5.8) + real, parameter :: A_Turb = 5.8 + ! AhTurb: Stability Coefficient Heat = 5.4 + ! Stability Coefficient in the SBL Universal Stable Function + ! for Heat (Cheng et al., 2005, 2004JD004923, p.3, eq.9: 5.4) + real, parameter :: AhTurb = 5.4 + ! AsTurb: Stability Coefficient BLOW * = 4.0 + ! Stability Coefficient in the SBL Universal Stable Function + ! for BLOW*(Bintanja, 2000, BLM 95, p.390 4.0) + real, parameter :: AsTurb = 4. + ! r_Turb: Turbulent Diffusivities Ratio K*/Km + ! (Bintanja, 2000, BLM 95, p. 384 3.0) + real, parameter :: r_Turb = 3. + ! ====================================== + ! Thermodynamical Constants (Atmosphere) + ! ====================================== + ! RDryAi: perfect gas law constant for dry air (287 J/kg/K) + real, parameter :: RDryAi = 287.05967 + ! Ra : perfect gas law constant for dry air (287 J/kg/K) + real, parameter :: Ra = 287.05967 + ! Cp : dry air specific heat at constant p (1004 J/kg/K) + real, parameter :: Cp = 1004.708845 + ! CvDryA: dry air specific heat at constant V ( 717 J/kg/K) + real, parameter :: CvDryA = Cp - RDryAi + ! racv = Ra / Cv = Ra /(Cp-Ra) + real, parameter :: racv = RDryAi / CvDryA + ! cap = ra / cp + real, parameter :: cap = RDryAi / Cp + ! pcap = 100 ** (R / Cp) = 100.[kPa]**cap + real, parameter :: pcap = 3.7301 + ! RVapor: perfect gas law constant Water Vapor (461 J/kg/K) + real, parameter :: RVapor = 461. + ! epsq : Minimum Water Vapor Content = 3.00d-6 kg/kg + real, parameter :: epsq = 3.e-6 + ! Lv_H2O: Latent Heat Vaporisation / Water = 2500.00d+3 J/kg +#if(EU) + real, parameter :: Lv_H2O = 2.2608e6 +#else + real, parameter :: Lv_H2O = 2.5008e6 +#endif + ! Ls_H2O: Latent Heat Sublimation / Ice = 2833.60d+3 J/kg + real, parameter :: Ls_H2O = 2.8345e6 + ! r_LvCp [Lv=2500000J/kg]/[Cp=1004J/kg/K]= 2490.04 K/[kg/kg] + real, parameter :: r_LvCp = Lv_H2O / Cp + ! r_LcCp [Lc= 333600J/kg]/[Cp=1004J/kg/K]= 332.27 K/[kg/kg] + real, parameter :: r_LcCp = (Ls_H2O - Lv_H2O) / Cp + ! r_LsCp [Ls=2833600J/kg]/[Cp=1004J/kg/K]= 2822.31 K/[kg/kg] + real, parameter :: r_LsCp = Ls_H2O / Cp + ! stefan: Stefan Constant = 5.67d-8 W/m2/K4 + real, parameter :: stefan = 5.67e-8 + ! qv_MIN: Minimum Specific Humidity = 3.00d-6 kg/kg + ! (Christian Tricot, pers.com.) + real, parameter :: qv_MIN = 3.e-6 + ! =============================== + ! Thermodynamical Constants (Sea) + ! =============================== + ! ------------------------------------------------------------------ + ! cpl : constants usefull for coupled configuration (see MAR_AO.inc) + ! !AO_CK 20/02/2020 + ! ------------------------------------------------------------------ + ! cpv: water vapor specific heat (J/kg/K) + real, parameter :: cpv = 1846.1 + ! cpvir: [cpv/cp - 1] (usefull value for qsat) (-) + real, parameter :: cpvir = 0.83746 + ! R_Rv: [gas cste dry air=287.0] / [gas cste moist air=461.5] + real, parameter :: R_Rv = 0.622 + ! EmiSnoao : Snow Emissivity + real, parameter :: EmiSnoao = 0.95 + ! EmiWatao : Water Emissivity + real, parameter :: EmiWatao = 1. + ! other + ! ----- + ! tfrwat: Sea-Water freezing Temperature = 271.20d+0 K + real, parameter :: tfrwat = 271.2 + ! siclf : Sea-Ice Heat of Fusion = 302.00d+6 J/m3 + real, parameter :: siclf = 302.e6 + ! cdsice: Sea-Ice Thermal Conductivity = 2.04d+0 W/mK + real, parameter :: cdsice = 2.04 + ! hic0 : Sea-Ice Initial Thickness = 2.00d+0 m + real, save :: hic0 = 1. + ! ro_Wat: Density of Water = 1000.00d+0 kg/m3 + real, parameter :: ro_Wat = 1000. + ! C__Wat: Heat Capacity of Water = 4186.00d+0 J/kg/K + real, parameter :: C__Wat = 4186. + ! fracoh : 1. - 0.25 + ! Hibler (1984): 25% of cooling => Oceanic Heat Flux (ANTARCTIC Ocean) + real, parameter :: fracoh = 0.75 + ! ro_Ice: Density of Pure Ice = 920.00 kg/m3 + real, parameter :: ro_Ice = 920. + ! cdice : Conductivity of Pure Ice = 2.51 W/m/K + real, parameter :: cdice = 2.1 + ! TfSnow: Snow melting Temperature = 273.15 K + real, parameter :: TfSnow = 273.15 + ! csnow: Heat Capacity of Snow = 2105. J/kg/K (Loth et al. 1993, JGR 98 D6, 2.2.2 2e para p.10453) + real, parameter :: csnow = 2105. + ! r0sno : Fresh Snow Density (kg/m3) + real, parameter :: r0sno = 30. + ! frsno : Fresh blowed Snow Density (kg/m3) + ! frsno : Fresh Snow Density (kg/m3) / calibration + real, parameter :: frsno = 300. + ! Lf_H2O: Latent Heat of Fusion of Snow (J/kg) + real, parameter :: Lf_H2O = 3.337e5 + ! =============================================== + ! Standard Atmosphere (Winter / Middle Latitudes) + ! =============================================== +endmodule marphy diff --git a/MAR/code_mar/marqqm_mod.f90 b/MAR/code_mar/marqqm_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4ecfccb58a3e5166943690dc204d089049536473 --- /dev/null +++ b/MAR/code_mar/marqqm_mod.f90 @@ -0,0 +1,24 @@ +! marqqm : water vapor total mass +! =============================== +module marqqm + use mardim + implicit none + integer, parameter :: lb = 1 + integer, parameter :: lgx = min(lb + 1, mx) + integer, parameter :: ldx = max(1, mx - lb - 2) + integer, parameter :: lgy = min(lb + 1, my) + integer, parameter :: ldy = max(1, my - lb - 2) + integer, parameter :: lgx1 = max(1, lgx - 1) + integer, parameter :: lgx2 = max(1, lgx - 2) + integer, parameter :: ldx1 = min(ldx + 1, mx) + integer, parameter :: ldx2 = min(ldx + 2, mx) + integer, parameter :: lgy1 = max(1, lgy - 1) + integer, parameter :: lgy2 = max(1, lgy - 2) + integer, parameter :: ldy1 = min(ldy + 1, my) + integer, parameter :: ldy2 = min(ldy + 2, my) + integer, parameter :: lgxx = min(lgx + 1, mx) + integer, parameter :: ldxx = max(1, ldx - 1) + integer, parameter :: lgyy = min(lgy + 1, my) + integer, parameter :: ldyy = max(1, ldy - 1) + real, parameter :: f2_3 = 2./3. +endmodule marqqm diff --git a/MAR/code_mar/marsib_mod.f90 b/MAR/code_mar/marsib_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9621cc41b6293fdb55a686d0b360788eb097a65a --- /dev/null +++ b/MAR/code_mar/marsib_mod.f90 @@ -0,0 +1,20 @@ +! marsib : include sea-ice (19-02-2004) +! ===================================== +! Commons MARsIB are used to follow MAR Sea-Ice Fraction +module marsib + use mardim, only: mx, my + implicit none + ! sicsIB : Sea-Ice Fraction / Time Interpolated + real, save :: sicsIB(mx, my) + ! sic1sI : Sea-Ice Fraction / Time Step n + real, save :: sic1sI(mx, my) + ! sic2sI : Sea-Ice Fraction / Time Step n+1 + real, save :: sic2sI(mx, my) + integer, save :: iyr_sI + integer, save :: mma_sI + integer, save :: jda_sI + integer, save :: jhu_sI + integer, save :: jdh_sI + integer(kind=8), save :: tim1sI + integer(kind=8), save :: tim2sI +endmodule marsib diff --git a/MAR/code_mar/marsnd_mod.f90 b/MAR/code_mar/marsnd_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4165b8134ee2629148248c86b47f5c8180e70cb1 --- /dev/null +++ b/MAR/code_mar/marsnd_mod.f90 @@ -0,0 +1,35 @@ +module marsnd + implicit none + real, save :: tiSND1, tiSND2 + ! =============================================== + ! Standard Atmosphere (Winter / Middle Latitudes) + ! =============================================== + ! iSND, jSND are the (x,y) coordinates of the sounding grid point + integer, save :: iSND + integer, save :: jSND + ! pstSND: initial model depth (kPa) + real, save :: pstSND + ! iyrSND, mmaSND, jdaSND, jhuSND + ! Year Month Day HourUT of the Sounding + integer, save :: iyrSND, mmaSND, jdaSND, jhuSND + ! nSND: Sounding No + integer, save :: nSND + ! loSND: 1 -> This is NOT the last Sounding + integer, save :: loSND + ! xSND : sounding characteristics + ! x = (tp->potential temperature + ! t->temperature, q->specific humidity, + ! z->Altitude, p->pressure, ff, dd-> large scale wind components) + ! ze->relative vorticity + ! uu,vv->Large Scale Wind Vector in MAR horiz. coord. (iSND,jSND) + real, save :: zSND(0:40, 2) + real, save :: tSND(0:40, 2) + real, save :: qSND(0:40, 2) + real, save :: pSND(0:40, 2) + real, save :: tpSND(0:40, 2) + real, save :: fSND(0:40, 2) + real, save :: dSND(0:40, 2) + real, save :: zeSND(2) + real, save :: uuSND(0:40) + real, save :: vvSND(0:40) +endmodule marsnd diff --git a/MAR/code_mar/marssn_mod.f90 b/MAR/code_mar/marssn_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0d2e237fa6ed9704b2c0178589581d981a501334 --- /dev/null +++ b/MAR/code_mar/marssn_mod.f90 @@ -0,0 +1,118 @@ +! marssn : snowpack +! ================== +module marssn + use mardim + use mar_sv + implicit none + integer, parameter :: nsx = mw + ! *CL* interpolation of boundary layer variables + real, save, allocatable :: sh_int(:, :, :) + real, save, allocatable :: tairDY_int(:, :, :) + real, save, allocatable :: gradTM(:, :) + real, save, allocatable :: qvDY_int(:, :, :) + real, save, allocatable :: gradQM(:, :) + ! mskSNo: Snow/Ice Type Index + real, save :: mskSNo(mx, my, nsx) + ! nssSNo: Number of Snow Layers + integer, save :: nssSNo(mx, my, nsx) + ! nisSNo: Number of Ice Layers + integer, save :: nisSNo(mx, my, nsx) + ! issSNo: Number of superimposed Ice Layers + integer, save :: issSNo(mx, my, nsx) + ! nhsSNo: Layer historics: previous occurrence of water or faceted crystal + integer, save, allocatable :: nhsSNo(:, :, :, :) + ! tisSNo: Soil temperature (=> in the snow cover ) [K] + real, save, allocatable :: tisSNo(:, :, :, :) + ! wasSNo: Soil humidity content (=> in the snow cover ) [kg/kg] + real, save, allocatable :: wasSNo(:, :, :, :) + ! rosSNo: Snow density [kg/m3] + real, save, allocatable :: rosSNo(:, :, :, :) + ! dzsSNo: Depth of each layer of the snow cover [m] + real, save, allocatable :: dzsSNo(:, :, :, :) + ! g1sSNo: Grain Type: -99< g1 < 0 (Dendricity) 0< g1 <99 [Sphericity] + real, save, allocatable :: g1sSNo(:, :, :, :) + ! g2sSNo: Grain Type: 0< g2 <99 (Sphericity) .3mm < g2 [Size] + real, save, allocatable :: g2sSNo(:, :, :, :) + ! agsSNo: Snow Age [day] + real, save, allocatable :: agsSNo(:, :, :, :) + ! SWaSNo: Surficial Water Mass [mmWE or kg/m2] + real, save, allocatable :: SWaSNo(:, :, :) + ! SWSSNo: Surficial Water Status (0,1 = no freezing,freezing) + real, save, allocatable :: SWSSNo(:, :, :) + ! SWfSNo: Surficial Water Hydrological Model [-] + real, save, allocatable :: SWfSNo(:, :) + ! snohSN: Snow Buffer Layer Thickness [mmWE] + real, save, allocatable :: snohSN(:, :, :) + ! BrosSN: Snow Buffer Layer Density [kg/m3] + real, save, allocatable :: BrosSN(:, :, :) + ! BG1sSN: Snow Buffer Layer Dendricity / Sphericity [-] + real, save, allocatable :: BG1sSN(:, :, :) + ! BG2sSN: Snow Buffer Layer Sphericity / Size [-] [0.1 mm] + real, save, allocatable :: BG2sSN(:, :, :) + ! blowSN: Blown snow Buffer Layer Thickness [mWE] + real, save, allocatable :: blowSN(:, :, :) + ! SaltSN: Friction Velocity Saltation Threshold [m/s] + real, save, allocatable :: SaltSN(:, :, :) + ! hSalSN: Saltating Snow Thickness [mWE] + real, save, allocatable :: hSalSN(:, :, :) + ! zWE0SN: Initial Snow Thickness [mmWE] + real, save, allocatable :: zWE0SN(:, :, :) + ! zWE_SN: Current Snow Thickness [mmWE] + real, save, allocatable :: zWE_SN(:, :, :) + ! zWEcSN: Non-erodible Snow Thickness [mmWE] + real, save, allocatable :: zWEcSN(:, :, :) + ! smbsSN : Surface Mass Balance [mWE] + real, save, allocatable :: smbsSN(:, :, :) + ! sihsSN : Superimposed Ice Height [m] + real, save, allocatable :: sihsSN(:, :, :) + ! sshsSN : Slush Height [m] + real, save, allocatable :: sshsSN(:, :, :) + ! ravsSN : Averaged Density [kg/m2] + real, save, allocatable :: ravsSN(:, :, :) + ! wavsSN : Averaged Water Content [kg/kg] + real, save, allocatable :: wavsSN(:, :, :) + ! WEq_SN : Added Snow Mass [mmWE] + real, save, allocatable :: WEq_SN(:, :, :) + +contains + + subroutine marssn_init() + + use mardim, only: mx, my + implicit none + + allocate(nhsSNo(mx, my, nsx, nsno)) + allocate(sh_int(mx, my, nsx)) + allocate(tairDY_int(mx, my, nsx)) + allocate(gradTM(mx, my)) + allocate(qvDY_int(mx, my, nsx)) + allocate(gradQM(mx, my)) + allocate(tisSNo(mx, my, nsx, nsno)) + allocate(wasSNo(mx, my, nsx, nsno)) + allocate(rosSNo(mx, my, nsx, nsno)) + allocate(dzsSNo(mx, my, nsx, nsno)) + allocate(g1sSNo(mx, my, nsx, nsno)) + allocate(g2sSNo(mx, my, nsx, nsno)) + allocate(agsSNo(mx, my, nsx, nsno)) + allocate(SWaSNo(mx, my, nsx)) + allocate(SWSSNo(mx, my, nsx)) + allocate(SWfSNo(mx, my)) + allocate(snohSN(mx, my, nsx)) + allocate(BrosSN(mx, my, nsx)) + allocate(BG1sSN(mx, my, nsx)) + allocate(BG2sSN(mx, my, nsx)) + allocate(blowSN(mx, my, nsx)) + allocate(SaltSN(mx, my, nsx)) + allocate(hSalSN(mx, my, nsx)) + allocate(zWE0SN(mx, my, nsx)) + allocate(zWE_SN(mx, my, nsx)) + allocate(zWEcSN(mx, my, nsx)) + allocate(smbsSN(mx, my, nsx)) + allocate(sihsSN(mx, my, nsx)) + allocate(sshsSN(mx, my, nsx)) + allocate(ravsSN(mx, my, nsx)) + allocate(wavsSN(mx, my, nsx)) + allocate(WEq_SN(mx, my, nsx)) + + endsubroutine marssn_init +endmodule marssn diff --git a/MAR/code_mar/marvec_mod.f90 b/MAR/code_mar/marvec_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..37e5592bdb51f119933a7ba87e6c2e576df6bfa5 --- /dev/null +++ b/MAR/code_mar/marvec_mod.f90 @@ -0,0 +1,34 @@ +! marvec : mar vectorization +! ========================== +module marvec + use mardim + implicit none + real, save :: vecxa(mx) + real, save :: vecx1(mx) + real, save :: vecx2(mx) + real, save :: vecx3(mx) + real, save :: vecx4(mx) + real, save :: vecx5(mx) + real, save :: vecx6(mx) + real, save :: delta + real, save :: vecy1(my) + real, save :: vecy2(my) + real, save :: vecy3(my) + real, save :: dumeps(mz) + real, save, allocatable :: dumy3D(:, :, :) + real, allocatable :: dumy3Q(:, :, :) + + +contains + + subroutine marvec_init() + + use mardim, only: mx, my, mz,mzz, mw + implicit none + + allocate(dumy3D(mx, my, mz)) + allocate(dumy3Q(mx, my, mz)) + + endsubroutine marvec_init + +endmodule marvec diff --git a/MAR/code_mar/marxsv_mod.f90 b/MAR/code_mar/marxsv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..49f63a562ffadb7a6488fc4a514d4313d89d5340 --- /dev/null +++ b/MAR/code_mar/marxsv_mod.f90 @@ -0,0 +1,256 @@ +! marxsv : SISVAT INPUT Variables +! =============================== +module marxsv + use mardim + use mar_sv + implicit none + ! LSmask : Land-Sea Mask + integer :: LSmask(klonv) + ! isotSV : Soil Type + integer :: isotSV(klonv) + ! iWaFSV : Soil Drainage:(1,0)=(y,n) + integer :: iWaFSV(klonv) + ! ivgtSV : Vegetation Type + integer :: ivgtSV(klonv) + ! AOmask : Weight-coupling Mask (1: MAR; 0 = Oasis) !AO_CK 20/02/2020 + real :: AOmask(klonv) + ! coszSV : Cosine of Sun zenithal Angle + real :: coszSV(klonv) + ! sol_SV : Downward Solar Radiation + real :: sol_SV(klonv) + ! IRd_SV : Downward Longwave Radiation + real :: IRd_SV(klonv) + ! drr_SV : Rain Intensity [kg/m2/s] + real :: drr_SV(klonv) + ! dsn_SV : Snow Intensity [kg/m2/s] + real :: dsn_SV(klonv) + ! dsnbSV : Idem, fraction, from Drift [-] + real :: dsnbSV(klonv) + ! esnbSV : Idem, fraction, from Drift [-] + real :: esnbSV(klonv) + ! dbs_SV : Drift Amount [kg/m2] + real :: dbs_SV(klonv) + ! BrosSV : Buffer Snow Layer Density + real :: BrosSV(klonv) + ! BG1sSV : Buffer Snow Layer Dendr/Sphe[-] + real :: BG1sSV(klonv) + ! BG2sSV : Buffer Snow Layer Spher/Size[-] [0.0001 m] + real :: BG2sSV(klonv) + ! dz0_SV : dz0(Sastrugi dh) [m] + real :: dz0_SV(klonv) + ! dbs_Er : BS Erosion [kg/m2] + real :: dbs_Er(klonv) + ! dbs_Ac : BS Accumulation [kg/m2] + real :: dbs_Ac(klonv) + ! cld_SV : Cloudiness (seen from SBL) + real :: cld_SV(klonv) + ! za__SV : SBL Height + real :: za__SV(klonv) + !(VV__SV : SBL Top) Wind Velocity + real :: VV__SV(klonv) + ! VV10SV : 10-m Wind Velocity + real :: VV10SV(klonv) + !(VVs_SV : Sastr,V) Relevance + real :: VVs_SV(klonv) + !(RRs_SV : Sastr,V) Counter + real :: RRs_SV(klonv) + !(DDs_SV : Sastr,V) Angle + real :: DDs_SV(klonv) + ! TaT_SV : SBL Top Temperature + real :: TaT_SV(klonv) + ! ExnrSV : Exner Potential + real :: ExnrSV(klonv) + ! dSdTSV : Sensible Heat Flux T Derivat. + real :: dSdTSV(klonv) + ! dLdTSV : Latent Heat Flux T Derivat. + real :: dLdTSV(klonv) + ! rhT_SV : SBL Top Air Density + real :: rhT_SV(klonv) + ! QaT_SV : SBL Top Specific Humidity + real :: QaT_SV(klonv) + ! dQa_SV : SBL Flux Limitation of Qa + real :: dQa_SV(klonv) + ! qsnoSV : SBL Mean Snow Content + real :: qsnoSV(klonv) + ! tsrf_SV : surface temperature(K) + real :: tsrf_SV(klonv) + ! pst_SV : surface pressure (kPa) + real :: pst_SV(klonv) + ! LAI0SV : Nominal Leaf Area Index + real :: LAI0SV(klonv) + ! glf0SV : Green Leaf Fraction + real :: glf0SV(klonv) + ! alb0SV : Soil Albedo + real :: alb0SV(klonv) + ! slopSV : Snow/Ice/Soil-Water Surf. Slope + real :: slopSV(klonv) + ! ptopSV : Pressure at Model Top (kPa) + real :: ptopSV + ! zSBLSV : SBL Height (Initial Value) + real :: zSBLSV + ! dt__SV : Time Step + real :: dt__SV + ! daHost : Date Host Model + character(len=18), save :: daHost + ! +--SISVAT INPUT/OUTPUT Variables + ! + ----------------------------- + ! isnoSV : Nb of Ice/Snow Layers + integer :: isnoSV(klonv) + ! ispiSV : Uppermost superimposed ice + integer :: ispiSV(klonv) + ! iiceSV : Nb of Ice Layers + integer :: iiceSV(klonv) + ! istoSV : Snow Layer History + integer :: istoSV(klonv, 0:nsno) + ! alb_SV : Surface-Canopy Albedo + real :: alb_SV(klonv) + ! alb1SV : Snow Albedo + real :: alb1SV(klonv) + ! alb2SV : Snow Albedo + real :: alb2SV(klonv) + ! alb3SV : Snow Albedo + real :: alb3SV(klonv) + ! emi_SV : Surface-Canopy Emissivity + real :: emi_SV(klonv) + ! IRs_SV : Soil IR Flux + real :: IRs_SV(klonv) + ! LMO_SV : Monin-Obukhov Scale + real :: LMO_SV(klonv) + ! us__SV : Friction Velocity + real :: us__SV(klonv) + ! uts_SV : Temperature Turbulent Scale + real :: uts_SV(klonv) + ! cutsSV : Temperature Turbulent Scale C. + real :: cutsSV(klonv) + ! uqs_SV : Spec.Humid. Turbulent Scale + real :: uqs_SV(klonv) + ! uss_SV : Blow.Snow Turbulent Scale + real :: uss_SV(klonv) + ! usthSV : Blowing Snow Erosion Thresh. + real :: usthSV(klonv) + ! rCDmSV : Square Root Contribut. Drag_m + real :: rCDmSV(klonv) + ! rCDhSV : Square Root Contribut. Drag_h + real :: rCDhSV(klonv) + ! Z0m_SV : Momentum Roughness Length + real :: Z0m_SV(klonv) + ! Z0mmSV : z0(Momentum, Time Mean) [m] + real :: Z0mmSV(klonv) + ! Z0mnSV : z0(Momentum, instanta.) [m] + real :: Z0mnSV(klonv) + ! Z0roSV : Subgrid Topo Roughness Length + real :: Z0roSV(klonv) + ! Z0SaSV : z0(Sastrugi h) [m] + real :: Z0SaSV(klonv) + ! Z0e_SV : z0(Snow eroded) [m] + real :: Z0e_SV(klonv) + ! Z0emSV : z0(Snow eroded, Time Mean) [m] + real :: Z0emSV(klonv) + ! Z0enSV : z0(Snow eroded, instanta.) [m] + real :: Z0enSV(klonv) + ! Z0h_SV : Heat Roughness Length + real :: Z0h_SV(klonv) + ! Z0hmSV : z0(Heat, Time Mean) [m] + real :: Z0hmSV(klonv) + ! Z0hnSV : z0(Heat, instanta.) [m] + real :: Z0hnSV(klonv) + ! snCaSV : Canopy Snow Thickness + real :: snCaSV(klonv) + ! rrCaSV : Canopy Water Content + real :: rrCaSV(klonv) + ! psivSV : Leaf Water Potential + real :: psivSV(klonv) + ! TvegSV : Vegetation Temperature + real :: TvegSV(klonv) + ! TsisSV : Snow/Ice/Soil-Water Temperature + real :: TsisSV(klonv, -nsol:nsno) + ! ro__SV : Snow/Ice/Soil-Water VolumicMass + real :: ro__SV(klonv, -nsol:nsno) + ! eta_SV : Snow/Ice/Soil Water Content + real :: eta_SV(klonv, -nsol:nsno) + ! G1snSV : Snow Dendricity/Sphericity + real :: G1snSV(klonv, 0:nsno) + ! G2snSV : Snow Sphericity/Size + real :: G2snSV(klonv, 0:nsno) + ! dzsnSV : Snow Layer Thickness + real :: dzsnSV(klonv, 0:nsno) + ! agsnSV : Snow Age + real :: agsnSV(klonv, 0:nsno) + ! BufsSV : Snow Buffer Layer + real :: BufsSV(klonv) + ! rusnSV : Surficial Water + real :: rusnSV(klonv) + ! SWf_SV : Normalized Decay + real :: SWf_SV(klonv) + ! SWS_SV : Surficial Water Status + real :: SWS_SV(klonv) + ! HFraSV : Frazil Thickness + real :: HFraSV(klonv) + ! zWE_SV : Current Snow Thickness [mmWE] + real :: zWE_SV(klonv) + ! zWEcSV : Compacted Snow Thickness [mmWE] + real :: zWEcSV(klonv) + ! wem_SV : Only Melting [mmWE] + real :: wem_SV(klonv) + ! wer_SV : Refreezing [mmWE] + real :: wer_SV(klonv) + ! wee_SV : Evapo/Sublimation [mmWE] + real :: wee_SV(klonv, 4) + ! zn4_SV : snowheight change [mm] + real :: zn4_SV(klonv) + ! zn5_SV : snowheight change [mm] + real :: zn5_SV(klonv) + ! +--SISVAT OUTPUT Variables + ! + ----------------------------- + ! no__SV : OUTPUT file Unit Number + integer :: no__SV(nb_wri) + ! i___SV : OUTPUT point i Coordinate + integer :: i___SV(nb_wri) + ! j___SV : OUTPUT point j Coordinate + integer :: j___SV(nb_wri) + ! n___SV : OUTPUT point n Coordinate + integer :: n___SV(nb_wri) + ! lwriSV : OUTPUT point vec Index + integer :: lwriSV(klonv) + ! ii__SV : WORK point i Coordinate + integer :: ii__SV(klonv), iwr_SV + ! jj__SV : WORK point j Coordinate + integer :: jj__SV(klonv), jwr_SV + ! nn__SV : WORK point n Coordinate + integer :: nn__SV(klonv), nwr_SV + ! IRu_SV : UPward IR Flux (effective) + real :: IRu_SV(klonv) + ! hSalSV : Saltating Layer Height + real :: hSalSV(klonv) + ! qSalSV : Saltating Snow Concentration + real :: qSalSV(klonv) + ! RnofSV : RunOFF Intensity + real :: RnofSV(klonv) + ! RuofSV : RunOFF Intensity + real :: RuofSV(klonv, 6) + common / xSISVAT_I / LSmask, ivgtSV, isotSV, iWaFSV & + , isnoSV, ispiSV, iiceSV, istoSV & + , no__SV, i___SV, j___SV, n___SV, lwriSV & + , ii__SV, jj__SV, nn__SV & + , iwr_SV, jwr_SV, nwr_SV + common / xSISVAT_R / AOmask, coszSV, sol_SV, IRd_SV & + , drr_SV, dsn_SV, dsnbSV, esnbSV, dbs_SV & + , BrosSV, BG1sSV, BG2sSV, dz0_SV & + , cld_SV, za__SV, VV__SV, VV10SV, TaT_SV, ExnrSV & + , VVs_SV, RRs_SV, DDs_SV & + , dSdTSV, dLdTSV, rhT_SV, QaT_SV, qsnoSV, tsrf_SV, pst_SV & + , LAI0SV, glf0SV, alb0SV, slopSV, zSBLSV, dt__SV & + , alb_SV, emi_SV, IRs_SV & + , LMO_SV, us__SV, uts_SV, cutsSV, uqs_SV, uss_SV, usthSV & + , rCDmSV, rCDhSV, ptopSV & + , Z0m_SV, Z0mnSV, Z0mmSV, Z0roSV, Z0SaSV & + , Z0e_SV, Z0enSV, Z0emSV, zn4_SV, zn5_SV & + , Z0h_SV, Z0hnSV, Z0hmSV, snCaSV, rrCaSV & + , psivSV, TvegSV, TsisSV, ro__SV, eta_SV & + , G1snSV, G2snSV, dzsnSV, agsnSV, BufsSV, rusnSV, SWf_SV & + , SWS_SV, HFraSV, IRu_SV, hSalSV, qSalSV, RnofSV, RuofSV & + , zWE_SV, zWEcSV, wem_SV, wer_SV, wee_SV & + , alb1SV, alb2SV, alb3SV, dbs_Er, dbs_Ac + save + !$OMP threadprivate(/xSISVAT_I/,/xSISVAT_R/) +endmodule marxsv diff --git a/MAR/code_mar/marysv_mod.f90 b/MAR/code_mar/marysv_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..564938d9c2d8bc0c6f11e5867a86c93ff7607575 --- /dev/null +++ b/MAR/code_mar/marysv_mod.f90 @@ -0,0 +1,91 @@ +module marysv + use mardim + use mar_sv + implicit none + ! NLaysv : New Snow Layer Switch + integer :: NLaysv(klonv) + ! i_thin : Index of the thinest Layer + integer :: i_thin(klonv) + ! LIndsv : Contiguous Layer relative Index + integer :: LIndsv(klonv) + ! albisv : Integrated Surface Albedo + real :: albisv(klonv) + ! albssv : Soil Albedo [-] + real :: albssv(klonv) + ! SeaalbAOsisv : Ice/Snow Albedo from NEMO !AO_CK 20/02/2020 + real :: albAOsisv(klonv) + ! SoCasv : Canopy Absorbed Solar Radiat. + real :: SoCasv(klonv) + ! SoSosv : Surface Absorbed Solar Radiat. + real :: SoSosv(klonv) + ! IRv_sv : Vegetation IR Flux [W/m2] + real :: IRv_sv(klonv) + ! Evg_sv : Emissivity of Vegetation+Snow + real :: Evg_sv(klonv) + ! Eso_sv : Emissivity of Soil+Snow + real :: Eso_sv(klonv) + ! tau_sv : Transmited Radiation Fraction + real :: tau_sv(klonv) + ! rrMxsv : Canopy Maximum Intercepted Rain + real :: rrMxsv(klonv) + ! LAIesv : effective LAI for transpirati. + real :: LAIesv(klonv) + ! LAI_sv : corrected LAI in case of snow + real :: LAI_sv(klonv) + ! glf_sv : Green Leaf Fraction + real :: glf_sv(klonv) + ! Sigmsv : Canopy Ventilation Factor + real :: Sigmsv(klonv) + ! HSv_sv : Sensible Heat Flux [W/m2] + real :: HSv_sv(klonv) + ! HLv_sv : Latent Heat Flux [W/m2] + real :: HLv_sv(klonv) + ! HSs_sv : Sensible Heat Flux (t) + real :: HSs_sv(klonv) + ! HLs_sv : Latent Heat Flux (t) + real :: HLs_sv(klonv) + ! sqrCm0 : in Neutral Drag Coef.Moment. + real :: sqrCm0(klonv) + ! sqrCh0 : in Neutral Drag Coef.Heat + real :: sqrCh0(klonv) + ! Lx_H2O : Latent Heat of Vaporiz./Sublim. + real :: Lx_H2O(klonv) + ! ram_sv : Aerodyn.Resistance (Moment.) + real :: ram_sv(klonv) + ! rah_sv : Aerodyn.Resistance (Heat) + real :: rah_sv(klonv) + ! Fh__sv : Stability Function + real :: Fh__sv(klonv) + ! dFh_sv : Stability Function (Deriv.) + real :: dFh_sv(klonv) + ! Evp_sv : Evaporation [kg/m2] + real :: Evp_sv(klonv) + ! EvT_sv : Evapotranspiration [kg/m2] + real :: EvT_sv(klonv) + ! LSdzsv : Land/Sea Vert. Discretiz. Fact. + real :: LSdzsv(klonv) + ! Tsrfsv : Surface Temperature + real :: Tsrfsv(klonv) + ! sEX_sv : Verticaly Integr.Extinct.Coef. + real :: sEX_sv(klonv, -nsol:nsno + 1) + ! zzsnsv : Snow Pack Thickness [m] + real :: zzsnsv(klonv, 0:nsno) + ! psi_sv : Soil Water Potential + real :: psi_sv(klonv, -nsol:0) + ! Khydsv : Soil Hydraulic Conductiv. + real :: Khydsv(klonv, -nsol:0) + ! Rootsv : Root Water Pump [kg/m2/s] + real :: Rootsv(klonv, -nsol:0) + ! EExcsv : Energy in Excess, current + real :: EExcsv(klonv) + common / ySISVAT_I / NLaysv, i_thin, LIndsv + common / ySISVAT_R / albisv, albssv, albaosisv, SoCasv, & + SoSosv, IRv_sv, Evg_sv, Eso_sv, tau_sv, & + rrMxsv, LAIesv, LAI_sv, glf_sv, & + Sigmsv, HSv_sv, HLv_sv, HSs_sv, HLs_sv, & + sqrCm0, sqrCh0, Lx_H2O, ram_sv, rah_sv, Evp_sv, EvT_sv, & + LSdzsv, Tsrfsv, sEX_sv, zzsnsv, & + psi_sv, Khydsv, Rootsv, EExcsv + save + !$OMP threadprivate(/ySISVAT_I/,/ySISVAT_R/) +endmodule marysv diff --git a/MAR/code_mar/matinv.f90 b/MAR/code_mar/matinv.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a286cd7864169002874de1ae8c0c4f081bd09c6a --- /dev/null +++ b/MAR/code_mar/matinv.f90 @@ -0,0 +1,115 @@ +subroutine matinv(wk1, wk2, l_min, l_max) + ! + + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS LBC 27-09-2001 MAR | + ! | subroutine matinv performs a Matrix Inversion using a Companion | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : wk1 : Matrix to be inverted | + ! | ^^^^^^^^ Dimension : (lmin:lmax) -> jdim=lmax-lmin+1 | + ! | This Matrix is Loss after the Matrix Inversion | + ! | | + ! | OUTPUT : wk2 : Inverted Matrix | + ! | ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + implicit none + + ! +--Input Output Variables + ! + ====================== + integer, intent(in) :: l_min + integer, intent(in) :: l_max + real, intent(inout) :: wk1(l_min:l_max, l_min:l_max) + real, intent(out) :: wk2(l_min:l_max, l_min:l_max) + + ! +--Local Variables + ! + ================ + ! + + integer l, k, ll, llp1, llx1, llm1 + real xx, yy + + ! +--wk2 = Compagnion Matrix = Unity Matrix + ! + -------------------------------------- + ! + + do l = l_min, l_max + do k = l_min, l_max + wk2(l, k) = 0.d0 + enddo + wk2(l, l) = 1.d0 + enddo + ! + + ! +...Combinaisons lineaires de lignes de la matrice wk1 de facon a y faire + ! + apparaitre des 0 dans le triangle inferieur et des 1 sur la diagonale. + ! + Memes operations effectuees systematiquement sur la matrice compagnon. + ! + + ll = l_min +50 llp1 = ll + 1 + xx = wk1(ll, ll) + ! + + ! +...Si l'element diagonal est nul,la ligne le contenant est interchangee + ! + avec une des suivantes...jusqu'a ce qu'on obtienne un element non nul. + ! + Dans le cas contraire la matrice est singuliere. + ! + + if(xx == 0.0d0) then + llx1 = ll + 1 +90 if(wk1(llx1, llx1) == 0.0d0) then + llx1 = llx1 + 1 + if(llx1 > l_max) write(21, *) 'Matrice non inversible' + go to 90 + endif + do k = l_min, l_max + yy = wk1(ll, k) + wk1(ll, k) = wk1(llx1, k) + wk1(llp1, k) = yy + yy = wk2(ll, k) + wk2(ll, k) = wk2(llx1, k) + wk2(llp1, k) = yy + enddo + xx = wk1(ll, ll) + endif + ! + + ! +...Division pour obtenir 1 sur la diagonale + ! + + do k = l_min, l_max + wk1(ll, k) = wk1(ll, k) / xx + wk2(ll, k) = wk2(ll, k) / xx + enddo + ! + + ! +...Soustraction pour obtenir 0 dans le triangle inferieur + ! + + do l = llp1, l_max + xx = wk1(l, ll) + do k = l_min, l_max + wk1(l, k) = wk1(l, k) - xx * wk1(ll, k) + wk2(l, k) = wk2(l, k) - xx * wk2(ll, k) + enddo + enddo + ! + + ! +...Passage a la ligne suivante + ! + + if(ll < l_max) then + ll = ll + 1 + go to 50 + endif + ! + + ! +...Combinaisons lineaires effectuees sur la matrice wk1 + ! + pour y faire apparaitre des 0 dans le triangle superieur. + ! + Memes operations effectuees sur la matrice compagnon + ! + + ll = l_max +60 llm1 = ll - 1 + do l = llm1, l_min, -1 + xx = wk1(l, ll) + do k = l_min, l_max + wk1(l, k) = wk1(l, k) - xx * wk1(ll, k) + wk2(l, k) = wk2(l, k) - xx * wk2(ll, k) + enddo + enddo + if(ll > l_min) then + ll = ll - 1 + go to 60 + endif + ! + + return +end diff --git a/MAR/code_mar/oasis_2_mar.f90 b/MAR/code_mar/oasis_2_mar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1c8cd4ee39f46f3b54493b789fa413b649290e58 --- /dev/null +++ b/MAR/code_mar/oasis_2_mar.f90 @@ -0,0 +1,134 @@ +subroutine OASIS_2_MAR + + ! +--------------------------------------------------------------------------+ + ! | 20-20-2020| + ! | subroutine OASIS_2_MAR transfers OASIS variables to MAR | + ! | | + ! | | + ! | A chaque pas de temps, fromcpl est appele ; | + ! | si il_time_secs est egal a un multiple de la periode de couplage | + ! | alors son action est effective (via oasis_get), | + ! | et MAR recupere les champs de NEMO via getfld (oasis) | + ! | | + ! | C. Kittel + P-V. Huot + N. Jourdain | + ! | cf mar_module.f90 | + ! | cf OASIS-3 user guide (december 2004) | + ! +--------------------------------------------------------------------------+ + + use mod_oasis + use mar_module + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_ra + use mar_lb + use mar_dy + use mar_hy + use mar_te + use mar_tu + use mar_sv + use mardsv + use mar0sv + use mar_sl + use mar_ao + use mar_tv + use mar_bs + use marssn + use mar_io + use marsib + use mar_po + use mar_wk + + implicit none + + ! +--MAR Variables + ! + ---------------- + + integer i, j, k, m, n, isl + + ! AO_CK 20/02/2020 + + ! +--cpl : GET FIELDS FROM OASIS + ! + =========================== + ! write(6, *) "get fields?", tocken_AO + if(tocken_AO == 1) then + ! fromcpl a deja ete appele pour ce pas de temps + tocken_AO = 0 + else + ! il_time_secs : temps du run en sec. au pas de temps precedant + il_time_secs = iterun * idt + ! write(*,*) ' call fromcpl, itexpe =', itexpe + + ! + ******* + call fromcpl(il_time_secs, srftAO(:, :, 1), aoss, & + sicsAO, aogla, albAO(:, :, 2), aoalb, srftAO(:, :, 2), aotic, & + hicAO, aohic, hsnoAO, aohsn, UoceAO, ao_uo, VoceAO, ao_vo, & + UiceAO, ao_ui, ViceAO, ao_vi) + ! + ******* + + ! cpl----those oceanic fields from oasis are used along the code-- + + ! +--open water albedo (same parametrisation as in NEMO, + ! + ----------------- but with a real zenith angle) + + ! see Briegleb & Ramanathan, JAM, 1982 + ! print *, aoss, il_time_secs,iterun !for debug + do i = 1, mx + do j = 1, my + + ! Albedo from the ocean as computed in NEMO + ! czenGE=cos(zenith angle),cld_SL=cloud cover + albAO(i, j, 1) = (0.05 / (1.1 * czenGE(i, j)**1.4 + 0.15)) * cld_SL(i, j) & + + 0.06 * (1.-cld_SL(i, j)) + + ! you should avoid coupling sst and sic on different time steps + ! even if it's possible in the code with different aoss and aogla + if(aoss > 0 .and. weightao_sst(i, j) /= 1) then + + ! avoid interpolation error in oasis + !WARNING WARNING WARNING + srftAO(i, j, 1) = min(max(srftAO(i, j, 1) / (1 - sicsAO(i, j)), 271.01), 300.15) + + sst_LB(i, j) = (1.-weightao_sst(i, j)) * srftAO(i, j, 1) & + + (weightAO_sst(i, j) * sst_LB(i, j)) + endif + + !+update of new snow layers in phy_sisvat_mp.f + if(aotic > 0 .and. weightao_st(i, j) /= 1) then + !avoid interpolation error in oasis (non interecative mask) + !WARNING WARNING WARNING + srftAO(i, j, 2) = min(max(srftAO(i, j, 2) / sicsAO(i, j), 250.001), 273.15) + + if(sicsAO(i, j) > 0) then + do isl = 1, nsno + if(maskSL(i, j) == 1 .and. nssSNo(i, j, 2) >= 1) then + ! if there was snow/sea ice at dt-1 on sea(maskSL=1) + tisSNo(i, j, 2, isl) = (1.-weightao_st(i, j)) * srftAO(i, j, 2) & + + weightAO_st(i, j) * tisSNo(i, j, 2, isl) + endif + enddo + endif + + endif + + if(aogla > 0 .and. weightAO_sic(i, j) /= 1) then + sicsIB(i, j) = (1.-weightao_sic(i, j)) * sicsAO(i, j) & + + (weightAO_sic(i, j) * sicsIB(i, j)) + endif + + if(aoalb > 0) then + albAO(i, j, 2) = max(min(albAO(i, j, 2) / sicsAO(i, j), 1.0), 0.0) + ! weighting directly in snoptp.f (phy_sisvat => (sisvat) => snoptp) + endif + + enddo + enddo + + ! hicAO et hsnoAO => only in full NEMO domain (update in physisvat_mp) + + endif + + return +end diff --git a/MAR/code_mar/out_nc.f90 b/MAR/code_mar/out_nc.f90 new file mode 100644 index 0000000000000000000000000000000000000000..44bb56ec783936d7d48a397a04717581710c3e89 --- /dev/null +++ b/MAR/code_mar/out_nc.f90 @@ -0,0 +1,1047 @@ +#include "MAR_pp.def" +subroutine out_nc(ipr_nc) + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT Fri 20-Jan-2012 MAR | + ! | subroutine out_nc is used to write the main Model Variables | + ! | on a NetCDF file | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ipr_nc: Current time step number | + ! | ^^^^^^ (starting from ipr_nc=1, which => new file creation) | + ! | | + ! | OUTPUT: NetCDF File adapted to IDL Graphic Software | + ! | ^^^^^^ | + ! | | + ! | CAUTION: This Routine requires the usual NetCDF library, | + ! | ^^^^^^^^ and the complementary access library 'libUN.a' | + ! | | + ! | MODIF. 4 Nov 2009 : OUTPUT of Map Scaling Factor SFm_DY | + ! | ^^^^^ | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_te + use mar_tu + use mar_ca + use mar_hy + use mar_ra + use mar_sl + use mar_sv + use mardSV + use mar_TV + use marsSN + use mar_wk + use mar_io + use trackwind, only : track_wind, ntrackwind, delta_u, delta_v, itw, & + name_wind, delta_u_NCsave, delta_v_NCsave, ddelta_var, & + track_dgz, ntrackdgz, delta_u_dgz, delta_v_dgz, & + name_dgz, delta_u_dgz_NCsave, delta_v_dgz_NCsave + use trackwater, only: jtw, track_water, delta_qv, ntwater, & + name_water, delta_qv_NCsave, ddelta_water + + implicit none + + integer, intent(in) :: ipr_nc + integer i, j, k, m + real Soilz(mz) + common / out_nc_rea / Soilz + + integer nsnomz, kk + parameter(nsnomz=min(nsno, mz)) + + integer kOUTnc, nOUTnc + integer ijSNOW(mx, my) + common / out_nc_int / kOUTnc, nOUTnc, ijSNOW + + ! +--Local Variables + ! + ================ + +#if(IZ) + logical noZOOM +#endif + logical LastIO + real end_YR + + integer Lfnam, Ltit, Luni, Lnam, Llnam + PARAMETER(Lfnam=40, Ltit=90, Luni=90, Lnam=13, Llnam=50) + ! +...Length of char strings + + character * (Lfnam) fnamNC + common / out_nc_loc / fnamNC + ! +... fnamNC: To retain file name. + + integer NdimNC + PARAMETER(NdimNC=6) + ! +...Number of defined spatial dimensions (exact) + + integer MXdim + PARAMETER(MXdim=86401) + ! +...Maximum Number of all dims: recorded Time Steps + ! + and also maximum of spatial grid points for each direction. + + integer MX_var + PARAMETER(MX_var=120) + ! +...Maximum Number of Variables + + integer NattNC + PARAMETER(NattNC=2) + ! +...Number of real attributes given to all variables + + integer RCODE + + integer njmo + integer jourNC(MXdim) + integer moisNC(MXdim) + real yearNC(MXdim) + real dateNC(MXdim) + common / out_nc_r / yearNC, dateNC + real timeNC(MXdim) + real VALdim(MXdim, 0:NdimNC) + integer nDFdim(0:NdimNC) + common / out_nc_i / nDFdim + integer NvatNC(NattNC) + character * (Lnam) NAMdim(0:NdimNC) + character * (Luni) UNIdim(0:NdimNC) + character * (Lnam) SdimNC(4, MX_var) + character * (Luni) unitNC(MX_var) + character * (Lnam) nameNC(MX_var) + character * (Llnam) lnamNC(MX_var) + character * (Ltit) tit_NC + character * (Lnam) NAMrat(NattNC) +#if(TC) + character * 9 labelc +#endif + character * 120 tmpINP + + integer n1000, n100a, n100, n10_a, n10, n1, m10 + integer n, l, jd10, jd1, MMXstp + integer it, mois, mill, iu, itotNC, NtotNC, ID__nc +#if(TC) + integer itot +#endif + real starti, starta(1), DayLen, rhodzk + + character * 1 chn + character * 7 lab__z, lab_dz, lab_ro, lab_wa, lab_g1, lab_g2, lab_Ti + + data lab__z/'z_mmWE '/ + data lab_dz/'dzSNOW '/ + data lab_ro/'roSNOW '/ + data lab_wa/'waSNOW '/ + data lab_g1/'g1SNOW '/ + data lab_g2/'g2SNOW '/ + data lab_Ti/'TiSNOW '/ + +#if(IZ) + data noZOOM/.false./ +#endif + + ! +--NetCDF File Initialization + ! + ========================== + + if(ipr_nc == 1) then + + ! +--Nb of OUTPUT per File (Option #SO for splitting the MAR*.nc file) + ! + --------------------- + + nOUTnc = npr_nc +#if(SO) + nOUTnc = (2.0 / 0.09) * (161.*161.*34.) / (mx * my * mzz) + kOUTnc = 86400.1 / (dt * nboucl) + nOUTnc = nOUTnc / kOUTnc + nOUTnc = nOUTnc * kOUTnc + nOUTnc = min(nOUTnc, & + kOUTnc * (365 + max(0, 1 - mod(iyrrGE, 4)))) + if(npr_nc == nprint + 1) then + nOUTnc = nOUTnc + 1 + endif + nOUTnc = min(npr_nc, nOUTnc) +#endif + npr_nc = npr_nc - nOUTnc + + n1000 = 1 + iyrrGE / 1000 + n100a = mod(iyrrGE, 1000) + n100 = 1 + n100a / 100 + n10_a = mod(n100a, 100) + n10 = 1 + n10_a / 10 + n1 = 1 + mod(n10_a, 10) + m10 = 1 + mmarGE / 10 + m1 = 1 + mod(mmarGE, 10) + jd10 = 1 + jdarGE / 10 + jd1 = 1 + mod(jdarGE, 10) + + ! +--Output File Label + ! + ----------------- + + fnamNC = 'MAR.' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) & + //'.'//explIO & + //'.nc ' + +#if(SO) + write(6, 6000) fnamNC, nOUTnc, npr_nc, kOUTnc +6000 format(/, '++++++++++++++++++++++++++++++++++++++++++++++', & + /, 'out_nc: Nb of OUTPUT: ', a19, ':', i4, & + /, ' After present File:', i4, & + /, ' Per Day :', i4, & + /, '++++++++++++++++++++++++++++++++++++++++++++++') +#endif + + ! +--Output Title + ! + ------------ + + tit_NC = 'MAR' & + //' - Exp: '//explIO & + //' - ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) + + ! +--Create File / Write Constants + ! + ----------------------------- + + MMXstp = MXdim + ! +...To check array bounds... silently + + ! +--Time Variable (hour) + ! + ~~~~~~~~~~~~~~~~~~~~ + + ! +... To define a NetCDF dimension (size, name, unit): + nDFdim(0) = nOUTnc + nDFdim(0) = 0 + NAMdim(0) = 'time' + UNIdim(0) = 'HOURS since 1901-01-15 00:00:00' + + ! +... Check temporary arrays: large enough ? + if(nOUTnc > MMXstp) & + STOP '*** out_nc - ERROR : MXdim to low ***' + + starti = jhurGE + minuGE / 60.d0 + jsecGE / 3600.d0 + ! +... starti : Starting Time (= current time in the day) + ! Nb Days before iyrrGE + ! Nb Leap Years + ! Nb Days before mmarGE + ! (including Leap Day) + starta(1) = (351 + (iyrrGE - 1902) * 365 & + + (iyrrGE - 1901) / 4 & + + njyrGE(mmarGE) & + + njybGE(mmarGE) & + * max(0, 1 - mod(iyrrGE, 4)) & + + jdarGE - 1) * 24 & + + jhurGE & + + (minuGE * 60 + jsecGE) / 3600. + + do it = 1, nOUTnc + timeNC(it) = starti + (it - 1) * nboucl * dt / 3600. + ! +... nboucl: #iter between output + + VALdim(it, 0) = starta(1) + (it - 1) * nboucl * dt / 3600. + ! +... VALdim( ,0) : values of the dimension # 0 (time) + + ! +--Time Variable (date) + ! + ~~~~~~~~~~~~~~~~~~~~ + dateNC(it) = timeNC(it) + jourNC(it) = jdarGE + timeNC(it) / 24. + enddo + mois = mmarGE + mill = iyrrGE + do it = 1, nOUTnc + if(mois == 2 .and. & + mod(mill, 4) == 0) then + njmo = njmoGE(mois) + 1 + else + njmo = njmoGE(mois) + endif + if(jourNC(it) > njmo) then + do iu = it, nOUTnc + jourNC(iu) = jourNC(iu) - njmo + enddo + mois = mois + 1 + if(mois > 12) then + mois = 1 + mill = mill + 1 + endif + endif + moisNC(it) = mois + yearNC(it) = mill + + if(dateNC(it) > 24.-epsi) then + DayLen = 24. + do iu = it, nOUTnc + dateNC(iu) = mod(dateNC(iu), DayLen) + enddo + endif + enddo + + do it = 1, nOUTnc + dateNC(it) = dateNC(it) & + + 1.d+2 * jourNC(it) & + + 1.d+4 * moisNC(it) + enddo + + ! +--Define horizontal spatial dimensions : + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! +...Check temporary arrays: large enough ? + if(mx > MMXstp .or. my > MMXstp & + .or. mzz > MMXstp .or. mw > MMXstp) & + STOP '*** out_nc - ERROR : MXdim to low ***' + + ! +...To define NetCDF dimensions (size, name, unit): + + do i = 1, mx + VALdim(i, 1) = xxkm(i) + enddo + nDFdim(1) = mx + NAMdim(1) = 'x' + UNIdim(1) = 'km' + + do j = 1, my + VALdim(j, 2) = yykm(j) + enddo + nDFdim(2) = my + NAMdim(2) = 'y' + UNIdim(2) = 'km' + + do k = 1, mz + VALdim(k, 3) = sigma(k) + enddo + nDFdim(3) = mz + NAMdim(3) = 'level' + UNIdim(3) = 'sigma_level' + ! +... For levels k + + do k = 1, mz + VALdim(k, 4) = sigmid(k + 1) + enddo + nDFdim(4) = mz + NAMdim(4) = 'level2' + UNIdim(4) = 'sigma_level' + ! +... For levels k+1/2 + + do k = 1, mz + VALdim(k, 5) = sigma(k) + enddo + VALdim(mzz, 5) = 1. + nDFdim(5) = mzz + NAMdim(5) = 'levelp1' + UNIdim(5) = 'sigma_level' + ! +... For levels mzz + + do k = 1, mw + VALdim(k, 6) = k + enddo + nDFdim(6) = mw + NAMdim(6) = 'sector' + UNIdim(6) = 'level' + ! +... For Surface Sectors + + ! +--Variable's Choice (Table MARvou.dat) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + OPEN(unit=10, status='unknown', file='MARvou.dat') + + itotNC = 0 +980 continue + READ(10, '(A120)', end=990) tmpINP + if(tmpINP(1:4) == ' ') then + itotNC = itotNC + 1 + READ(tmpINP, '(4x,5A9,A12,A50)') & + nameNC(itotNC), SdimNC(1, itotNC), SdimNC(2, itotNC), & + SdimNC(3, itotNC), SdimNC(4, itotNC), & + unitNC(itotNC), lnamNC(itotNC) +#if(TC) + ! +... nameNC: Name + ! + SdimNC: Names of Selected Dimensions (max.4/variable) + ! + unitNC: Units + ! + lnamNC: Long_name, a description of the variable + if(nameNC(itotNC) == 'qxTC ' .and. nkWri >= 1) then + nameNC(itotNC) = namTC(1) + if(nkWri > 1) then + itot = itotNC + do n = 2, nkWri + itot = itot + 1 + nameNC(itot) = namTC(n) + do m = 1, 4 + SdimNC(m, itot) = SdimNC(m, itotNC) + enddo + unitNC(itot) = unitNC(itotNC) + lnamNC(itot) = lnamNC(itotNC) + enddo + itotNC = itot + endif + endif +#endif + + endif + GOTO 980 +990 continue + + CLOSE(unit=10) + + NtotNC = itotNC + ! +... NtotNC : Total number of variables writen in NetCDF file. + + ! +--List of NetCDF attributes given to all variables: + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! +... The "actual_range" is the (min,max) + ! + of all data for each variable: + NAMrat(1) = 'actual_range' + NvatNC(1) = 2 + + ! +... The "[var]_range" is NOT of attribute type, + ! + it is a true variable containing the (min,max) for + ! + each level, for 4D (space+time) variables only + ! + (automatic handling by UN library; + ! + must be the LAST attribute) + NAMrat(NattNC) = '[var]_range' + NvatNC(NattNC) = 2 + + ! +--Automatic Generation of the NetCDF File Structure + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! + ************** + call UNscreate(fnamNC, tit_NC, & + NdimNC, nDFdim, MXdim, NAMdim, UNIdim, VALdim, & + MX_var, NtotNC, nameNC, SdimNC, unitNC, lnamNC, & + NattNC, NAMrat, NvatNC, & + ID__nc) + ! + ************** + + ! +--Write Time - Constants + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + WKxy1(i, j) = GElonh(i, j) * 15. + ! +... Conversion: Hour->degrees + + WKxy2(i, j) = GElatr(i, j) / degrad + ! +... Conversion: rad ->degrees + + WKxy3(i, j) = isolSL(i, j) + ! +... Conversion to REAL type (integer not allowed) + + WKxy4(i, j) = isolTV(i, j) + ! +... Conversion to REAL type (integer not allowed) + + enddo + enddo + + do l = 1, llx + Soilz(l) = -deptTV(l) + enddo + do l = llx + 1, mz + Soilz(l) = -deptTV(llx) - 1.e-6 * (l - llx) + enddo + + ! + ************ + call UNwrite(ID__nc, 'lon ', 1, mx, my, 1, WKxy1) + call UNwrite(ID__nc, 'lat ', 1, mx, my, 1, WKxy2) + call UNwrite(ID__nc, 'MapSC ', 1, mx, my, 1, SFm_DY) + call UNwrite(ID__nc, 'sh ', 1, mx, my, 1, sh) + call UNwrite(ID__nc, 'isol ', 1, mx, my, 1, WKxy3) + call UNwrite(ID__nc, 'TEX ', 1, mx, my, 1, WKxy4) + call UNwrite(ID__nc, 'DepthS ', ipr_nc, mz, 1, 1, Soilz) + call UNwrite(ID__nc, 'dsigm1', 1, mz, 1, 1, dsigm1) + + ! + ************ + + ! +--Snow Mosa?c for OUTPUT + ! + ====================== + + do j = 1, my + do i = 1, mx + ijSNOW(i, j) = 1 + maskSL(i, j) + enddo + enddo + + if(track_wind) then + ! initialize track momentum budget + delta_u_NCsave = 0. + delta_v_NCsave = 0. + ! ddelta_var = delta_var - delta_var_NCsave + ddelta_var = 0. + endif + + else + ! +--Re-Open file if already created. + ! + ================================ + + ! + ************ + call UNwopen(fnamNC, ID__nc) + ! + ************ + + endif + + ! +--Write Time-dependent variables: + ! + =============================== + + ! +--UNLIMITED Time Dimension + ! + ------------------------ + + if(nDFdim(0) == 0) then + ! Nb Days before iyrrGE + ! Nb Leap Years + ! Nb Days before mmarGE + ! (including Leap Day) + starta(1) = (351 + (iyrrGE - 1902) * 365 & + + (iyrrGE - 1901) / 4 & + + njyrGE(mmarGE) & + + njybGE(mmarGE) & + * max(0, 1 - mod(iyrrGE, 4)) & + + jdarGE - 1) * 24 & + + jhurGE & + + (minuGE * 60 + jsecGE) / 3600. + + ! + ************ + call UNwrite(ID__nc, 'time ', ipr_nc, 1, 1, 1, starta(1)) + ! + ************ + + endif + + ! + ************ + call UNwrite(ID__nc, 'date ', ipr_nc, 1, 1, 1, dateNC(ipr_nc)) + call UNwrite(ID__nc, 'year ', ipr_nc, 1, 1, 1, yearNC(ipr_nc)) + ! + ************ + + ! +--Geopotential Height, Saturation Specific Humidity + ! + ------------------------------------------------- + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = gplvDY(i, j, k) * grvinv + WKxyz2(i, j, k) = qvswDY(i, j, k) +#if(NH) + WKxyz3(i, j, k) = pairNH(i, j, k) * pstDYn(i, j) * sigma(k) +#endif + WKxyz4(i, j, k) = 0.0 + enddo + enddo + enddo + + ! +--Surface Humidity and Green Leaf Fraction [%] + ! + -------------------------------------------- + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + enddo + enddo + + do n = 1, nvx + do j = 1, my + do i = 1, mx + WKxy1(i, j) = WKxy1(i, j) & + + eta_TV(i, j, n, 1) * SLsrfl(i, j, n) + WKxy2(i, j) = WKxy2(i, j) & + + glf_TV(i, j, n) * alaiTV(i, j, n) * SLsrfl(i, j, n) + enddo + enddo + enddo + + do l = 1, llx + do n = 1, nvx + do j = 1, my + do i = 1, mx + WKxyz4(i, j, l) = WKxyz4(i, j, l) & + + eta_TV(i, j, n, l) * SLsrfl(i, j, n) + enddo + enddo + enddo + enddo + + do l = 1, llx + do j = 1, my + do i = 1, mx + WKxy3(i, j) = WKxy3(i, j) & + + WKxyz4(i, j, l) * dz_dSV(1 - l) + enddo + enddo + enddo + + if(track_wind) then + ! track momentum budget + ! --------------------- + do itw = 1, ntrackwind + ! delta u + ddelta_var = delta_u(:, :, :, itw) - delta_u_NCsave(:, :, :, itw) + call UNwrite (ID__nc, 'du_' // name_wind(itw), ipr_nc, mx, my, mz, ddelta_var) + ! delta v + ddelta_var = delta_v(:, :, :, itw) - delta_v_NCsave(:, :, :, itw) + call UNwrite (ID__nc, 'dv_' // name_wind(itw), ipr_nc, mx, my, mz, ddelta_var) + enddo + delta_u_NCsave = delta_u + delta_v_NCsave = delta_v + endif + if (track_dgz) then + ! track momentum budget in dyndgz + ! ------------------------------- + do itw = 1, ntrackdgz + ! delta u dgz + ddelta_var = delta_u_dgz(:, :, :, itw) - delta_u_dgz_NCsave(:, :, :, itw) + call UNwrite (ID__nc, 'du_' // name_dgz(itw), ipr_nc, mx, my, mz, ddelta_var) + ! delta v dgz + ddelta_var = delta_v_dgz(:, :, :, itw) - delta_v_dgz_NCsave(:, :, :, itw) + call UNwrite (ID__nc, 'dv_' // name_dgz(itw), ipr_nc, mx, my, mz, ddelta_var) + enddo + delta_u_dgz_NCsave = delta_u_dgz + delta_v_dgz_NCsave = delta_v_dgz + end if + + if(track_water) then + ! track water budget + ! ------------------ + do jtw = 1, ntwater + ! delta qv + ddelta_water = delta_qv(:, :, :, jtw) - delta_qv_NCsave(:, :, :, jtw) + call UNwrite(ID__nc, 'dq_' // name_water(jtw), ipr_nc, mx, my, mz, ddelta_water) + enddo + delta_qv_NCsave = delta_qv + endif + + ! + ************ + call UNwrite(ID__nc, 'uairDY ', ipr_nc, mx, my, mz, uairDY) + call UNwrite(ID__nc, 'vairDY ', ipr_nc, mx, my, mz, vairDY) + call UNwrite(ID__nc, 'wairDY ', ipr_nc, mx, my, mz, wairDY) + call UNwrite (ID__nc, 'psigDY ', ipr_nc, mx, my, mz, psigDY) + call UNwrite (ID__nc, 'wsigDY ', ipr_nc, mx, my, mz, wsigDY) + call UNwrite(ID__nc, 'tairDY ', ipr_nc, mx, my, mz, tairDY) + call UNwrite(ID__nc, 'pktaDY ', ipr_nc, mx, my, mzz, pktaDY) +#if(NH) + call UNwrite(ID__nc, 'wairNH ', ipr_nc, mx, my, mz, wairNH) + call UNwrite(ID__nc, 'pairNH ', ipr_nc, mx, my, mz, WKxyz3) +#endif + call UNwrite(ID__nc, 'qvDY ', ipr_nc, mx, my, mz, qvDY) + call UNwrite(ID__nc, 'zzDY ', ipr_nc, mx, my, mz, WKxyz1) + call UNwrite(ID__nc, 'qsatDY ', ipr_nc, mx, my, mz, WKxyz2) + call UNwrite(ID__nc, 'pstDY ', ipr_nc, mx, my, 1, pstDY) + call UNwrite(ID__nc, 'RadOLR ', ipr_nc, mx, my, 1, RAdOLR) + call UNwrite(ID__nc, 'RadSol ', ipr_nc, mx, my, 1, RAdsol) + call UNwrite(ID__nc, 'Rad_IR ', ipr_nc, mx, my, 1, RAD_ir) + call UNwrite(ID__nc, 'hmelSL ', ipr_nc, mx, my, 1, hmelSL) + call UNwrite(ID__nc, 'tairSL ', ipr_nc, mx, my, 1, TairSL) + call UNwrite(ID__nc, 'tsrfSL ', ipr_nc, mx, my, mw, tsrfSL) +#if(T2) + call UNwrite(ID__nc, 'Ta2mSL ', ipr_nc, mx, my, mw, Ta2mSL) + call UNwrite(ID__nc, 'TminSL ', ipr_nc, mx, my, mw, TminSL) + call UNwrite(ID__nc, 'TmaxSL ', ipr_nc, mx, my, mw, TmaxSL) + call UNwrite(ID__nc, 'Ta3mSL ', ipr_nc, mx, my, mw, Ta3mSL) + call UNwrite(ID__nc, 'V03mSL ', ipr_nc, mx, my, mw, V03mSL) + call UNwrite(ID__nc, 'V10mSL ', ipr_nc, mx, my, mw, V10mSL) +#endif + call UNwrite(ID__nc, 'albxSL ', ipr_nc, mx, my, mw, albxSL) + call UNwrite(ID__nc, 'hsenSL ', ipr_nc, mx, my, 1, hsenSL) + call UNwrite(ID__nc, 'hlatSL ', ipr_nc, mx, my, 1, hlatSL) + call UNwrite(ID__nc, 'ect_TE ', ipr_nc, mx, my, mz, ect_TE) + call UNwrite(ID__nc, 'eps_TE ', ipr_nc, mx, my, mz, eps_TE) + call UNwrite(ID__nc, 'TUkvm ', ipr_nc, mx, my, mz, TUkvm) + call UNwrite(ID__nc, 'TUkvh ', ipr_nc, mx, my, mz, TUkvh) + call UNwrite(ID__nc, 'SL_z0 ', ipr_nc, mx, my, mw, SL_z0) + call UNwrite(ID__nc, 'SL_r0 ', ipr_nc, mx, my, mw, SL_r0) +#if(BS) + call UNwrite(ID__nc, 'ustart ', ipr_nc, mx, my, mw, SaltSN) + call UNwrite(ID__nc, 'z0emBS ', ipr_nc, mx, my, mw, Z0emBS) + call UNwrite(ID__nc, 'z0SaBS ', ipr_nc, mx, my, mw, Z0SaBS) +#endif + call UNwrite(ID__nc, 'SLsrfl ', ipr_nc, mx, my, mw, SLsrfl) + call UNwrite(ID__nc, 'SLuusl ', ipr_nc, mx, my, mw, SLuusl) + call UNwrite(ID__nc, 'SLutsl ', ipr_nc, mx, my, mw, SLutsl) + call UNwrite(ID__nc, 'SLuqsl ', ipr_nc, mx, my, mw, SLuqsl) + call UNwrite(ID__nc, 'SLussl ', ipr_nc, mx, my, mw, SLussl) + call UNwrite(ID__nc, 'albeSL ', ipr_nc, mx, my, 1, albeSL) + call UNwrite(ID__nc, 'Clouds ', ipr_nc, mx, my, 1, cld_SL) + ! + ************ + + ! + ************ + call UNwrite(ID__nc, 'HumSol ', ipr_nc, mx, my, 1, WKxy1) + call UNwrite(ID__nc, 'GreenL ', ipr_nc, mx, my, 1, WKxy2) + call UNwrite(ID__nc, 'WatSol ', ipr_nc, mx, my, 1, WKxy3) + call UNwrite(ID__nc, 'EvapoT ', ipr_nc, mx, my, 1, evapTV) + call UNwrite(ID__nc, 'Draing ', ipr_nc, mx, my, 1, draiTV) + call UNwrite(ID__nc, 'RunOFF ', ipr_nc, mx, my, 1, runoTV) + call UNwrite(ID__nc, 'H2OSol ', ipr_nc, mx, my, mz, WKxyz4) + ! + ************ + +#if(IZ) + if(noZOOM) then +#endif +#if(DY) + ! +--Dynamical Budget + ! + ---------------- + do k = 1, mz + do j = 1, my + do i = 1, mx + dumy3D(i, j, k) = 0. + enddo + enddo + enddo + ! + ****** + call dynbil(7, 1, ipr_nc, ID__nc, 0., 0., 0., 0., dumy3D) + ! + ****** +#endif +#if(IZ) + endif +#endif + + ! +--Cloud Microphysics, Mass Flux convective Scheme + ! + ----------------------------------------------- + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qwHY(i, j, k) + qiHY(i, j, k) + WKxyz2(i, j, k) = qrHY(i, j, k) + qsHY(i, j, k) + WKxyz3(i, j, k) = dqv_CA(i, j, k) * Lv_H2O / cp & + * min(adj_CA(i, j), iun) * 86400./dt_Loc + WKxyz4(i, j, k) = (dpktCA(i, j, k) & + * (ptopDY + sigma(k) * pstDY(i, j))**cap) & + * min(adj_CA(i, j), iun) * 86400./dt_Loc + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + zcd_HY(i, j) = zcd_HY(i, j) / max(eps9, Hcd_HY(i, j)) / gravit + Tcd_HY(i, j) = Tcd_HY(i, j) / max(eps9, Hcd_HY(i, j)) + zsb_HY(i, j) = zsb_HY(i, j) / max(eps9, Hsb_HY(i, j)) / gravit + Tsb_HY(i, j) = Tsb_HY(i, j) / max(eps9, Hsb_HY(i, j)) + Hcd_HY(i, j) = Hcd_HY(i, j) / max(1, icntHY) + Hsb_HY(i, j) = Hsb_HY(i, j) / max(1, icntHY) + enddo + enddo + + ! + ************ + call UNwrite(ID__nc, 'QwQi ', ipr_nc, mx, my, mz, WKxyz1) + call UNwrite(ID__nc, 'QrQs ', ipr_nc, mx, my, mz, WKxyz2) + call UNwrite(ID__nc, 'ccniHY ', ipr_nc, mx, my, mz, ccniHY) + call UNwrite(ID__nc, 'qiHY ', ipr_nc, mx, my, mz, qiHY) + call UNwrite(ID__nc, 'qwHY ', ipr_nc, mx, my, mz, qwHY) + call UNwrite(ID__nc, 'qsHY ', ipr_nc, mx, my, mz, qsHY) + call UNwrite(ID__nc, 'qrHY ', ipr_nc, mx, my, mz, qrHY) + call UNwrite(ID__nc, 'hlatHY ', ipr_nc, mx, my, mz, hlatHY) + call UNwrite(ID__nc, 'HLCond ', ipr_nc, mx, my, 1, Hcd_HY) + call UNwrite(ID__nc, 'TaCond ', ipr_nc, mx, my, 1, Tcd_HY) + call UNwrite(ID__nc, 'z_Cond ', ipr_nc, mx, my, 1, zcd_HY) + call UNwrite(ID__nc, 'HLSubl ', ipr_nc, mx, my, 1, Hsb_HY) + call UNwrite(ID__nc, 'TaSubl ', ipr_nc, mx, my, 1, Tsb_HY) + call UNwrite(ID__nc, 'z_Subl ', ipr_nc, mx, my, 1, zsb_HY) + call UNwrite(ID__nc, 'rainHY ', ipr_nc, mx, my, 1, rainHY) + call UNwrite(ID__nc, 'snowHY ', ipr_nc, mx, my, 1, snowHY) + call UNwrite(ID__nc, 'crysHY ', ipr_nc, mx, my, 1, crysHY) + ! + ************ + + icntHY = 0 + do j = 1, my + do i = 1, mx + Hcd_HY(i, j) = 0. + Tcd_HY(i, j) = 0. + zcd_HY(i, j) = 0. + Hsb_HY(i, j) = 0. + Tsb_HY(i, j) = 0. + zsb_HY(i, j) = 0. + enddo + enddo + + ! + ************ + call UNwrite(ID__nc, 'CAPE ', ipr_nc, mx, my, 1, capeCA) + call UNwrite(ID__nc, 'rainCA ', ipr_nc, mx, my, 1, rainCA) + call UNwrite(ID__nc, 'snowCA ', ipr_nc, mx, my, 1, snowCA) + call UNwrite(ID__nc, 'dqv_CA ', ipr_nc, mx, my, mz, WKxyz3) + call UNwrite(ID__nc, 'dpktCA ', ipr_nc, mx, my, mz, WKxyz4) + ! + ************ + +#if(WB) + ! +--Water Budget + ! + ------------ + ! + ****** + call H2O_WB(-1, 0., 0., .false., .true.) + ! + ****** + do j = 1, my + do i = 1, mx + WKxy1(i, j) = dq__WB(i, j, 1) + WKxy2(i, j) = dq__WB(i, j, 2) + WKxy3(i, j) = dq__WB(i, j, 3) + WKxy4(i, j) = dq__WB(i, j, 4) + WKxy5(i, j) = dq__WB(i, j, 5) + WKxy6(i, j) = dq__WB(i, j, 6) + enddo + enddo + call UNwrite(ID__nc, 'H2O_ADV', ipr_nc, mx, my, 1, WKxy1) + call UNwrite(ID__nc, 'H2OdifH', ipr_nc, mx, my, 1, WKxy2) + call UNwrite(ID__nc, 'H2O_CVA', ipr_nc, mx, my, 1, WKxy3) + call UNwrite(ID__nc, 'H2OdifV', ipr_nc, mx, my, 1, WKxy4) + call UNwrite(ID__nc, 'H2O_mic', ipr_nc, mx, my, 1, WKxy5) + call UNwrite(ID__nc, 'H2Ofltr', ipr_nc, mx, my, 1, WKxy6) + call UNwrite(ID__nc, 'H2OsrfT', ipr_nc, mx, my, 1, uq__WB) + call UNwrite(ID__nc, 'H2OsrfA', ipr_nc, mx, my, 1, wq__WB) + call UNwrite(ID__nc, 'H2Oflux', ipr_nc, mx, my, 1, upq_WB) + call UNwrite(ID__nc, 'H2Ofluy', ipr_nc, mx, my, 1, vpq_WB) + call UNwrite(ID__nc, 'H2Omean', ipr_nc, mx, my, 1, cpq_WB) + call UNwrite(ID__nc, 'Snoflux', ipr_nc, mx, my, 1, ups_WB) + call UNwrite(ID__nc, 'Snofluy', ipr_nc, mx, my, 1, vps_WB) + call UNwrite(ID__nc, 'Snomean', ipr_nc, mx, my, 1, cps_WB) + call UNwrite(ID__nc, 'Vap_Liq', ipr_nc, mx, my, mz, dqwHY) + call UNwrite(ID__nc, 'Vap_Ice', ipr_nc, mx, my, mz, dqiHY) + ! + ****** + call H2O_WB(-1, 0., 0., .true., .false.) + ! + ****** +#endif + +#if(OD) + ! +--Cloud Optical Depth + ! + ------------------- + do j = 1, my + do i = 1, mx + ! +... WKxy1(i,j) : liquid water path (kg/m2) (droplets) + WKxy1(i, j) = 0. + ! +... WKxy2(i,j) : liquid water path (kg/m2) (crystals) + WKxy2(i, j) = 0. + enddo + enddo + do k = mzabso + 1, mz + do j = 1, my + do i = 1, mx + ! rhodzk : (rho / 1000) * (dz * gravit) + rhodzk = (pstDY(i, j) * sigma(k) + ptopDY) & + / (ra * tairDY(i, j, k) * (1.+.608 * qvDY(i, j, k))) & + * (gpmiDY(i, j, k) - gpmiDY(i, j, k + 1)) + WKxy1(i, j) = WKxy1(i, j) + rhodzk * qwHY(i, j, k) + WKxy2(i, j) = WKxy2(i, j) + rhodzk * qiHY(i, j, k) + enddo + enddo + enddo + do j = 1, my + do i = 1, mx + WKxy3(i, j) = 1.5 * (WKxy1(i, j) / 20.d-6 & + + WKxy2(i, j) / 40.d-6) * grvinv + enddo + enddo + call UNwrite(ID__nc, 'OptDep ', ipr_nc, mx, my, 1, WKxy3) +#endif + + ! + ************ + call UNwrite(ID__nc, 'OptDep ', ipr_nc, mx, my, 1, RAcdtO) + ! + ************ + + ! +--Snow Pack + ! + --------- + + if(SnoMod .and. VSISVAT) then + + do k = 1, mw + do j = 1, my + do i = 1, mx + WRKxys(i, j, k) = zWE_SN(i, j, k) - zWE0SN(i, j, k) + enddo + enddo + enddo + + do n = 1, mw + + if(n > 1) then + lab__z(5:5) = '_' + lab_dz(5:5) = '_' + lab_ro(5:5) = '_' + lab_wa(5:5) = '_' + lab_g1(5:5) = '_' + lab_g2(5:5) = '_' + lab_Ti(5:5) = '_' + write(chn, '(i1)') n + lab__z(6:6) = chn + lab_dz(6:6) = chn + lab_ro(6:6) = chn + lab_wa(6:6) = chn + lab_g1(6:6) = chn + lab_g2(6:6) = chn + lab_Ti(6:6) = chn + else + lab__z(5:6) = 'WE' + lab_dz(5:6) = 'OW' + lab_ro(5:6) = 'OW' + lab_wa(5:6) = 'OW' + lab_g1(5:6) = 'OW' + lab_g2(5:6) = 'OW' + lab_Ti(5:6) = 'OW' + endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0. + WKxyz2(i, j, k) = 0. + WKxyz3(i, j, k) = 0. + WKxyz4(i, j, k) = 0. + enddo + enddo + enddo + + do k = 1, nsnomz + do j = 1, my + do i = 1, mx + WKxyz4(i, j, k) = min(max(nssSNo(i, j, n) - k + 1, 0), 1) ! 0: outside SnowPack + enddo + enddo + enddo + + do k = 1, nsnomz + do j = 1, my + do i = 1, mx +#if(vS) + n = ijSNOW(i, j) ! 1: Land / 2:Ocean +#endif + kk = max(nssSNo(i, j, n) - k + 1, 1) ! 1: 1st lev SnowPack + + WKxyz1(i, j, k) = dzsSNo(i, j, n, kk) * WKxyz4(i, j, k) & + + epsi * (1.-WKxyz4(i, j, k)) + WKxyz2(i, j, k) = rosSNo(i, j, n, kk) * WKxyz4(i, j, k) + WKxyz3(i, j, k) = wasSNo(i, j, n, kk) * WKxyz4(i, j, k) + enddo + enddo + enddo + + ! + ************ + call UNwrite(ID__nc, lab__z, ipr_nc, mx, my, mw, WRKxys) + call UNwrite(ID__nc, lab_dz, ipr_nc, mx, my, mz, WKxyz1) + call UNwrite(ID__nc, lab_ro, ipr_nc, mx, my, mz, WKxyz2) + call UNwrite(ID__nc, lab_wa, ipr_nc, mx, my, mz, WKxyz3) + ! + ************ + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0. + WKxyz2(i, j, k) = 0. + WKxyz3(i, j, k) = 0. + WKxyz4(i, j, k) = 0. + enddo + enddo + enddo + + do k = 1, nsnomz + do j = 1, my + do i = 1, mx + kk = max(nssSNo(i, j, n) - k + 1, 1) ! 1: 1st lev SnowPack + WKxyz1(i, j, k) = g1sSNo(i, j, n, kk) * WKxyz4(i, j, k) + WKxyz2(i, j, k) = g2sSNo(i, j, n, kk) * WKxyz4(i, j, k) + WKxyz3(i, j, k) = tisSNo(i, j, n, kk) * WKxyz4(i, j, k) + enddo + enddo + enddo + + ! + ************ + call UNwrite(ID__nc, lab_g1, ipr_nc, mx, my, mz, WKxyz1) + call UNwrite(ID__nc, lab_g2, ipr_nc, mx, my, mz, WKxyz2) + call UNwrite(ID__nc, lab_Ti, ipr_nc, mx, my, mz, WKxyz3) + ! + ************ + + enddo + + endif + +#if(PO) + ! +--Polynya + ! + ------- + ! + ************ + call UNwrite(ID__nc, 'hatmPO ', ipr_nc, mx, my, 1, hatmPO) + call UNwrite(ID__nc, 'hfraPO ', ipr_nc, mx, my, 1, hfraPO) + call UNwrite(ID__nc, 'aicePO ', ipr_nc, mx, my, 1, aicePO) + call UNwrite(ID__nc, 'hicePO ', ipr_nc, mx, my, 1, hicePO) + call UNwrite(ID__nc, 'hiavPO ', ipr_nc, mx, my, 1, hiavPO) + ! + ************ +#endif + +#if(TC) + ! +--Chemical Species + ! + ---------------- + if(nkWri > 0) then + do n = 1, nkWri + labelc = namTC(ikTC(n)) + do k = 1, mz + do j = 1, my + do i = 1, mx + ! +... Conversion [kg/kg] ------------------> [micro-g/kg] + ! Conversion [mcm] ------------------> [ppb] if requested + WKxyz1(i, j, k) = qxTC(i, j, k, ikTC(n)) * 1.000d+09 +#endif +#if(CH) + ! =>Conversion [kg/kg] ------------------> [micro-g/kg] eliminated + ! ==> 0.392D-19 = 392D-10/1.d+9 + WKxyz1(i, j, k) = WKxyz1(i, j, k) * rolvDY(i, j, k) * 0.392D-19 / Unity +#endif +#if(TC) + enddo + enddo + enddo + ! + ************ + call UNwrite(ID__nc, labelc(1:7), ipr_nc, mx, my, mz, WKxyz1) + ! + ************ + enddo + endif +#endif + + ! +--That 's all, folks: NetCDF File Closure + ! + ======================================= + + ! + ************ + call UNclose(ID__nc) + ! + ************ + + ! +--Work Arrays Reset + ! + ================= + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + enddo + enddo + enddo + + if(mmarGE == 12 .and. jdarGE == 31) then + end_YR = real(24 - jhurGE) * 3599.9 - dt * nboucl + if(end_YR < 0.) then + LastIO = .true. + else + LastIO = .false. + endif + else + if(mmarGE == 1 .and. jdarGE == 1 .and. jhurGE == 0 .and. & + iyrrGE > iyr0GE .and. & + iterun >= nboucl * nprint) then + LastIO = .true. + else + LastIO = .false. + endif + endif + + ! + +++++++++++ + ! + if (LastIO) ipr_nc = 0 ! ipr_nc:=0 => NEW MAR*.nc created + ! + +++++++++++ ! at the next out_nc call + + return +endsubroutine out_nc diff --git a/MAR/code_mar/outgks.f90 b/MAR/code_mar/outgks.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ffe5193656d4b5534fcc43e071b7abced5f08646 --- /dev/null +++ b/MAR/code_mar/outgks.f90 @@ -0,0 +1,263 @@ +#include "MAR_pp.def" +subroutine OUTgks + ! + + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT 19-09-2001 MAR | + ! | subroutine OUTgks is used to write the main Model Variables | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | OUTPUT: on asci file si_ddhhmm.LAB (Atmospheric Dynamics, Surface) | + ! | ^^^^^^ cl_ddhhmm.LAB (Microphysics) | + ! | | + ! +------------------------------------------------------------------------+ + ! + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use marsnd + use mar_dy + use mar_te + use mar_tu + use mar_hy + use mar_sl + use mar_sv + use mar_io +#if(OL) + use mar_OL +#endif +#if(PO) + use mar_po +#endif + ! + + implicit none + ! + + external zext + integer zext + ! + + ! + + ! +--Local Variables + ! + ================ + ! + + integer i, j, k, m + real fac_sh + integer jmmd, jm10, jh10, jh1, jd10, jd1 + ! + + ! + + ! +--Linear Mountain Waves Characteristics + ! + ===================================== + ! + +#if(OL) + do k = 1, mz + do j = 1, my + do i = 1, mx + urefOL(i, j, k) = uairDY(i, j, k) + uairDY(i, j, k) = (uairDY(i, j, k) - ugeoDY(i, j, k)) * 1000.d0 + trefOL(i, j, k) = tairDY(i, j, k) + tairDY(i, j, k) = (tairDY(i, j, k) - tSND(1, 1)) * 1000.d0 & + + tSND(1, 1) + gplvOL(i, j, k) = gplvDY(i, j, k) + gplvDY(i, j, k) = (gplvDY(i, j, k) - gp00OL(i, j, k)) * 1000.d0 & + + gp00OL(i, j, k) + enddo + enddo + enddo +#endif + fac_sh = 1.d0 +#if(OL) + fac_sh = 1.d3 +#endif + ! + + ! + + ! +--Output File Label + ! + ================= + ! + + fnam(1:3) = 'si_' + jmmd = 1 + mod(minuGE, 10) + jm10 = 1 + minuGE / 10 + jh10 = 1 + jhaMAR / 10 + jh1 = 1 + mod(jhaMAR, 10) + jd10 = 1 + jdaMAR / 10 + jd1 = 1 + mod(jdaMAR, 10) + if(jd10 > 10) then + fnam(3:3) = '+' + jd10 = mod(jd10, 10) + endif + fnam(4:4) = labnum(jd10) + fnam(5:5) = labnum(jd1) + fnam(6:6) = labnum(jh10) + fnam(7:7) = labnum(jh1) + fnam(8:8) = labnum(jm10) + fnam(9:9) = labnum(jmmd) + fnam(10:10) = '.' + fnam(11:13) = explIO + fnam(14:16) = ' ' + ! + + ! + + ! +--File si_ddhhmm.LAB (Atmospheric Dynamics, Surface) + ! + ================================================== + ! + + open(unit=13, status='unknown', file=fnam) + rewind 13 + ! + + write(13, 613) itexpe, iterun, imez, jmez +613 format(4i12) + write(13, 611) qsolSL +611 format(l2, ' qsolSL') + write(13, 614)(((fac_sh * sh(i, j)), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +614 format(10e12.5, ' sh') + write(13, 615) GElat0, GElon0, itizGE(imez, jmez), fcorDY(imez, jmez), & + 0.1d0 * pSND(1, 1), pstSND, & + GEddxx, zs_SL, zn_SL, zl_SL, dt, dx, ptopDY +615 format(6e12.5) + write(13, 616)(sigma(k), k=mzw1IO, mzw2IO, izw_IO) +616 format(8f12.8, ' s') + write(13, 617)(ugeoDY(1, 1, k), k=mzw1IO, mzw2IO, izw_IO) +617 format(8e12.5, ' ug') + write(13, 618)(vgeoDY(1, 1, k), k=mzw1IO, mzw2IO, izw_IO) +618 format(8e12.5, ' vg') + ! + + write(13, 619) itexpe * dt, jdaMAR, jhaMAR, & + mmarGE, jdarGE, jhurGE, minuGE, jsecGE +619 format(e12.5, 2i12, ' time - jdaMAR - jhaMAR', & + i5, '/', i2, i3, 'h', i2, 'm', i2, 's') + write(13, 620)(((uairDY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +620 format(10f12.6, ' u') + write(13, 621)(((vairDY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +621 format(10f12.6, ' v') + write(13, 622)((((wairDY(i, j, k)), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +622 format(10e12.5, ' w') + write(13, 623)((((tairDY(i, j, k)), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +623 format(10f12.6, ' T') + write(13, 624)((((gplvDY(i, j, k) * grvinv), & + i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +624 format(10f12.4, ' GPlev') + write(13, 625)(((qvDY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +625 format(10e12.5, ' qv ') + write(13, 627)((hmelSL(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +627 format(10e12.5, ' hmel') + write(13, 628)((pstDY(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +628 format(10f12.6, ' pstar') + write(13, 629)((tsrfSL(i, j, 1), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +629 format(10f12.6, ' tsrfSL') + write(13, 630)(((TUkvm(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +630 format(10f12.6, ' TUkvm') + write(13, 631)(((TUkvh(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +631 format(10f12.6, ' TUkvh') + write(13, 632)((SLuus(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +632 format(10f12.6, ' SLuus') + write(13, 633)((SLuts(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +633 format(10f12.6, ' SLuts') + write(13, 634)((SLuqs(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +634 format(10f12.9, ' SLuqs') + ! + + write(13, 636)(((ect_TE(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +636 format(10e12.5, ' ect_TE') + ! + +#if(PO) + write(13, 6370)((hatmPO(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +6370 format(10f12.2, ' H(atm) ') + write(13, 637)((hfraPO(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +637 format(10f12.6, ' Frazil') + write(13, 6380)((SLsrfl(i, j, 2), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +6380 format(10f12.6, ' Srf Wa ') + write(13, 6381)((aicePO(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +6381 format(10f12.6, ' A(ice) ') + write(13, 6382)((hicePO(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +6382 format(10f12.6, ' h(ice) ') + write(13, 6383)((hiavPO(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +6383 format(10f12.6, ' Hi avr.') +#endif + ! + + close(unit=13) + ! + + ! + + ! +--File cl_ddhhmm.LAB (Microphysics) + ! + ================================= + ! + + fnam(1:2) = 'cl' + open(unit=14, status='unknown', file=fnam) + rewind 14 + ! + + write(14, 641) - zext(turnHY), itexpe, jdarGE, jhurGE +641 format(4i12, ' turnHY - itexpe - jdarGE - jhurGE') + write(14, 642)(((qwHY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +642 format(10e12.5, ' qw') + write(14, 643)(((qiHY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +643 format(10e12.5, ' qi') + write(14, 644)(((qrHY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +644 format(10e12.5, ' qr') + write(14, 645)(((qsHY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +645 format(10e12.5, ' qs') + write(14, 646)((rainHY(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +646 format(10e12.5, ' rain') + write(14, 647)((snowHY(i, j), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO) +647 format(10e12.5, ' snow') + write(14, 648)(((hlatHY(i, j, k), i=mxw1IO, mxw2IO, ixw_IO), & + j=myw1IO, myw2IO, iyw_IO), & + k=mzw1IO, mzw2IO, izw_IO) +648 format(10e12.5, ' hlat') + ! + + close(unit=14) + ! + + ! + + ! +--RESET + ! + ===== + ! + +#if(OL) + do k = 1, mz + do j = 1, my + do i = 1, mx + uairDY(i, j, k) = urefOL(i, j, k) + tairDY(i, j, k) = trefOL(i, j, k) + gplvDY(i, j, k) = gplvOL(i, j, k) + enddo + enddo + enddo +#endif + ! + + return +endsubroutine OUTgks diff --git a/MAR/code_mar/outice.f90 b/MAR/code_mar/outice.f90 new file mode 100644 index 0000000000000000000000000000000000000000..22680c1b77f48903fe54bd48848cb7eb2039539e --- /dev/null +++ b/MAR/code_mar/outice.f90 @@ -0,0 +1,3273 @@ +subroutine OUTice + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT 28-11-2022 MAR | + ! | subroutine OUTice is used to initialize | + ! | and perform Ouput of Surface Mass Balance | + ! | (Netcdf files) | + ! | | + ! | CAUTION: the Estimation of the Optical Depth codIB is obsolescent | + ! | ^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_ra + use mar_sl + use mar_sv + use mar_tv + use mar_hy + use mar_ca + use marssn + use mar_ib + use marsib + use mar_wk + use mar_io + use mardsv + use mar_te + use mar_ao + use mar0sv + use trackwind, only: track_wind, itw, ntrackwind, delta_u, delta_v, & + name_wind, duIB, dvIB, delta_u_IBsave, delta_v_IBsave, & + track_dgz, ntrackdgz, delta_u_dgz, delta_v_dgz, & + name_dgz, dudgzIB, dvdgzIB, delta_u_dgz_IBsave, delta_v_dgz_IBsave + use trackwater, only: jtw, track_water, ntwater, delta_qv, & + name_water, dqvIB, delta_qv_IBsave + + implicit none + + INCLUDE 'NetCDF.inc' + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer Lfnam, Ltit, Luni, Lnam, Llnam + PARAMETER(Lfnam=40, Ltit=90, Luni=90, Lnam=13, Llnam=50) + ! +...Length of char strings + + integer NdimNC_ice + PARAMETER(NdimNC_ice=12) + ! +...Number of defined spatial dimensions (exact) + + integer MXdim + PARAMETER(MXdim=20000) + ! +...Maximum Number of all dims: recorded Time Steps + ! + and also maximum of spatial grid points for each direction. + + integer MX_var + PARAMETER(MX_var=200) + ! +...Maximum Number of Variables + ! + + integer NattNC_ice + PARAMETER(NattNC_ice=1) + ! +...Number of real attributes given to all variables + + real yearNC_ice(MXdim) + real dateNC_ice(MXdim) + real timeNC_ice(MXdim) + real VALdim(MXdim, 0:NdimNC_ice) + real tmp(3), tmp1z(mz), tmp2z(mz), tmp3, tmp4 + real znsn1(nsno + 1), znsn2(nsno + 1), snwae(nsno + 1) + real tmp1_OK, tmp2_OK, tmp3_OK, avlwc, factim + + real, allocatable :: xyllx1(:, :, :) + real, allocatable :: xyllx2(:, :, :) + real, allocatable :: xyllx3(:, :, :) + real, allocatable :: xyllx4(:, :, :) + real, allocatable :: xymi1(:, :, :) + real, allocatable :: xymi2(:, :, :) + real, allocatable :: xymi3(:, :, :) + real, allocatable :: xymi4(:, :, :) + real, allocatable :: xymi5(:, :, :) + real, allocatable :: xymi6(:, :, :) + real, allocatable :: xymi7(:, :, :) + real, allocatable :: xynsno1(:, :, :) + real, allocatable :: xynsno2(:, :, :) + real, allocatable :: xynsno3(:, :, :) + real, allocatable :: xynsno4(:, :, :) + real, allocatable :: xynsno5(:, :, :) + real, allocatable :: xynsno6(:, :, :) + real, allocatable :: xynsno7(:, :, :) + real, allocatable :: xynsno8(:, :, :) + real, allocatable :: xynsx0(:, :, :) + real, allocatable :: xynsx1(:, :, :) + real, allocatable :: xynsx2(:, :, :) + real, allocatable :: xynsx3(:, :, :) + real, allocatable :: xynsx4(:, :, :) + real, allocatable :: xynsx5(:, :, :) + real, allocatable :: xynsx6(:, :, :) + real, allocatable :: xynsx7(:, :, :) + real, allocatable :: xymlhh(:, :, :) + real, allocatable :: xynsx8(:, :, :) + real, allocatable :: xynsx9(:, :, :) + real, allocatable :: xynsx10(:, :, :) + real, allocatable :: xynsx11(:, :, :) + real, allocatable :: xynsx12(:, :, :) + real, allocatable :: xynsx13(:, :, :) + real, allocatable :: xynsx14(:, :, :) + + real depthsnow(nsno), depthSNo, dater + real pLev, pUp, pDown, pMiddle, distUp + real zLev, zUp, zDown, zMiddle + real q, qst, r, rst, rh, qsat0D,rh1,rh2 + real rhodz, phi, cphi, sphi + + integer nDFdim(0:NdimNC_ice) + integer NvatNC_ice(NattNC_ice) + integer dayNC_ice(MXdim) + integer monthNC_ice(MXdim), RCODE + integer n1000, n100a, n100, n10_a, n10, n1, m10 + integer n, jd10, jd1, nk, kk, nx + integer it, month, mill, iu + integer iSBLmx(mz), jSBLmx(mz) + integer ID__nc_ice, itotNC_ice, NtotNC_ice + integer dt_ICE, nbr_dt_ICE, dt_ICE2, index, njmo + integer kp, kz, kUp, kDown, kMiddle, OutdyIB0 + + character * (Lfnam) fnamNC_ice, fnamNC_ics, fnamNC_tmp + character * (Lnam) NAMdim(0:NdimNC_ice) + character * (Luni) UNIdim(0:NdimNC_ice) + character * (Lnam) SdimNC_ice(4, MX_var) + character * (Luni) unitNC_ice(MX_var) + character * (Lnam) nameNC_ice(MX_var) + character * (Llnam) lnamNC_ice(MX_var) + character * (Ltit) tit_NC_ice + character * (Lnam) NAMrat(NattNC_ice) + character * 120 tmpINP + character * 1 sector + integer(kind=8) date, date0 + integer iyrrIB, mmarIB, jdarIB, jhurIB, minuIB + + common / OUTice_r / yearNC_ice, dateNC_ice + common / OUTice_i / dt_ICE, dt_ICE2, nDFdim, OutdyIB0, & + iyrrIB, mmarIB, jdarIB, jhurIB, minuIB + common / OUTice_i8 / date, date0 + common / OUTice_c / fnamNC_ice, fnamNC_ics + + real rhh, num, den + integer i_hi, i_lo + real(kind=8) refrac_h, refrac_w + real p_hi, p_lo, z_hi, z_lo, kappa + + real, parameter :: k1p = 7.76e-7 + real, parameter :: k2p = 3.73e-3 + real, parameter :: Md = 28.9644 + real, parameter :: Mv = 18.0153 + real, parameter :: E = Mv / Md + + ! ! for having a ICS*.nc file with snapshots + ! ! when ICE*.nc is written + + logical, parameter :: snapshot = .false. + integer :: ss + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++ 1. Initialisation ++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + allocate(xyllx1(mx, my, llx)) + allocate(xyllx2(mx, my, llx)) + allocate(xyllx3(mx, my, llx)) + allocate(xyllx4(mx, my, llx)) + allocate(xymi1(mx, my, mi)) + allocate(xymi2(mx, my, mi)) + allocate(xymi3(mx, my, mi)) + allocate(xymi4(mx, my, mi)) + allocate(xymi5(mx, my, mi)) + allocate(xymi6(mx, my, mi)) + allocate(xymi7(mx, my, mi)) + allocate(xynsno1(mx, my, nsno)) + allocate(xynsno2(mx, my, nsno)) + allocate(xynsno3(mx, my, nsno)) + allocate(xynsno4(mx, my, nsno)) + allocate(xynsno5(mx, my, nsno)) + allocate(xynsno6(mx, my, nsno)) + allocate(xynsno7(mx, my, nsno)) + allocate(xynsno8(mx, my, nsno)) + allocate(xynsx0(mx, my, nsx)) + allocate(xynsx1(mx, my, nsx)) + allocate(xynsx2(mx, my, nsx)) + allocate(xynsx3(mx, my, nsx)) + allocate(xynsx4(mx, my, nsx)) + allocate(xynsx5(mx, my, nsx)) + allocate(xynsx6(mx, my, nsx)) + allocate(xynsx7(mx, my, nsx)) + allocate(xymlhh(mx, my, mlhh)) + allocate(xynsx8(mx, my, nsx)) + allocate(xynsx9(mx, my, nsx)) + allocate(xynsx10(mx, my, nsx)) + allocate(xynsx11(mx, my, nsx)) + allocate(xynsx12(mx, my, nsx)) + allocate(xynsx13(mx, my, nsx)) + allocate(xynsx14(mx, my, nsx)) + + ID__nc_ice = -1 ! NetCDF File is not open + + if(itexpe <= 1) then + do k = 1, nsx + do j = 1, my + do i = 1, mx + wei0IB(i, j, k) = 0. ! Bottom Ice added + wee_IB(i, j, k, :) = 0. ! Evapo/Sublimation + wem_IB(i, j, k) = 0. ! Melting + wer_IB(i, j, k) = 0. ! Refreezing + weu_IB(i, j, k) = 0. ! Run-off + weo_IB(i, j, k, :) = 0. ! Run-off + weacIB(i, j, k) = 0. + weerIB(i, j, k) = 0. + enddo + enddo + enddo + endif + + if(iterun <= 1) then + ! +--1.1 Initialization of all variables + ! + =================================== + ss = 0 + if(snapshot) ss = 1 +800 continue + + itrdIB = 0 + dt_ICE2 = 0 + timehIB = 0. + OutdyIB0 = min(1, max(0, OutdyIB - 1)) + iyrrIB = 0 + + do j = 1, my + do i = 1, mx + werr0IB(i, j) = 0. ! max(0.,rainHY(i,j)) + wesf0IB(i, j) = 0. ! max(0.,snowHY(i,j)) + wecp0IB(i, j) = 0. ! max(0.,rainCA(i,j)+snowCA(i,j)) + wero0IB(i, j) = max(0., runoTV(i, j)) + WKxy2(i, j) = 0. + do n = 1, nsx + WKxy2(i, j) = WKxy2(i, j) & + + SLsrfl(i, j, n) * snohSN(i, j, n) / 1000. + weh0IB(i, j, n) = 0. + enddo + ! wesf0IB(i, j) = wesf0IB(i, j) ! - WKxy2(i,j) no bluffer + prh0IB(i, j) = 0. + meh0IB(i, j) = 0. + suh0IB(i, j) = 0. + snfh0IB(i, j) = 0. + cph0IB(i, j) = 0. + ruh0IB(i, j) = 0. + swdIB(i, j) = 0. ! Shortwave incoming Radiation + swuIB(i, j) = 0. ! Shortwave outgoing Radiation + lwdIB(i, j) = 0. ! Longwave incoming Radiation + lwuIB(i, j) = 0. ! Longwave outgoing Radiation + swdtIB(i, j) = 0. ! TOA Shortwave incoming Radiation + swutIB(i, j) = 0. ! TOA Shortwave outgoing Radiation + lwutIB(i, j) = 0. ! TOA Longwave outgoing Radiation + sunIB(i, j) = 0. ! Sunshine + shfIB(i, j) = 0. ! Sensible Heat + lhfIB(i, j) = 0. ! Latent Heat + alIB(i, j) = 0. ! Albedo + as1_IB(i, j) = 0. ! Albedo + as2_IB(i, j) = 0. ! Albedo + as3_IB(i, j) = 0. ! Albedo + sicIB(i, j) = 0. ! Sea ice fraction + stIB(i, j) = 0. ! Surface Temperature + spIB(i, j) = 0. ! Surface Pressure + slpIB(i, j) = 0. ! Sea Surface Pressure + if(mw == 5) then + gradTIB(i, j) = 0. ! *CL* Local temp. gradient + gradQIB(i, j) = 0. ! *CL* Local hum. gradient + endif + ccIB(i, j) = 0. ! Cloud Cover + cuIB(i, j) = 0. ! Cloud Cover + cmIB(i, j) = 0. ! Cloud Cover + cdIB(i, j) = 0. ! Cloud Cover + codIB(i, j) = 0. ! Cloud Optical Depth + qwIB(i, j) = 0. ! Cloud Dropplets Concent + qiIB(i, j) = 0. ! Cloud Ice Crystals Concent. + qsIB(i, j) = 0. ! Cloud Snow Flakes Concent. + qrIB(i, j) = 0. ! Cloud Rain Concentration + wvpIB(i, j) = 0. ! Water Vapour Path / cCA old + cwpIB(i, j) = 0. ! Condensed Water Path / cCA old + iwpIB(i, j) = 0. ! Ice Water Path / cCA old + tcwvIB(i, j) = 0. ! Total column water vapor / cCA new + tclcIB(i, j) = 0. ! Total column liquid cloud / cCA new + tcicIB(i, j) = 0. ! Total column ice cloud / cCA new + tclpIB(i, j) = 0. ! Total column liquid precipitation / cCA new + tcipIB(i, j) = 0. ! Total column ice precipitation / cCA new + qbrIB(i, j) = 0. ! Snow ratio between kb level and surface + sicaoIB(i, j) = 0. ! SIC from OASIS + sitaoIB(i, j) = 0. !sea ice thickness + sntaoIB(i, j) = 0. !snow on sea ice thickness + if(mw == 5) then + mingrTIB(i, j) = 5. ! *CL* Maximum temp gradient the Day + maxgrTIB(i, j) = -5. ! *CL* Maximum temp gradient of the Day + mingrQIB(i, j) = 100. ! *CL* Maximum spec hum gradient the Day + maxgrQIB(i, j) = -100.! *CL* Maximum spec hum gradient of the Day + endif + pddIB(i, j) = 0. ! Positive degree day quantity + enddo + enddo + + do k = 1, nsx + do j = 1, my + do i = 1, mx + ! wet_IB : Total Mass Balance + wet_IB(i, j, k) = 0. + ! wec0IB : canopy water content + wec0IB(i, j, k) = CaWaTV(i, j, k) + ! wel0IB : soil water content + wel0IB(i, j, k) = 0. + ! wee_IB : Evapo/Subli + wee_IB(i, j, k, :) = 0. + wee0IB(i, j, k, :) = 0. + ! wem_IB : onlyMelting + wem_IB(i, j, k) = 0. + wem0IB(i, j, k) = 0. + ! weu_IB : run-off + weu_IB(i, j, k) = 0. + ! weo_IB : run-off + weo_IB(i, j, k, :) = 0. + weu0IB(i, j, k) = 0. + weo0IB(i, j, k, :) = 0. + ! wer_IB : Refreezing + wer_IB(i, j, k) = 0. + wer0IB(i, j, k) = 0. + wesw0IB(i, j, k) = max(0., SWaSNo(i, j, k)) + do kk = 1, ml + enddo + weacIB(i, j, k) = 0. + weerIB(i, j, k) = 0. + weac0IB(i, j, k) = 0. + weer0IB(i, j, k) = 0. + if(mw == 5) then + tt_intIB(i, j, k) = 0. !*CL* Interpolated temperature + qq_intIB(i, j, k) = 0. !*CL* Interpolated spec. hum. + endif + al1IB(i, j, k) = 0. ! Albedo + al2IB(i, j, k) = 0. ! Albedo + frvIB(i, j, k) = 0. ! ifratv + st2IB(i, j, k) = 0. ! Surface Temperature + z0IB(i, j, k) = 0. ! Roughness length for Moment. + r0IB(i, j, k) = 0. ! Roughness length for Heat + uusIB(i, j, k) = 0. ! Friction Velocity + uusthIB(i, j, k) = 0. ! Threshold Friction Velocity + utsIB(i, j, k) = 0. ! Sfc Pot. Tp. Turb. Flux + uqsIB(i, j, k) = 0. ! Water Vapor Flux + ussIB(i, j, k) = 0. ! Blowing Snow Flux + pblIB(i, j, k) = 0. ! Height of Boundary Layer (2) + zn4IB(i, j, k) = 0. ! snowheight change due to compaction + zn5IB(i, j, k) = 0. ! snowheight change due to melting + zn6IB(i, j, k) = 0. ! snowheight total + ! output from coupling + st2aoIB(i, j, k) = 0. !surface temperature from OASIS + albaoIB(i, j, k) = 0. !albedo from OASIS + txhIB0(i, j) = -99. ! Maximum Temp of the hour + tnhIB0(i, j) = 99. ! Minimum Temp of the hour + enddo + enddo + enddo + + do kk = 1, ml + do j = 1, my + do i = 1, mx + snf0IB(i, j, kk) = 0. ! atmospheric snowfall + sbl0IB(i, j, kk) = 0. ! atmospheric snowfall sublimation + qssbl0IB(i, j, kk) = 0. ! atmospehric sublimation ratio + dep0IB(i, j, kk) = 0. ! atmospheric snowfall condensation + rnf0IB(i, j, kk) = 0. ! atmospheric rainfall + evp0IB(i, j, kk) = 0. ! atmospheric rainfall evaporation + smt0IB(i, j, kk) = 0. ! int. snow mass transport + snf_IB(i, j, kk) = 0. ! atmospheric snowfall + sbl_IB(i, j, kk) = 0. ! atmospheric snowfall sublimation + qssbl_IB(i, j, kk) = 0. ! atmospheric sublimation ratio + dep_IB(i, j, kk) = 0. ! atmospheric snowfall condensation + rnf_IB(i, j, kk) = 0. ! atmospheric rainfall + evp_IB(i, j, kk) = 0. ! atmospheric rainfall evaporation + smt_IB(i, j, kk) = 0. ! integrated snow mass transport + mintIB(i, j, kk) = 99. ! Minimum Temp of the Day + maxtIB(i, j, kk) = -99. ! Maximum Temp of the Day + maxwIB(i, j, kk) = 0. ! Maximum wind of the Day + ttIB(i, j, kk) = 0. ! Temperature + tdIB(i, j, kk) = 0. ! Temperature + uuIB(i, j, kk) = 0. ! x-Wind Speed component + vvIB(i, j, kk) = 0. ! y-Wind Speed component + if(track_wind) then + do itw = 1, ntrackwind + duIB(i, j, kk, itw) = 0. ! delta_u in m s-2 + dvIB(i, j, kk, itw) = 0. ! delta_v in m s-2 + enddo + endif + if(track_dgz) then + do itw = 1, ntrackdgz + dudgzIB(i, j, kk, itw) = 0. ! delta_u_dgz in m s-2 + dvdgzIB(i, j, kk, itw) = 0. ! delta_v_dgz in m s-2 + enddo + endif + wwIB(i, j, kk) = 0. ! z-Wind Speed component + psigIB(i, j, kk) = 0. ! psigDY : p* X Vertical Wind Speed (in sigma coordinate) (kPa/s) + wsigIB(i, j, kk) = 0. ! wsigDY : Vertical Wind Speed (in sigma coordinate) (1/s) + uvIB(i, j, kk) = 0. ! Horizontal Wind Speed + ruuIB(i, j, kk) = 0. ! x-Wind Speed component (reg grid) + rvvIB(i, j, kk) = 0. ! y-Wind Speed component (reg grid) + ruvIB(i, j, kk) = 0. ! Horizontal Wind Speed (reg grid) + qqIB(i, j, kk) = 0. ! Specific Humidity + if(track_water) then + do jtw = 1, ntwater + dqvIB(i, j, kk, jtw) = 0. ! delta_qv in (g/kg) / hour + enddo + endif + rhodzIB(i, j, kk) = 0. ! rho x dz = dsigma x SP / g + rolvIB(i, j, kk) = 0. ! Air Density + rhIB(i, j, kk) = 0. ! Relative Humidity + zzIB(i, j, kk) = 0. ! Model Levels Height + tkeIB(i, j, kk) = 0. ! TKE + lqsIB(i, j, kk) = 0. ! Snow flakes content at first levels + lqiIB(i, j, kk) = 0. ! Ice flakes content at first levels + lqwIB(i, j, kk) = 0. ! Water flakes content at first levels + lqrIB(i, j, kk) = 0. ! Rain flakes content at first levels + qsbIB(i, j, kk) = 0. ! Sublimation of Qs + lsbIB(i, j, kk) = 0. ! Total Vertical Integration of LH (k=1) + LH + swn3DIB(i, j, kk) = 0. ! SW net per atm. level + lwn3DIB(i, j, kk) = 0. ! LW net per atm. level + swnc3DIB(i, j, kk) = 0.! Clear-sky SW net per atm. level + lwnc3DIB(i, j, kk) = 0.! Clear-sky LW net per atm. level + cod3DIB(i, j, kk) = 0. ! Cloud Optical Depth per atm. level + cc3DIB(i, j, kk) = 0. ! Cloud Cover per atm. level + ! tnh(i, j, kk) = tnhIB0(i, j) + ! txh(i, j, kk) = txhIB0(i, j) + enddo + enddo + enddo + + do kp = 1, mp + do j = 1, my + do i = 1, mx + nbpIB(i, j, kp) = 0 ! Count valid data on pressure levels + ttpIB(i, j, kp) = 0. ! Temperature + uupIB(i, j, kp) = 0. ! x-Wind Speed component + vvpIB(i, j, kp) = 0. ! y-Wind Speed component + wwpIB(i, j, kp) = 0. ! w-Wind Speed component + uvpIB(i, j, kp) = 0. ! Horizontal Wind Speed + qqpIB(i, j, kp) = 0. ! Specific Humidity + zzpIB(i, j, kp) = 0. ! Model Levels Height + enddo + enddo + enddo + + do kz = 1, mztq + do j = 1, my + do i = 1, mx + ttzIB(i, j, kz) = 0. ! Temperature + qqzIB(i, j, kz) = 0. ! Specific Humidity + enddo + enddo + enddo + + do kz = 1, mzuv + do j = 1, my + do i = 1, mx + uuzIB(i, j, kz) = 0. ! x-Wind Speed component + vvzIB(i, j, kz) = 0. ! y-Wind Speed component + u2zIB(i, j, kz) = 0. ! x-Wind Speed component + v2zIB(i, j, kz) = 0. ! y-Wind Speed component + uvzIB(i, j, kz) = 0. ! Horizontal Wind Speed + rozIB(i, j, kz) = 0. ! Air density + enddo + enddo + enddo + + do kk = 1, llx + do k = 1, nsx + do j = 1, my + do i = 1, mx + sltIB(i, j, k, kk) = 0 ! Soil Temperature + slqIB(i, j, k, kk) = 0 ! Soil Humidity Content + enddo + enddo + enddo + enddo + + do kk = 1, mi + do k = 1, nsx + do j = 1, my + do i = 1, mx + agIB(i, j, k, kk) = 0. ! Average ag + g1IB(i, j, k, kk) = 0. ! Average g1 + g2IB(i, j, k, kk) = 0. ! Average g2 + roIB(i, j, k, kk) = 0. ! Average ro + tiIB(i, j, k, kk) = 0. ! Average ti + waIB(i, j, k, kk) = 0. ! Avegage wa + enddo + enddo + enddo + enddo + + ! +--1.2 Output Netcdf Initialisation + ! + ================================ + + n1000 = 1 + iyrrGE / 1000 + n100a = mod(iyrrGE, 1000) + n100 = 1 + n100a / 100 + n10_a = mod(n100a, 100) + n10 = 1 + n10_a / 10 + n1 = 1 + mod(n10_a, 10) + m10 = 1 + mmarGE / 10 + m1 = 1 + mod(mmarGE, 10) + jd10 = 1 + jdarGE / 10 + jd1 = 1 + mod(jdarGE, 10) + + ! +--1.2.1 Output File Label + ! + ----------------------- + + fnamNC_ice = 'ICE.' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) & + //'.'//explIO & + //'.nc ' + + fnamNC_ics = 'ICS.' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) & + //'.'//explIO & + //'.nc ' + + fnamNC_tmp = fnamNC_ice + + if(snapshot .and. ss == 0) then + fnamNC_tmp = fnamNC_ics + endif + + ! +--1.2.3 Output Title + ! + ------------------ + + tit_NC_ice = 'ICE' & + //' - Exp: '//explIO & + //' - ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) + + ! +--1.2.4 Time Variable (hour) + ! + -------------------------- + + dt_ICE = 0 + nbr_dt_ICE = nterun * dt * OutdyIB / 86400 ! Nbr of Outputs + + nDFdim(0) = nbr_dt_ICE + nDFdim(0) = 0 + NAMdim(0) = 'time' + UNIdim(0) = 'HOURS since 1901-01-15 00:00:00' + + n1000 = 1 + iyr0GE / 1000 + n100a = mod(iyr0GE, 1000) + n100 = 1 + n100a / 100 + n10_a = mod(n100a, 100) + n10 = 1 + n10_a / 10 + n1 = 1 + mod(n10_a, 10) + m10 = 1 + mma0GE / 10 + m1 = 1 + mod(mma0GE, 10) + jd10 = 1 + jda0GE / 10 + jd1 = 1 + mod(jda0GE, 10) + + UNIdim(0) = 'MINUTES since ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1)//'-' & + //labnum(m10)//labnum(m1)//'-' & + //labnum(jd10)//labnum(jd1)//' 00:00:00' + + if(OutdyIB <= 24) & + UNIdim(0) = 'HOURS since ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1)//'-' & + //labnum(m10)//labnum(m1)//'-' & + //labnum(jd10)//labnum(jd1)//' 00:00:00' + + if(OutdyIB == 1) & + UNIdim(0) = 'DAYS since ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1)//'-' & + //labnum(m10)//labnum(m1)//'-' & + //labnum(jd10)//labnum(jd1)//' 00:00:00' + + if(nbr_dt_ICE > MXdim) & + STOP '*** OUTice - ERROR : MXdim to low ***' + + ! date = (351 +(iyrrGE -1902) *365 ! Nb Days before iyrrGE + ! . +(iyrrGE -1901) / 4 ! Nb Leap Years + ! . + njyrGE(mmarGE) ! Nb Days before mmarGE + ! . + njybGE(mmarGE) ! (including Leap Day) + ! . * max(0,1-mod(iyrrGE,4)) ! + ! . + jdarGE -1 )* 24 ! + ! . + jhurGE ! + ! . + (minuGE *60+jsecGE )/3600.! + + date = nint(real(itexpe) * dt / 60.) + if(OutdyIB <= 24) date = nint(real(itexpe) * dt / (3600.)) + if(OutdyIB == 1) date = nint(real(itexpe) * dt / (3600.*24.)) + date0 = date + + do it = 1, nbr_dt_ICE + ! Starting Time + timeNC_ice(it) = jhurGE + minuGE / 60.0 & + + jsecGE / 3600.0 & + + (it - 1) * 24.0 & + / real(max(OutdyIB, 1)) + ! values of dim.time + VALdim(it, 0) = date + (it - 1) * 24.0 / real(max(OutdyIB, 1)) + ! Time Variable + dateNC_ice(it) = timeNC_ice(it) + dayNC_ice(it) = jdarGE + timeNC_ice(it) / 24.0 + enddo + + month = mmarGE + mill = iyrrGE + do it = 1, nbr_dt_ICE + if(month == 2 .and. & + mod(mill, 4) == 0) then + njmo = njmoGE(month) + 1 + else + njmo = njmoGE(month) + endif + if(dayNC_ice(it) > njmo) then + do iu = it, nbr_dt_ICE + dayNC_ice(iu) = dayNC_ice(iu) - njmo + enddo + month = month + 1 + if(month > 12) then + month = 1 + mill = mill + 1 + endif + endif + monthNC_ice(it) = month + yearNC_ice(it) = mill + + if(dateNC_ice(it) > 24.0 - epsi) then + do iu = it, nbr_dt_ICE + dateNC_ice(iu) = mod(dateNC_ice(iu), 24.0) + enddo + endif + enddo + + do it = 1, nbr_dt_ICE + dateNC_ice(it) = dateNC_ice(it) & + + 1.d+2 * dayNC_ice(it) & + + 1.d+4 * monthNC_ice(it) & + + 1.d+6 * yearNC_ice(it) + enddo + + ! +--1.2.5 Define horizontal spatial dimensions + ! + ------------------------------------------ + + do i = 1, mx + VALdim(i, 1) = xxkm(i) + !VALdim(i,1) = xxkm2(i) ! true distance + enddo + nDFdim(1) = mx + NAMdim(1) = 'x' + UNIdim(1) = 'km' + + do j = 1, my + VALdim(j, 2) = yykm(j) + !VALdim(j,2) = yykm2(j) ! true distance + enddo + nDFdim(2) = my + NAMdim(2) = 'y' + UNIdim(2) = 'km' + + do k = 1, nsx + VALdim(k, 3) = k + enddo + nDFdim(3) = nsx + NAMdim(3) = 'sector' + UNIdim(3) = 'level' + + do k = 1, ml + VALdim(k, 4) = sigma(mz - k + 1) + dsigmaIB(k) = dsigm1(mz - k + 1) + enddo + nDFdim(4) = ml + NAMdim(4) = 'atmlay' + UNIdim(4) = 'sigma_level' + + do k = 1, mlhh + VALdim(k, 5) = k * (24./real(mlhh)) + enddo + nDFdim(5) = mlhh + NAMdim(5) = 'atmxh' + UNIdim(5) = 'hours' + + do k = 1, mi + VALdim(k, 6) = OutshIB(k) + enddo + nDFdim(6) = mi + NAMdim(6) = 'outlay' + UNIdim(6) = 'm' + + do k = 1, llx + VALdim(k, 7) = k + enddo + nDFdim(7) = llx + NAMdim(7) = 'sollay' + UNIdim(7) = 'layer' + + do k = 1, nsno + VALdim(k, 8) = k + enddo + nDFdim(8) = nsno + NAMdim(8) = 'snolay' + UNIdim(8) = 'layer' + + do k = 1, mp + VALdim(k, 9) = OutPLevIB(k) + enddo + nDFdim(9) = mp + NAMdim(9) = 'plev' + UNIdim(9) = 'hPa' + + do k = 1, mztq + VALdim(k, 10) = OutZTQLevIB(k) + enddo + nDFdim(10) = mztq + NAMdim(10) = 'ztqlev' + UNIdim(10) = 'm' + + do k = 1, mzuv + VALdim(k, 11) = OutZUVLevIB(k) + enddo + nDFdim(11) = mzuv + NAMdim(11) = 'zuvlev' + UNIdim(11) = 'm' + + if(mlb > ml) then + print *, "ERROR mlb > ml" + stop + endif + + do k = 1, mlb + VALdim(k, 12) = sigma(mz - k + 1) + enddo + nDFdim(12) = mlb + NAMdim(12) = 'blev' + UNIdim(12) = 'sigma_level' + + ! +--1.2.6 Variable's Choice (Table ICEvou.dat) + ! + ------------------------------------------ + + OPEN(unit=10, status='unknown', file='ICEvou.dat') + + itotNC_ice = 0 +980 continue + READ(10, '(A120)', end=990) tmpINP + if(tmpINP(1:4) == ' ') then + itotNC_ice = itotNC_ice + 1 + ! Name + ! Names of Selected Dimensions + ! (max.4/variable) + ! + ! + ! Units + ! Description of the variable + READ(tmpINP, '(4x,5A9,A12,A50)') & + nameNC_ice(itotNC_ice), & + SdimNC_ice(1, itotNC_ice), & + SdimNC_ice(2, itotNC_ice), & + SdimNC_ice(3, itotNC_ice), & + SdimNC_ice(4, itotNC_ice), & + unitNC_ice(itotNC_ice), & + lnamNC_ice(itotNC_ice) + + if(snapshot .and. ss == 0) then + if(nameNC_ice(itotNC_ice)(1:2) == "MB") itotNC_ice = itotNC_ice - 1 + if(nameNC_ice(itotNC_ice)(3:1) == "h") itotNC_ice = itotNC_ice - 1 + endif + + endif + GOTO 980 +990 continue + + CLOSE(unit=10) + + NtotNC_ice = itotNC_ice ! Total number of variables + ! + ! writen in NetCDF file. + + ! +--1.2.7 List of NetCDF attributes given to all variables + ! + ------------------------------------------------------ + + NAMrat(1) = 'actual_range' ! "actual_range" is (min,max) + NvatNC_ice(1) = 2 ! of all data for each variable + + if(NattNC_ice == 2) then + NAMrat(NattNC_ice) = '[var]_range' + NvatNC_ice(NattNC_ice) = 2 + endif + + ! +--1.2.8 Automatic Generation of the NetCDF File Structure + ! + ------------------------------------------------------- + + ! + ************** + call UNscreate(fnamNC_tmp, tit_NC_ice, & + NdimNC_ice, nDFdim, MXdim, & + NAMdim, UNIdim, VALdim, & + MX_var, NtotNC_ice, nameNC_ice, & + SdimNC_ice, unitNC_ice, lnamNC_ice, & + NattNC_ice, NAMrat, NvatNC_ice, & + ID__nc_ice) + ! + ************** + + print *, "Creation of "//trim(fnamNC_tmp) + + ! +--1.2.9 Computation of inital mass balance variables (at itexpe=0) + ! + ---------------------------------------------------------------- + + tmp2_OK = 1.0 + do j = jp11, my1 + do i = ip11, mx1 + do k = 1, nsx + tmp2_OK = min(tmp2_OK, & + max(zero, sign(unun, -mb0IB(i, j, k)))) + enddo + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + do k = 1, nsx + if(nssSNo(i, j, k) >= 1) then + znsn1(nssSNo(i, j, k)) = dzsSNo(i, j, k, nssSNo(i, j, k)) + snwae(nssSNo(i, j, k)) = rosSNo(i, j, k, nssSNo(i, j, k)) & + * dzsSNo(i, j, k, nssSNo(i, j, k)) & + * 1.e3 / ro_Wat & + * (1.+0.*wasSNo(i, j, k, nssSNo(i, j, k))) & + + SWaSNo(i, j, k) + do nk = nssSNo(i, j, k) - 1, 1, -1 + znsn1(nk) = dzsSNo(i, j, k, nk) + znsn1(nk + 1) + snwae(nk) = rosSNo(i, j, k, nk) * dzsSNo(i, j, k, nk) & + * 1.e3 / ro_Wat & + * (1 + 0.*wasSNo(i, j, k, nk)) & + + snwae(nk + 1) + enddo + tmp1_OK = max(0, sign(1, nisSNo(i, j, k) - 1)) + mb0IB(i, j, k) = tmp2_OK & + * (snwae(1) - snwae(nisSNo(i, j, k) + 1) * tmp1_OK) & + + (1.-tmp2_OK) * mb0IB(i, j, k) + zn0IB(i, j, k) = tmp2_OK & + * (znsn1(1) - znsn1(nisSNo(i, j, k) + 1) * tmp1_OK) & + + (1.-tmp2_OK) * zn0IB(i, j, k) + ! +... tmp1_OK = 1 if ice + ! + tmp2_OK = 0 if mb0IB is initialised + wet_IB(i, j, k) = snwae(1) + wet0IB(i, j, k) = snwae(1) + if(k == 1) smbh0IB(i, j) = snwae(1) + if(k == 1) swh0IB(i, j) = SWaSNo(i, j, k) + S_m_IB(i, j, k) = & + (snwae(1) - snwae(nisSNo(i, j, k) + 1) * tmp1_OK) + S_h_IB(i, j, k) = & + (znsn1(1) - znsn1(nisSNo(i, j, k) + 1) * tmp1_OK) + SIm_IB(i, j, k) = snwae(1) + SIh_IB(i, j, k) = znsn1(1) + + do nk = 1, nsno + zn6IB(i, j, k) = dzsSNo(i, j, k, nk) + zn6IB(i, j, k) + enddo + zn6IB(i, j, k) = zn6IB(i, j, k) - zn0IB(i, j, k) + + else + mb0IB(i, j, k) = 0. + zn0IB(i, j, k) = 0. + wet_IB(i, j, k) = 0. + wet0IB(i, j, k) = 0. + S_m_IB(i, j, k) = 0. + S_h_IB(i, j, k) = 0. + SIm_IB(i, j, k) = 0. + SIh_IB(i, j, k) = 0. + endif + xynsx1(i, j, k) = 1. ! 1. above 1st superimposed Ice Layer + SSh_IB(i, j, k) = 0. ! H (* without superimposed Ice) + enddo + enddo + enddo + + ! cCA todo : useful? + ! #if(EU) + ! zn0IB = 0. + ! mb0IB = 0. + ! #endif + + do kk = nsno, 1, -1 + do k = 1, nsx + do j = 1, my + do i = 1, mx + xynsx1(i, j, k) = xynsx1(i, j, k) & + * max(zero, sign(unun, 850.-rosSNo(i, j, k, kk))) + SSh_IB(i, j, k) = dzsSNo(i, j, k, kk) * xynsx1(i, j, k) & + + SSh_IB(i, j, k) + enddo + enddo + enddo + enddo + + ! +--1.2.10 Write Time - Constants + ! + ----------------------------- + + do j = 1, my + do i = 1, mx + Wkxy1(i, j) = GElonh(i, j) * 15.d0 ! Hour->degrees + WKxy2(i, j) = GElatr(i, j) / degrad ! rad ->degree + WKxy3(i, j) = real(mskSNo(i, j, 1)) ! REAL type + do k = 1, nsx + xynsx2(i, j, k) = real(mskSNo(i, j, k)) + enddo + WKxy4(i, j) = real(isolTV(i, j)) ! REAL type + WKxy5(i, j) = real(isolSL(i, j)) ! REAL type + enddo + enddo + + ! + ************ + call UNwrite(ID__nc_ice, 'LON', 1, mx, my, 1, Wkxy1) + call UNwrite(ID__nc_ice, 'LAT', 1, mx, my, 1, Wkxy2) + call UNwrite(ID__nc_ice, 'SH', 1, mx, my, 1, sh) + CALL UNwrite(ID__nc_ice, 'AREA', 1, mx, my, 1, area) + CALL UNwrite(ID__nc_ice, 'DX', 1, mx, my, 1, dx3 / 1000.) + CALL UNwrite(ID__nc_ice, 'DY', 1, mx, my, 1, dy3 / 1000.) + call UNwrite(ID__nc_ice, 'SLO', 1, mx, my, 1, slopGE) + call UNwrite(ID__nc_ice, 'dsigma', 1, ml, 1, 1, dsigmaIB) + + if(mw /= 5) then + call UNwrite(ID__nc_ice, 'MSK', 1, mx, my, 1, WKxy3) + else + call UNwrite(ID__nc_ice, 'MSK', 1, mx, my, nsx, xynsx2) + endif + + call UNwrite(ID__nc_ice, 'SOL', 1, mx, my, 1, Wkxy4) + call UNwrite(ID__nc_ice, 'SRF', 1, mx, my, 1, Wkxy5) + ! + ************ + + do k = 1, min(nvx, nsx) + do j = 1, my + do i = 1, mx + Wkxy1(i, j) = real(czenGE(i, j)) + WKxy2(i, j) = real(AlbSTV(i, j)) + xynsx1(i, j, k) = real(ivegTV(i, j, k)) + xynsx2(i, j, k) = real(ifraTV(i, j, k)) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + do k = 1, nsx + slqmIB(i, j, k) = 0 + slqcIB(i, j, k) = 0 + do kk = -nsol, 0 + slqmIB(i, j, k) = EtadSV(isolTV(i, j)) * 1000.*dzAvSV(kk) + slqmIB(i, j, k) + slqcIB(i, j, k) = Eta_TV(i, j, k, 1 - kk) * dzAvSV(kk) * ro_Wat + slqcIB(i, j, k) + enddo + wel0IB(i, j, k) = slqcIB(i, j, k) + enddo + enddo + enddo + + ! + ************ + call UNwrite(ID__nc_ice, 'CZ', 1, mx, my, 1, Wkxy1) + call UNwrite(ID__nc_ice, 'SAL', 1, mx, my, 1, WKxy2) + call UNwrite(ID__nc_ice, 'VEG', 1, mx, my, nsx, xynsx1) + call UNwrite(ID__nc_ice, 'FRV', 1, mx, my, nsx, xynsx2) + call UNwrite(ID__nc_ice, 'SLQM', 1, mx, my, nsx, slqmIB) + call NCSNC(ID__nc_ice, RCODE) + ! + ************ + + ! date = (351+(iyrrGE -1902) *365 ! Nb Days before iyrrGE + ! . +(iyrrGE -1901) / 4 ! Nb Leap Years + ! . + njyrGE(mmarGE) ! Nb Days before mmarGE + ! . + njybGE(mmarGE) ! (including Leap Day) + ! . * max(0,1-mod(iyrrGE,4)) ! + ! . + jdarGE -1 )* 24 ! + ! . + jhurGE ! + ! . + (0 *60 +0)/3600 ! + + date = nint(max(0., real(itexpe - 1)) * dt / 60.) + if(OutdyIB <= 24) date = nint(max(0., real(itexpe - 1)) * dt / (3600.)) + if(OutdyIB == 1) date = nint(max(0., real(itexpe - 1)) * dt / (3600.*24.)) + date0 = date + + print *, "OUTice Initialization BEGIN", ss + + write(6, 399) OutdyIB +399 format(" OUTice: nbr of outputs by day:", i3) + + write(6, 400) mz, mz - ml +400 format(" OUTice: sigma levels kept:", i3, ' => ', i3) + + write(6, 401) int(24./real(mlhh) * 60.) +401 format(" OUTice: x-hourly outputs every:", i5, " minutes") + + write(6, 402)(int(OutPLevIB(i)), i=mp, 1, -1) +402 format(" OUTice: Pressure levels:", 20i4) + + write(6, 403)(int(OutZTQLevIB(i)), i=1, mztq) +403 format(" OUTice: Height levels:", 20i4) + + write(6, 404)(OutshIB(i), i=1, mi) +404 format(" OUTice: Snow height levels:", 30f5.1) + + write(6, 405) nbr_call_outice +405 format(" OUTice: called every ", i2, " time steps in mar.f") + + print *, "OUTice Initialization END" + + if(snapshot .and. ss == 1) then + ss = 0 + goto 800 + endif + + ENDif ! Initialization + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++ 2. Every Time ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + ! +--2.1 Re-initialization + ! + ===================== + + ss = 0 + if(snapshot) ss = 1 + + fnamNC_tmp = fnamNC_ice + +801 continue + + if(dt_ICE2 == -1) then + + dt_ICE2 = 0 + timehIB = 0. + iyrrIB = 0 + + do j = 1, my + do i = 1, mx + swdIB(i, j) = 0. ! Shortwave incoming Radiation + swuIB(i, j) = 0. ! Shortwave outgoing Radiation + lwdIB(i, j) = 0. ! Longwave incoming Radiation + lwuIB(i, j) = 0. ! Longwave outgoing Radiation + swdtIB(i, j) = 0. ! TOA Shortwave incoming Radiation + swutIB(i, j) = 0. ! TOA Shortwave outgoing Radiation + lwutIB(i, j) = 0. ! TOA Longwave outgoing Radiation + sunIB(i, j) = 0. ! Sunshine + shfIB(i, j) = 0. ! Sensible Heat + lhfIB(i, j) = 0. ! Latent Heat + alIB(i, j) = 0. ! Albedo + as1_IB(i, j) = 0. ! Albedo + as2_IB(i, j) = 0. ! Albedo + as3_IB(i, j) = 0. ! Albedo + sicIB(i, j) = 0. ! Sea ice fraction + stIB(i, j) = 0. ! Surface Temperature + spIB(i, j) = 0. ! Surface Pressure + slpIB(i, j) = 0. ! Sea Surface Pressure + if(mw == 5) then + gradTIB(i, j) = 0. ! *CL* local temp. gradient + gradQIB(i, j) = 0. ! *CL* local hum. gradient + endif + ccIB(i, j) = 0. ! Cloud Cover + cuIB(i, j) = 0. ! Cloud Cover + cmIB(i, j) = 0. ! Cloud Cover + cdIB(i, j) = 0. ! Cloud Cover + codIB(i, j) = 0. ! Cloud Optical Depth + qwIB(i, j) = 0. ! Cloud Dropplets Concent + qiIB(i, j) = 0. ! Cloud Ice Crystals Concent. + qsIB(i, j) = 0. ! Cloud Snow Flakes Concent. + qrIB(i, j) = 0. ! Cloud Rain Concentration + wvpIB(i, j) = 0. ! Water Vapour Path / cCA old + cwpIB(i, j) = 0. ! Condensed Water Path / cCA old + iwpIB(i, j) = 0. ! Ice Water Path / cCA old + tcwvIB(i, j) = 0. ! Total column water vapor / cCA new + tclcIB(i, j) = 0. ! Total column liquid cloud / cCA new + tcicIB(i, j) = 0. ! Total column ice cloud / cCA new + tclpIB(i, j) = 0. ! Total column liquid precipitation / cCA new + tcipIB(i, j) = 0. ! Total column ice precipitation / cCA new + qbrIB(i, j) = 0. ! Snow ratio between kb level and surface + sicaoIB(i, j) = 0. ! SIC from OASIS + sitaoIB(i, j) = 0. ! sea ice thickness + sntaoIB(i, j) = 0. ! snow on sea ice thickness + if(mw == 5) then + mingrTIB(i, j) = 5. ! *CL* Maximum temp gradient the Day + maxgrTIB(i, j) = -5. ! *CL* Maximum temp gradient of the Day + mingrQIB(i, j) = 100. ! *CL* Maximum spec hum gradient the Day + maxgrQIB(i, j) = -100.! *CL* Maximum spec hum gradient of the Day + endif + pddIB(i, j) = 0. ! Positive degree day quantity + tnhIB0(i, j) = 99. ! Minimum Temp of the hour + txhIB0(i, j) = -99. ! Maximum Temp of the hour + enddo + enddo + + do k = 1, nsx + do j = 1, my + do i = 1, mx + al1IB(i, j, k) = 0. ! Albedo + al2IB(i, j, k) = 0. ! Albedo + frvIB(i, j, k) = 0. ! ifratv + st2IB(i, j, k) = 0. ! Surface Temperature + if(mw == 5) then + tt_intIB(i, j, k) = 0. ! *CL* Interpolated temperature + qq_intIB(i, j, k) = 0. ! *CL* Interpolated spec. hum. + endif + z0IB(i, j, k) = 0. ! Roughness length for Moment. + r0IB(i, j, k) = 0. ! Roughness length for Heat + uusIB(i, j, k) = 0. ! Friction Velocity + uusthIB(i, j, k) = 0. ! Threshold Friction Velocity + utsIB(i, j, k) = 0. ! Sfc Pot. Tp. Turb. Flux + uqsIB(i, j, k) = 0. ! Water Vapor Flux + ussIB(i, j, k) = 0. ! Blowing Snow Flux + pblIB(i, j, k) = 0. ! Height of Boundary Layer (2) + zn4IB(i, j, k) = 0. ! snowheight change due to compaction + zn5IB(i, j, k) = 0. ! snowheight change due to melting + ! output from coupling + st2aoIB(i, j, k) = 0. ! surface temperature from OASIS + albaoIB(i, j, k) = 0. ! albedo from OASIS + enddo + enddo + enddo + + do kk = 1, ml + do j = 1, my + do i = 1, mx + mintIB(i, j, kk) = 60. ! Minimum Temp of the Day + maxtIB(i, j, kk) = -60. ! Maximum Temp of the Day + maxwIB(i, j, kk) = 0. ! Maximum Wind of the Day + ttIB(i, j, kk) = 0. ! Temperature + tdIB(i, j, kk) = 0. ! Temperature + uuIB(i, j, kk) = 0. ! x-Wind Speed component + vvIB(i, j, kk) = 0. ! y-Wind Speed component + if(track_wind) then + do itw = 1, ntrackwind + duIB(i, j, kk, itw) = 0. ! delta_u in m s-2 + dvIB(i, j, kk, itw) = 0. ! delta_v in m s-2 + enddo + endif + if(track_dgz) then + do itw = 1, ntrackdgz + dudgzIB(i, j, kk, itw) = 0. ! delta_u_dgz in m s-2 + dvdgzIB(i, j, kk, itw) = 0. ! delta_v_dgz in m s-2 + enddo + endif + wwIB(i, j, kk) = 0. ! w-Wind Speed component + psigIB(i, j, kk) = 0. ! psigDY : p* X Vertical Wind Speed (in sigma coordinate) (kPa/s) + wsigIB(i, j, kk) = 0. ! wsigDY : Vertical Wind Speed (in sigma coordinate) (1/s) + uvIB(i, j, kk) = 0. ! Horizontal Wind Speed + ruuIB(i, j, kk) = 0. ! x-Wind Speed component (reg grid) + rvvIB(i, j, kk) = 0. ! y-Wind Speed component (reg grid) + ruvIB(i, j, kk) = 0. ! Horizontal Wind Speed (reg grid) + qqIB(i, j, kk) = 0. ! Specific Humidity + if(track_water) then + do jtw = 1, ntwater + dqvIB(i, j, kk, jtw) = 0. ! delta_qv in (g/kg) / hour + enddo + endif + rhodzIB(i, j, kk) = 0. ! rho x dz = dsigma x SP / g + rolvIB(i, j, kk) = 0. ! Air Density + rhIB(i, j, kk) = 0. ! Relative Humidity + zzIB(i, j, kk) = 0. ! Model Levels Height + tkeIB(i, j, kk) = 0. ! TKE + lqsIB(i, j, kk) = 0. ! Snow flakes content at first levels + lqiIB(i, j, kk) = 0. ! Ice flakes content at first levels + lqrIB(i, j, kk) = 0. ! Rain flakes content at first levels + lqwIB(i, j, kk) = 0. ! Water flakes content at first levels + qsbIB(i, j, kk) = 0. ! Sublimation of Qs + lsbIB(i, j, kk) = 0. ! Total Vertical Integration of LH (k=1) + LH + swn3DIB(i, j, kk) = 0. ! SW net per atm. level + lwn3DIB(i, j, kk) = 0. ! LW net per atm. level + swnc3DIB(i, j, kk) = 0. ! Clear-sky SW net per atm. level + lwnc3DIB(i, j, kk) = 0. ! Clear-sky LW net per atm. level + cod3DIB(i, j, kk) = 0. ! Cloud Optical Depth per atm. level + cc3DIB(i, j, kk) = 0. ! Cloud Cover per atm. level + enddo + enddo + enddo + + do kp = 1, mp + do j = 1, my + do i = 1, mx + nbpIB(i, j, kp) = 0 ! Count valid data on pressure levels + ttpIB(i, j, kp) = 0. ! Temperature + uupIB(i, j, kp) = 0. ! x-Wind Speed component + vvpIB(i, j, kp) = 0. ! y-Wind Speed component + wwpIB(i, j, kp) = 0. ! w-Wind Speed component + uvpIB(i, j, kp) = 0. ! Horizontal Wind Speed + qqpIB(i, j, kp) = 0. ! Specific Humidity + zzpIB(i, j, kp) = 0. ! Model Levels Height + enddo + enddo + enddo + + do kz = 1, mztq + do j = 1, my + do i = 1, mx + ttzIB(i, j, kz) = 0. ! Temperature + rhzIB(i, j, kz) = 0. ! Temperature + qqzIB(i, j, kz) = 0. ! Specific Humidity + enddo + enddo + enddo + + do kz = 1, mzuv + do j = 1, my + do i = 1, mx + uuzIB(i, j, kz) = 0. ! x-Wind Speed component + vvzIB(i, j, kz) = 0. ! y-Wind Speed component + u2zIB(i, j, kz) = 0. ! x-Wind Speed component + v2zIB(i, j, kz) = 0. ! y-Wind Speed component + uvzIB(i, j, kz) = 0. ! Horizontal Wind Speed + rozIB(i, j, kz) = 0. ! Air density + enddo + enddo + enddo + + do kk = 1, llx + do k = 1, nsx + do j = 1, my + do i = 1, mx + sltIB(i, j, k, kk) = 0 ! Soil Temperature + slqIB(i, j, k, kk) = 0 ! Soil Humidity Content + enddo + enddo + enddo + enddo + + do kk = 1, mi + do k = 1, nsx + do j = 1, my + do i = 1, mx + agIB(i, j, k, kk) = 0. ! Average ag + g1IB(i, j, k, kk) = 0. ! Average g1 + g2IB(i, j, k, kk) = 0. ! Average g2 + roIB(i, j, k, kk) = 0. ! Average ro + tiIB(i, j, k, kk) = 0. ! Average ti + waIB(i, j, k, kk) = 0. ! Avegage wa + enddo + enddo + enddo + enddo + endif + + ! +--2.2 Putting Values in Matrices + ! + ============================== + + dt_ICE2 = dt_ICE2 + 1 + + ! +--2.2.1 Atmospheric variables + ! + --------------------------- + + if(nsx < 2) then + print *, "mw <2!!!!" + stop + endif + + !$OMP PARALLEL do default(shared) & + !$OMP private(i,j,k,kz,zDown,zLev,distUp,kUp,kDown,kMiddle, & + !$OMP zMiddle,zUp,pDown,pLev,pMiddle,kk,q,qst,r,rst,rh1,rh2, & + !$OMP rh,tmp1z,tmp2z,tmp3,tmp4,nk,depthsnow,tmp,phi,cphi,sphi) + do j = 1, my + do i = 1, mx + qbrIB(i, j) = qbrIB(i, j) + qbs_HY(i, j) + if(mw == 5) then + maxgrTIB(i, j) = max(gradTM(i, j), maxgrTIB(i, j)) ! *CL* + mingrTIB(i, j) = min(gradTM(i, j), mingrTIB(i, j)) ! *CL* + maxgrQIB(i, j) = max(gradQM(i, j), maxgrQIB(i, j)) ! *CL* + mingrQIB(i, j) = min(gradQM(i, j), mingrQIB(i, j)) ! *CL* + endif + + do k = 1, mz + phi = (-1.) * (gelonh(i, j) * 15.+90.-GEddxx) * degrad + cphi = cos(-phi) + sphi = sin(-phi) + rotuuIB(i, j, k) = cphi * uairDY(i, j, k) - sphi * vairDY(i, j, k) + rotvvIB(i, j, k) = sphi * uairDY(i, j, k) + cphi * vairDY(i, j, k) + enddo + + do kk = 1, ml + + q = qvDY(i, j, mz - kk + 1) + qst = qsat0D(tairDY(i, j, mz - kk + 1), & + sigma(mz - kk + 1), pstDY(i, j), ptopDY, 1) + + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + + rh = (r / (0.622 + r)) & + / max(epsi,(rst / (0.622 + rst))) * 100. + rh = max(0., min(100., rh)) + tdIB(i, j, kk) = tdIB(i, j, kk) + & + 243.5 * & + (log(rh / 100.) & + + ((17.67 * (tairDY(i, j, mz - kk + 1) - TfSnow)) & + / (243.5 + (tairDY(i, j, mz - kk + 1) - TfSnow)))) / & + (17.67 - Log(rh / 100.) & + - ((17.67 * (tairDY(i, j, mz - kk + 1) - TfSnow)) & + / (243.5 + (tairDY(i, j, mz - kk + 1) - TfSnow)))) + + mintIB(i, j, kk) = min(tairDY(i, j, mz - kk + 1) - TfSnow, & + mintIB(i, j, kk)) + maxtIB(i, j, kk) = max(tairDY(i, j, mz - kk + 1) - TfSnow, & + maxtIB(i, j, kk)) + + maxwIB(i, j, kk) = max( & + (uairDY(i, j, mz - kk + 1)**2 + vairDY(i, j, mz - kk + 1)**2)**0.5, & + maxwIB(i, j, kk)) + ttIB(i, j, kk) = ttIB(i, j, kk) + tairDY(i, j, mz - kk + 1) - TfSnow + uuIB(i, j, kk) = uuIB(i, j, kk) + uairDY(i, j, mz - kk + 1) + vvIB(i, j, kk) = vvIB(i, j, kk) + vairDY(i, j, mz - kk + 1) + if(track_wind) then + do itw = 1, ntrackwind + ! duIB and dvIB in (m s-1) / h : delta wind by hour + duIB(i, j, kk, itw) = duIB(i, j, kk, itw) + & + (delta_u(i, j, mz - kk + 1, itw) - & + delta_u_IBsave(i, j, mz - kk + 1, itw)) / dt * 3600. + dvIB(i, j, kk, itw) = dvIB(i, j, kk, itw) + & + (delta_v(i, j, mz - kk + 1, itw) - & + delta_v_IBsave(i, j, mz - kk + 1, itw)) / dt * 3600. + delta_u_IBsave(i, j, mz - kk + 1, itw) = delta_u(i, j, mz - kk + 1, itw) + delta_v_IBsave(i, j, mz - kk + 1, itw) = delta_v(i, j, mz - kk + 1, itw) + enddo + endif + if(track_dgz) then + do itw = 1, ntrackdgz + ! dudgzIB and dvdgzIB in (m s-1) / h : delta wind by hour + dudgzIB(i, j, kk, itw) = dudgzIB(i, j, kk, itw) + & + (delta_u_dgz(i, j, mz - kk + 1, itw) & + - delta_u_dgz_IBsave(i, j, mz - kk + 1, itw)) / & + dt * 3600. + dvdgzIB(i, j, kk, itw) = dvdgzIB(i, j, kk, itw) + & + (delta_v_dgz(i, j, mz - kk + 1, itw) - & + delta_v_dgz_IBsave(i, j, mz - kk + 1, itw)) / & + dt * 3600. + delta_u_dgz_IBsave(i, j, mz - kk + 1, itw) = delta_u_dgz(i, j, mz - kk + 1, itw) + delta_v_dgz_IBsave(i, j, mz - kk + 1, itw) = delta_v_dgz(i, j, mz - kk + 1, itw) + enddo + endif + uvIB(i, j, kk) = uvIB(i, j, kk) + & + (uairDY(i, j, mz - kk + 1)**2 + vairDY(i, j, mz - kk + 1)**2)**0.5 + wwIB(i, j, kk) = wwIB(i, j, kk) + wairDY(i, j, mz - kk + 1) + psigIB(i, j, kk) = psigIB(i, j, kk) + psigDY(i, j, mz - kk + 1) + wsigIB(i, j, kk) = wsigIB(i, j, kk) + wsigDY(i, j, mz - kk + 1) + + ruuIB(i, j, kk) = ruuIB(i, j, kk) + rotuuIB(i, j, mz - kk + 1) + rvvIB(i, j, kk) = rvvIB(i, j, kk) + rotvvIB(i, j, mz - kk + 1) + ruvIB(i, j, kk) = ruvIB(i, j, kk) + & + (rotuuIB(i, j, mz - kk + 1)**2 + rotvvIB(i, j, mz - kk + 1)**2)**0.5 + + qqIB(i, j, kk) = qqIB(i, j, kk) + qvDY(i, j, mz - kk + 1) * 1000. + + if(track_water) then + do jtw = 1, ntwater + ! dqvIB in (g/kg) / h : delta qv by hour + dqvIB(i, j, kk, jtw) = dqvIB(i, j, kk, jtw) + & + (delta_qv(i, j, mz - kk + 1, jtw) - delta_qv_IBsave(i, j, mz - kk + 1, jtw)) / & + dt * 3600.*1000. + delta_qv_IBsave(i, j, mz - kk + 1, jtw) = delta_qv(i, j, mz - kk + 1, jtw) + enddo + endif + + ! rhodz : rho dz = dp / g = dsigma * SP / g (kg m-2) + ! rhodz : *1000 : kPa -> Pa + rhodzIB(i, j, kk) = rhodzIB(i, j, kk) + dsigmaIB(kk) * (pstDY(i, j) + ptopDY) * 1000.*grvinv + rolvIB(i, j, kk) = rolvIB(i, j, kk) + rolvDY(i, j, mz - kk + 1) * 1000. + rhIB(i, j, kk) = rhIB(i, j, kk) + rh + zzIB(i, j, kk) = zzIB(i, j, kk) + gplvDY(i, j, mz - kk + 1) * grvinv + tkeIB(i, j, kk) = tkeIB(i, j, kk) + ect_TE(i, j, mz - kk + 1) + lqsIB(i, j, kk) = lqsIB(i, j, kk) + qsHY(i, j, mz - kk + 1) * 1000. + lqiIB(i, j, kk) = lqiIB(i, j, kk) + qiHY(i, j, mz - kk + 1) * 1000. + lqrIB(i, j, kk) = lqrIB(i, j, kk) + qrHY(i, j, mz - kk + 1) * 1000. + lqwIB(i, j, kk) = lqwIB(i, j, kk) + qwHY(i, j, mz - kk + 1) * 1000. + qsbIB(i, j, kk) = qsbIB(i, j, kk) + hsubHY(i, j, mz - kk + 1) * 1000. + lsbIB(i, j, kk) = lsbIB(i, j, kk) + hlatHY(i, j, mz - kk + 1) + swn3DIB(i, j, kk) = swn3DIB(i, j, kk) + RAfnSO(i, j, mz - kk + 1) + lwn3DIB(i, j, kk) = lwn3DIB(i, j, kk) + RAfnIR(i, j, mz - kk + 1) + swnc3DIB(i, j, kk) = swnc3DIB(i, j, kk) + RAfncSO(i, j, mz - kk + 1) + lwnc3DIB(i, j, kk) = lwnc3DIB(i, j, kk) + RAfncIR(i, j, mz - kk + 1) + + ! !Cloud variables + cc3DIB(i, j, kk) = cc3DIB(i, j, kk) + CldFRA(i, j, mz - kk + 1) + do k = 1, 3 + tmp(k) = 0.0 + enddo + tmp(3) = (pstDY(i, j) * sigma(mz - kk + 1) + ptopDY) & + / (ra * tairDY(i, j, mz - kk + 1) & + * (1.+.608 * qvDY(i, j, mz - kk + 1))) & + * (gpmiDY(i, j, mz - kk + 1) - gpmiDY(i, j, mz - kk + 1 + 1)) + tmp(1) = tmp(3) * qwHY(i, j, mz - kk + 1) + tmp(2) = tmp(3) * qiHY(i, j, mz - kk + 1) + cod3DIB(i, j, kk) = 1.5 * (tmp(1) / 20.d-6 & + + tmp(2) / 40.d-6) * grvinv & + + cod3DIB(i, j, kk) + enddo + + do kk = 1, mz + tmp1z(kk) = ect_TE(i, j, kk) + tmp2z(kk) = gplvDY(i, j, kk) * grvinv - sh(i, j) + enddo + + ! + ************ + call PBLtop(tmp1z, tmp2z, tmp3, tmp4) + ! + ************ + + pblIB(i, j, 1) = pblIB(i, j, 1) + tmp3 + pblIB(i, j, 2) = pblIB(i, j, 2) + tmp4 + + spIB(i, j) = spIB(i, j) + pstDY(i, j) * 10. ! kPa -> hPa + + if(mw == 5) then + gradTIB(i, j) = gradTIB(i, j) + gradTM(i, j) !*CL* + gradQIB(i, j) = gradQIB(i, j) + gradQM(i, j) !*CL* + do k = 1, nsx + tt_intIB(i, j, k) = tt_intIB(i, j, k) - TfSnow + tairDY_int(i, j, k) !*CL* + qq_intIB(i, j, k) = qq_intIB(i, j, k) + qvDY_int(i, j, k) * 1000. !*CL* + enddo + endif + + enddo + ! end do + + ! +--2.2.3 Atmospheric variables on pressure levels + ! + ---------------------------------------------- + + ! do j=1,my + do i = 1, mx + pDown = (pstDY(i, j) * sigma(mz) + ptopDY) * 10 + do kp = 1, mp + pLev = OutPLevIB(kp) + if(pLev <= pDown) then + nbpIB(i, j, kp) = nbpIB(i, j, kp) + 1 + kUp = 1 + kDown = mz + do WHILE(kDown - kUp > 1) + kMiddle = (kDown + kUp) / 2 + pMiddle = (pstDY(i, j) * sigma(kMiddle) + & + ptopDY) * 10 + if(pMiddle >= pLev) then + kDown = kMiddle + else + kUp = kMiddle + endif + enddo + pUp = (pstDY(i, j) * sigma(kUp) + ptopDY) * 10 + pDown = (pstDY(i, j) * sigma(kDown) + ptopDY) * 10 + distUp = (pLev - pUp) / (pDown - pUp) + tairDYp(i, j, kp) = distUp * tairDY(i, j, kDown) + & + (1 - distUp) * tairDY(i, j, kUp) + qvDYp(i, j, kp) = distUp * qvDY(i, j, kDown) + & + (1 - distUp) * qvDY(i, j, kUp) + gplvDYp(i, j, kp) = distUp * gplvDY(i, j, kDown) + & + (1 - distUp) * gplvDY(i, j, kUp) + uairDYp(i, j, kp) = distUp * uairDY(i, j, kDown) + & + (1 - distUp) * uairDY(i, j, kUp) + vairDYp(i, j, kp) = distUp * vairDY(i, j, kDown) + & + (1 - distUp) * vairDY(i, j, kUp) + wairDYp(i, j, kp) = distUp * wairDY(i, j, kDown) + & + (1 - distUp) * wairDY(i, j, kUp) + ! ! sum for the output + ttpIB(i, j, kp) = ttpIB(i, j, kp) + & + tairDYp(i, j, kp) - TfSnow + qqpIB(i, j, kp) = qqpIB(i, j, kp) + & + qvDYp(i, j, kp) * 1000. + zzpIB(i, j, kp) = zzpIB(i, j, kp) + & + gplvDYp(i, j, kp) * grvinv + uupIB(i, j, kp) = uupIB(i, j, kp) + uairDYp(i, j, kp) + vvpIB(i, j, kp) = vvpIB(i, j, kp) + vairDYp(i, j, kp) + wwpIB(i, j, kp) = wwpIB(i, j, kp) + wairDYp(i, j, kp) + uvpIB(i, j, kp) = uvpIB(i, j, kp) + & + (uairDYp(i, j, kp)**2 + vairDY(i, j, kp)**2)**0.5 + endif + enddo + enddo + ! end do + + ! +--2.2.4 Atmospheric variables on heigth levels (z) + ! + ------------------------------------------------ + + ! +--2.2.4.1 Temperature + + ! do j=1,my + do i = 1, mx + zDown = gplvDY(i, j, mz) * grvinv - sh(i, j) + do kz = 1, mztq + zLev = OutZTQLevIB(kz) + if(zLev < zDown) then + distUp = (zDown - zLev) / zDown + ttzIB_0(i, j, kz) = distUp * tairSL(i, j) + & + (1 - distUp) * tairDY(i, j, mz) + qqzIB_0(i, j, kz) = distUp * qvapSL(i, j) + & + (1 - distUp) * qvDY(i, j, mz) + ppzIB_0(i, j, kz) = (pstDY(i, j) & + * sigma(kUp) + ptopDY) * 10 + + q = qvapSL(i, j) + qst = qsat0D(tairSL(i, j), & + 1., pstDY(i, j), ptopDY, 1) + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + rh = (r / (0.622 + r)) & + / max(epsi,(rst / (0.622 + rst))) * 100. + rh1 = max(0., min(100., rh)) + + q = qvDY(i, j, mz) + qst = qsat0D(tairDY(i, j, mz), & + sigma(mz), pstDY(i, j), ptopDY, 1) + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + rh = (r / (0.622 + r)) & + / max(epsi,(rst / (0.622 + rst))) * 100. + rh2 = max(0., min(100., rh)) + + rhzIB_0(i, j, kz) = distUp * rh1 + & + (1 - distUp) * rh2 + + else + kUp = 1 + kDown = mz + do WHILE(kDown - kUp > 1) + kMiddle = (kDown + kUp) / 2 + zMiddle = gplvDY(i, j, kMiddle) * grvinv - sh(i, j) + if(zMiddle <= zLev) then + kDown = kMiddle + else + kUp = kMiddle + endif + enddo + zUp = gplvDY(i, j, kUp) * grvinv - sh(i, j) + zDown = gplvDY(i, j, kDown) * grvinv - sh(i, j) + distUp = (zUp - zLev) / (zUp - zDown) + ttzIB_0(i, j, kz) = distUp * tairDY(i, j, kDown) + & + (1 - distUp) * tairDY(i, j, kUp) + qqzIB_0(i, j, kz) = distUp * qvDY(i, j, kDown) + & + (1 - distUp) * qvDY(i, j, kUp) + ppzIB_0(i, j, kz) = distUp * & + (pstDY(i, j) * sigma(kDown) + ptopDY) * 10 & + + (1 - distUp) * & + (pstDY(i, j) * sigma(kUp) + ptopDY) * 10 + + + q = qvDY(i, j, kDown) + qst = qsat0D(tairDY(i, j, kDown), & + sigma(kDown), pstDY(i, j), ptopDY, 1) + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + rh = (r / (0.622 + r)) & + / max(epsi,(rst / (0.622 + rst))) * 100. + rh1 = max(0., min(100., rh)) + + q = qvDY(i, j, kUp) + qst = qsat0D(tairDY(i, j, kUp), & + sigma(kUp), pstDY(i, j), ptopDY, 1) + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + rh = (r / (0.622 + r)) & + / max(epsi,(rst / (0.622 + rst))) * 100. + rh2 = max(0., min(100., rh)) + + rhzIB_0(i, j, kz) = distUp * rh1 + & + (1 - distUp) * rh2 + + + endif + ! ! sum for the output + ttzIB(i, j, kz) = ttzIB(i, j, kz) + & + ttzIB_0(i, j, kz) - TfSnow + qqzIB(i, j, kz) = qqzIB(i, j, kz) + & + qqzIB_0(i, j, kz) * 1000. + rhzIB(i, j, kz) = rhzIB(i, j, kz) + & + rhzIB_0(i, j, kz) + enddo + enddo + ! end do + + ! +--2.2.4.2 Wind + ! do j=1,my + do i = 1, mx + zDown = gplvDY(i, j, mz) * grvinv - sh(i, j) + do kz = 1, mzuv + zLev = OutZUVLevIB(kz) + if(zLev < zDown) then + distUp = (zDown - zLev) / zDown + uuzIB_0(i, j, kz) = distUp * 0.+ & + (1 - distUp) * uairDY(i, j, mz) + vvzIB_0(i, j, kz) = distUp * 0.+ & + (1 - distUp) * vairDY(i, j, mz) + u2zIB_0(i, j, kz) = distUp * 0.+(1 - distUp) * rotuuIB(i, j, mz) + v2zIB_0(i, j, kz) = distUp * 0.+(1 - distUp) * rotvvIB(i, j, mz) + rozIB_0(i, j, kz) = distUp * 0.+ & + (1 - distUp) * rolvDY(i, j, mz) + else + kUp = 1 + kDown = mz + do WHILE(kDown - kUp > 1) + kMiddle = (kDown + kUp) / 2 + zMiddle = gplvDY(i, j, kMiddle) * grvinv - sh(i, j) + if(zMiddle <= zLev) then + kDown = kMiddle + else + kUp = kMiddle + endif + enddo + zUp = gplvDY(i, j, kUp) * grvinv - sh(i, j) + zDown = gplvDY(i, j, kDown) * grvinv - sh(i, j) + distUp = (zUp - zLev) / (zUp - zDown) + uuzIB_0(i, j, kz) = distUp * uairDY(i, j, kDown) + & + (1 - distUp) * uairDY(i, j, kUp) + vvzIB_0(i, j, kz) = distUp * vairDY(i, j, kDown) + & + (1 - distUp) * vairDY(i, j, kUp) + u2zIB_0(i, j, kz) = distUp * rotuuIB(i, j, kDown) + & + (1 - distUp) * rotuuIB(i, j, kUp) + v2zIB_0(i, j, kz) = distUp * rotvvIB(i, j, kDown) + & + (1 - distUp) * rotvvIB(i, j, kUp) + rozIB_0(i, j, kz) = distUp * rolvDY(i, j, kDown) + & + (1 - distUp) * rolvDY(i, j, kUp) + endif + ! ! sum for the output + uuzIB(i, j, kz) = uuzIB(i, j, kz) + uuzIB_0(i, j, kz) + vvzIB(i, j, kz) = vvzIB(i, j, kz) + vvzIB_0(i, j, kz) + u2zIB(i, j, kz) = u2zIB(i, j, kz) + u2zIB_0(i, j, kz) + v2zIB(i, j, kz) = v2zIB(i, j, kz) + v2zIB_0(i, j, kz) + uvzIB(i, j, kz) = uvzIB(i, j, kz) + & + (uuzIB_0(i, j, kz)**2.+vvzIB_0(i, j, kz)**2.)**0.5 + rozIB(i, j, kz) = rozIB(i, j, kz) + rozIB_0(i, j, kz) * 1000. + enddo + enddo + ! end do + + ! +--2.2.4.3 sea level pressure + ! do j=1,my + do i = 1, mx + + ! ! vertical gradiant between mz-15 and mz-10 + ! zUp = gplvDY(i,j,mz-15) * grvinv + ! zDown = gplvDY(i,j,mz-10) * grvinv + + ! tmp3= + ! . (tairDY(i,j,mz-10)-tairDY(i,j,mz-15))/ + ! . (zup - zDown) + ! tmp3=max(0.005,min(0.01,tmp3)) + tmp3 = 0.0065 ! standard gradiant + + slpIB(i, j) = slpIB(i, j) + & + (pstDY(i, j) * sigma(mz - 3) + ptopDY) * 10 * & + (1 - tmp3 * gplvDY(i, j, mz - 3) * grvinv / & + (tairDY(i, j, mz - 3) + tmp3 * gplvDY(i, j, mz - 3) * grvinv)) & + **(-5.257) + + enddo + + ! end do + + ! +--2.2.4.3 X-hourly variables + ! + -------------------------- + + ! do j=1,my + do i = 1, mx + tnhIB0(i, j) = min(tairDY(i, j, mz) - TfSnow, tnhIB0(i, j)) + txhIB0(i, j) = max(tairDY(i, j, mz) - TfSnow, txhIB0(i, j)) + enddo + ! end do + + ! +--2.2.4 Surface variables + ! + ----------------------- + + ! do j=jp11,my1 + do i = ip11, mx1 + + if(RAdsol(i, j) > 120) sunIB(i, j) = sunIB(i, j) + dt * nbr_call_outice + ! outice is called every x time steps + + swdIB(i, j) = RAdsol(i, j) + swdIB(i, j) + swuIB(i, j) = albeSL(i, j) * RAdsol(i, j) + swuIB(i, j) + lwdIB(i, j) = RAd_ir(i, j) + lwdIB(i, j) + lwuIB(i, j) = firmSL(i, j) + lwuIB(i, j) + + lwutIB(i, j) = RAdOLR(i, j) + lwutIB(i, j) + swutIB(i, j) = RAdOSR(i, j) + swutIB(i, j) + swdtIB(i, j) = rsunGE * czenGE(i, j) + swdtIB(i, j) + shfIB(i, j) = -hsenSL(i, j) + shfIB(i, j) + lhfIB(i, j) = -hlatSL(i, j) + lhfIB(i, j) + alIB(i, j) = albeSL(i, j) + alIB(i, j) + as1_IB(i, j) = alb1IB(i, j) + as1_IB(i, j) + as2_IB(i, j) = alb2IB(i, j) + as2_IB(i, j) + as3_IB(i, j) = alb3IB(i, j) + as3_IB(i, j) + stIB(i, j) = tairsl(i, j) - TfSnow + stIB(i, j) + sicIB(i, j) = ifratv(i, j, 2) + sicIB(i, j) + pddIB(i, j) = pddIB(i, j) + & + (tairDY(i, j, mz) - TfSnow) & + * max(zero, sign(unun, & + tairDY(i, j, mz) - TfSnow)) + if(coupling_ao .eqv. .true.) then + sicaoIB(i, j) = sicsAO(i, j) + sicaoIB(i, j) + sitaoIB(i, j) = hicao(i, j) + sitaoIB(i, j) + sntaoIB(i, j) = hsnoao(i, j) + sntaoIB(i, j) + endif + + do k = 1, nsx + al1IB(i, j, k) = RAdsol(i, j) * albxSL(i, j, k) + al1IB(i, j, k) + al2IB(i, j, k) = albxSL(i, j, k) + al2IB(i, j, k) + frvIB(i, j, k) = ifratv(i, j, k) + frvIB(i, j, k) + st2IB(i, j, k) = tsrfSL(i, j, k) - TfSnow + st2IB(i, j, k) + z0IB(i, j, k) = SL_Z0(i, j, k) + z0IB(i, j, k) + r0IB(i, j, k) = SL_R0(i, j, k) + r0IB(i, j, k) + uusIB(i, j, k) = SLuusl(i, j, k) + uusIB(i, j, k) + utsIB(i, j, k) = SLutsl(i, j, k) + utsIB(i, j, k) + uqsIB(i, j, k) = SLuqsl(i, j, k) + uqsIB(i, j, k) + ussIB(i, j, k) = SLussl(i, j, k) + ussIB(i, j, k) + uusthIB(i, j, k) = SaltSN(i, j, k) + uusthIB(i, j, k) + if(coupling_ao .eqv. .true.) then + st2aoIB(i, j, k) = srftao(i, j, k) + st2aoIB(i, j, k) + albaoIB(i, j, k) = albao(i, j, k) + albaoIB(i, j, k) + endif + enddo + enddo + ! end do + + ! +--2.2.5 Cloud Variables + ! + --------------------- + ! do j=1,my + do i = 1, mx + do k = 1, 3 + tmp(k) = 0.0 + enddo + do k = mzhyd, mz + tmp(3) = (pstDY(i, j) * sigma(k) + ptopDY) & + / (ra * tairDY(i, j, k) * (1.+.608 * qvDY(i, j, k))) & + * (gpmiDY(i, j, k) - gpmiDY(i, j, k + 1)) + tmp(1) = tmp(1) + tmp(3) * qwHY(i, j, k) + tmp(2) = tmp(2) + tmp(3) * qiHY(i, j, k) + enddo + codIB(i, j) = 1.5 * (tmp(1) / 20.d-6 & + + tmp(2) / 40.d-6) * grvinv & + + codIB(i, j) + !C#EE codIB(i,j) = RAcdtO(i,j)+codIB (i,j) + + do k = mzhyd, mz + ! todo : old computation [cCA 02/08/2022], remove ? + ! ================================================= + tmp(1) = rolvDY(i, j, k) * 1000. & + *((gplvDY(i, j, k - 1) + gplvDY(i, j, k)) / 2. & + -(gplvDY(i, j, k) + gplvDY(i, j, k + 1)) / 2.) & + * grvinv + wvpIB(i, j) = wvpIB(i, j) + qvDY(i, j, k) * tmp(1) + cwpIB(i, j) = cwpIB(i, j) + (qwHY(i, j, k) + qrHY(i, j, k)) * tmp(1) + iwpIB(i, j) = iwpIB(i, j) + (qiHY(i, j, k) + qsHY(i, j, k)) * tmp(1) + qwIB(i, j) = qwIB(i, j) + qwHY(i, j, k) * tmp(1) + qiIB(i, j) = qiIB(i, j) + qiHY(i, j, k) * tmp(1) + qsIB(i, j) = qsIB(i, j) + qsHY(i, j, k) * tmp(1) + qrIB(i, j) = qrIB(i, j) + qrHY(i, j, k) * tmp(1) + ! water content: standard computation [cCA 02/08/2022] + ! ================================================= + ! rhodz : rho dz = dp / g = dsigma * SP / g (kg m-2) + ! rhodz : for staggered grid (usual MAR setting), dsigma = dsigm1 + rhodz = dsigm1(k) * (pstDY(i, j) + ptopDY) * 1000.*grvinv ! *1000 : kPa -> Pa + tcwvIB(i, j) = tcwvIB(i, j) + qvDY(i, j, k) * rhodz + tclcIB(i, j) = tclcIB(i, j) + qwHY(i, j, k) * rhodz + tcicIB(i, j) = tcicIB(i, j) + qiHY(i, j, k) * rhodz + tclpIB(i, j) = tclpIB(i, j) + qrHY(i, j, k) * rhodz + tcipIB(i, j) = tcipIB(i, j) + qsHY(i, j, k) * rhodz + enddo + ccIB(i, j) = cld_SL(i, j) + ccIB(i, j) + cuIB(i, j) = clduSL(i, j) + cuIB(i, j) + cmIB(i, j) = cldmSL(i, j) + cmIB(i, j) + cdIB(i, j) = clddSL(i, j) + cdIB(i, j) + enddo + ! end do + + ! +--2.2.6 Soil Variables + ! + -------------------- + ! do j=jp11,my1 + do i = ip11, mx1 + do k = 1, nsx + do kk = 1, llx + sltIB(i, j, k, kk) = TsolTV(i, j, k, kk) - TfSnow + sltIB(i, j, k, kk) + slqIB(i, j, k, kk) = Eta_TV(i, j, k, kk) * 1000.+slqIB(i, j, k, kk) + enddo + enddo + enddo + ! end do + + ! +--2.2.7 Snow Pack Variables + ! + ------------------------- + do k = 1, nsx + ! do j=jp11,my1 + do i = ip11, mx1 + if(nssSNo(i, j, k) > 1) then + depthsnow(nssSNo(i, j, k)) = dzsSNo(i, j, k, nssSNo(i, j, k)) / 2. + do nk = nssSNo(i, j, k) - 1, 1, -1 + depthsnow(nk) = depthsnow(nk + 1) + dzsSNo(i, j, k, nk) / 2. & + +dzsSNo(i, j, k, nk + 1) / 2. + enddo + do kk = 1, mi + if(OutshIB(kk) <= depthsnow(nssSNo(i, j, k))) then + agIB(i, j, k, kk) = agsSNo(i, j, k, nssSNo(i, j, k)) & + + agIB(i, j, k, kk) + g1IB(i, j, k, kk) = g1sSNo(i, j, k, nssSNo(i, j, k)) & + + g1IB(i, j, k, kk) + g2IB(i, j, k, kk) = g2sSNo(i, j, k, nssSNo(i, j, k)) & + + g2IB(i, j, k, kk) + roIB(i, j, k, kk) = rosSNo(i, j, k, nssSNo(i, j, k)) & + + roIB(i, j, k, kk) + tiIB(i, j, k, kk) = tisSNo(i, j, k, nssSNo(i, j, k)) & + + tiIB(i, j, k, kk) + waIB(i, j, k, kk) = wasSNo(i, j, k, nssSNo(i, j, k)) & + + waIB(i, j, k, kk) + endif + if(OutshIB(kk) >= depthsnow(1)) then + agIB(i, j, k, kk) = agsSNo(i, j, k, 1) & + + agIB(i, j, k, kk) + g1IB(i, j, k, kk) = g1sSNo(i, j, k, 1) & + + g1IB(i, j, k, kk) + g2IB(i, j, k, kk) = g2sSNo(i, j, k, 1) & + + g2IB(i, j, k, kk) + roIB(i, j, k, kk) = rosSNo(i, j, k, 1) & + + roIB(i, j, k, kk) + tiIB(i, j, k, kk) = tisSNo(i, j, k, 1) & + + tiIB(i, j, k, kk) + waIB(i, j, k, kk) = wasSNo(i, j, k, 1) & + + waIB(i, j, k, kk) + endif + if(OutshIB(kk) > depthsnow(nssSNo(i, j, k)) .and. & + OutshIB(kk) < depthsnow(1)) then + nk = nssSNo(i, j, k) + do WHILE(OutshIB(kk) > depthsnow(nk)) + nk = nk - 1 + enddo + agIB(i, j, k, kk) = agsSNo(i, j, k, nk + 1) + & + (agsSNo(i, j, k, nk) - agsSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + agIB(i, j, k, kk) + + g1IB(i, j, k, kk) = g1sSNo(i, j, k, nk + 1) + & + (g1sSNo(i, j, k, nk) - g1sSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + g1IB(i, j, k, kk) + + g2IB(i, j, k, kk) = g2sSNo(i, j, k, nk + 1) + & + (g2sSNo(i, j, k, nk) - g2sSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + g2IB(i, j, k, kk) + + tiIB(i, j, k, kk) = tisSNo(i, j, k, nk + 1) + & + (tisSNo(i, j, k, nk) - tisSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + tiIB(i, j, k, kk) + + roIB(i, j, k, kk) = rosSNo(i, j, k, nk + 1) + & + (rosSNo(i, j, k, nk) - rosSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + roIB(i, j, k, kk) + + waIB(i, j, k, kk) = wasSNo(i, j, k, nk + 1) + & + (wasSNo(i, j, k, nk) - wasSNo(i, j, k, nk + 1)) / & + (depthsnow(nk) - depthsnow(nk + 1)) * (OutshIB(kk) - depthsnow(nk + 1)) & + + waIB(i, j, k, kk) + endif + enddo + endif + enddo + enddo + enddo + !$OMP END PARALLEL DO + + do kk = 1, mlhh + if(OutdyIB == 1 .and. iterun > 10 .and. timehIB(kk) == 0 .and. ( & + jhurGE * 3600 + minuGE * 60 + jsecGE >= (kk) * 86400./real(mlhh) .or. & + (jhurGE * 3600 + minuGE * 60 + jsecGE <= dt .and. kk == mlhh))) then + timehIB(kk) = jhurGE + real(minuGE) / 100.+real(jsecGE) / 10000. + print *, "OUTice x-hourly outputs", kk, timehIB(kk) + do j = 1, my + do i = 1, mx + !C +--------Soil temperature and humidity (slth,slqch) + !C + ------------------------------------------ + ! tmp=0.; slth(i,j,kk)=0.; slqch(i,j,kk)=0. + ! do k=1,llx + ! tmp(1)=tmp(1)+dz_dSV(k) + ! do n=1,nvx ! Sous-mailles (3) + ! slth(i,j,kk) = (TsolTV(i,j,n,k) - TfSnow) * dz_dSV(llx-k) + ! . * SLsrfl(i,j,n) + slth(i,j,kk) + ! + ! slqch(i,j,kk) = (Eta_TV(i,j,n,k)*1000.* dz_dSV(llx-k)) + ! . * SLsrfl(i,j,n) + slqch(i,j,kk) + ! + ! end do + ! end do + ! slth(i,j,kk) = slth(i,j,kk)/tmp(1) + ! slqch(i,j,kk) = slqch(i,j,kk)/tmp(1) + ! + !C +--------Convective precipitation (cph) + !C + -------------------------------- + ! cphIB(i,j,kk) = rainCA(i,j) + snowCA(i,j) - cph0IB(i,j) + ! cph0IB(i,j) = rainCA(i,j) + snowCA(i,j) + ! cphIB(i,j,kk) = cphIB(i,j,kk) * 1000. + !C +--------Water Vapor Path (wvph) + !C + ----------------------- + ! wvph(i,j,kk) = 0. + ! do k = 2,mz + ! tmp(1) = rolvDY(i,j,k) + ! . * ((gplvDY(i,j,k-1) + gplvDY(i,j,k )) / 2. + ! . - (gplvDY(i,j,k) + gplvDY(i,j,k+1)) / 2.) + ! . * grvinv + ! wvph(i,j,kk) = wvph(i,j,kk) + qvDY(i,j,k) * 1000. + ! . * tmp(1) + ! end do + ! + !C +--------Dew Point Temperature (Td) + !C + -------------------------- + ! q = qvDY(i,j,mz) + ! qst = qsat0D(tairDY(i,j,mz),sigma(mz),pstDY(i,j),ptopDY,1) + ! r = q / max(epsi,1.-q) + ! rst = qst / max(epsi,1.-qst) + ! rhh = (r/(0.622+r)) / max(epsi,(rst/(0.622+rst))) * 100. + ! rhh = max(0.,min(100.,rhh)) + ! tdh(i,j,kk) = tairDY(i,j,mz) - ((100-rhh)/5.) - 273.15 + ! + !C +--------Zenithal variables (ZTD,ZHD,ZWD) + !C + -------------------------------- + ! kUp = 1 + ! kDown = mz + ! kMiddle = (kDown + kUp) / 2. + ! + ! zhdh(i,j,kk)=0 ; zwdh(i,j,kk)=0 + ! + ! do i_hi=1,mz-1 + ! i_lo = i_hi+1. + ! refrac_h = k1p / tairDY(i,j,i_lo) + ! refrac_w = k2p * qvDY(i,j,i_lo) / (tairDY(i,j,i_lo)**2. + ! . * (E+(1.-E)*qvDY(i,j,i_lo))) + ! p_hi = (pstDY(i,j) * sigma(i_hi) + ptopDY) * 10. + ! p_lo = (pstDY(i,j) * sigma(i_lo) + ptopDY) * 10. + !! z_hi = gpmiDY(i,j,i_hi)/grvinv + !! z_lo = gpmiDY(i,j,i_lo)/grvinv + ! z_hi = gplvDY(i,j,i_hi) * grvinv + ! z_lo = gplvDY(i,j,i_lo) * grvinv + ! kappa = log(p_lo/p_hi) / (z_hi-z_lo) + ! zhdh(i,j,kk) = zhdh(i,j,kk) + refrac_h * (p_lo-p_hi)/kappa + ! zwdh(i,j,kk) = zwdh(i,j,kk) + refrac_w * (p_lo-p_hi)/kappa + ! end do + ! + ! ztdh(i,j,kk) = zhdh(i,j,kk) + zwdh(i,j,kk) + ! + ! + !C +--------Weighted Mean Temperature (Tm) + !C + ------------------------------ + ! num=0 ; den=0 + ! + ! do i_hi=1,mz-1 + ! i_lo = i_hi+1. + ! refrac_h = qvDY(i,j,i_lo) / (tairDY(i,j,i_lo) + ! . * (E+(1.-E)*qvDY(i,j,i_lo))) + ! refrac_w = qvDY(i,j,i_lo) / (tairDY(i,j,i_lo)**2. + ! . * (E+(1.-E)*qvDY(i,j,i_lo))) + ! p_hi = (pstDY(i,j) * sigma(i_hi) + ptopDY) * 10. + ! p_lo = (pstDY(i,j) * sigma(i_lo) + ptopDY) * 10. + ! z_hi = gplvDY(i,j,i_hi) * grvinv + ! z_lo = gplvDY(i,j,i_lo) * grvinv + ! kappa = log(p_lo/p_hi) / (z_hi-z_lo) + ! num = num + refrac_h * (p_lo-p_hi)/kappa + ! den = den + refrac_w * (p_lo-p_hi)/kappa + ! end do + ! tmh(i,j,kk) = num / den + ! + !C +--------50m-level variables + !C + ------------------- + ! + ! kz=3 + ! do k=1,mzuv + ! if(OutZUVLevIB(k)==50) kz=k + ! end do + ! + ! u5hIB(i,j,kk) = uuzIB_0(i,j,kz) + ! v5hIB(i,j,kk) = vvzIB_0(i,j,kz) + ! + ! kz=3 + ! do k=1,mztq + ! if(OutZTQLevIB(k)==50) kz=k + ! end do + ! + ! t5hIB(i,j,kk) = ttzIB_0(i,j,kz)-273.15 + ! q5hIB(i,j,kk) = qqzIB_0(i,j,kz)*1000. + ! p5hIB(i,j,kk) = ppzIB_0(i,j,kz) + ! + ! capeh(i,j,kk) = capeCA(i,j) + sphIB(i, j, kk) = pstDY(i, j) * 10. + sthIB(i, j, kk) = tairsl(i, j) - TfSnow + tthIB(i, j, kk) = tairDY(i, j, mz) - TfSnow + txhIB(i, j, kk) = txhIB0(i, j); txhIB0(i, j) = -99. + tnhIB(i, j, kk) = tnhIB0(i, j); tnhIB0(i, j) = 99. + qqhIB(i, j, kk) = qvDY(i, j, mz) * 1000. + ! uuhIB(i, j, kk) = (uairDY(i, j, mz-2)+uairDY(i, j, mz-3))/2. ! ~10m + ! vvhIB(i, j, kk) = (vairDY(i, j, mz-2)+vairDY(i, j, mz-3))/2. ! ~10m + uuhIB(i, j, kk) = uairDY(i, j, mz) ! ~2m + vvhIB(i, j, kk) = vairDY(i, j, mz) ! ~2m + swdhIB(i, j, kk) = RAdsol(i, j) + lwdhIB(i, j, kk) = RAd_ir(i, j) + lwuhIB(i, j, kk) = firmSL(i, j) + shfhIB(i, j, kk) = (-hsenSL(i, j)) + lhfhIB(i, j, kk) = (-hlatSL(i, j)) + alhIB(i, j, kk) = albeSL(i, j) + clhIB(i, j, kk) = cld_SL(i, j) + snfhIB(i, j, kk) = snowHY(i, j) * 1000.-snfh0IB(i, j) + snfh0IB(i, j) = snowHY(i, j) * 1000. + prhIB(i, j, kk) = (rainHY(i, j) + snowHY(i, j)) * 1000. & + -prh0IB(i, j) + prh0IB(i, j) = (rainHY(i, j) + snowHY(i, j)) * 1000. + rfhIB(i, j, kk) = max(0., prhIB(i, j, kk) - snfhIB(i, j, kk)) + mehIB(i, j, kk) = (-1.) * wem_IB(i, j, 1) - meh0IB(i, j) + meh0IB(i, j) = (-1.) * wem_IB(i, j, 1) + suhIB(i, j, kk) = wee_IB(i, j, 1, 3) - suh0IB(i, j) + suh0IB(i, j) = wee_IB(i, j, 1, 3) + + k = 1 ! only snow + wet_IB(i, j, k) = 0. + do nk = nsno, 1, -1 + wet_IB(i, j, k) = rosSNo(i, j, k, nk) * dzsSNo(i, j, k, nk) & + * 1.d3 / ro_Wat * (1.+0.*wasSNo(i, j, k, nk)) & + + wet_IB(i, j, k) + enddo + wet_IB(i, j, k) = wet_IB(i, j, k) !+ SWaSNo(i,j,k) + smbhIB(i, j, kk) = wet_IB(i, j, k) - smbh0IB(i, j) + smbh0IB(i, j) = wet_IB(i, j, k) + + swhIB(i, j, kk) = SWaSNo(i, j, k) - swh0IB(i, j) + swh0IB(i, j) = SWaSNo(i, j, k) + + ruhIB(i, j, kk) = weu_IB(i, j, k) - ruh0IB(i, j) + ruh0IB(i, j) = weu_IB(i, j, k) + lwc1mhIB(i, j, kk) = 0. + lwc2mhIB(i, j, kk) = 0. + nx = 1 ! Sector 1 + nk = max(1, nssSNo(i, j, nx)) + depthSNo = dzsSNo(i, j, nx, nk) / 2. + do while(depthSNo <= 1. .and. nk > 1) + ! 0.1 * ! bug 11/10/2017 + lwc1mhIB(i, j, kk) = lwc1mhIB(i, j, kk) + & + 0.1 * wasSNo(i, j, nx, nk) * & + rosSNo(i, j, nx, nk) * dzsSNo(i, j, nx, nk) + depthSNo = depthSNo + (dzsSNo(i, j, nx, nk) + dzsSNo(i, j, nx, nk - 1)) / 2. + nk = nk - 1 + enddo + nk = max(1, nssSNo(i, j, nx)) + depthSNo = dzsSNo(i, j, nx, nk) / 2. + do while(depthSNo <= 2. .and. nk > 1) + ! 0.1 * ! bug 11/10/2017& + lwc2mhIB(i, j, kk) = lwc2mhIB(i, j, kk) + & + 0.1 * & + wasSNo(i, j, nx, nk) * & + rosSNo(i, j, nx, nk) * dzsSNo(i, j, nx, nk) + depthSNo = depthSNo + & + (dzsSNo(i, j, nx, nk) + dzsSNo(i, j, nx, nk - 1)) / 2. + nk = nk - 1 + enddo + enddo + enddo + endif + enddo + + ! +--2.2.8 Slush and Superimposed Ice + ! + -------------------------------- + + ! do k= 1,nsx + ! + ! do j=jp11,my1 + ! do i=ip11,mx1 + ! + ! WKxy1(i,j) = 1. + ! + ! do kk=1,nssSNo(i,j,k) + ! + ! WKxy3(i,j) = max( 0., sign(1., rosSNo(i,j,k,kk)-roCdSV)) + ! . * max( 0., sign(1.,-wasSNo(i,j,k,kk)+epsi )) + ! + ! WKxy1(i,j) = min( WKxy1(i,j) , WKxy3(i,j) + ! . + max( 0., sign(1.,-nsiiIB(i,j,k) +epsi))) + ! + ! nsiiIB (i,j,k) = max(nsiiIB(i,j,k), + ! . kk*int(WKxy1(i,j) * WKxy3(i,j))) + ! siiceIB(i,j,k) = siiceIB(i,j,k)+dzsSNo(i,j,k,kk) + ! . *WKxy1(i,j) * WKxy3(i,j) + ! end do + ! + ! siIB (i,j,k) = siiceIB(i,j,k) + siIB(i,j,k) + ! slushIB(i,j,k) = 0. + ! nsluIB (i,j,k) = nsiiIB(i,j,k) + ! end do + ! end do + ! end do + ! + ! do k= 1,nsx + ! + ! do j=jp11,my1 + ! do i=ip11,mx1 + ! + ! WKxy2(i,j) = 1. + ! + ! do kk=1,nssSNo(i,j,k) + ! WKxy3(i,j)= max(0., sign(1., rosSNo(i,j,k,kk)- roCdSV)) + ! . * max(0., sign(1., wasSNo(i,j,k,kk)- 0.1e0 )) + ! . * max(0 , sign(1 , kk-max(1,nsiiIB(i,j,k) ))) + ! WKxy2(i,j)= min(WKxy2(i,j) , WKxy3(i,j) + ! . + max(0., sign(1., nsiiIB(i,j,k) + ! . -nsluIB(i,j,k) + epsi))) + ! nsluIB (i,j,k) = max(nsluIB(i,j,k), + ! . kk*int(WKxy2(i,j)*WKxy3(i,j))) + ! slushIB(i,j,k) = slushIB(i,j,k) + ! . + dzsSNo(i,j,k,kk) + ! . *WKxy2(i,j)*WKxy3(i,j) + ! end do + ! + ! suIB (i,j,k) = slushIB(i,j,k) + suIB(i,j,k) + ! nsluIB (i,j,k) = nsluIB(i,j,k) - nsiiIB(i,j,k) + ! end do + ! end do + ! end do + + ! + snow (with ice lenses perhaps ! ) + ! + - - - - - - - - + ! + slush (ro > 830kg/m3 and wa > 0.1) + ! + - - - - - - - - + ! + surimposed ice (ro > 830kg/m3 and wa = 0 ) + ! + - - - - - - - - + ! + ice (ro = 900kg/m3 and wa = 0 ) + ! + - - - - - - - - + ! + ground + + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! +++ 3. Output ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + if((iterun - itrdIB + nbr_call_outice) >= 43200./real(OutdyIB * dt) .and. & + jhurGE * 60 + minuGE >= abs(real(OutdyIB0) - 0.5) * 1440./real(OutdyIB) & + .and. & + jhurGE * 60 + minuGE < abs(real(OutdyIB0) - 0.5) * 1440./real(OutdyIB) & + + nbr_call_outice * dt / 60) then + + iyrrIB = iyrrGE + mmarIB = mmarGE + jdarIB = jdarGE + jhurIB = jhurGE + minuIB = minuGE + + endif + + if((iterun - itrdIB + nbr_call_outice) >= 86400./real(OutdyIB * dt) .and. & + jhurGE * 60 + minuGE >= OutdyIB0 * 1440./real(OutdyIB) .and. & + jhurGE * 60 + minuGE < OutdyIB0 * 1440./real(OutdyIB) & + + nbr_call_outice * dt / 60.) then + + !XF WARNING: it does not work if MAR starts at 6h or 12h !!! + !XF if it is the case, nbr_call_outice=1 and + !XF if ((iterun-itrdIB)*dt+unun.gt.86400.0/real(OutdyIB)) then + + if(dt_ICE2 > iterun - itrdIB) then + print *, "OUTice error: dt_ICE2 > iterun-itrdIB", & + dt_ICE2, iterun - itrdIB + endif + + ! +--3.0 Snapshot of Snow Height + ! + =========================== + + do k = 1, nsx + do j = 1, my + do i = 1, mx + zn1IB(i, j, k) = 1. + zn2IB(i, j, k) = 0. + zn3IB(i, j, k) = 0. + wet_IB(i, j, k) = 0. + enddo + enddo + enddo + + do kk = nsno, 1, -1 + do k = 1, nsx + do j = 1, my + do i = 1, mx + zn3IB(i, j, k) = dzsSNo(i, j, k, kk) + zn3IB(i, j, k) + wet_IB(i, j, k) = rosSNo(i, j, k, kk) * dzsSNo(i, j, k, kk) & + * 1.d3 / ro_Wat * (1.+0.*wasSNo(i, j, k, kk)) & + + wet_IB(i, j, k) + zn1IB(i, j, k) = zn1IB(i, j, k) & + * max(zero, sign(unun, & + ro_ice - 20.-rosSNo(i, j, k, kk))) + zn2IB(i, j, k) = dzsSNo(i, j, k, kk) * zn1IB(i, j, k) & + + zn2IB(i, j, k) + enddo + enddo + enddo + enddo + + do k = 1, nsx + do j = 1, my + do i = 1, mx + wet_IB(i, j, k) = wet_IB(i, j, k) + SWaSNo(i, j, k) + zn2IB(i, j, k) = zn2IB(i, j, k) * (1.-zn1IB(i, j, k)) + zn1IB(i, j, k) = zn3IB(i, j, k) - zn0IB(i, j, k) + mbIB(i, j, k) = wet_IB(i, j, k) - mb0IB(i, j, k) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + ! +--3.1 Computation of Averaged Values + ! + ================================== + qbrIB(i, j) = qbrIB(i, j) / real(dt_ICE2) + pddIB(i, j) = pddIB(i, j) / real(dt_ICE2) + do kk = 1, ml + ttIB(i, j, kk) = ttIB(i, j, kk) / real(dt_ICE2) + tdIB(i, j, kk) = tdIB(i, j, kk) / real(dt_ICE2) + uuIB(i, j, kk) = uuIB(i, j, kk) / real(dt_ICE2) + vvIB(i, j, kk) = vvIB(i, j, kk) / real(dt_ICE2) + if(track_wind) then + do itw = 1, ntrackwind + duIB(i, j, kk, itw) = duIB(i, j, kk, itw) / real(dt_ICE2) + dvIB(i, j, kk, itw) = dvIB(i, j, kk, itw) / real(dt_ICE2) + enddo + endif + if(track_dgz) then + do itw = 1, ntrackdgz + dudgzIB(i, j, kk, itw) = dudgzIB(i, j, kk, itw) / real(dt_ICE2) + dvdgzIB(i, j, kk, itw) = dvdgzIB(i, j, kk, itw) / real(dt_ICE2) + enddo + endif + uvIB(i, j, kk) = uvIB(i, j, kk) / real(dt_ICE2) + wwIB(i, j, kk) = wwIB(i, j, kk) / real(dt_ICE2) + psigIB(i, j, kk) = psigIB(i, j, kk) / real(dt_ICE2) + wsigIB(i, j, kk) = wsigIB(i, j, kk) / real(dt_ICE2) + ruuIB(i, j, kk) = ruuIB(i, j, kk) / real(dt_ICE2) + rvvIB(i, j, kk) = rvvIB(i, j, kk) / real(dt_ICE2) + ruvIB(i, j, kk) = ruvIB(i, j, kk) / real(dt_ICE2) + qqIB(i, j, kk) = qqIB(i, j, kk) / real(dt_ICE2) + if(track_water) then + do jtw = 1, ntwater + dqvIB(i, j, kk, jtw) = dqvIB(i, j, kk, jtw) / real(dt_ICE2) + enddo + endif + rhodzIB(i, j, kk) = rhodzIB(i, j, kk) / real(dt_ICE2) + rolvIB(i, j, kk) = rolvIB(i, j, kk) / real(dt_ICE2) + rhIB(i, j, kk) = rhIB(i, j, kk) / real(dt_ICE2) + zzIB(i, j, kk) = zzIB(i, j, kk) / real(dt_ICE2) + tkeIB(i, j, kk) = tkeIB(i, j, kk) / real(dt_ICE2) + lqsIB(i, j, kk) = lqsIB(i, j, kk) / real(dt_ICE2) + lqiIB(i, j, kk) = lqiIB(i, j, kk) / real(dt_ICE2) + lqrIB(i, j, kk) = lqrIB(i, j, kk) / real(dt_ICE2) + lqwIB(i, j, kk) = lqwIB(i, j, kk) / real(dt_ICE2) + qsbIB(i, j, kk) = qsbIB(i, j, kk) / real(dt_ICE2) + lsbIB(i, j, kk) = lsbIB(i, j, kk) / real(dt_ICE2) + swn3DIB(i, j, kk) = swn3DIB(i, j, kk) / real(dt_ICE2) + lwn3DIB(i, j, kk) = lwn3DIB(i, j, kk) / real(dt_ICE2) + swnc3DIB(i, j, kk) = swnc3DIB(i, j, kk) / real(dt_ICE2) + lwnc3DIB(i, j, kk) = lwnc3DIB(i, j, kk) / real(dt_ICE2) + cod3DIB(i, j, kk) = cod3DIB(i, j, kk) / real(dt_ICE2) + cc3DIB(i, j, kk) = cc3DIB(i, j, kk) / real(dt_ICE2) + enddo + do kp = 1, mp + if(nbpIB(i, j, kp) > 0) then + ttpIB(i, j, kp) = ttpIB(i, j, kp) / nbpIB(i, j, kp) + uupIB(i, j, kp) = uupIB(i, j, kp) / nbpIB(i, j, kp) + vvpIB(i, j, kp) = vvpIB(i, j, kp) / nbpIB(i, j, kp) + wwpIB(i, j, kp) = wwpIB(i, j, kp) / nbpIB(i, j, kp) + uvpIB(i, j, kp) = uvpIB(i, j, kp) / nbpIB(i, j, kp) + qqpIB(i, j, kp) = qqpIB(i, j, kp) / nbpIB(i, j, kp) + zzpIB(i, j, kp) = zzpIB(i, j, kp) / nbpIB(i, j, kp) + else + ttpIB(i, j, kp) = NF_FILL_REAL + uupIB(i, j, kp) = NF_FILL_REAL + vvpIB(i, j, kp) = NF_FILL_REAL + wwpIB(i, j, kp) = NF_FILL_REAL + uvpIB(i, j, kp) = NF_FILL_REAL + qqpIB(i, j, kp) = NF_FILL_REAL + zzpIB(i, j, kp) = NF_FILL_REAL + endif + enddo + do kz = 1, mztq + ttzIB(i, j, kz) = ttzIB(i, j, kz) / real(dt_ICE2) + rhzIB(i, j, kz) = rhzIB(i, j, kz) / real(dt_ICE2) + qqzIB(i, j, kz) = qqzIB(i, j, kz) / real(dt_ICE2) + enddo + do kz = 1, mzuv + uuzIB(i, j, kz) = uuzIB(i, j, kz) / real(dt_ICE2) + vvzIB(i, j, kz) = vvzIB(i, j, kz) / real(dt_ICE2) + u2zIB(i, j, kz) = u2zIB(i, j, kz) / real(dt_ICE2) + v2zIB(i, j, kz) = v2zIB(i, j, kz) / real(dt_ICE2) + uvzIB(i, j, kz) = uvzIB(i, j, kz) / real(dt_ICE2) + rozIB(i, j, kz) = rozIB(i, j, kz) / real(dt_ICE2) + enddo + do k = 1, nsx + pblIB(i, j, k) = pblIB(i, j, k) / real(dt_ICE2) + al1IB(i, j, k) = al1IB(i, j, k) / max(swdIB(i, j), epsi) + al2IB(i, j, k) = al2IB(i, j, k) / real(dt_ICE2) + enddo + alIB(i, j) = alIB(i, j) / real(dt_ICE2) + as1_IB(i, j) = as1_IB(i, j) / real(dt_ICE2) + as2_IB(i, j) = as2_IB(i, j) / real(dt_ICE2) + as3_IB(i, j) = as3_IB(i, j) / real(dt_ICE2) + swdIB(i, j) = swdIB(i, j) / real(dt_ICE2) + swuIB(i, j) = swuIB(i, j) / real(dt_ICE2) + lwdIB(i, j) = lwdIB(i, j) / real(dt_ICE2) + lwuIB(i, j) = lwuIB(i, j) / real(dt_ICE2) + swdtIB(i, j) = swdtIB(i, j) / real(dt_ICE2) + swutIB(i, j) = swutIB(i, j) / real(dt_ICE2) + lwutIB(i, j) = lwutIB(i, j) / real(dt_ICE2) + shfIB(i, j) = shfIB(i, j) / real(dt_ICE2) + lhfIB(i, j) = lhfIB(i, j) / real(dt_ICE2) + spIB(i, j) = spIB(i, j) / real(dt_ICE2) + slpIB(i, j) = slpIB(i, j) / real(dt_ICE2) + if(mw == 5) then + gradTIB(i, j) = gradTIB(i, j) / real(dt_ICE2) !*CL* + gradQIB(i, j) = gradQIB(i, j) / real(dt_ICE2) !*CL* + endif + ccIB(i, j) = ccIB(i, j) / real(dt_ICE2) + cuIB(i, j) = cuIB(i, j) / real(dt_ICE2) + cmIB(i, j) = cmIB(i, j) / real(dt_ICE2) + cdIB(i, j) = cdIB(i, j) / real(dt_ICE2) + qwIB(i, j) = qwIB(i, j) / real(dt_ICE2) + qiIB(i, j) = qiIB(i, j) / real(dt_ICE2) + qsIB(i, j) = qsIB(i, j) / real(dt_ICE2) + qrIB(i, j) = qrIB(i, j) / real(dt_ICE2) + wvpIB(i, j) = wvpIB(i, j) / real(dt_ICE2) + cwpIB(i, j) = cwpIB(i, j) / real(dt_ICE2) + iwpIB(i, j) = iwpIB(i, j) / real(dt_ICE2) + tcwvIB(i, j) = tcwvIB(i, j) / real(dt_ICE2) ! cCA : new + tclcIB(i, j) = tclcIB(i, j) / real(dt_ICE2) ! cCA : new + tcicIB(i, j) = tcicIB(i, j) / real(dt_ICE2) ! cCA : new + tclpIB(i, j) = tclpIB(i, j) / real(dt_ICE2) ! cCA : new + tcipIB(i, j) = tcipIB(i, j) / real(dt_ICE2) ! cCA : new + codIB(i, j) = codIB(i, j) / real(dt_ICE2) + stIB(i, j) = stIB(i, j) / real(dt_ICE2) + sicIB(i, j) = sicIB(i, j) / real(dt_ICE2) + if(coupling_ao .eqv. .true.) then + sicaoIB(i, j) = sicaoIB(i, j) / real(dt_ICE2) + sitaoIB(i, j) = sitaoIB(i, j) / real(dt_ICE2) + sntaoIB(i, j) = sntaoIB(i, j) / real(dt_ICE2) + do k = 1, nsx + st2aoIB(i, j, k) = st2aoIB(i, j, k) / real(dt_ICE2) + albaoIB(i, j, k) = albaoIB(i, j, k) / real(dt_ICE2) + enddo + endif + + do k = 1, nsx + frvIB(i, j, k) = frvIB(i, j, k) / real(dt_ICE2) + st2IB(i, j, k) = st2IB(i, j, k) / real(dt_ICE2) + z0IB(i, j, k) = z0IB(i, j, k) / real(dt_ICE2) + r0IB(i, j, k) = r0IB(i, j, k) / real(dt_ICE2) + uusIB(i, j, k) = uusIB(i, j, k) / real(dt_ICE2) + uusthIB(i, j, k) = uusthIB(i, j, k) / real(dt_ICE2) + utsIB(i, j, k) = utsIB(i, j, k) / real(dt_ICE2) + uqsIB(i, j, k) = uqsIB(i, j, k) / real(dt_ICE2) + ussIB(i, j, k) = ussIB(i, j, k) / real(dt_ICE2) + if(mw == 5) then + tt_intIB(i, j, k) = tt_intIB(i, j, k) / real(dt_ICE2) !*CL* + qq_intIB(i, j, k) = qq_intIB(i, j, k) / real(dt_ICE2) !*CL* + endif + do kk = 1, llx + sltIB(i, j, k, kk) = sltIB(i, j, k, kk) / real(dt_ICE2) + slqIB(i, j, k, kk) = slqIB(i, j, k, kk) / real(dt_ICE2) + enddo + do kk = 1, mi + agIB(i, j, k, kk) = agIB(i, j, k, kk) / real(dt_ICE2) + g1IB(i, j, k, kk) = g1IB(i, j, k, kk) / real(dt_ICE2) + g2IB(i, j, k, kk) = g2IB(i, j, k, kk) / real(dt_ICE2) + roIB(i, j, k, kk) = roIB(i, j, k, kk) / real(dt_ICE2) + tiIB(i, j, k, kk) = tiIB(i, j, k, kk) / real(dt_ICE2) - TfSnow + waIB(i, j, k, kk) = waIB(i, j, k, kk) / real(dt_ICE2) + enddo + enddo + + enddo + enddo + + dt_ICE2 = -1 + + ! + 3.2 Save in a netcdf file + ! + ========================= + + dt_ICE = dt_ICE + 1 + + if(iterun > 1) then ! + + ! + ************ + call UNwopen(fnamNC_tmp, ID__nc_ice) + ! + ************ + + ENDif ! Re-Open file if already created. + + write(6, 398) trim(fnamNC_tmp), & + jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE + +398 format(' Writing of OUTice in ', a19, ':' & + , i2, '/', i2, '/', i4, ' ', i2, ':', i2, ':', i2) + + ! +--3.2.1 Write Time-dependent variables + ! + ------------------------------------ + + if(nDFdim(0) == 0) then ! + + ! date = (351+(iyrrGE -1902) *365 ! Nb Days before iyrrGE + ! . +(iyrrGE -1901) / 4 ! Nb Leap Years + ! . + njyrGE(mmarGE) ! Nb Days before mmarGE + ! . + njybGE(mmarGE) ! (including Leap Day) + ! . * max(0,1-mod(iyrrGE,4)) ! + ! . + jdarGE -1 )* 24 ! + ! . + jhurGE ! + ! . +(minuGE *60 +jsecGE)/3600 ! + + date = nint(real(itexpe) * dt / 60.) + if(OutdyIB <= 24) date = nint(real(itexpe) * dt / (3600.)) + if(OutdyIB == 1) date = nint(real(itexpe) * dt / (3600.*24.)) + + dater = real(date0 + date) / 2. + date0 = date + + ! + ************ + call UNwrite(ID__nc_ice, 'time', dt_ICE, 1, 1, 1, dater) + ! + ************ + + endif + + ! + ************ + call UNwrite(ID__nc_ice, 'DATE', dt_ICE, 1, 1, 1, & + dateNC_ice(dt_ICE)) + call UNwrite(ID__nc_ice, 'year', dt_ICE, 1, 1, 1, & + yearNC_ice(dt_ICE)) + ! + ************ + + if(iyrrIB == 0 .or. OutdyIB > 1) then + iyrrIB = iyrrGE + mmarIB = mmarGE + jdarIB = jdarGE + jhurIB = jhurGE + minuIB = minuGE + endif + + ! + ************ + dater = iyrrIB + call UNwrite(ID__nc_ice, 'YYYY', dt_ICE, 1, 1, 1, dater) + dater = mmarIB + call UNwrite(ID__nc_ice, 'MM', dt_ICE, 1, 1, 1, dater) + dater = jdarIB + call UNwrite(ID__nc_ice, 'DD', dt_ICE, 1, 1, 1, dater) + dater = jhurIB + call UNwrite(ID__nc_ice, 'HH', dt_ICE, 1, 1, 1, dater) + dater = minuIB + call UNwrite(ID__nc_ice, 'MIN', dt_ICE, 1, 1, 1, dater) + ! + ************ + + ! +--3.2.0.a X-hourly Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + if(OutdyIB == 1) then + ! + ************ + call UNwrite(ID__nc_ice, 'TIMEh', dt_ICE, mlhh, 1, 1, timehIB) + call UNwrite(ID__nc_ice, 'SPh', dt_ICE, mx, my, mlhh, sphIB) + call UNwrite(ID__nc_ice, 'STh', dt_ICE, mx, my, mlhh, sthIB) + call UNwrite(ID__nc_ice, 'TTh', dt_ICE, mx, my, mlhh, tthIB) + call UNwrite(ID__nc_ice, 'TXh', dt_ICE, mx, my, mlhh, txhIB) + call UNwrite(ID__nc_ice, 'TNh', dt_ICE, mx, my, mlhh, tnhIB) + call UNwrite(ID__nc_ice, 'QQh', dt_ICE, mx, my, mlhh, qqhIB) + call UNwrite(ID__nc_ice, 'UUh', dt_ICE, mx, my, mlhh, uuhIB) + call UNwrite(ID__nc_ice, 'VVh', dt_ICE, mx, my, mlhh, vvhIB) + call UNwrite(ID__nc_ice, 'SWDh', dt_ICE, mx, my, mlhh, swdhIB) + call UNwrite(ID__nc_ice, 'LWDh', dt_ICE, mx, my, mlhh, lwdhIB) + call UNwrite(ID__nc_ice, 'LWUh', dt_ICE, mx, my, mlhh, lwuhIB) + call UNwrite(ID__nc_ice, 'SHFh', dt_ICE, mx, my, mlhh, shfhIB) + call UNwrite(ID__nc_ice, 'LHFh', dt_ICE, mx, my, mlhh, lhfhIB) + call UNwrite(ID__nc_ice, 'ALh', dt_ICE, mx, my, mlhh, alhIB) + call UNwrite(ID__nc_ice, 'CCh', dt_ICE, mx, my, mlhh, clhIB) + call UNwrite(ID__nc_ice, 'LWC1mh', dt_ICE, mx, my, mlhh, lwc1mhIB) + call UNwrite(ID__nc_ice, 'LWC2mh', dt_ICE, mx, my, mlhh, lwc2mhIB) + + ! call UNwrite (ID__nc_ice,'TT50mh',dt_ICE,mx, my, mlhh,t5hIB) + ! call UNwrite (ID__nc_ice,'QQ50mh',dt_ICE,mx, my, mlhh,q5hIB) + ! call UNwrite (ID__nc_ice,'UU50mh',dt_ICE,mx, my, mlhh,u5hIB) + ! call UNwrite (ID__nc_ice,'VV50mh',dt_ICE,mx, my, mlhh,v5hIB) + ! call UNwrite (ID__nc_ice,'PP50mh',dt_ICE,mx, my, mlhh,p5hIB) + ! + ! call UNwrite (ID__nc_ice, 'TDh', dt_ICE, mx, my, mlhh,tdh) + ! call UNwrite (ID__nc_ice, 'SLTh', dt_ICE, mx, my, mlhh,slth) + ! call UNwrite (ID__nc_ice,'SLQCh', dt_ICE, mx, my, mlhh,slqch) + ! call UNwrite (ID__nc_ice, 'WVPh', dt_ICE, mx, my, mlhh,wvph) + ! call UNwrite (ID__nc_ice, 'CPh', dt_ICE, mx, my, mlhh,cphIB) + ! call UNwrite (ID__nc_ice, 'CAPEh',dt_ICE, mx, my, mlhh,capeh) + ! call UNwrite (ID__nc_ice, 'WMTh', dt_ICE, mx, my, mlhh,tmh) + ! call UNwrite (ID__nc_ice, 'ZTDh', dt_ICE, mx, my, mlhh,ztdh) + ! call UNwrite (ID__nc_ice, 'ZHDh', dt_ICE, mx, my, mlhh,zhdh) + ! call UNwrite (ID__nc_ice, 'ZWDh', dt_ICE, mx, my, mlhh,zwdh) + endif + + ! + ************ + + ! +--3.2.1.a Atmospheric Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! ! daily mean + + ! + ************ + call UNwrite(ID__nc_ice, 'TTmin', dt_ICE, mx, my, ml, mintIB) + call UNwrite(ID__nc_ice, 'TTmax', dt_ICE, mx, my, ml, maxtIB) + call UNwrite(ID__nc_ice, 'TTint', dt_ICE, mx, my, nsx, tt_intIB) + call UNwrite(ID__nc_ice, 'TT', dt_ICE, mx, my, ml, ttIB) + CALL UNwrite(ID__nc_ice, 'TD', dt_ICE, mx, my, ml, tdIB) + call UNwrite(ID__nc_ice, 'UU', dt_ICE, mx, my, ml, uuIB) + call UNwrite(ID__nc_ice, 'VV', dt_ICE, mx, my, ml, vvIB) + if(track_wind) then + do itw = 1, ntrackwind + call UNwrite(ID__nc_ice, 'du_'//name_wind(itw), dt_ICE, mx, my, ml, duIB(:, :, :, itw)) + call UNwrite(ID__nc_ice, 'dv_'//name_wind(itw), dt_ICE, mx, my, ml, dvIB(:, :, :, itw)) + enddo + endif + if(track_dgz) then + do itw = 1, ntrackdgz + call UNwrite(ID__nc_ice, 'du_'//name_dgz(itw), dt_ICE, mx, my, ml, dudgzIB(:, :, :, itw)) + call UNwrite(ID__nc_ice, 'dv_'//name_dgz(itw), dt_ICE, mx, my, ml, dvdgzIB(:, :, :, itw)) + enddo + endif + call UNwrite(ID__nc_ice, 'UV', dt_ICE, mx, my, ml, uvIB) + call UNwrite(ID__nc_ice, 'UVmax', dt_ICE, mx, my, ml, maxwIB) + call UNwrite(ID__nc_ice, 'WW', dt_ICE, mx, my, ml, wwIB) + call UNwrite(ID__nc_ice, 'psig', dt_ICE, mx, my, ml, psigIB) + call UNwrite(ID__nc_ice, 'wsig', dt_ICE, mx, my, ml, wsigIB) + call UNwrite(ID__nc_ice, 'XUU', dt_ICE, mx, my, ml, ruuIB) + call UNwrite(ID__nc_ice, 'YVV', dt_ICE, mx, my, ml, rvvIB) + call UNwrite(ID__nc_ice, 'YUU', dt_ICE, mx, my, ml, rvvIB) + call UNwrite(ID__nc_ice, 'XYUV', dt_ICE, mx, my, ml, ruvIB) + call UNwrite(ID__nc_ice, 'XUV', dt_ICE, mx, my, ml, ruvIB) + call UNwrite(ID__nc_ice, 'QQ', dt_ICE, mx, my, ml, qqIB) + if(track_water) then + do jtw = 1, ntwater + call UNwrite(ID__nc_ice, 'dq_'//name_water(jtw), dt_ICE, mx, my, ml, dqvIB(:, :, :, jtw)) + enddo + endif + call UNwrite(ID__nc_ice, 'QQint', dt_ICE, mx, my, nsx, qq_intIB) + call UNwrite(ID__nc_ice, 'RHO', dt_ICE, mx, my, ml, rolvIB) + call UNwrite(ID__nc_ice, 'RH', dt_ICE, mx, my, ml, rhIB) + call UNwrite(ID__nc_ice, 'ZZ', dt_ICE, mx, my, ml, zzIB) + call UNwrite(ID__nc_ice, 'PDD', dt_ICE, mx, my, 1, pddIB) + call UNwrite(ID__nc_ice, 'SP', dt_ICE, mx, my, 1, spIB) + call UNwrite(ID__nc_ice, 'SLP', dt_ICE, mx, my, 1, slpIB) + call UNwrite(ID__nc_ice, 'gradT', dt_ICE, mx, my, 1, gradTIB) + call UNwrite(ID__nc_ice, 'gradTmin', dt_ICE, mx, my, 1, mingrTIB) + call UNwrite(ID__nc_ice, 'gradTmax', dt_ICE, mx, my, 1, maxgrTIB) + call UNwrite(ID__nc_ice, 'gradQ', dt_ICE, mx, my, 1, gradQIB) + call UNwrite(ID__nc_ice, 'gradQmin', dt_ICE, mx, my, 1, mingrQIB) + call UNwrite(ID__nc_ice, 'gradQmax', dt_ICE, mx, my, 1, maxgrQIB) + call UNwrite(ID__nc_ice, 'TKE', dt_ICE, mx, my, ml, tkeIB) + call UNwrite(ID__nc_ice, 'LQS', dt_ICE, mx, my, ml, lqsIB) + call UNwrite(ID__nc_ice, 'LQI', dt_ICE, mx, my, ml, lqiIB) + call UNwrite(ID__nc_ice, 'LQR', dt_ICE, mx, my, ml, lqrIB) + call UNwrite(ID__nc_ice, 'LQW', dt_ICE, mx, my, ml, lqwIB) + call UNwrite(ID__nc_ice, 'SWN3D', dt_ICE, mx, my, ml, swn3DIB) + call UNwrite(ID__nc_ice, 'LWN3D', dt_ICE, mx, my, ml, lwn3DIB) + call UNwrite(ID__nc_ice, 'SWNC3D', dt_ICE, mx, my, ml, swnc3DIB) + call UNwrite(ID__nc_ice, 'LWNC3D', dt_ICE, mx, my, ml, lwnc3DIB) + call UNwrite(ID__nc_ice, 'COD3D', dt_ICE, mx, my, ml, cod3DIB) + call UNwrite(ID__nc_ice, 'CC3D', dt_ICE, mx, my, ml, cc3DIB) + + ttbIB = ttIB(:, :, 1:mlb) + txbIB = maxtIB(:, :, 1:mlb) + tnbIB = mintIB(:, :, 1:mlb) + qqbIB = qqIB(:, :, 1:mlb) + uubIB = uuIB(:, :, 1:mlb) + vvbIB = vvIB(:, :, 1:mlb) + uvbIB = uvIB(:, :, 1:mlb) + zzbIB = zzIB(:, :, 1:mlb) + + call UNwrite(ID__nc_ice, 'TTb', dt_ICE, mx, my, mlb, ttbIB) + call UNwrite(ID__nc_ice, 'TXb', dt_ICE, mx, my, mlb, txbIB) + call UNwrite(ID__nc_ice, 'TNb', dt_ICE, mx, my, mlb, tnbIB) + call UNwrite(ID__nc_ice, 'QQb', dt_ICE, mx, my, mlb, qqbIB) + call UNwrite(ID__nc_ice, 'ZZb', dt_ICE, mx, my, mlb, zzbIB) + call UNwrite(ID__nc_ice, 'UUb', dt_ICE, mx, my, mlb, uubIB) + call UNwrite(ID__nc_ice, 'VVb', dt_ICE, mx, my, mlb, vvbIB) + call UNwrite(ID__nc_ice, 'UVb', dt_ICE, mx, my, mlb, uvbIB) + + call UNwrite(ID__nc_ice, 'TTp', dt_ICE, mx, my, mp, ttpIB) + call UNwrite(ID__nc_ice, 'QQp', dt_ICE, mx, my, mp, qqpIB) + call UNwrite(ID__nc_ice, 'ZZp', dt_ICE, mx, my, mp, zzpIB) + call UNwrite(ID__nc_ice, 'UUp', dt_ICE, mx, my, mp, uupIB) + call UNwrite(ID__nc_ice, 'VVp', dt_ICE, mx, my, mp, vvpIB) + call UNwrite(ID__nc_ice, 'WWp', dt_ICE, mx, my, mp, wwpIB) + call UNwrite(ID__nc_ice, 'UVp', dt_ICE, mx, my, mp, uvpIB) + + call UNwrite(ID__nc_ice, 'TTz', dt_ICE, mx, my, mztq, ttzIB) + call UNwrite(ID__nc_ice, 'QQz', dt_ICE, mx, my, mztq, qqzIB) + call UNwrite(ID__nc_ice, 'RHz', dt_ICE, mx, my, mztq, rhzIB) + call UNwrite(ID__nc_ice, 'UUz', dt_ICE, mx, my, mzuv, uuzIB) + call UNwrite(ID__nc_ice, 'VVz', dt_ICE, mx, my, mzuv, vvzIB) + CALL UNwrite(ID__nc_ice, 'U2z', dt_ICE, mx, my, mzuv, u2zIB) + CALL UNwrite(ID__nc_ice, 'V2z', dt_ICE, mx, my, mzuv, v2zIB) + call UNwrite(ID__nc_ice, 'UVz', dt_ICE, mx, my, mzuv, uvzIB) + call UNwrite(ID__nc_ice, 'ROz', dt_ICE, mx, my, mzuv, rozIB) + ! + ************ + + ! +--3.2.1.b Surface Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! ! daily mean + + ! + ************ + call UNwrite(ID__nc_ice, 'SWD', dt_ICE, mx, my, 1, swdIB) + call UNwrite(ID__nc_ice, 'SWU', dt_ICE, mx, my, 1, swuIB) + call UNwrite(ID__nc_ice, 'SUN', dt_ICE, mx, my, 1, sunIB) + call UNwrite(ID__nc_ice, 'LWD', dt_ICE, mx, my, 1, lwdIB) + call UNwrite(ID__nc_ice, 'LWU', dt_ICE, mx, my, 1, lwuIB) + + call UNwrite(ID__nc_ice, 'SWDT', dt_ICE, mx, my, 1, swdtIB) + call UNwrite(ID__nc_ice, 'SWUT', dt_ICE, mx, my, 1, swutIB) + call UNwrite(ID__nc_ice, 'LWUT', dt_ICE, mx, my, 1, lwutIB) + + call UNwrite(ID__nc_ice, 'SHF', dt_ICE, mx, my, 1, shfIB) + call UNwrite(ID__nc_ice, 'LHF', dt_ICE, mx, my, 1, lhfIB) + call UNwrite(ID__nc_ice, 'AL', dt_ICE, mx, my, 1, alIB) + call UNwrite(ID__nc_ice, 'AS1', dt_ICE, mx, my, 1, aS1_IB) + call UNwrite(ID__nc_ice, 'AS2', dt_ICE, mx, my, 1, aS2_IB) + call UNwrite(ID__nc_ice, 'AS3', dt_ICE, mx, my, 1, aS3_IB) + call UNwrite(ID__nc_ice, 'AL1', dt_ICE, mx, my, nsx, al1IB) + call UNwrite(ID__nc_ice, 'AL2', dt_ICE, mx, my, nsx, al2IB) + call UNwrite(ID__nc_ice, 'FRV2', dt_ICE, mx, my, nsx, frvIB) + call UNwrite(ID__nc_ice, 'SIC', dt_ICE, mx, my, 1, sicIB) + call UNwrite(ID__nc_ice, 'FRA', dt_ICE, mx, my, nsx, frvIB) + call UNwrite(ID__nc_ice, 'ST', dt_ICE, mx, my, 1, stIB) + call UNwrite(ID__nc_ice, 'ST2', dt_ICE, mx, my, nsx, st2IB) + call UNwrite(ID__nc_ice, 'Z0', dt_ICE, mx, my, nsx, Z0IB) + call UNwrite(ID__nc_ice, 'R0', dt_ICE, mx, my, nsx, R0IB) + call UNwrite(ID__nc_ice, 'UUS', dt_ICE, mx, my, nsx, UUSIB) + call UNwrite(ID__nc_ice, 'UUSTH', dt_ICE, mx, my, nsx, UUSTHIB) + call UNwrite(ID__nc_ice, 'UTS', dt_ICE, mx, my, nsx, UTSIB) + call UNwrite(ID__nc_ice, 'UQS', dt_ICE, mx, my, nsx, UQSIB) + call UNwrite(ID__nc_ice, 'USS', dt_ICE, mx, my, nsx, USSIB) + call UNwrite(ID__nc_ice, 'PBL', dt_ICE, mx, my, nsx, pblIB) + ! + ++++++++++++ + call UNwrite(ID__nc_ice, 'SICAO', dt_ICE, mx, my, 1, sicaoIB) + call UNwrite(ID__nc_ice, 'SITAO', dt_ICE, mx, my, 1, sitaoIB) + call UNwrite(ID__nc_ice, 'SNTAO', dt_ICE, mx, my, 1, sntaoIB) + call UNwrite(ID__nc_ice, 'ST2AO', dt_ICE, mx, my, nsx, st2aoIB) + call UNwrite(ID__nc_ice, 'AL2AO', dt_ICE, mx, my, nsx, albaoIB) + + ! +--3.2.1.c Cloud Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + + ! ! daily mean + + ! + ++++++++++++ + call UNwrite(ID__nc_ice, 'CC', dt_ICE, mx, my, 1, ccIB) + call UNwrite(ID__nc_ice, 'CU', dt_ICE, mx, my, 1, cuIB) + call UNwrite(ID__nc_ice, 'CM', dt_ICE, mx, my, 1, cmIB) + call UNwrite(ID__nc_ice, 'CD', dt_ICE, mx, my, 1, cdIB) + call UNwrite(ID__nc_ice, 'QW', dt_ICE, mx, my, 1, qwIB) + call UNwrite(ID__nc_ice, 'QI', dt_ICE, mx, my, 1, qiIB) + call UNwrite(ID__nc_ice, 'QS', dt_ICE, mx, my, 1, qsIB) + call UNwrite(ID__nc_ice, 'QR', dt_ICE, mx, my, 1, qrIB) + call UNwrite(ID__nc_ice, 'COD', dt_ICE, mx, my, 1, codIB) + call UNwrite(ID__nc_ice, 'WVP', dt_ICE, mx, my, 1, wvpIB) + call UNwrite(ID__nc_ice, 'CWP', dt_ICE, mx, my, 1, cwpIB) + call UNwrite(ID__nc_ice, 'IWP', dt_ICE, mx, my, 1, iwpIB) + call UNwrite(ID__nc_ice, 'QBR', dt_ICE, mx, my, 1, qbrIB) + call UNwrite(ID__nc_ice, 'tcwv', dt_ICE, mx, my, 1, tcwvIB) + call UNwrite(ID__nc_ice, 'tclc', dt_ICE, mx, my, 1, tclcIB) + call UNwrite(ID__nc_ice, 'tcic', dt_ICE, mx, my, 1, tcicIB) + call UNwrite(ID__nc_ice, 'tclp', dt_ICE, mx, my, 1, tclpIB) + call UNwrite(ID__nc_ice, 'tcip', dt_ICE, mx, my, 1, tcipIB) + call UNwrite(ID__nc_ice, 'rhodz', dt_ICE, mx, my, ml, rhodzIB) + ! + ++++++++++++ + + ! +--3.2.1.d Snow Pack Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + do k = 1, nsx + + write(sector, '(i1)') k + + do kk = 1, mi + do j = 1, my + do i = 1, mx + xymi1(i, j, kk) = g1IB(i, j, k, kk) + xymi2(i, j, kk) = g2IB(i, j, k, kk) + xymi3(i, j, kk) = agIB(i, j, k, kk) + xymi5(i, j, kk) = roIB(i, j, k, kk) + xymi6(i, j, kk) = tiIB(i, j, k, kk) + xymi7(i, j, kk) = waIB(i, j, k, kk) + enddo + enddo + enddo + + ! ! daily mean + + ! + ++++++++++++ + call UNwrite(ID__nc_ice, 'AG'//sector, & + dt_ICE, mx, my, mi, xymi3) + call UNwrite(ID__nc_ice, 'G1'//sector, & + dt_ICE, mx, my, mi, xymi1) + call UNwrite(ID__nc_ice, 'G2'//sector, & + dt_ICE, mx, my, mi, xymi2) + call UNwrite(ID__nc_ice, 'RO'//sector, & + dt_ICE, mx, my, mi, xymi5) + call UNwrite(ID__nc_ice, 'TI'//sector, & + dt_ICE, mx, my, mi, xymi6) + call UNwrite(ID__nc_ice, 'WA'//sector, & + dt_ICE, mx, my, mi, xymi7) + ! + ************ + + enddo + + do k = 1, nsx + do j = 1, my + do i = 1, mx + xynsx1(i, j, k) = real(nssSNo(i, j, k)) + xynsx2(i, j, k) = real(nisSNo(i, j, k)) + xynsx3(i, j, k) = zn3IB(i, j, k) - zn0IB(i, j, k) & + - zn6IB(i, j, k) + zn6IB(i, j, k) = zn3IB(i, j, k) - zn0IB(i, j, k) + enddo + enddo + enddo + + ! ! Snapshot + + ! + ************ + call UNwrite(ID__nc_ice, 'nSSN', & + dt_ICE, mx, my, nsx, xynsx1) + call UNwrite(ID__nc_ice, 'nISN', & + dt_ICE, mx, my, nsx, xynsx2) + call UNwrite(ID__nc_ice, 'SWSN', & + dt_ICE, mx, my, nsx, SWaSNo) + call UNwrite(ID__nc_ice, 'ALSN', & + dt_ICE, mx, my, 1, albeSL) + call UNwrite(ID__nc_ice, 'MB', & + dt_ICE, mx, my, nsx, mbIB) + call UNwrite(ID__nc_ice, 'ZN', & + dt_ICE, mx, my, nsx, zn1IB) + call UNwrite(ID__nc_ice, 'ZN1', & + dt_ICE, mx, my, nsx, zn1IB) + call UNwrite(ID__nc_ice, 'ZN2', & + dt_ICE, mx, my, nsx, zn2IB) + call UNwrite(ID__nc_ice, 'ZN3', & + dt_ICE, mx, my, nsx, zn3IB) + call UNwrite(ID__nc_ice, 'ZN4', & + dt_ICE, mx, my, nsx, zn4IB) + call UNwrite(ID__nc_ice, 'ZN5', & + dt_ICE, mx, my, nsx, zn5IB) + call UNwrite(ID__nc_ice, 'ZN6', & + dt_ICE, mx, my, nsx, xynsx3) + call UNwrite(ID__nc_ice, 'ZN0', dt_ICE, mx, my, nsx, zn0IB) + call UNwrite(ID__nc_ice, 'MB0', dt_ICE, mx, my, nsx, mb0IB) + ! + ************ + + do k = 1, nsx + + write(sector, '(i1)') k + + do kk = 1, nsno + do j = 1, my + do i = 1, mx + xynsno1(i, j, kk) = agsSNo(i, j, k, kk) + xynsno2(i, j, kk) = dzsSNo(i, j, k, kk) + xynsno3(i, j, kk) = real(nhsSNo(i, j, k, kk)) + xynsno4(i, j, kk) = g1sSNo(i, j, k, kk) + xynsno5(i, j, kk) = g2sSNo(i, j, k, kk) + xynsno6(i, j, kk) = rosSNo(i, j, k, kk) + xynsno7(i, j, kk) = tisSNo(i, j, k, kk) - TfSnow + xynsno8(i, j, kk) = wasSNo(i, j, k, kk) + enddo + enddo + enddo + + ! Snapshot + ! + ************ + call UNwrite(ID__nc_ice, 'agSN'//sector, dt_ICE, mx, my, nsno, xynsno1) + call UNwrite(ID__nc_ice, 'dzSN'//sector, dt_ICE, mx, my, nsno, xynsno2) + call UNwrite(ID__nc_ice, 'nhSN'//sector, dt_ICE, mx, my, nsno, xynsno3) + call UNwrite(ID__nc_ice, 'g1SN'//sector, dt_ICE, mx, my, nsno, xynsno4) + call UNwrite(ID__nc_ice, 'g2SN'//sector, dt_ICE, mx, my, nsno, xynsno5) + call UNwrite(ID__nc_ice, 'roSN'//sector, dt_ICE, mx, my, nsno, xynsno6) + call UNwrite(ID__nc_ice, 'tiSN'//sector, dt_ICE, mx, my, nsno, xynsno7) + call UNwrite(ID__nc_ice, 'waSN'//sector, dt_ICE, mx, my, nsno, xynsno8) + ! + ************ + + enddo + + ! +--3.2.1.e Soil Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + do k = 1, nsx + slqcIB(i, j, k) = 0 + do kk = -nsol, 0 + slqcIB(i, j, k) = Eta_TV(i, j, k, 1 - kk) * dzAvSV(kk) * ro_Wat + slqcIB(i, j, k) + enddo + enddo + enddo + enddo + + call UNwrite(ID__nc_ice, 'SLQC', dt_ICE, mx, my, nvx, slqcIB) + + do k = 1, nvx + write(sector, '(i1)') k + do kk = 1, llx + do j = 1, my + do i = 1, mx + xyllx1(i, j, kk) = TsolTV(i, j, k, kk) - TfSnow + xyllx2(i, j, kk) = Eta_TV(i, j, k, kk) + xyllx3(i, j, kk) = sltIB(i, j, k, kk) + xyllx4(i, j, kk) = slqIB(i, j, k, kk) + enddo + enddo + enddo + + ! ! Daily mean + snapshot + + ! + ************ + call UNwrite(ID__nc_ice, 'SLTSN'//sector, & + dt_ICE, mx, my, llx, xyllx1) + call UNwrite(ID__nc_ice, 'SLQSN'//sector, & + dt_ICE, mx, my, llx, xyllx2) + call UNwrite(ID__nc_ice, 'SLT'//sector, & + dt_ICE, mx, my, llx, xyllx3) + call UNwrite(ID__nc_ice, 'SLQ'//sector, & + dt_ICE, mx, my, llx, xyllx4) + ! + ************ + + enddo + + ! +--3.2.1.f Mass Balance Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + do j = 1, my + do i = 1, mx + + WKxy1(i, j) = snowHY(i, j) * 1000. + WKxy2(i, j) = rainHY(i, j) * 1000. + + enddo + enddo + + ! ! Snapshot + + ! + ************ + ! call UNwrite (ID__nc_ice, 'SImass', dt_ICE, mx, my, nsx,SIm_IB) + ! call UNwrite (ID__nc_ice, 'SImadd', dt_ICE, mx, my, nsx,wei0IB) + ! call UNwrite (ID__nc_ice, 'S_mass', dt_ICE, mx, my, nsx,S_m_IB) + ! call UNwrite (ID__nc_ice, 'SI_hhh', dt_ICE, mx, my, nsx,SIh_IB) + ! call UNwrite (ID__nc_ice, 'S__hhh', dt_ICE, mx, my, nsx,S_h_IB) + ! call UNwrite (ID__nc_ice, 'SS_hhh', dt_ICE, mx, my, nsx,SSh_IB) + ! call UNwrite (ID__nc_ice, 'MBsubl', dt_ICE, mx, my, nsx,wes_IB) + ! call UNwrite (ID__nc_ice, 'MBmelt', dt_ICE, mx, my, nsx,wem_IB) + ! call UNwrite (ID__nc_ice, 'MBrefr', dt_ICE, mx, my, nsx,wer_IB) + ! call UNwrite (ID__nc_ice, 'MBruno', dt_ICE, mx, my, nsx,weu_IB) + ! call UNwrite (ID__nc_ice, 'MBsrfW', dt_ICE, mx, my, nsx,SWaSNo) + ! call UNwrite (ID__nc_ice, 'MBevap', dt_ICE, mx, my, nsx,wee_IB) + ! call UNwrite (ID__nc_ice, 'MBsnow', dt_ICE, mx, my, 1, WKxy1) + ! call UNwrite (ID__nc_ice, 'MBrain', dt_ICE, mx, my, 1, WKxy2) + ! call UNwrite (ID__nc_ice, 'MBroff', dt_ICE, mx, my, 1,runoTV) + ! + ************ + + ! + factim = (86400.0/real(OutdyIB)) / abs((itrdIB-iterun) *dt ) + factim = 1.0 + ! +... factim : Conversion Factor (x /elapsed time --> x /Days) + + do j = 1, my + do i = 1, mx + do k = 1, nsx + xynsx1(i, j, k) = (CaWaTV(i, j, k) - wec0IB(i, j, k)) * factim + wec0IB(i, j, k) = CaWaTV(i, j, k) ! Canopy water content + + xynsx2(i, j, k) = (weacIB(i, j, k) - weac0IB(i, j, k)) * factim + weac0IB(i, j, k) = weacIB(i, j, k) ! BS acc + + xynsx3(i, j, k) = (weerIB(i, j, k) - weer0IB(i, j, k)) * factim + weer0IB(i, j, k) = weerIB(i, j, k) ! BS erosion + + xynsx4(i, j, k) = (slqcIB(i, j, k) - wel0IB(i, j, k)) * factim + wel0IB(i, j, k) = slqcIB(i, j, k) ! Soil water content + + ! Refreezing - Melting + xynsx5(i, j, k) = (wem_IB(i, j, k) - wem0IB(i, j, k)) * factim + (wer_IB(i, j, k) - wer0IB(i, j, k)) * factim + xynsx5(i, j, k) = (-1.) * xynsx6(i, j, k) + + ! Refreezing + xynsx6(i, j, k) = (wer_IB(i, j, k) - wer0IB(i, j, k)) * factim + wer0IB(i, j, k) = wer_IB(i, j, k) + enddo + enddo + enddo + + CALL UNwrite(ID__nc_ice, 'MBcc', dt_ICE, mx, my, nsx, xynsx1) + CALL UNwrite(ID__nc_ice, 'MBac', dt_ICE, mx, my, nsx, xynsx2) + CALL UNwrite(ID__nc_ice, 'MBer', dt_ICE, mx, my, nsx, xynsx3) + CALL UNwrite(ID__nc_ice, 'MBsc', dt_ICE, mx, my, nsx, xynsx4) + CALL UNwrite(ID__nc_ice, 'MBmt', dt_ICE, mx, my, nsx, xynsx5) + CALL UNwrite(ID__nc_ice, 'MBr', dt_ICE, mx, my, nsx, xynsx6) + + do j = 1, my + do i = 1, mx + do k = 1, nsx + xynsx1(i, j, k) = (wet_IB(i, j, k) - wet0IB(i, j, k)) * factim + wet0IB(i, j, k) = wet_IB(i, j, k) ! Total + + xynsx2(i, j, k) = (wem_IB(i, j, k) - wem0IB(i, j, k)) * factim + xynsx2(i, j, k) = (-1.) * xynsx2(i, j, k) + wem0IB(i, j, k) = wem_IB(i, j, k) ! Only Melting + + xynsx3(i, j, k) = (weu_IB(i, j, k) - weu0IB(i, j, k)) * factim + weu0IB(i, j, k) = weu_IB(i, j, k) ! Run-off + + xynsx4(i, j, k) = (weo_IB(i, j, k, 2) - weo0IB(i, j, k, 2)) * factim + weo0IB(i, j, k, 2) = weo_IB(i, j, k, 2) ! Run-off from snow + + xynsx5(i, j, k) = (wee_IB(i, j, k, 3) - wee0IB(i, j, k, 3)) * factim + wee0IB(i, j, k, 3) = wee_IB(i, j, k, 3) ! Subli from snow + + xynsx6(i, j, k) = (wee_IB(i, j, k, 1) - wee0IB(i, j, k, 1)) * factim + wee0IB(i, j, k, 1) = wee_IB(i, j, k, 1) ! Evaporation + + xynsx7(i, j, k) = (wee_IB(i, j, k, 2) - wee0IB(i, j, k, 2)) * factim + wee0IB(i, j, k, 2) = wee_IB(i, j, k, 2) ! Evapotranspiratuon + + xynsx8(i, j, k) = (wee_IB(i, j, k, 4) - wee0IB(i, j, k, 4)) * factim + wee0IB(i, j, k, 4) = wee_IB(i, j, k, 4) ! Subli from soil + + xynsx9(i, j, k) = (SWaSNo(i, j, k) - wesw0IB(i, j, k)) * factim + wesw0IB(i, j, k) = SWaSNo(i, j, k) ! Superficial Water + enddo + + WKxy2(i, j) = 0. + do k = 1, nsx + WKxy2(i, j) = WKxy2(i, j) & + + SLsrfl(i, j, k) * snohSN(i, j, k) / 1000. + enddo + + do kk = 1, ml + snf_IB(i, j, kk) = (snfHY(i, j, mz - kk + 1) - snf0IB(i, j, kk)) * factim + snf_IB(i, j, kk) = snf_IB(i, j, kk) * 1000. + snf0IB(i, j, kk) = snfHY(i, j, mz - kk + 1) + sbl_IB(i, j, kk) = (sblHY(i, j, mz - kk + 1) - sbl0IB(i, j, kk)) * factim + sbl_IB(i, j, kk) = sbl_IB(i, j, kk) * 1000. + sbl0IB(i, j, kk) = sblHY(i, j, mz - kk + 1) + ! cCA : check definition of qssbl; should be like LQS + qssbl_IB(i, j, kk) = (qssblHY(i, j, mz - kk + 1) - qssbl0IB(i, j, kk)) * factim + qssbl_IB(i, j, kk) = qssbl_IB(i, j, kk) * 1000. ! convertion mWE -> mmWE + qssbl0IB(i, j, kk) = qssblHY(i, j, mz - kk + 1) + dep_IB(i, j, kk) = (depHY(i, j, mz - kk + 1) - dep0IB(i, j, kk)) * factim + dep_IB(i, j, kk) = dep_IB(i, j, kk) * 1000. + dep0IB(i, j, kk) = depHY(i, j, mz - kk + 1) + rnf_IB(i, j, kk) = (rnfHY(i, j, mz - kk + 1) - rnf0IB(i, j, kk)) * factim + rnf_IB(i, j, kk) = rnf_IB(i, j, kk) * 1000. + rnf0IB(i, j, kk) = rnfHY(i, j, mz - kk + 1) + evp_IB(i, j, kk) = (evpHY(i, j, mz - kk + 1) - evp0IB(i, j, kk)) * factim + evp_IB(i, j, kk) = evp_IB(i, j, kk) * 1000. + evp0IB(i, j, kk) = evpHY(i, j, mz - kk + 1) + smt_IB(i, j, kk) = (smtHY(i, j, mz - kk + 1) - smt0IB(i, j, kk)) * factim + smt0ib(i, j, kk) = smtHY(i, j, mz - kk + 1) + enddo + + WKxy2(i, j) = 0. ! snowfall does not taken into account + ! ! the snow in the SISVAT bluffer + + WKxy1(i, j) = (snowHY(i, j) - wesf0IB(i, j) & + - WKxy2(i, j)) * factim + WKxy1(i, j) = max(0., WKxy1(i, j) * 1000.) + wesf0IB(i, j) = snowHY(i, j) - WKxy2(i, j) ! Snowfall + + WKxy2(i, j) = (rainHY(i, j) - werr0IB(i, j)) * factim + WKxy2(i, j) = max(0., WKxy2(i, j) * 1000.) + werr0IB(i, j) = rainHY(i, j) ! Rain + + WKxy3(i, j) = (rainCA(i, j) + snowCA(i, j) & + - wecp0IB(i, j)) * factim + WKxy3(i, j) = max(0., WKxy3(i, j) * 1000.) + wecp0IB(i, j) = rainCA(i, j) + snowCA(i, j) ! Convective precip. + + WKxy4(i, j) = (runoTV(i, j) - wero0IB(i, j)) * factim + wero0IB(i, j) = runoTV(i, j) ! RunOFF + + WKxy5(i, j) = (crysHY(i, j) - wecr0IB(i, j)) * factim + WKxy5(i, j) = max(0., WKxy5(i, j) * 1000.) + wecr0IB(i, j) = crysHY(i, j) ! Ice crystals + + enddo + enddo + + do j = 1, my + do i = 1, mx + do k = 1, nsx + xynsx0(i, j, k) = WKxy1(i, j) + WKxy2(i, j) - xynsx4(i, j, k) - xynsx5(i, j, k) ! smb = snf + rnf - sb + xynsx14(i, j, k) = WKxy2(i, j) + xynsx2(i, j, k) - xynsx9(i, j, k) ! rfz = r + enddo + ! if (isolSL(i, j)<=2) then ! ocean and sea-ice + ! xynsx0(i, j, 1) = NF_FILL_REAL ! SMB + ! xynsx5(i, j, 1) = NF_FILL_REAL ! Sublimation + ! xynsx2(i, j, 1) = NF_FILL_REAL ! Melting + ! xynsx4(i, j, 1) = NF_FILL_REAL ! Run-off + ! xynsx14(i, j, 1) = NF_FILL_REAL ! Refreezing + ! end if + enddo + enddo + + ! ! Sum + + ! + ************ + call UNwrite(ID__nc_ice, 'smb', dt_ICE, mx, my, nsx, xynsx0) + call UNwrite(ID__nc_ice, 'snf', dt_ICE, mx, my, 1, WKxy1) + call UNwrite(ID__nc_ice, 'rnf', dt_ICE, mx, my, 1, WKxy2) + call UNwrite(ID__nc_ice, 'cry', dt_ICE, mx, my, 1, WKxy5) + CALL UNwrite(ID__nc_ice, 'sbl', dt_ICE, mx, my, nsx, xynsx5) + CALL UNwrite(ID__nc_ice, 'mlt', dt_ICE, mx, my, nsx, xynsx2) + CALL UNwrite(ID__nc_ice, 'rof', dt_ICE, mx, my, nsx, xynsx4) + CALL UNwrite(ID__nc_ice, 'rfz', dt_ICE, mx, my, nsx, xynsx14) + call UNwrite(ID__nc_ice, 'snf3D', dt_ICE, mx, my, ml, snf_IB) + call UNwrite(ID__nc_ice, 'sbl3D', dt_ICE, mx, my, ml, sbl_IB) + CALL UNwrite(ID__nc_ice, 'QSSBL', dt_ICE, mx, my, ml, qssbl_IB) + call UNwrite(ID__nc_ice, 'rnf3D', dt_ICE, mx, my, ml, rnf_IB) + CALL UNwrite(ID__nc_ice, 'dep3D', dt_ICE, mx, my, ml, dep_IB) + call UNwrite(ID__nc_ice, 'evp3D', dt_ICE, mx, my, ml, evp_IB) + call UNwrite(ID__nc_ice, 'smt3D', dt_ICE, mx, my, ml, smt_IB) + + call UNwrite(ID__nc_ice, 'MBto', dt_ICE, mx, my, nsx, xynsx1) + call UNwrite(ID__nc_ice, 'MBic', dt_ICE, mx, my, 1, WKxy5) + call UNwrite(ID__nc_ice, 'MBsf', dt_ICE, mx, my, 1, WKxy1) + call UNwrite(ID__nc_ice, 'MBrr', dt_ICE, mx, my, 1, WKxy2) + CALL UNwrite(ID__nc_ice, 'MBrf', dt_ICE, mx, my, 1, WKxy2) + call UNwrite(ID__nc_ice, 'MBcp', dt_ICE, mx, my, 1, WKxy3) + call UNwrite(ID__nc_ice, 'MBru', dt_ICE, mx, my, 1, WKxy4) + + CALL UNwrite(ID__nc_ice, 'MBsw', dt_ICE, mx, my, nsx, xynsx9) + CALL UNwrite(ID__nc_ice, 'MBm', dt_ICE, mx, my, nsx, xynsx2) + + CALL UNwrite(ID__nc_ice, 'MBru2', dt_ICE, mx, my, nsx, xynsx3) + CALL UNwrite(ID__nc_ice, 'MBro2', dt_ICE, mx, my, nsx, xynsx4) + CALL UNwrite(ID__nc_ice, 'MBru3', dt_ICE, mx, my, nsx, xynsx4) + + CALL UNwrite(ID__nc_ice, 'MBsn', dt_ICE, mx, my, nsx, xynsx5) + CALL UNwrite(ID__nc_ice, 'MBep', dt_ICE, mx, my, nsx, xynsx6) + CALL UNwrite(ID__nc_ice, 'MBet', dt_ICE, mx, my, nsx, xynsx7) + CALL UNwrite(ID__nc_ice, 'MBsl', dt_ICE, mx, my, nsx, xynsx8) + CALL UNwrite(ID__nc_ice, 'MBe', dt_ICE, mx, my, nsx, xynsx6 + xynsx7) + CALL UNwrite(ID__nc_ice, 'MBs', dt_ICE, mx, my, nsx, xynsx5 + xynsx8) + + do j = 1, my + do i = 1, mx + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + smbhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + smbhIB(i, j, k) = smbhIB(i, j, k) & + * xynsx1(i, j, 1) / tmp3 + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + swhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + swhIB(i, j, k) = swhIB(i, j, k) * xynsx9(i, j, 1) / tmp3 + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + mehIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + mehIB(i, j, k) = mehIB(i, j, k) * xynsx2(i, j, 1) / tmp3 + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + 0.1 * mehIB(i, j, k) + 0.9 * ruhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + ruhIB(i, j, k) = (0.1 * mehIB(i, j, k) + 0.9 * ruhIB(i, j, k)) * xynsx4(i, j, 1) / tmp3 + else + if(abs(xynsx4(i, j, 1)) > 0.001) then + ruhIB(i, j, k) = xynsx4(i, j, 1) / real(mlhh) + else + ruhIB(i, j, k) = 0. + endif + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + suhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + suhIB(i, j, k) = suhIB(i, j, k) * xynsx5(i, j, 1) / tmp3 + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + snfhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + snfhIB(i, j, k) = snfhIB(i, j, k) * WKxy1(i, j) / tmp3 + endif + enddo + + tmp3 = 0 + do k = 1, mlhh + tmp3 = tmp3 + rfhIB(i, j, k) + enddo + do k = 1, mlhh + if(abs(tmp3) > 0.001) then + rfhIB(i, j, k) = rfhIB(i, j, k) & + * WKxy2(i, j) / tmp3 + endif + prhIB(i, j, k) = rfhIB(i, j, k) + snfhIB(i, j, k) + enddo + + enddo + enddo + + ! For snow only + call UNwrite(ID__nc_ice, 'SMBh', dt_ICE, mx, my, mlhh, smbhIB) + call UNwrite(ID__nc_ice, 'SWh', dt_ICE, mx, my, mlhh, swhIB) + call UNwrite(ID__nc_ice, 'MEh', dt_ICE, mx, my, mlhh, mehIB) + call UNwrite(ID__nc_ice, 'PRh', dt_ICE, mx, my, mlhh, prhIB) + call UNwrite(ID__nc_ice, 'SUh', dt_ICE, mx, my, mlhh, suhIB) + call UNwrite(ID__nc_ice, 'RUh', dt_ICE, mx, my, mlhh, ruhIB) + call UNwrite(ID__nc_ice, 'SNFh', dt_ICE, mx, my, mlhh, snfhIB) + call UNwrite(ID__nc_ice, 'SFh', dt_ICE, mx, my, mlhh, snfhIB) + call UNwrite(ID__nc_ice, 'RFh', dt_ICE, mx, my, mlhh, rfhIB) + + ! + Conservation on ice sheet: MBSF+MBRR-MBS-MBRU~MBTO-MBSW + ! + ******************************************************* + + do j = 1, my + do i = 1, mx + do k = 1, nsx + xynsx6(i, j, k) = (weo_IB(i, j, k, 1) - weo0IB(i, j, k, 1)) * factim + weo0IB(i, j, k, 1) = weo_IB(i, j, k, 1) ! Run-off + xynsx8(i, j, k) = (weo_IB(i, j, k, 3) - weo0IB(i, j, k, 3)) * factim + weo0IB(i, j, k, 3) = weo_IB(i, j, k, 3) ! Run-off + xynsx9(i, j, k) = (weo_IB(i, j, k, 4) - weo0IB(i, j, k, 4)) * factim + weo0IB(i, j, k, 4) = weo_IB(i, j, k, 4) ! Run-off + xynsx10(i, j, k) = (weo_IB(i, j, k, 5) - weo0IB(i, j, k, 5)) * factim + weo0IB(i, j, k, 5) = weo_IB(i, j, k, 5) ! Run-off + xynsx11(i, j, k) = (weo_IB(i, j, k, 6) - weo0IB(i, j, k, 6)) * factim + weo0IB(i, j, k, 6) = weo_IB(i, j, k, 6) ! Run-off + enddo + ! WKxy1(i, j) = 0 + ! WKxy2(i, j) = 0 + ! WKxy3(i, j) = 0 + ! WKxy4(i, j) = 0 + ! WKxy5(i, j) = 0 + ! do k = 1, nsx + ! WKxy1(i, j) = WKxy1(i, j) + SLsrfl(i, j, k) * xynsx6(i, j, k) + ! WKxy2(i, j) = WKxy2(i, j) + SLsrfl(i, j, k) * xynsx7(i, j, k) + ! WKxy3(i, j) = WKxy3(i, j) + SLsrfl(i, j, k) * xynsx8(i, j, k) + ! WKxy4(i, j) = WKxy4(i, j) + SLsrfl(i, j, k) * xynsx9(i, j, k) + ! WKxy5(i, j) = WKxy5(i, j) + SLsrfl(i, j, k) * xynsx10(i, j, k) + ! end do + enddo + enddo + + CALL UNwrite(ID__nc_ice, 'MBro1', dt_ICE, mx, my, mw, xynsx6) + CALL UNwrite(ID__nc_ice, 'MBro3', dt_ICE, mx, my, mw, xynsx8) + CALL UNwrite(ID__nc_ice, 'MBro4', dt_ICE, mx, my, mw, xynsx9) + CALL UNwrite(ID__nc_ice, 'MBro5', dt_ICE, mx, my, mw, xynsx10) + CALL UNwrite(ID__nc_ice, 'MBro6', dt_ICE, mx, my, mw, xynsx11) + + ! +--3.2.2 Work Arrays Reset + ! + ----------------------- + + do j = 1, my + do i = 1, mx + WKxy0(i, j) = 0.0 + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + WKxy5(i, j) = 0.0 + WKxy6(i, j) = 0.0 + WKxy7(i, j) = 0.0 + WKxy8(i, j) = 0.0 + WKxy9(i, j) = 0.0 + enddo + enddo + + call NCSNC(ID__nc_ice, RCODE) + + if(ID__nc_ice /= -1) then + ! + ************ + call UNclose(ID__nc_ice) + ! + ************ + ID__nc_ice = -1 + endif + + If(snapshot .and. ss == 1) then + ss = 0 + fnamNC_tmp = fnamNC_ics + dt_ICE = dt_ICE - 1 + goto 801 + endif + + OutdyIB0 = OutdyIB0 + 1 + if(OutdyIB0 >= OutdyIB) OutdyIB0 = 0 + + itrdIB = iterun + + ENDif !Daily + + ! +--3.2.3 NetCDF File Closure + ! + ------------------------- + + if(ID__nc_ice /= -1) then + ! + ************ + call UNclose(ID__nc_ice) + ! + ************ + ID__nc_ice = -1 + endif + + deallocate(xyllx1) + deallocate(xyllx2) + deallocate(xyllx3) + deallocate(xyllx4) + deallocate(xymi1) + deallocate(xymi2) + deallocate(xymi3) + deallocate(xymi4) + deallocate(xymi5) + deallocate(xymi6) + deallocate(xymi7) + deallocate(xynsno1) + deallocate(xynsno2) + deallocate(xynsno3) + deallocate(xynsno4) + deallocate(xynsno5) + deallocate(xynsno6) + deallocate(xynsno7) + deallocate(xynsno8) + deallocate(xynsx0) + deallocate(xynsx1) + deallocate(xynsx2) + deallocate(xynsx3) + deallocate(xynsx4) + deallocate(xynsx5) + deallocate(xynsx6) + deallocate(xynsx7) + deallocate(xymlhh) + deallocate(xynsx8) + deallocate(xynsx9) + deallocate(xynsx10) + deallocate(xynsx11) + deallocate(xynsx12) + deallocate(xynsx13) + deallocate(xynsx14) + + return +end diff --git a/MAR/code_mar/outsav.f90 b/MAR/code_mar/outsav.f90 new file mode 100644 index 0000000000000000000000000000000000000000..54d36296a036d8571fec3487db452b8b3114a167 --- /dev/null +++ b/MAR/code_mar/outsav.f90 @@ -0,0 +1,319 @@ +#include "MAR_pp.def" +subroutine outsav + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT Mon 23-May-2011 MAR | + ! | subroutine outsav is used to save the main Model Variables | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_ub + use marsib + use mar_te + use mar_tu + use mar_ra + use mar_hy + use mar_ca + use mar_pb + use mar_sl + use mar_sv + use mar_bs + use mar_io +#if(NH) + use mar_nh +#endif +#if(TC) + use mar_tc +#endif +#if(PO) + use mar_po +#endif +#if(iso) + use mariso, only: qvDY_iso, qvapSL_iso, & + dqv_CA_iso, dqw_CA_iso, dqi_CA_iso, & + drr_CA_iso, dss_CA_iso, dsn_CA_iso, & + rainCA_iso, snowCA_iso, & + qiHY_iso, qsHY_iso, qwHY_iso, & + qrHY_iso, rainHY_iso, rai0HY_iso, & + snowHY_iso, sno0HY_iso, sfa0HY_iso, crysHY_iso, & + SLuqs_iso, SLuqsl_iso +#endif + + implicit none + + ! +-- Hydrostatic Dynamics + ! + ======================== + open(unit=11, status='unknown', form='unformatted', file='MARdyn.DAT') + rewind 11 + ! Time Parameters + write(11) itexpe, jdh_LB + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + ! Spatial Parameters + write(11) imez, jmez + write(11) GElat0, GElon0 + ! Discretisation + write(11) sigma, ptopDY, dx, dy + ! Dynamics + write(11) uairDY + write(11) vairDY + write(11) pktaDY + write(11) pstDY + write(11) qvDY + write(11) sh + write(11) pstDY1 + ! Lateral Boundary Conditions + write(11) iyr_LB, mma_LB, jda_LB, jhu_LB, jdh_LB + write(11) vaxgLB, vaxdLB, vayiLB, vaysLB + write(11) sst_LB + ! Upper Sponge Reference State + write(11) uairUB, vairUB, pktaUB + write(11) pstDYn + write(11) RAd_ir + write(11) IRsoil + write(11) virDY + write(11) tim1LB, v1xgLB, v1xdLB, v1yiLB, v1ysLB + write(11) tim2LB, v2xgLB, v2xdLB, v2yiLB, v2ysLB + write(11) sst1LB, sst2LB + write(11) ua1_UB, ua2_UB + write(11) va1_UB, va2_UB + write(11) pkt1UB, pkt2UB + ! + + if(my == 1) then + write(11) ugeoDY + write(11) vgeoDY + endif + ! + + close(unit=11) +#if(iso) + ! write isotopic composition of dynamical variables + open(unit=11, status='unknown', form='unformatted', file='MARdyn_iso.DAT') + rewind 11 + write(11) qvDY_iso + close(unit=11) +#endif +#if(NH) + ! +--Non-Hydrostatic Dynamics + ! + ======================== + open(unit=11, status='unknown', form='unformatted', file='MARonh.DAT') + rewind 11 + write(11) itexpe + ! Time Parameters + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + ! Dynamics + write(11) ua0_NH + write(11) va0_NH + write(11) wa0_NH + write(11) wairNH + write(11) pairNH + close(unit=11) +#endif + + ! +--Mass Flux convective Scheme + ! + =========================== + if(convec) then + open(unit=11, status='unknown', form='unformatted', file='MARcva.DAT') + rewind 11 + write(11) itexpe + ! Time Parameters + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + write(11) adj_CA + write(11) int_CA + write(11) dpktCA + write(11) dqv_CA + write(11) dqw_CA + write(11) dqi_CA + write(11) drr_CA + write(11) dss_CA + write(11) dsn_CA + write(11) rainCA + write(11) snowCA + write(11) tau_CA + write(11) Kstep1 + write(11) K_CbT1 + write(11) K_CbB1 + write(11) P_CH_0 + write(11) PdCH_1 + write(11) PdTa_1 + write(11) PdQa_1 + write(11) PdQw_1 + write(11) PdQi_1 + write(11) Pdrr_1 + write(11) Pdss_1 + write(11) PuMF_1 + write(11) PdMF_1 + write(11) Pfrr_1 + write(11) Pfss_1 + write(11) Pcape1 + close(unit=11) +#if(iso) + ! write isotopic composition of convective variables + open(unit=11, status='unknown', form='unformatted', file='MARcva_iso.DAT') + rewind 11 + write(11) dqv_CA_iso + write(11) dqw_CA_iso + write(11) dqi_CA_iso + write(11) drr_CA_iso + write(11) dss_CA_iso + write(11) dsn_CA_iso + write(11) rainCA_iso + write(11) snowCA_iso + close(unit=11) +#endif + endif + + ! +--Microphysics + ! + ============ + if(micphy) then + open(unit=11, status='unknown', form='unformatted', file='MARcld.DAT') + rewind 11 + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + write(11) turnHY + write(11) ccniHY + write(11) qiHY + write(11) qsHY +#if(qg) + write(11) qgHY +#endif + write(11) qwHY + write(11) qrHY + write(11) rainHY, rai0HY + write(11) snowHY, sno0HY, sfa0HY + write(11) crysHY + write(11) rainCA +#if(BS) + write(11) uss_HY +#endif + close(unit=11) +#if(iso) + ! write isotopic composition of microphysics water + open(unit=11, status='unknown', form='unformatted', file='MARcld_iso.DAT') + rewind 11 + write(11) qiHY_iso + write(11) qsHY_iso + write(11) qwHY_iso + write(11) qrHY_iso + write(11) rainHY_iso, rai0HY_iso + write(11) snowHY_iso, sno0HY_iso, sfa0HY_iso + write(11) crysHY_iso + ! rainCA_iso already in 'MARcva_iso.DAT' + ! write(11) rainCA_iso + close(unit=11) +#endif + endif +#if(TC) + ! +--Atmospheric Tracers + ! + =================== + open(unit=11, status='unknown', form='unformatted', file='MARtca.DAT') + rewind 11 + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + write(11) dt_ODE, dt2ODE, nt_ODE, jt_ODE + write(11) qxTC + write(11) qsTC + write(11) uqTC + close(unit=11) +#endif +#if(PO) + ! +--Polynya Model + ! + ============= + if(polmod) then + open(unit=11, status='unknown', form='unformatted', file='MARpol.DAT') + rewind 11 + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + write(11) isolSL + write(11) iPO1, iPO2, jPO1, jPO2, iPO3, iPO4, jPO3, jPO4 + write(11) hfraPO, vgriPO, uocnPO, vocnPO, swsaPO, focnPO + write(11) silfPO, hicePO, aicePO, uicePO, vicePO, dtPO + close(unit=11) + endif +#endif + ! +--Soil Model + ! + ========== + open(unit=11, status='unknown', form='unformatted', file='MARsol.DAT') + rewind 11 + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + write(11) nSLsrf + write(11) SLsrfl + write(11) TairSL + write(11) tsrfSL + write(11) alb0SL, eps0SL + write(11) SaltSL + write(11) ro_SL0 + write(11) ro_SL + write(11) d1_SL + write(11) t2_SL + write(11) w2_SL, wg_SL + write(11) roseSL + write(11) qvapSL + write(11) hsnoSL + write(11) hmelSL + write(11) SLuusl, SL_z0 + write(11) SLutsl, SL_r0 + write(11) pktaSL + write(11) sicsIB + write(11) sic1sI, sic2sI + write(11) albeSL + write(11) SLuus, SLuts + write(11) SLuqs, SLuqsl + write(11) duusSL + write(11) dutsSL + write(11) cdmSL, cdhSL + write(11) V_0aSL + write(11) dT0aSL +#if(AM) + write(11) u_0aSL +#endif +#if(AT) + write(11) uT0aSL +#endif +#if(AS) + write(11) us0aSL +#endif +#if(VX) + write(11) WV__SL +#endif + write(11) SLlmo, SLlmol +#if(BV) + write(11) virSL +#endif + close(unit=11) +#if(iso) + ! write isotopic composition of surface air water + open(unit=11, status='unknown', form='unformatted', file='MARsol_iso.DAT') + rewind 11 + write(11) qvapSL_iso + write(11) SLuqs_iso + write(11) SLuqsl_iso + close(unit=11) +#endif + ! +--SVAT Model + ! + ========== + if(vegmod) then + ! + *********** + call svasav('writ') + ! + *********** + endif + ! +--Turbulence + ! + ========== + open(unit=11, status='unknown', form='unformatted', file='MARtur.DAT') + rewind 11 + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + ! TURBULENT KINETIC ENERGY (TKE) and DISSIPATION (e) + write(11) ect_TE + write(11) eps_TE + write(11) tranTE + ! TURBULENT DIFFUSION COEFFICIENT + write(11) TUkvm + write(11) TUkvh + close(unit=11) + return +end diff --git a/MAR/code_mar/pbltop.f90 b/MAR/code_mar/pbltop.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4bb89586833c3d9b52d471b2ea92aaf76db8b2e0 --- /dev/null +++ b/MAR/code_mar/pbltop.f90 @@ -0,0 +1,180 @@ +subroutine PBLtop(TKE_1D, HHH_1D, h__PSL, h__SSL) + ! +---------------------------------------------------------------------------+ + ! | 07-APR-2005 | + ! | PBLtop computes the height of the Primary Seeing Layer PSL | + ! | Secondary Seeing Layer SSL | + ! | | + ! | INPUT: TKE_1D: Turbulent Kinetic Energy [m2/s2] | + ! | HHH_1D: Height above the Surface [m] | + ! | | + ! | OUTPUT: h__PSL: Height of the Primary Seeing Layer [m] | + ! | h__SSL: Height of the Secondary Seeing Layer [m] | + ! | | + ! +---------------------------------------------------------------------------+ + + use mardim + + implicit none + + real TKE_1D(mz) + real HHH_1D(mz) + real h__PSL + real h__SSL + + real TKEmin + real TKEtop + + integer k, kmx, kzi + + logical RESET + logical INTERP + + DATA TKEmin/1.e-6/ + + INTERP = .false. + + ! +--Height of the Primary Seeing Layer (PSL) + ! + ========================================== + + ! +--Search the lowest TKE maximum + ! + ----------------------------- + + k = mz + TKEtop = 0.01 * TKE_1D(k) +1001 continue + k = k - 1 + if(k <= mzabso) go to 1000 + if(TKE_1D(k) < TKE_1D(k + 1) .and. & + TKE_1D(k + 1) > TKEmin * 3.00) go to 1000 + ! + 3.00 = 1/2 order of magnitude + ! + (in order to only detect a significant maximum) + go to 1001 +1000 continue + kmx = k + 1 + TKEtop = 0.01 * TKE_1D(kmx) + TKEtop = max(TKEmin * 1.50, TKEtop) + ! + 1.50 = 1/4 order of magnitude + + ! +--Search (from above) the lowest TKE minimum above the lowest TKE maximum + ! + ------ (This mimimum may be ) ---------- + ! + (either a TRUE minimum => INTERP = .false.) + ! + ( or an arbitrary small value => INTERP = .true. ) + ! + ----------------------------------------------------- + + ! +--Index of the layer containing the minimum + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + kzi = mzabso + do k = mzabso, kmx + if(TKE_1D(k) < TKEtop .OR. & + TKE_1D(k) < TKE_1D(k - 1) * 0.3) then + kzi = k + if(TKE_1D(k) < TKEtop) then + INTERP = .true. + else + INTERP = .false. + endif + endif + enddo + + ! +--Height of the minimum + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + k = kzi + if(kzi <= mzabso + 1) then + h__PSL = HHH_1D(mz) + else + if(INTERP) then + h__PSL = HHH_1D(k + 1) & + + (HHH_1D(k) - HHH_1D(k + 1)) & + * (TKEtop - TKE_1D(k + 1)) & + / (TKE_1D(k) - TKE_1D(k + 1)) + else + h__PSL = HHH_1D(k) + endif + endif + + h__PSL = min(h__PSL, HHH_1D(1)) + h__PSL = max(HHH_1D(mz), h__PSL) + + ! +--Height of the Secondary Seeing Layer (SSL) + ! + ========================================== + + RESET = .true. + + ! +--Search the TKE minimum above the Primary Seeing Layer (PSL) + ! + (necessary if the TKE has decreased below the minimum value) + ! + ------------------------------------------------------------------ + + if(INTERP) then + k = kzi + 1 +1011 continue + k = k - 1 + if(k <= mzabso) go to 1010 + if(TKE_1D(k) < TKE_1D(k + 1)) go to 1011 +1010 continue + else + k = kzi + endif + + ! +--Search the first TKE maximum above the Primary Seeing Layer (PSL) + ! + ------------------------------------------------------------------ + + kmx = kzi + k = k + 1 +1021 continue + k = k - 1 + if(k <= mzabso) go to 1020 + if(TKE_1D(k) > TKE_1D(k - 1) .and. & + TKE_1D(k) > TKE_1D(k + 1) .and. & + TKE_1D(k) > TKEmin * 3.0) then + ! + 3.0 = 1/2 order of magnitude + ! + (in order to only detect a significant maximum) + + ! +--Define the TKE at the SSL top from the largest maximum in the SSL + ! + (thus examine the remaining upper part of the atmospheric column) + ! + ----------------------------------------------------------------- + + if(RESET) then + RESET = .false. ! indicates TKEtop is initialized + TKEtop = 0.00 ! + endif + if(TKEtop < TKE_1D(k) * 0.01) then + TKEtop = TKE_1D(k) * 0.01 + kmx = k + endif + endif + go to 1021 +1020 continue + TKEtop = max(TKEmin * 3.0, TKEtop) + ! + 3.0 = 1/2 order of magnitude + + ! +--Search (from above) the SSL top above the SSL TKE maximum + ! + ------ (This may be ) ---------- + ! + (either a TRUE minimum => INTERP = .false.) + ! + ( or an arbitrary small value => INTERP = .true. ) + ! + ----------------------------------------------------- + + kzi = mzabso + do k = kmx, mzabso, -1 + if(TKE_1D(k) > TKEtop) & + kzi = k + enddo + + k = kzi - 1 + if(kzi <= mzabso + 1) then + h__SSL = HHH_1D(mz) + else + if(INTERP) then + h__SSL = HHH_1D(k + 1) & + + (HHH_1D(k) - HHH_1D(k + 1)) & + * (TKEtop - TKE_1D(k + 1)) & + / (TKE_1D(k) - TKE_1D(k + 1)) + else + h__SSL = HHH_1D(k) + endif + endif + + h__SSL = min(h__SSL, HHH_1D(1)) + h__SSL = max(h__PSL, h__SSL) + + return +end diff --git a/MAR/code_mar/phy_sisvat.f90 b/MAR/code_mar/phy_sisvat.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fd5ab2f6f90b3d52077760e78d42ccb0188c40b5 --- /dev/null +++ b/MAR/code_mar/phy_sisvat.f90 @@ -0,0 +1,2405 @@ +#include "MAR_pp.def" +subroutine PHY_SISVAT_MP(ihamr_SIS, nhamr_SIS) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_Driver 09-03-2021 MAR | + ! | subroutine PHY_SISVAT interfaces MAR with the | + ! | Soil/Ice Snow Vegetation Atmosphere Transfer Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: ihamr_SIS: Time Digital Filter Status | + ! | ^^^^^ nhamr_SIS: Time Digital Filter Set Up | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ VegMod: SISVAT is set up when .T. | + ! | SnoMod: Snow Pack is set up when .T. | + ! | reaLBC: Update Bound.Condit.when .T. | + ! | iterun: Run Iterations Counter | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ xxxxTV: SISVAT/MAR interfacing variables | + ! | | + ! | # CAUTION: #sa: Stand Alone Preprocessing Label must be removed | + ! | # ^^^^^^^ when SISVAT is coupled with MAR | + ! | | + ! | Preprocessing Option: SISVAT PHYSICS | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ | + ! | # #HY | + ! | # #SN: Snow Model | + ! | # #BS: Blowing Snow Parameterization | + ! | # #SI Sea-Ice Parameterization | + ! | # #GP LAI and GLF Variations not specified | + ! | # #OP SST is interactive | + ! | | + ! | # #DS: diffuse radiation differing from direct | + ! | (variable RADsod must still be included) | + ! | | + ! | Preprocessing Option: SISVAT PHYSICS: Col de Porte | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | # #CP: SBL, Col de Porte | + ! | # #cp Solar Radiation, Col de Porte | + ! | # #AG: Snow Ageing, Col de Porte | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # ANI.yyyymmdd.LAB.nc | #NC: OUTPUT on NetCDF File (Stand Alone EXP.) | + ! | | | + ! | # SISVAT_iii_jjj_n | #E0: OUTPUT on ASCII File (SISVAT Variables) | + ! | # |(#E0 MUST BE PREPROCESSED BEFORE #e1 & #e2 !) | + ! | # SISVAT_iii_jjj_n | #e1: OUTPUT/Verification: Energy Conservation | + ! | # SISVAT_iii_jjj_n | #e2: OUTPUT/Verification: Energy Consrv.2e pt.| + ! | | (no premature stop) | + ! | | | + ! | # SISVAT_iii_jjj_n | #m0: OUTPUT/Verification: H2O Conservation | + ! | # SISVAT_iii_jjj_n | #m1: OUTPUT/Verification: * Mass Conservation | + ! | # SISVAT_iii_jjj_n | #m2: OUTPUT/Verification: SeaIce Conservation | + ! | | | + ! | # SISVAT_zSn.vz | #vz: OUTPUT/Verification: Snow Layers Agrega. | + ! | | unit 41, subroutine SISVAT_zSn **ONLY** | + ! | # SISVAT_qSo.vw | #vw: OUTPUT/Verif+Detail: H2O Conservation | + ! | | unit 42, subroutine SISVAT_qSo **ONLY** | + ! | # SISVAT_qSn.vm | #vm: OUTPUT/Verification: Energy/Water Budget | + ! | | unit 43, subroutine SISVAT_qSn **ONLY** | + ! | # SISVAT_qSn.vu | #vu: OUTPUT/Verification: Slush Parameteriz. | + ! | | unit 44, subroutine SISVAT_qSn **ONLY** | + ! | # SISVAT_wEq.ve | #ve: OUTPUT/Verification: Snow/Ice Water Eqv. | + ! | | unit 45, subroutine SISVAT_wEq **ONLY** | + ! | # SnOptP____.va | #va: OUTPUT/Verification: Albedo Parameteriz. | + ! | | unit 46, subroutine SnOptP **ONLY** | + ! | # SISVAT_GSn.vp | #vp: OUTPUT/Verification: Snow Properties | + ! | | unit 47, subroutines SISVAT_zSn, _GSn | + ! | # PHY_SISVAT.v0 | #v0: OUTPUT/Verification: DUMP | + ! | | unit 50, subroutine PHY_SISVAT **ONLY** | + ! | | | + ! | # stdout | #s0: OUTPUT of Snow Buffer Layer | + ! | | unit 6, subroutine SISVAT **ONLY** | + ! | # stdout | #wx: OUTPUT/Verification: specified i,j,k,n | + ! | # stdout | #wz: OUTPUT of Roughness Length (Blown Snow) | + ! | | unit 6, subroutines SISVAT, PHY_SISVAT | + ! | | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_ra + use mar_lb + use mar_dy + use mar_hy + use mar_tu + use mar_sv + use mardSV + use mar0SV + use mar_sl + use mar_TV + use mar_bs + use marssn + use mar_ib + use marsib + use mar_wk + use marmagic +#if(BW) + use mar_te +#endif +#if(TC) + use mar_tc +#endif +#if(AO) + use mar_AO +#endif +#if(PO) + use mar_po +#endif + ! +--INTERFACE Variables + ! + =================== + use marxsv + use marysv +#if(iso) + use mariso, only: wiso, niso, qsrfHY_iso, SLuqsl_iso, uqs_SV_iso, & + SLuqs_iso, qvapSL_iso, evapTV_iso, Rdefault +#endif + implicit none + + ! +--Global Variables + ! + ================ + + integer ihamr_SIS, nhamr_SIS ! Hamming Filter Counters + integer newglfSIS ! + integer newsicSI ! + + real rtime + integer ntime + common / c_time / ntime + + integer mw0 + parameter(mw0=3) + + ! +--Level of negligible blown Snow Particles Concentration + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer kB + common / SISVAT_MAR__BS / kB + + ! +--10-m Level + ! + ~~~~~~~~~~ + integer kSBL + common / PHY_SISVAT_SBLi / kSBL + real rSBL10, VV__10(mx, my), ERprev(mx, my, mw) + common / PHY_SISVAT_SBLr / rSBL10, ERprev + + ! +--V, dT(a-s) Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + real V__mem(klonv, ntaver) ! ntaver defined in MAR_SL.inc + real VVmmem(klonv) ! + common / SVeSBLmem / V__mem, VVmmem ! + real T__mem(klonv, ntaver) ! + real dTmmem(klonv) ! + common / STeSBLmem / T__mem, dTmmem ! + + !$OMP threadprivate(/SVeSBLmem/,/STeSBLmem/) + + ! +--u*, u*T*, u*s* Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(AM) + ! ntaver defined in mar_sl + real u__mem(klonv, ntaver) + common / S_eSBLmem / u__mem +#endif +#if(AT) + real uT_mem(klonv, ntaver), uT_mem +#endif +#if(AS) + real us_mem(klonv, ntaver), us_mem +#endif + + ! +--OUTPUT for Stand Alone NetCDF File + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(NC) + ! SOsoKL : Absorbed Solar Radiation + real SOsoKL(klonv) + ! IRsoKL : Absorbed IR Radiation + real IRsoKL(klonv) + ! HSsoKL : Absorbed Sensible Heat Flux + real HSsoKL(klonv) + ! HLsoKL : Absorbed Latent Heat Flux + real HLsoKL(klonv) + ! HLs_KL : Evaporation + real HLs_KL(klonv) + ! HLv_KL : Transpiration + real HLv_KL(klonv) + common / DumpNC / SOsoKL, IRsoKL, HSsoKL, HLsoKL, HLs_KL, HLv_KL + ! SOsoNC : Absorbed Solar Radiation + real SOsoNC(mx, my, nvx) + ! IRsoNC : Absorbed IR Radiation + real IRsoNC(mx, my, nvx) + ! HSsoNC : Absorbed Sensible Heat Flux + real HSsoNC(mx, my, nvx) + ! HLsoNC : Absorbed Latent Heat Flux + real HLsoNC(mx, my, nvx) + ! HLs_NC : Evaporation + real HLs_NC(mx, my, nvx) + ! HLv_NC : Transpiration + real HLv_NC(mx, my, nvx) + ! eta_NC : Soil Humidity + real eta_NC(mx, my, nvx) + common / writNC / SOsoNC, IRsoNC, HSsoNC, HLsoNC, HLs_NC, HLv_NC, eta_NC +#endif + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + common / SISVAT_EV / iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif + + ! +--Internal Variables + ! + =================== + integer i, j, k, m + logical StandA, snow_filter + logical glfFIX + ! ijnmax, nvcmax : Control Indices Distribution + integer ijnmax, nvcmax + common / SISVAT_MAR_Loc / ijnmax, nvcmax + ! k2i : Distributed i Index + integer k2i(klonv) + ! k2j : Distributed j Index + integer k2j(klonv) + ! k2n : Distributed mosaic Index + integer k2n(klonv) +#if(VR) + ! ij0ver : Verification of Vectorization + integer ij0ver(mx, my, mw) + ! ij_ver : Verification of Vectorization + integer ij_ver(mx, my, mw) + ! ij2, ijdver : Verification of Vectorization + integer ij2, ijdver(mx, my, mw) +#endif + character * 1 cha, chb + integer iwr, ipt, l, nvcmax2, ijnmax2, itPhys + integer ikl, isl, isn + integer ijn, ij, nnn + integer nvc, nkl, n, nt + + ! slopx, slopy : Surf.Slope, x, y + real slopx, slopy + ! czemin : Minimum accepted cos(Solar zenith.Dist.) + real czemin + ! Upw_IR : Upward IR Flux + real Upw_IR(mx, my) + ! IR_aux : Upward IR Flux (dummy) + real IR_aux + ! uqstar : u*q* + real uqstar + ! rhAir : Air Densitity + real rhAir + ! Ua_min : Minimum Air Velocity + real Ua_min + ! rr__DR : Desagregated Rain + real rr__DR(mx, my, mw) + ! hfra : Frazil Thickness + real hfra(mx, my, mw) + ! Rnof : RunOFF Intensity + real Rnof(mx, my, mw) + ! Ruof : RunOFF Intensity + real Ruof(mx, my, mw, 6) + ! EvSu : RunOFF Intensity + real EvSu(mx, my, mw, 4) + ! d_snow, SnowOK : Snow Precip.: Total + real d_snow, SnowOK + ! dbsnow : Snow Precip.: from Drift + real dbsnow +#if(SZ) + ! dsastr : z0(Sastrugi): Variation + real dsastr(mx, my) +#endif + real WVaLim(mx, my) + ! FixSST, VarSST : SST forcing switch + real FixSST, VarSST + ! SSTnud : SST Nudging Rate + real SSTnud + common / SISVAT_MAR_ocn / FixSST, VarSST, SSTnud + + real ifra_t + !XF + ! SrfSIC, SIc0OK : Oceanic Fraction: previous + real SrfSIC, SIc0OK + ! FraOcn, SIceOK : Oceanic Fraction + real FraOcn, SIceOK + ! TocnSI : Ocn Temp.=> S-Ice Covered + real TocnSI + ! OcnMin : Oceanic Fraction: Minimum + real OcnMin + ! dzSIce : Sea-Ice Layers Thickness + real dzSIce(4) + ! SIcMIN : Sea-Ice Layer Min Thickness + real SIcMIN + ! SIc_OK : Sea-Ice Switch + real SIc_OK(2) + ! c1_zuo, c2_zuo, c3_zuo : Run Off Parameters + real c1_zuo, c2_zuo, c3_zuo + ! SnowWE : Snow Water Equivalent[m w.e.] + real SnowWE + ! rosNEW : Added Snow Density [kg/m3] + real rosNEW + ! S_Eros, SnEros : Snow Erosion (status) = (1,0) + real S_Eros, SnEros +#if(BW) + integer noUNIT + real BlowST, SnowSB +#endif +#if(WR) + ! ifrVER : Verification Variable: Total Fraction must be 100% + integer ifrVER(mx, my) +#endif + real tairDY_2D(mx, my), qvDY_2D(mx, my) + real uu, vv, ww +#if(AO) + !coupling ck AO + real zntot +#endif + + ! +--DATA + ! + ==== + data StandA/.true./ + data glfFIX/.false./ + data cha/'-'/ + data chb/':'/ + + data czemin/1.e-3/ + + data TocnSI/270.70/ ! Ocn Temp.=> S-Ice Covered +#if(AO) + !AO_CK 20/02/2020 same as in NEMO + data OcnMin/0.01/ +#endif + data OcnMin/0.05/ ! Oceanic Fraction: Minimum + data dzSIce/0.5, 0.05, 0.001, 0.0/ ! Sea-Ice Layers Thickness + data SIcMIN/0.1/ ! Sea-Ice Layer Min Thickness + data SIc_OK/1.0, 0.00/ ! Sea-Ice Switch + ! + + ! data c1_zuo/12.960e+4/,c2_zuo/2.160e+6/,c3_zuo/1.400e+2/ ! Zuoriginal + ! data c1_zuo/ 2.796e+4/,c2_zuo/2.160e+6/,c3_zuo/1.400e+2/ ! ETH Tuning + ! data c1_zuo/ 86400/,c2_zuo/ 777600/,c3_zuo/1.400e+2/ ! 1-10 days + ! from 12h (c1_zuo) to 18h (c1_zuo+c2_zuo). + data c1_zuo/10800/, c2_zuo/54000/, c3_zuo/1.400e+2/ ! 1 day max + + ! +... Run Off Parameters + ! + 86400*1.5 day ...*25 days (Modif. ETH Camp: 86400*0.3day) + ! + (Zuo and Oerlemans 1996, J.Glacio. 42, 305--317) + + ! +--SISVAT Time Variable + ! + ================================ + dt__SV = dt + + ! + ++++++++++++++++ INITIALISATION: BEGIN +++ + if(.not. INI_SV) then + ! + ++++++++++++++++ + + ! +--OUTPUT point (i,j,n) coordinates + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + iwr_SV = 1 + jwr_SV = 1 + nwr_SV = 1 + + ! +--Level of negligible blown Snow Particles Concentration ( ~ 100magl) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + kB = mz +11 continue +#if(AE) + if(zsigma(kB) > 100. .OR. kB <= 1) go to 10 + kB = kB - 1 + go to 11 +#endif +10 continue +#if(AE) + write(6, 1000) kB +#endif +1000 format(/, ' BS : Level of negligible ' & + , 'blown Snow Particles Concentration is', i4 & + , ' (i.e., ~ 100. magl)',/) + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Snow Erosion Statistics: Grid Point Coordinate + iSV_v1 = imez + ! Id. + jSV_v1 = jmez + ! Id. + nSV_v1 = 1 + ! Snow Erosion Statistics: OUTPUT SWITCH (if > 0) + ! .LE. 1 Blowing Snow + ! .LE. 2 Blowing Snow (FULL) + ! .EQ. 3 Snow Agregation + lSV_v1 = 1 +#endif + + ! +--SISVAT Time Independant Variables + ! + ================================= + + StandA = .false. + if(VSISVAT .and. StandA) then + write(6, 600) +600 format(/, '### MAR_SISVAT CRASH,', & + ' STAND ALONE LABEL #sa is ON ###', & + /, ' ?!&~@|@[#@#]=!!!', 15x, 'EMERGENCY STOP') + stop + endif + + if(mw /= nvx) then + write(6, 601) mw, nvx +601 format(/, '### MAR_SISVAT CRASH, mw =', i6, & + ' .NE. nvx =', i6, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 15x, 'EMERGENCY STOP') + stop + endif + + if(mw /= nsx) then + write(6, 602) mw, nsx +602 format(/, '### MAR_SISVAT CRASH, mw =', i6, & + ' .NE. nvx =', i6, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 15x, 'EMERGENCY STOP') + stop + endif + + if(nsol + 1 /= llx) then + write(6, 603) nsol + 1, llx +603 format(/, '### MAR_SISVAT CRASH, ns =', i6, & + ' .NE. nvx =', i6, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 15x, 'EMERGENCY STOP') + stop + endif + + if(nb_wri > mz) then + write(6, 604) nb_wri, mz +604 format(/, '### MAR_SISVAT CRASH, nb_wri =', i6, & + ' .GT. mz =', i3, ' ', 2x, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 23x, 'EMERGENCY STOP') + ! stop + endif + + if(nb_wri > mw * iptx) then + write(6, 605) nb_wri, mw, iptx +605 format(/, '### MAR_SISVAT CRASH, nb_wri =', i6, & + ' .GT. mw *iptx=', i3, '*', i2, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 23x, 'EMERGENCY STOP') + ! stop + endif + + if(nb_wri > nsx * iptx) then + write(6, 606) nb_wri, nsx, iptx +606 format(/, '### MAR_SISVAT CRASH, nb_wri =', i6, & + ' .GT. nsx*iptx=', i3, '*', i2, ' ###', & + /, ' ?!&~@|@[#@#]=!!!', 23x, 'EMERGENCY STOP') + stop + endif + +#if(BS) + if(klonv /= 256) then + write(6, 608) klonv +608 format(/, '#BS MAR_SISVAT CRASH, klonv =', i6, '.ne.256 ###', & + /, ' ?!&~@|@[#@#]=!!!', 15x, 'EMERGENCY STOP') + stop + endif +#endif + + ! + **************** + call SISVAT_ini + ! + **************** + + ! +--Grids Correspondance + ! + -------------------- + + do isl = -nsol, 0 + deptTV(1 - isl) = dz_dSV(isl) + enddo + + ntime = 0 + + ijnmax = mx2 * my2 * nvx + if(mod(ijnmax, klonv) == 0) then + nvcmax = ijnmax / klonv + else + nvcmax = ijnmax / klonv + 1 + endif + ! + + ! + + ! +--Surface Fall Line Slope + ! + ----------------------- + ! + + if(SnoMod) then + if(mx == 1 .and. my == 1) then + ! Normalized Decay of the + ! Surficial Water Content + !(Zuo and Oerlemans 1996, J.Glacio. 42, 305--317) + SWfSNo(1, 1) = & + exp(-dt__SV & + / (c1_zuo & + + c2_zuo * exp(-c3_zuo * slopTV(1, 1)))) + else + do j = jp11, my1 + do i = ip11, mx1 + slopx = (sh(ip1(i), j) - sh(im1(i), j)) * dxinv3(i, j) + slopy = (sh(i, jp1(j)) - sh(i, jm1(j))) * dyinv3(i, j) + slopTV(i, j) = sqrt(slopx * slopx + slopy * slopy) + ! SWfSNo + ! Normalized Decay of the + ! Surficial Water Content + ! (Zuo and Oerlemans 1996, J.Glacio. 42, 305--317) + SWfSNo(i, j) = & + exp(-dt__SV & + / (c1_zuo & + + c2_zuo * exp(-c3_zuo * slopTV(i, j)))) + slopGE(i, j) = cos(atan(slopTV(i, j))) + enddo + enddo + endif + endif + + ! +--Initialization of Surface Types + ! + =============================== + if(itexpe == 0) then + do j = jp11, my1 + do i = ip11, mx1 + if(maskSL(i, j) == 1) then + nSLsrf(i, j) = 1 ! Ocean Grid Pt + SLsrfl(i, j, 1) = 1. + if(mw > 1) then + do n = min(2, mw), nvx + SLsrfl(i, j, n) = 0. + enddo + endif + else + nSLsrf(i, j) = nvx ! Land Grid Pt + do n = 1, nvx + SLsrfl(i, j, n) = ifraTV(i, j, n) + SLsrfl(i, j, n) = SLsrfl(i, j, n) * 0.01 + enddo + endif + + ! +--Initialization of z0(Sastrugi) + ! + ============================== + + ! Influence of the Angle(Wind,Sastrugi) (Andreas, 1995, CCREL report 95-16) + ! ------------------------------------------------------------------------- + +#if(ZA) + ua_0BS(i, j) = uairDY(i, j, mz) + va_0BS(i, j) = vairDY(i, j, mz) +#endif + + ! Sastrugi Height + ! --------------- + + do n = 1, mw +#if(SZ) + Z0SaBS(i, j, n) = 0. +#endif + do nt = 1, ntavSL + SLn_z0(i, j, n, nt) = 0.5e-6 + SLn_b0(i, j, n, nt) = 0.5e-6 + SLn_r0(i, j, n, nt) = 0.5e-6 + enddo + enddo + enddo + enddo + + endif + +#if(ZA) + ! Influence of the Angle(Wind,Sastrugi) (Andreas, 1995, CCREL report 95-16) + ! ------------------------------------------------------------------------- + FracBS = exp(-dt__SV / 43200.) +#endif + +#if(OR) + ! +--Initialization of z0(Orography Roughness) + ! + ========================================= + do k = 1, mw + do j = 1, my + do i = 1, mx + SL_z0(i, j, k) = min(SL_z0(i, j, k), zsigma(mz) / 3.) + SLzoro(i, j, k) = min(SLzoro(i, j, k), zsigma(mz) / 3.) + enddo + enddo + enddo +#endif + + ! +--Ocean Status + ! + ============ + VarSST = 0. +#if(OP) + VarSST = 1. +#endif + FixSST = 1.-VarSST + SSTnud = exp(-dt__SV / 2.592e6) ! SST Nudging: + ! +... ! e-folding time: 30 Days + ! + + if(itexpe == 0) then + do j = jp11, my1 + do i = ip11, mx1 + if(maskSL(i, j) > 0 .and. ifraTV(i, j, 1) < 100) then + write(6, 6000) i, j,(ifraTV(i, j, n), n=1, nvx) +6000 format(' WARNING on Grid Point', 2i4, ' Mosaic = (', 3i4, & + '): ISLANDS must(will) be excluded') + do n = 1, nvx + ifraTV(i, j, n) = 0 + ivegTV(i, j, n) = 0 + enddo + ifraTV(i, j, 1) = 100 + endif + enddo + enddo + + ! +--Prescription from SST + ! + --------------------- + Tfr_LB = TocnSI +#if(RE) + Tfr_LB = 271.35 + epsi +#endif + do j = jp11, my1 + do i = ip11, mx1 + FraOcn = (TsolTV(i, j, 1, 1) - Tfr_LB) / TSIdSV! Open Ocean + FraOcn = 1.-sicsIB(i, j) ! Prescribed + FraOcn = min(unun, FraOcn) ! Fract. + FraOcn = max(OcnMin, FraOcn) ! + ! New Ocean + SLsrfl(i, j, 1) = (1 - maskSL(i, j)) * SLsrfl(i, j, 1) & + + maskSL(i, j) * FraOcn ! + SrfSIC = SLsrfl(i, j, 2) ! Old Sea Ice + SIc0OK = max(zero, sign(unun, SrfSIC - epsi)) ! + ! New Sea Ice + SLsrfl(i, j, 2) = (1 - maskSL(i, j)) * SLsrfl(i, j, 2) & + + maskSL(i, j) * (1.-FraOcn) ! + SIceOK = max(zero, sign(unun, SLsrfl(i, j, 2) & + - epsi)) ! + ifra_t = ifraTV(i, j, 1) + ifraTV(i, j, 2) ! OCN Fract. + ifraTV(i, j, 1) = SLsrfl(i, j, 1) * 100. ! + ifraTV(i, j, 1) = min(ifraTV(i, j, 1), ifra_t) ! + ifraTV(i, j, 2) = ifra_t - ifraTV(i, j, 1) ! + + ! +--Sea-Ice Vertical Discretization + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + nssSNo(i, j, 2) = & + nssSNo(i, j, 2) * (1 - maskSL(i, j)) & + + (nssSNo(i, j, 2) * SIc0OK & + + 3 * (1.-SIc0OK) * SIceOK) * maskSL(i, j) + + nisSNo(i, j, 2) = & + nisSNo(i, j, 2) * (1 - maskSL(i, j)) & + + (nisSNo(i, j, 2) * SIc0OK & + + 3 * (1.-SIc0OK) * SIceOK) * maskSL(i, j) + issSNo(i, j, 2) = nisSNo(i, j, 2) + + do l = 1, nsno + dzsSNo(i, j, 2, l) = & + dzsSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + (dzsSNo(i, j, 2, l) * SIc0OK & + + dzSIce(min(4, l)) * (1.-SIc0OK) * SIceOK) * maskSL(i, j) + + tisSNo(i, j, 2, l) = & + tisSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + (tisSNo(i, j, 2, l) * SIc0OK & + + TsolTV(i, j, 1, 1) * (1.-SIc0OK)) * maskSL(i, j) + + rosSNo(i, j, 2, l) = & + rosSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + (rosSNo(i, j, 2, l) * SIc0OK & + + ro_Ice * (1.-SIc0OK) * SIceOK) * maskSL(i, j) + + g1sSNo(i, j, 2, l) = & + g1sSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + (g1sSNo(i, j, 2, l) * SIc0OK & + + G1_dSV * (1.-SIc0OK) * SIceOK) * maskSL(i, j) + + g2sSNo(i, j, 2, l) = & + g2sSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + (g2sSNo(i, j, 2, l) * SIc0OK & + + 30.*(1.-SIc0OK) * SIceOK) * maskSL(i, j) + + nhsSNo(i, j, 2, l) = & + nhsSNo(i, j, 2, l) * (1 - maskSL(i, j)) & + + istdSV(2) * maskSL(i, j) + enddo + do l = 1, llx + TsolTV(i, j, 2, l) = & + TsolTV(i, j, 2, l) * (1 - maskSL(i, j)) & + + (TsolTV(i, j, 2, l) * SIc0OK & + + TsolTV(i, j, 1, l) * (1.-SIc0OK)) * maskSL(i, j) + + eta_TV(i, j, 2, l) = & + eta_TV(i, j, 2, l) * (1 - maskSL(i, j)) & + + eta_TV(i, j, 2, l) * SIc0OK * maskSL(i, j) + ! +... No Pore in Ice => No Water + enddo + +#if(WI) + write(6, 6001) jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, jsecGE, TsolTV(i, j, 1, 1) & + , FraOcn, ifraTV(i, j, 1), TsolTV(i, j, 2, 1) & + , nisSNo(i, j, 2), nssSNo(i, j, 2) +6001 format(/, 98('_'), & + /, i3, '-', a3, '-', i4, 3(':', i2), & + 2x, 'T OCN = ', f7.3, 4x, '% OCN = ', f7.3, '(', i3, ')', & + 2x, 'T ICE = ', f7.3, & + /, 42x, 'NbIce = ', i3, 11x, 'NbSno = ', i3) +#endif + + enddo + enddo + endif + + ! +--Soil Upward IR Flux + ! + =================== + + if(itexpe == 0) then + do j = jp11, my1 + do i = ip11, mx1 + ! Upward IR Flux + IR_aux = -eps0SL(i, j) * stefan * TairSL(i, j)**4 + do n = 1, nvx + IRsoil(i, j, n) = IR_aux + enddo + ! +--Water Vapor Flux Limitor + ! + ======================== +#if(VX) + do n = 1, nLimit + WV__SL(i, j, n) = 1. + enddo +#endif + enddo + enddo + + ! +--SBL Characteristics + ! + ==================== + do nt = 1, ntaver + do j = 1, my + do i = 1, mx + V_0aSL(i, j, nt) = ssvSL(i, j, mz) + do n = 1, nvx + dT0aSL(i, j, n, nt) = tairDY(i, j, mz) - tsrfSL(i, j, n) + enddo + enddo + enddo + enddo + endif + + ! +--OUTPUT Files Definition + ! + ======================= +#if(v0) + open(unit=50, status='unknown', file='PHY_SISVAT.v0') + rewind 50 +#endif + if(mmy <= 1 .and. mw > mw0) then + open(unit=51, status='unknown', file='Dsagrr.OUT') + rewind 51 + write(51, 5100) +5100 format(/, ' Simple Disagregation Model', & + /, ' ==========================') + endif + + iwr = 0 + do ipt = 1, iptx + if(IOi_TV(ipt) == 0) IOi_TV(ipt) = imez + if(IOj_TV(ipt) == 0) IOi_TV(ipt) = jmez + do n = 1, nvx + iwr = 1 + iwr + if(iwr <= nb_wri) then + no__SV(iwr) = 0 + i___SV(iwr) = IOi_TV(ipt) + j___SV(iwr) = IOj_TV(ipt) + n___SV(iwr) = n + endif + enddo + enddo + + ! +--Initialization of V10 Interpolation + ! + =================================== + if(zsigma(1) > 10.) then + k = 0 +301 continue + k = k + 1 + if(zsigma(k) < 10 .OR. k > mz) go to 300 + go to 301 +300 continue + kSBL = k + + if(kSBL == mz) then + ! 0.002: typical Z0 + rSBL10 = log(10./0.002) & + / log(zsigma(kSBL) / 0.002) ! + else + rSBL10 = (10.-zsigma(kSBL)) & + / (zsigma(kSBL - 1) - zsigma(kSBL)) + endif + else + kSBL = mz + rSBL10 = 1. + endif + + erprev = 0. + qbs_HY = 0. + ! + ++++++ + endif + ! + ++++++ +++ INITIALISATION: END +++ + + ! +--Preparation of V10 Interpolation + ! + =================================== + + if(kSBL == mz) then + do j = 1, my + do i = 1, mx + VV__10(i, j) = rSBL10 * ssvSL(i, j, kSBL) + enddo + enddo + else + do j = 1, my + do i = 1, mx + VV__10(i, j) = ssvSL(i, j, kSBL) & + + rSBL10 * (ssvSL(i, j, kSBL - 1) - ssvSL(i, j, kSBL)) + enddo + enddo + endif + + ! +--Preparation of OUTPUT + ! + ===================== + + ! do n = 1, nvx + ! do j = jp11, my1 + ! do i = ip11, mx1 + ! WKxyz1(i, j, n) = 0. + ! end do + ! end do + ! end do + ! do iwr = 1, nb_wri + ! WKxyz1(i___SV(iwr), j___SV(iwr), n___SV(iwr)) = iwr + ! end do + + ! +--Update Sea-Ice Fraction + ! + ========================== + + if(reaLBC) then + ! + ****** + call INIsic(ihamr_SIS, nhamr_SIS, newsicSI) + ! + ****** + endif + + ! +--Update Green Leaf Fraction + ! + ========================== +#if(GP) + glfFIX = .true. +#endif + if(vegmod .and. reaLBC .and. .not. glfFIX) then + ! + + ! + ****** + call INIglf(ihamr_SIS, nhamr_SIS, newglfSIS) + ! + ****** + ! + + endif + + ! +--SISVAT Time Dependant Variables + ! + ================================= + +#if(VX) + ! +--Water Vapor Flux Limitor + ! + ------------------------ + do n = 1, nLimit - 1 + do j = jp11, my1 + do i = ip11, mx1 + WV__SL(i, j, n) = WV__SL(i, j, n + 1) + enddo + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + uqstar = max(abs(SLuqs(i, j)), epsi) * sign(1., SLuqs(i, j)) + WV__SL(i, j, n) & + = TUkvh(i, j, mmz1) * (qvDY(i, j, km2(mz)) - qvDY(i, j, mmz1)) & + / (uqstar * (zsigma(km2(mz)) - zsigma(mmz1))) + enddo + enddo + do j = jp11, my1 + do i = ip11, mx1 + WVaLim(i, j) = 0. + do n = 1, nLimit + WVaLim(i, j) = WVaLim(i, j) + WV__SL(i, j, n) + enddo + WVaLim(i, j) = WVaLim(i, j) / nLimit + enddo + enddo +#endif + + ! +--Simple "Mosaic" Rain Disagregation Model + ! + ---------------------------------------- + + if(mmy <= 1 .and. mw > mw0) then ! + + ! +--White Noise Generator + ! + ~~~~~~~~~~~~~~~~~~~~~ + if(jhurGE == 6 .and. minuGE == 0 .and. jsecGE == 0) then + rtime = tairDY(imez, jmez, mz) * 1.e3 + ntime = int(rtime) + rtime = (rtime - ntime) * 1.e3 + ntime = rtime + ntime = mod(ntime, mw) + 1 + endif + + ! +--Averaged Soil Humidity + ! + ~~~~~~~~~~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + ! Averaged Soil Humidity + WKxy1(i, j) = 0. + do n = 1, mw + do k = -nsol, 0 + WKxy1(i, j) = WKxy1(i, j) & + + eta_TV(i, j, n, 1 - k) * dz_dSV(k) + enddo + enddo + WKxy1(i, j) = WKxy1(i, j) / (mw * zz_dSV) + + ! +--Rain Distribution + ! + ~~~~~~~~~~~~~~~~~ + ! Rain Persistance over "wetter" surfaces + ! (Taylor et al., 1997, MWR 125, pp.2211-2227) + ! Normalization Factor + WKxy2(i, j) = 0. + do n = 1, mw + ! Rain Distribution Arg. + ! dry ===> sparse Rain + ! Persistance Impact + rr__DR(i, j, n) = (mod(mw - n + ntime, mw) + 1) & + / (mw * WKxy1(i, j) * WKxy1(i, j)) & + * eta_TV(i, j, n, 1) / WKxy1(i, j) + rr__DR(i, j, n) = min(rr__DR(i, j, n) & + , argmax * 0.1) + ! Rain Distribution + rr__DR(i, j, n) = exp(-rr__DR(i, j, n)) + ! mw0 basic Mosaics + k = (n - 1) / mw0 + k = k * mw0 + 1 + ! Rain Distribution Arg. + rr__DR(i, j, n) = rr__DR(i, j, k) + ! Normalization Factor + WKxy2(i, j) = WKxy2(i, j) & + + rr__DR(i, j, n) ! + enddo ! + + enddo + enddo + + do j = 1, my + do i = 1, mx + do n = 1, mw + rr__DR(i, j, n) = rr__DR(i, j, n) * mw & + / WKxy2(i, j) + enddo + enddo + enddo + + if(mod(jdarGE, 3) == 0 .and. jhurGE == 6 .and. & + minuGE == 0 .and. & + jsecGE == 0 .and. & + mmy <= 1) then + do i = 1, mx + if(isolSL(i, 1) > 2) then + write(51, 5101) jdarGE, labmGE(mmarGE), iyrrGE, jhurGE, & + i,(eta_TV(i, 1, n, 1), n=1, mw) +5101 format(i3, '-', a3, '-', i4, ':', i2, i6, 15f6.3, /,(21x, 15f6.3)) + write(51, 5102) & + ntime, isolSL(i, 1),(rr__DR(i, 1, n), n=1, mw) +5102 format(i12, 3x, i6, 15f6.2, /,(21x, 15f6.2)) + endif + enddo + write(51, 5103) +5103 format(111('-')) + endif + else + do j = 1, my + do i = 1, mx + do n = 1, mw + rr__DR(i, j, n) = 1. + enddo + enddo + enddo + endif + + ! - Interpolation of temp. and spec. hum. on sub_grid - *CL* + ! -------------------------------------------------------------- + + do i = 1, mx; do j = 1, my + do n = 1, nsx + tairDY_int(i, j, n) = tairDY(i, j, mz) + qvDY_int(i, j, n) = qvDY(i, j, mz) + tairDY_2D(i, j) = tairDY(i, j, mz) + qvDY_2D(i, j) = qvDY(i, j, mz) + enddo + enddo; + enddo + + if(mw == 5) then + ! + ************************************************************ + call interp_subpix(tairDY_2D, tairDY_int, 1, -0.01, 0.05 & + , gradTM) + ! + ************************************************************ + + ! + ************************************************************ + call interp_subpix(qvDY_2D, qvDY_int, 2, -1.0, 1.0 & + , gradQM) + ! + ************************************************************ + endif + + ! +--Grid Averages + ! + ------------- + + !$OMP PARALLEL DO default(shared) & + !$OMP private(i,j,k,n,l,ikl,isl,isn,nt,Ua_min,d_snow,SnowOK, & + !$OMP rhAir,FraOcn,SrfSIC,SIc0OK,SIceOK,ifra_t, & + !$OMP S_Eros,SnEros,dbsnow,k2i,k2j,k2n,itphys) & + !$OMP schedule(dynamic) + + do j = jp11, my1 + do i = ip11, mx1 + dt__SV = dt + ! if(tairdy(i, j, mz)>273.15.and.& + ! max(nssSNo(i, j, 1), nssSNo(i, j, mw))>1.)& + ! dt__SV = dt / real(ntphys) + + ! if(isolSL(i, j)<=2) dt__SV = dt ! sea or ice + ! if(i<=n7.or.j<=n7.or.i>=mx - n6.or.j>=my - n6)& + ! dt__SV = dt + + ! +--Surface Fall Line Slope + ! + ----------------------- + ! + + if(SnoMod) then + if(mx == 1 .and. my == 1) then + ! Normalized Decay of the + ! Surficial Water Content + !(Zuo and Oerlemans 1996, J.Glacio. 42, 305--317) + SWfSNo(1, 1) = exp(-dt__SV / (c1_zuo + c2_zuo * exp(-c3_zuo * slopTV(1, 1)))) + else + ! Normalized Decay of the + ! Surficial Water Content + !(Zuo and Oerlemans 1996, J.Glacio. 42, 305--317) + SWfSNo(i, j) = exp(-dt__SV / (c1_zuo + c2_zuo * exp(-c3_zuo * slopTV(i, j)))) + endif + endif + +#if(WR) + ifrVER(i, j) = 0 +#endif + albeSL(i, j) = 0. + eps0SL(i, j) = 0. + Upw_IR(i, j) = 0. + SLlmo(i, j) = 0. + SLuus(i, j) = 0. + SLuts(i, j) = 0. + SLuqs(i, j) = 0. + uss_HY(i, j) = 0. + qsrfHY(i, j) = 0. +#if(iso) + do wiso = 1, niso + qsrfHY_iso(wiso, i, j) = 0. + SLuqs_iso(wiso, i, j) = 0. + enddo +#endif + TairSL(i, j) = 0. + draiTV(i, j) = 0. +#if(TC) + uqTC(i, j, 1) = 0. + qsTC(i, j, 1) = 0. +#endif + + dzsnSV = 0. + ro__SV = 0. + +#if(ZA) + FracBS = exp(-dt__SV / 43200.) +#endif + + ! +--Sastrugi Height decreased by Precipitation if V < 6 m/s (Kotlyakov, 1961) + ! + -------------------------------------------------------------------------- + +#if(SZ) + dsastr(i, j) = max(0.00,(snowHY(i, j) - sno0HY(i, j)) & + / max(0.05, 0.104 * sqrt(max(0.00, VV__10(i, j) - 6.00)))) +#endif + + ! Influence of the Angle(Wind,Sastrugi) (Andreas, 1995, CCREL report 95-16) + ! ------------------------------------------------------------------------- + +#if(ZA) + S_Eros = max(zero, sign(unun, -uss_HY(i, j) - eps9)) + SnEros = max(zero, sign(unun, uss_HY(i, j) + eps9)) + VVs_BS(i, j) = & + SnEros * VVs_BS(i, j) & + + S_Eros * (VVs_BS(i, j) * FracBS + & + VV__10(i, j)) + RRs_BS(i, j) = & + SnEros * RRs_BS(i, j) & + + S_Eros * (RRs_BS(i, j) * FracBS + 1.0) + DDs_BS(i, j) = & + SnEros * DDs_BS(i, j) & + + S_Eros * DDs_BS(i, j) * FracBS & + + ((vairDY(i, j, mz) * (uairDY(i, j, mz) - ua_0BS(i, j)) & + - uairDY(i, j, mz) * (vairDY(i, j, mz) - va_0BS(i, j)))) & + / (degrad * max(0.3, ssvSL(i, j, mz) * ssvSL(i, j, mz))) + if(DDs_BS(i, j) > 360.) DDs_BS(i, j) = DDs_BS(i, j) - 360. + if(DDs_BS(i, j) < 0.) DDs_BS(i, j) = DDs_BS(i, j) + 360. +#endif + + ! +--Grid Point Dependant Variables + ! + --------------------------------- + + ! +--Verification of Vectorization + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#if(VR) + ij2 = 0 + do n = 1, mw + ij0ver(i, j, n) = 0 + ij_ver(i, j, n) = 0 + ijdver(i, j, n) = 0 + enddo +#endif + + ! +--SISVAT Variables Update + ! + ^^^^^^^^^^^^^^^^^^^^^^^ + ptopSV = ptopDY + do n = 1, mw + if(SLsrfl(i, j, n) /= 0) then + do ikl = 1, klonv + k2i(ikl) = i + k2j(ikl) = j + k2n(ikl) = n + ! Work pt. i Coord. + ii__SV(ikl) = i + ! Work pt. j Coord. + jj__SV(ikl) = j + ! Work pt. n Coord. + nn__SV(ikl) = n + +#if(wz) + if(ikl == 1 .and. jsecGE == 0) write(6, 6659) +6659 format(20x, ' dsn_SV us__SV Z0SaSi Z0Sa_N' & + , ' Z0SaSV Z0m_Sn Z0m_SV') +#endif + + ! +--Atmospheric Forcing (INPUT) + ! + ^^^^^^^^^^^^^^^^^^^ ^^^^^ + ! zSBLSV [m] + zSBLSV = z__SBL + za__SV(ikl) = (gplvDY(i, j, mz) & + - gplvDY(i, j, mzz)) * grvinv + VV__SV(ikl) = ssvSL(i, j, mz) + VV10SV(ikl) = VV__10(i, j) +#if(ZA) + VVs_SV(ikl) = VVs_BS(i, j) / RRs_BS(i, j) + DDs_SV(ikl) = max(zero, DDs_BS(i, j) - 180.) & + + 180.*min(unun, zero - min(zero, DDs_BS(i, j) - 180.)) & + + min(zero, DDs_BS(i, j) - 180.) +#endif + Ua_min = epsi +#if(VM) + Ua_min = 0.2 * sqrt(za__SV(ikl)) +#endif + VV__SV(ikl) = max(Ua_min, ssvSL(i, j, mz)) + TaT_SV(ikl) = tairDY_int(i, j, n) + ExnrSV(ikl) = pkDY(i, j, mz) + ! [kg/m3] *CL* + rhT_SV(ikl) = (pstDYn(i, j) + ptopDY) * 1.e3 & + / (tairDY_int(i, j, n) * RDryAi) + QaT_SV(ikl) = qvDY_int(i, j, n) + tsrf_SV(ikl) = tsrfSL(i, j, n) + pst_SV(ikl) = pstDY(i, j) +#if(VX) + ! Water Vapor Flux Limitor + dQa_SV(ikl) = max(0., 1.-WVaLim(i, j)) * dtDiff / zsigma(mz) +#endif + qsnoSV(ikl) = 0.+min(demi, qsHY(i, j, mz)) + + ! +--Energy Fluxes (INPUT) + ! + ^^^^^^^^^^^^^ ^^^^^ + ! cos(zenith.Dist.) + coszSV(ikl) = max(czemin, czenGE(i, j)) + ! downward Solar + sol_SV(ikl) = RAdsol(i, j) + ! downward IR + IRd_SV(ikl) = RAd_ir(i, j) + + ! +--Water Fluxes (INPUT) + ! + ^^^^^^^^^^^^^ ^^^^^ + ! [m/s] -> [mm/s] = [kg/m2/s] + drr_SV(ikl) = (rainHY(i, j) - rai0HY(i, j)) * 1.e3 & + * rr__DR(i, j, n) / dt__SV + ! Only SnowFall + d_snow = snowHY(i, j) - sfa0HY(i, j) + ! Erosion NOT incl. + dsn_SV(ikl) = d_snow * 1.e3 / dt__SV + ! Correction + SnowOK = & + max(zero, sign(unun, qsHY(i, j, mz) - epsi)) & + * max(zero, min(unun,(rain_snow_limit - 1 - tairDY_int(i, j, n)))) + dsn_SV(ikl) = dsn_SV(ikl) + drr_SV(ikl) * SnowOK + drr_SV(ikl) = drr_SV(ikl) * (1.-SnowOK) +#if(BS) + ! Erosion + ! dsnbSV is used and modified in SISVAT_BSn, + ! then used for Buffer Layer Update + dbsnow = -SLussl(i, j, n) * dt__SV * rhT_SV(ikl) + dbs_Ac(ikl) = 0. + dbs_Er(ikl) = 0. +#endif + ! +--Soil/Canopy (INPUT) + ! + ^^^^^^^^^^^ ^^^^^ + ! Land/Sea Mask + LSmask(ikl) = 1 - maskSL(i, j) + ! Soil Type + isotSV(ikl) = isolTV(i, j) + ! Soil Drainage + iWaFSV(ikl) = iWaFTV(i, j) + ! Fall Line Slope + slopSV(ikl) = atan(slopTV(i, j)) + ! Soil Albedo + alb0SV(ikl) = AlbSTV(i, j) + ! Vegetation Type + ivgtSV(ikl) = ivegTV(i, j, n) + ! LAI + LAI0SV(ikl) = alaiTV(i, j, n) + ! Green Leaf Frac. + glf0SV(ikl) = glf_TV(i, j, n) + wem_SV(ikl) = 0. + wer_SV(ikl) = 0. + wee_SV(ikl, :) = 0. + + ! +--Energy Fluxes (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^ ^^^^^^^^^^^^ + ! Cloudiness + cld_SV(ikl) = cld_SL(i, j) + ! Soil upward IR + IRs_SV(ikl) = IRsoil(i, j, n) + ! Monin-Obukhov L. + LMO_SV(ikl) = SLlmol(i, j, n) + ! Frict. Velocity + us__SV(ikl) = SLuusl(i, j, n) + ! u*T* + uts_SV(ikl) = SLutsl(i, j, n) + + ! +--Water Fluxes (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^ ^^^^^^^^^^^^ + ! u*q* + uqs_SV(ikl) = SLuqsl(i, j, n) +#if(iso) + do wiso = 1, niso + uqs_SV_iso(wiso, ikl) = SLuqsl_iso(wiso, i, j, n) + enddo +#endif +#if(AE) + ! u*_th + usthSV(ikl) = SaltSN(i, j, n) +#endif + + ! +--Soil/Canopy (INPUT/OUTPUT) + ! + ^^^^^^^^^^^ ^^^^^^^^^^^^ + ! Moment.Roughn.L. + Z0m_SV(ikl) = SL_z0(i, j, n) + ! Heat Roughn.L. + Z0h_SV(ikl) = SL_r0(i, j, n) +#if(OR) + ! Orogr. Roughn.L. + Z0roSV(ikl) = SLzoro(i, j, n) +#endif + ! Vegetation Temp. + TvegSV(ikl) = TvegTV(i, j, n) + ! Canopy SnowCover + snCaSV(ikl) = CaSnTV(i, j, n) + ! Canopy RainWater + rrCaSV(ikl) = CaWaTV(i, j, n) + ! Vegetation Pot. + psivSV(ikl) = psivTV(i, j, n) + do isl = -nsol, 0 + ! Soil Temperature + TsisSV(ikl, isl) = TsolTV(i, j, n, 1 - isl) + ! Soil Humidity + eta_SV(ikl, isl) = eta_TV(i, j, n, 1 - isl) + enddo + enddo + + ! +--Snow Roughness (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^ ^^^^^^^^^^^^ + do ikl = 1, klonv + ! +--Verification of Vectorization + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#if(VR) + if(ijn <= ijnmax) then + ij0ver(i, j, n) = ij0ver(i, j, n) + 1 + ijdver(i, j, n) = ijdver(i, j, n) + ij + endif +#endif + + Z0mmSV(ikl) = 0. ! + Z0emSV(ikl) = 0. ! + Z0hmSV(ikl) = 0. ! + do nt = 1, ntavSL + Z0mmSV(ikl) = Z0mmSV(ikl) & + + SLn_z0(i, j, n, nt) + Z0emSV(ikl) = Z0emSV(ikl) & + + SLn_b0(i, j, n, nt) + Z0hmSV(ikl) = Z0hmSV(ikl) & + + SLn_r0(i, j, n, nt) + enddo + ! z0(Mom., Box Av.) + Z0mmSV(ikl) = min(Z0mmSV(ikl) / ntavSL, zsigma(mz) / 3.) + ! z0(Eros, Box Av.) + Z0emSV(ikl) = Z0emSV(ikl) / ntavSL + ! z0(Heat, Box Av.) + Z0hmSV(ikl) = Z0hmSV(ikl) / ntavSL + +#if(SZ) + ! z0(Sastrugi h) + Z0SaSV(ikl) = Z0SaBS(i, j, n) +#endif +#if(SZ) + ! dz0(Sastrugi dh) + dz0_SV(ikl) = .01 * dsastr(i, j) * max(2 - n, 0) +#endif + + ! +--V, dT(a-s) Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do nt = 1, ntaver + V__mem(ikl, nt) = V_0aSL(i, j, nt) + T__mem(ikl, nt) = dT0aSL(i, j, n, nt) + enddo + + do nt = 1, ntaver - 1 + V__mem(ikl, nt) = V__mem(ikl, nt + 1) + T__mem(ikl, nt) = T__mem(ikl, nt + 1) + enddo + V__mem(ikl, ntaver) = VV__SV(ikl) + T__mem(ikl, ntaver) = TaT_SV(ikl) - tsrfSL(i, j, n) + + VVmmem(ikl) = 0.0 + dTmmem(ikl) = 0.0 + do nt = 1, ntaver + VVmmem(ikl) = VVmmem(ikl) + V__mem(ikl, nt) + dTmmem(ikl) = dTmmem(ikl) + T__mem(ikl, nt) + enddo + VVmmem(ikl) = VVmmem(ikl) / ntaver + dTmmem(ikl) = dTmmem(ikl) / ntaver + + ! +--u*, u*T*, u*s* Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(AM) + do nt = 1, ntaver + u__mem(ikl, nt) = u_0aSL(i, j, n, nt) +#if(AT) + uT_mem(ikl, nt) = uT0aSL(i, j, n, nt) +#endif +#if(AS) + us_mem(ikl, nt) = us0aSL(i, j, n, nt) +#endif + enddo +#endif + enddo + +#if(BS) + do ikl = 1, klonv + Z0emBS(i, j, n) = Z0emSV(ikl) + enddo +#endif + + ! +--Snow Pack (INPUT/OUTPUT) + ! + ^^^^^^^^^ ^^^^^^^^^^^^ + do ikl = 1, klonv +#if(AO) + !weightA0= 1 if full MAR, 1> weightao>0 if transition, 0 for NEMO coupling area + AOmask = weightao_al(i, j) + albAOsisv(ikl) = albAO(i, j, n) +#endif + ! Snow Buffer Lay. + BufsSV(ikl) = snohSN(i, j, n) + dsn_SV(ikl) = dsn_SV(ikl) & + + max(BufsSV(ikl) - SMndSV, 0.) & + / dt__SV + BufsSV(ikl) = min(BufsSV(ikl), SMndSV) + ! Snow Buffer dens. + BrosSV(ikl) = BrosSN(i, j, n) + ! Snow Buffer D./S. + BG1sSV(ikl) = BG1sSN(i, j, n) + ! Snow Buffer S./S. + BG2sSV(ikl) = BG2sSN(i, j, n) + ! Nb Snow/Ice L + isnoSV(ikl) = min(nsno, max(0, nssSNo(i, j, n))) + ! Nb Supr.Ice L + ispiSV(ikl) = min(isnoSV(ikl), max(0, issSNo(i, j, n))) + ! Nb Ice L + iiceSV(ikl) = min(isnoSV(ikl), max(0, nisSNo(i, j, n))) + ! Non-Erod.*Thick. + zWEcSV(ikl) = zWEcSN(i, j, n) + ! Surficial Water + rusnSV(ikl) = SWaSNo(i, j, n) + ! Surficial Wat.St. + SWS_SV(ikl) = SWSSNo(i, j, n) + ! Normalized Decay + SWf_SV(ikl) = SWfSNo(i, j) + enddo + do ikl = 1, klonv + do isn = 1, nsno + ! istoSV [-] + istoSV(ikl, isn) = nhsSNo(i, j, n, isn) + ! dzsnSV [m] + dzsnSV(ikl, isn) = dzsSNo(i, j, n, isn) + ! ro__SV [kg/m3] + ro__SV(ikl, isn) = rosSNo(i, j, n, isn) + ! eta_SV [m3/m3] + eta_SV(ikl, isn) = wasSNo(i, j, n, isn) + ! TsisSV [K] + TsisSV(ikl, isn) = tisSNo(i, j, n, isn) + ! G1snSV [-] [-] + G1snSV(ikl, isn) = max(-G1_dSV, min(G1_dSV, g1sSNo(i, j, n, isn))) + ! G2snSV [-] [0.0001 m] + G2snSV(ikl, isn) = max(-G1_dSV, min(G1_dSV, g2sSNo(i, j, n, isn))) + ! agsnSV [day] + agsnSV(ikl, isn) = agsSNo(i, j, n, isn) + enddo + enddo + + ! Grid Point (OUTPUT) + ! ^^^^^^^^^^ ^^^^^^ +#if(wx) + kSV_v1 = 0 +#endif + + do ikl = 1, klonv + HFraSV(ikl) = 0. ! Frazil Thickness + + ! +--RunOFF Intensity (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ + RnofSV(ikl) = 0. ! RunOFF Intensity + RuofSV(ikl, :) = 0. ! RunOFF Intensity + zn4_SV(ikl) = 0. + zn5_SV(ikl) = 0. + + ! Grid Point (OUTPUT) + ! ^^^^^^^^^^ ^^^^^^ +#if(wx) + if(i == iSV_v1 .and. j == jSV_v1 .and. n == nSV_v1) kSV_v1 = ikl +#endif + ! lwriSV(ikl) = WKxyz1(i, j, n) +#if(BW) + if(lwriSV(ikl) /= 0 .and. iterun > 0) then + noUNIT = no__SV(lwriSV(ikl)) + write(noUNIT, 5012) +5012 format(/, 1x) + write(noUNIT, 5013) +5013 format(' -----+--------+--------+--------+--------+', & + '--------+--------+--------+--------+--------+', & + '--------+') + write(noUNIT, 5014) +5014 format(' n | z | qs | V | |', & + ' T | TKE^0.5| | | |', & + ' |', & + /, ' | [m] | [g/kg] | [m/s] | |', & + ' [K] | [m/s] | | | |', & + ' |') + BlowST = 0. + k = 0 +5011 continue + k = k + 1 + if(k > mz) go to 5010 + if(grvinv * gplvDY(i, j, k) - sh(i, j) < 100.) then + BlowST = BlowST + ssvSL(i, j, k) * qsHY(i, j, k) & + * pstDY(i, j) * dsigm1(k) * 1.e3 * grvinv + write(noUNIT, 5015) mzz - k, grvinv * gplvDY(i, j, k) - sh(i, j), & + 1.e3 * qsHY(i, j, k), ssvSL(i, j, k), tairDY(i, j, k), & + sqrt(ect_TE(i, j, k)) +5015 format(i5, ' |', f7.2, ' |', f7.3, ' |', f7.2, ' |', & + 8x, '|', f7.2, ' |', f7.3, ' |', 4(8x, '|')) + endif + go to 5011 +5010 continue + SnowSB = snohSN(i, j, n) + if(nssSNo(i, j, n) > 0) then + do isn = max(0, nssSNo(i, j, n)), nssSNo(i, j, n) + SnowSB = SnowSB & + + dzsSNo(i, j, n, isn) * rosSNo(i, j, n, isn) + enddo + endif + write(noUNIT, 5016) BlowST, SnowSB +5016 format(' * TRANSPORT = ', e12.3, ' kg/m/s', 8x, '|', & + ' * BUDGET = ', f12.6, ' mm w.e.|', 2(8x, '|')) + write(noUNIT, 5013) + endif +#endif +#if(v0) + ! OUTPUT, for Stand-Alone VERIFICATION + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(i >= 1 .and. i <= mx) then + write(50, 5001) iterun, i, j, n, nvc, ikl, & + za__SV(ikl), VV__SV(ikl), TaT_SV(ikl), & + rhT_SV(ikl), QaT_SV(ikl), qsnoSV(ikl), & + coszSV(ikl), sol_SV(ikl), IRd_SV(ikl), & + drr_SV(ikl), dsn_SV(ikl), dbs_SV(ikl), & + LSmask(ikl), isotSV(ikl), alb0SV(ikl), & + IRs_SV(ikl), & + ivgtSV(ikl), LAI0SV(ikl), glf0SV(ikl), & + TvegSV(ikl), LMO_SV(ikl), us__SV(ikl), & + uqs_SV(ikl), uts_SV(ikl), uss_SV(ikl), & + snCaSV(ikl), rrCaSV(ikl), psivSV(ikl) +5001 format(/, 'c #INFO iterun = ', i15, & + /, 'c #INFO i,j,n = ', 3i5, & + /, 'c #INFO nvc = ', i15, & + /, 'c #INFO ikl = ', i15, & + /, ' za__SV(ikl) = ', e15.6, & + /, ' VV__SV(ikl) = ', e15.6, & + /, ' TaT_SV(ikl) = ', e15.6, & + /, ' rhT_SV(ikl) = ', e15.6, & + /, ' QaT_SV(ikl) = ', e15.6, & + /, ' qsnoSV(ikl) = ', e15.6, & + /, ' coszSV(ikl) = ', e15.6, & + /, ' sol_SV(ikl) = ', e15.6, & + /, ' IRd_SV(ikl) = ', e15.6, & + /, ' drr_SV(ikl) = ', e15.6, & + /, ' dsn_SV(ikl) = ', e15.6, & + /, ' dbs_SV(ikl) = ', e15.6, & + /, ' LSmask(ikl) = ', i15, & + /, ' isotSV(ikl) = ', i15, & + /, ' alb0SV(ikl) = ', e15.6, & + /, ' IRs_SV(ikl) = ', e15.6, & + /, ' ivgtSV(ikl) = ', i15, & + /, ' LAI0SV(ikl) = ', e15.6, & + /, ' glf0SV(ikl) = ', e15.6, & + /, ' TvegSV(ikl) = ', e15.6, & + /, ' LMO_SV(ikl) = ', e15.6, & + /, ' us__SV(ikl) = ', e15.6, & + /, ' uqs_SV(ikl) = ', e15.6, & + /, ' uts_SV(ikl) = ', e15.6, & + /, ' uss_SV(ikl) = ', e15.6, & + /, ' snCaSV(ikl) = ', e15.6, & + /, ' rrCaSV(ikl) = ', e15.6, & + /, ' psivSV(ikl) = ', e15.6) + do isl = -nsol, 0 + write(50, 5002) isl, TsisSV(ikl, isl), isl, eta_SV(ikl, isl) +5002 format(' TsisSV(ikl,', i2, ') = ', e15.6, & + ' eta_SV(ikl,', i2, ') = ', e15.6) + enddo + do isl = 1, nsno + write(50, 5003) isl, TsisSV(ikl, isl), isl, dzsnSV(ikl, isl) +5003 format(' TsisSV(ikl,', i2, ') = ', e15.6, & + ' dzsnSV(ikl,', i2, ') = ', e15.6) + enddo + endif +#endif + enddo + + ! +--SISVAT Execution + ! + ^^^^^^^^^^^^^^^^ + ! write(daHost,'(i2,a3,i4,i3,2(a1,i2))') + ! . jdarGE,labmGE(mmarGE),iyrrGE, + ! . jhurGE,chb,minuGE,chb,jsecGE +#if(wz) + write(6, 6660) jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE +6660 format(2(i2, '-'), 2i4, 2(':', i2), 3x, $) +#endif + + do ikl = 1, klonv +#if(BS) + ! dbs_SV = Maximum potential erosion amount [kg/m2] + ! => Upper bound for eroded snow mass + dbs_SV(ikl) = blowSN(i, j, n) +#endif + uss_SV(ikl) = SLussl(i, j, n) ! u*qs* (only for Tv in sisvatesbl.f) +#if(BS) + ! dsnbSV is the drift fraction of deposited snow updated in sisvat.f + ! will be used for characterizing the Buffer Layer + ! (see update of Bros_N, G1same, G2same, zroOLD, zroNEW) + if(dsn_SV(ikl) > eps12 .and. erprev(i, j, n) > eps9) then + ! BS neglib. at kb ~100 magl) + dsnbSV(ikl) = 1.0 - min(qsHY(i, j, kB) & + / max(qshy(i, j, mz), eps9), unun) + dsnbSV(ikl) = max(dsnbSV(ikl), erprev(i, j, n) / dsn_SV(ikl)) + dsnbSV(ikl) = max(0., min(1., dsnbSV(ikl))) + else + dsnbSV(ikl) = 0. + endif + if(n == 1) qbs_HY(i, j) = dsnbSV(ikl) +#endif + + enddo + ! + ************ + ! do itPhys = 1, max(1, nint(dt / dt__SV)) + call SISVAT(1) + ! do ikl = 1, klonv + ! dsn_SV(ikl) = 0. + ! drr_SV(ikl) = 0. + ! end do + ! end do + ! + ************ + + do ikl = 1, klonv + SLussl(i, j, n) = 0. +#if(BS) + ! Effective erosion ~u*qs* from previous time step + SLussl(i, j, n) = (-dbs_ER(ikl)) / (dt * rhT_SV(ikl)) + ! New max. pot. Erosion [kg/m2] (further bounded in sisvat_bsn.f) + blowSN(i, j, n) = dt * uss_SV(ikl) * rhT_SV(ikl) + erprev(i, j, n) = dbs_Er(ikl) / dt__SV +#endif + enddo + + ! +--MAR Variables Update + ! + ^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv +#if(VR) + ! +--Verification of Vectorization + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ij2 = ij2 + 1 + ijdver(i, j, n) = ijdver(i, j, n) - ij2 + ij_ver(i, j, n) = ij_ver(i, j, n) + 1 +#endif + ! +--Energy Fluxes (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^ ^^^^^^^^^^^^ + ! Soil upward IR + IRsoil(i, j, n) = IRs_SV(ikl) + ! Monin-Obukhov L. + SLlmol(i, j, n) = LMO_SV(ikl) + ! Frict. Velocity + SLuusl(i, j, n) = us__SV(ikl) + ! u*T* + SLutsl(i, j, n) = uts_SV(ikl) + ! Sens.H.Flux T-Der. + SLdSdT(i, j, n) = dSdTSV(ikl) +#if(NC) + ! +--Energy Fluxes (OUTPUT/NetCDF) + ! + ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ + ! Absorb.Sol.Rad. + SOsoNC(i, j, n) = SOsoKL(ikl) + ! Absorb.IR Rad. + IRsoNC(i, j, n) = IRsoKL(ikl) + ! HS + HSsoNC(i, j, n) = HSsoKL(ikl) + ! HL + HLsoNC(i, j, n) = HLsoKL(ikl) + ! Evaporation + HLs_NC(i, j, n) = HLs_KL(ikl) + ! Transpiration + HLv_NC(i, j, n) = HLv_KL(ikl) +#endif + ! +--Water Fluxes (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! u*q* + SLuqsl(i, j, n) = uqs_SV(ikl) +#if(iso) + do wiso = 1, niso + ! todo : compute uqs_SV_iso in sisvat + ! todo : SLuqsl_iso -> uqs_SV -> HLv_sv + HLs_sv (sisvat.f90) + ! todo : HLv_sv (sisvat_tgv) and HLs_sv (sisvat_tso) -> HL___D : store Rsnow ? + ! SLuqsl_iso(wiso, i, j, n) = uqs_SV_iso(wiso, ikl) + SLuqsl_iso(wiso, i, j, n) = Rdefault(wiso) * uqs_SV(ikl) + enddo +#endif + ! Latn.H.Flux T-Der. + SLdLdT(i, j, n) = dLdTSV(ikl) + enddo + do ikl = 1, klonv +#if(AE) + ! u*_th + SaltSN(i, j, n) = usthSV(ikl) +#endif + ! +--Soil/Canopy (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! Moment.Roughn.L. + SL_z0(i, j, n) = Z0m_SV(ikl) + ! Heat Roughn.L. + SL_r0(i, j, n) = Z0h_SV(ikl) + ! sq.root Contr.Drag + cdmSL(i, j, n) = rCDmSV(ikl) + ! sq.root Contr.Drag + cdhSL(i, j, n) = rCDhSV(ikl) + ! Vegetation Temp. + TvegTV(i, j, n) = TvegSV(ikl) + ! Canopy SnowCover + CaSnTV(i, j, n) = snCaSV(ikl) + ! Canopy RainWater + CaWaTV(i, j, n) = rrCaSV(ikl) + ! Vegetation Pot. + psivTV(i, j, n) = psivSV(ikl) + do isl = -nsol, 0 + ! Soil Humidity + eta_TV(i, j, n, 1 - isl) = eta_SV(ikl, isl) + ! Soil Temperature + TsolTV(i, j, n, 1 - isl) = TsisSV(ikl, isl) + enddo + enddo + ! +--Snow Roughness (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + do nt = 1, ntavSL - 1 + SLn_z0(i, j, n, nt) = SLn_z0(i, j, n, nt + 1) + SLn_b0(i, j, n, nt) = SLn_b0(i, j, n, nt + 1) + SLn_r0(i, j, n, nt) = SLn_r0(i, j, n, nt + 1) + enddo + enddo + do ikl = 1, klonv + ! z0(Momentum) + SLn_z0(i, j, n, ntavSL) = Z0mnSV(ikl) + ! z0(Mom., Erosion) + SLn_b0(i, j, n, ntavSL) = Z0enSV(ikl) + ! z0(Heat) + SLn_r0(i, j, n, ntavSL) = Z0hnSV(ikl) +#if(SZ) + ! z0(Sastrugi h) + Z0SaBS(i, j, n) = Z0SaSV(ikl) +#endif + ! +--V, dT(a-s) Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do nt = 1, ntaver + V_0aSL(i, j, nt) = V__mem(ikl, nt) + dT0aSL(i, j, n, nt) = T__mem(ikl, nt) + enddo +#if(AM) + ! +--u*, u*T*, u*s* Time Moving Averages + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do nt = 1, ntaver + u_0aSL(i, j, n, nt) = u__mem(ikl, nt) +#if(AT) + uT0aSL(i, j, n, nt) = uT_mem(ikl, nt) +#endif +#if(AS) + us0aSL(i, j, n, nt) = us_mem(ikl, nt) +#endif + enddo +#endif + enddo + +#if(BD) + ! +--Dust Fluxes (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^ + do ikl = 1, klonv + ! Snow Free Surface + ! DUST Erosion + ! Tuning Factor (2D) + SLubsl(i, j, n) = (1 - min(1, isnoSV(ikl))) & + * uss_SV(ikl) & + * max(1,(2 - mmy) * 3) + enddo +#endif + ! +--Snow Pack (INPUT/OUTPUT) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + snohSN(i, j, n) = BufsSV(ikl) ! Snow Buffer Lay. + BrosSN(i, j, n) = BrosSV(ikl) ! Snow Buffer dens. + BG1sSN(i, j, n) = BG1sSV(ikl) ! Snow Buffer D./S. + BG2sSN(i, j, n) = BG2sSV(ikl) ! Snow Buffer S./S. + nssSNo(i, j, n) = isnoSV(ikl) ! Nb Snow/Ice Lay. + issSNo(i, j, n) = ispiSV(ikl) ! Nb Supr.Ice Lay. + nisSNo(i, j, n) = iiceSV(ikl) ! Nb Ice Lay. + zWE_SN(i, j, n) = zWE_SV(ikl) ! Current *Thick. + zWEcSN(i, j, n) = zWEcSV(ikl) ! Non-Erod.*Thick. + hSalSN(i, j, n) = hSalSV(ikl) ! Salt.Layer Height + SWaSNo(i, j, n) = rusnSV(ikl) ! Surficial Water + SWSSNo(i, j, n) = SWS_SV(ikl) ! Surficial Wat.St. + enddo + do ikl = 1, klonv + do isn = 1, nsno + nhsSNo(i, j, n, isn) = istoSV(ikl, isn) ! [-] + dzsSNo(i, j, n, isn) = dzsnSV(ikl, isn) ! [m] + rosSNo(i, j, n, isn) = ro__SV(ikl, isn) ! [kg/m3] + wasSNo(i, j, n, isn) = eta_SV(ikl, isn) ! [m3/m3] + tisSNo(i, j, n, isn) = TsisSV(ikl, isn) ! [K] + g1sSNo(i, j, n, isn) = G1snSV(ikl, isn) ! [-] [-] + g2sSNo(i, j, n, isn) = G2snSV(ikl, isn) ! [-] [0.0001 m] + agsSNo(i, j, n, isn) = agsnSV(ikl, isn) ! [day] + enddo + enddo + + do ikl = 1, klonv + EVSU(i, j, n, :) = wee_SV(ikl, :) ! Evapo/Sublimation + WKxyz4(i, j, n) = wem_SV(ikl) ! Melting + WKxyz5(i, j, n) = wer_SV(ikl) ! Refreezing +#if(BS) + weerIB(i, j, n) = weerIB(i, j, n) + dbs_Er(ikl) ! BS erosion +#endif + zn4IB(i, j, n) = zn4IB(i, j, n) + zn4_SV(ikl) + zn5IB(i, j, n) = zn5IB(i, j, n) + zn5_SV(ikl) + + ! +--Radiative Properties (OUTPUT) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + albxSL(i, j, n) = alb_SV(ikl) ! Mosaic Albedo + !Commented !AO_CK 20/02/2020 (bad variable) + !c #AO. *(1-maskSL(i,j)) ! + !c #AO. + albAO(i,j,n) ! Mosaic AlbedoNEMO + !c #AO. * maskSL(i,j) ! + WKxyz6(i, j, n) = emi_SV(ikl) ! Mosaic Emissivity + WKxyz7(i, j, n) = IRu_SV(ikl) ! Mosaic Upw.IR + WKxyz8(i, j, n) = qSalSV(ikl) ! Saltating Partic. + hfra(i, j, n) = HFraSV(ikl) ! Frazil Thickness + Rnof(i, j, n) = RnofSV(ikl) ! Run OFF Intensity + Ruof(i, j, n, :) = RuofSV(ikl, :) ! Run OFF Intensity + + if(n == 1) then + alb1IB(i, j) = alb1SV(ikl) + alb2IB(i, j) = alb2SV(ikl) + alb3IB(i, j) = alb3SV(ikl) + endif + + enddo + else + Rnof(i, j, n) = 0. + Ruof(i, j, n, :) = 0. + EVSU(i, j, n, :) = 0. + endif + enddo + + ! +--Surface Temperature: Prescription of relevant Medium (Snow, precribed SST) + ! + ========================================================================== + + do isl = -nsol, 0 ! + ! +--Open Ocean + ! + ---------- + eta_TV(i, j, 1, 1 - isl) = & + eta_TV(i, j, 1, 1 - isl) * (1 - maskSL(i, j)) & + + maskSL(i, j) ! Sea: Humidity:=1 + TsolTV(i, j, 1, 1 - isl) = & + ! Soil Temperature + ! Prescribed SST + (TsolTV(i, j, 1, 1 - isl) * (1 - maskSL(i, j)) & + + sst_LB(i, j) * maskSL(i, j)) +#if(OP) + ! cCA : OP is weird and not activated + TsolTV(i, j, 1, 1 - isl) = TsolTV(i, j, 1, 1 - isl) * FixSST + & + (TsolTV(i, j, 1, 1 - isl) & + !~Prescribed SST + + (sst_LB(i, j) - & + ! (Nudging) + TsolTV(i, j, 1, 1 - isl)) * maskSL(i, j) * SSTnud & + ! Interactive SST + ) * VarSST +#endif +#if(AO) + ! +--Sea Ice + ! + ------- + ! AO_CK 20/02/2020 tissno is now modified before the call of sisvat (in oasis_2_mar.f) + ! Sea: Humidity:=0 + eta_TV(i, j, 2, 1 - isl) = eta_TV(i, j, 2, 1 - isl) * (1 - maskSL(i, j)) + ! Soil Temperature + Prescribed ST + TsolTV(i, j, 2, 1 - isl) = & + (TsolTV(i, j, 2, 1 - isl) * (1 - maskSL(i, j)) & + + 271.2 * maskSL(i, j)) +#endif + enddo + + do n = 1, mw + ! Surf.Temperature + tsrfSL(i, j, n) = TsolTV(i, j, n, 1) & + * (1 - min(1, nssSNo(i, j, n))) & + + tisSNo(i, j, n, max(1, nssSNo(i, j, n))) & + * min(1, nssSNo(i, j, n)) +#if(NC) + eta_NC(i, j, n) = 0. + do isl = -nsol, 0 + ! Soil Moisture + eta_NC(i, j, n) = eta_NC(i, j, n) & + + eta_TV(i, j, n, 1 - isl) * dz_dSV(isl) + enddo +#endif + enddo + + ! +--Mosaic Cleaning + ! + =============== + + if(maskSL(i, j) == 1) then + if(nssSNo(i, j, 1) > 0) then + nssSNo(i, j, 1) = 0 + issSNo(i, j, 1) = 0 + nisSNo(i, j, 1) = 0 + do isl = 1, nsno + tisSNo(i, j, 1, isl) = 0. + dzsSNo(i, j, 1, isl) = 0. + rosSNo(i, j, 1, isl) = 0. + wasSNo(i, j, 1, isl) = 0. + g1sSNo(i, j, 1, isl) = 0. + g2sSNo(i, j, 1, isl) = 0. + agsSNo(i, j, 1, isl) = 0. + nhsSNo(i, j, 1, isl) = 0. + enddo + endif + if(SLsrfl(i, j, 2) < eps9 .and. tsrfSL(i, j, 2) /= tsrfSL(i, j, 1)) then + tsrfSL(i, j, 2) = tsrfSL(i, j, 1) + do isl = 1, nsol + 1 + TsolTV(i, j, 2, isl) = TsolTV(i, j, 1, isl) + ENDdo !#n2 + nssSNo(i, j, 2) = nssSNo(i, j, 1) * (1 - maskSL(i, j)) + issSNo(i, j, 2) = issSNo(i, j, 1) * (1 - maskSL(i, j)) + nisSNo(i, j, 2) = nisSNo(i, j, 1) * (1 - maskSL(i, j)) + do isl = 1, nsno ! + tisSNo(i, j, 2, isl) = tisSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + dzsSNo(i, j, 2, isl) = dzsSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + rosSNo(i, j, 2, isl) = rosSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + wasSNo(i, j, 2, isl) = wasSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + g1sSNo(i, j, 2, isl) = g1sSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + g2sSNo(i, j, 2, isl) = g2sSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + agsSNo(i, j, 2, isl) = agsSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + nhsSNo(i, j, 2, isl) = nhsSNo(i, j, 1, isl) * (1 - maskSL(i, j)) + ENDdo !#n2 + endif !#n2 + endif + + ! +--Grid Averages / Diagnostics + ! + =========================== + + ! +--Grid Averages (OUTPUT) + ! + ^^^^^^^^^^^^^ ^^^^^^ + do n = 1, mw + wee_IB(i, j, n, :) = EvSU(i, j, n, :) + wee_IB(i, j, n, :) ! evapotrans + wem_IB(i, j, n) = WKxyz4(i, j, n) + wem_IB(i, j, n) ! Melting + wer_IB(i, j, n) = WKxyz5(i, j, n) + wer_IB(i, j, n) ! Refreezing + ! Runoff + weu_IB(i, j, n) = Rnof(i, j, n) * dt__SV & + + weu_IB(i, j, n) + weo_IB(i, j, n, :) = Ruof(i, j, n, :) * dt__SV & + + weo_IB(i, j, n, :) + +#if(WR) + ifrVER(i, j) = ifrVER(i, j) + ifraTV(i, j, n) +#endif + ! albeSL : Grid Albedo + Mosaic Albedo + albeSL(i, j) = albeSL(i, j) + SLsrfl(i, j, n) * albxSL(i, j, n) + ! eps0SL : Grid Emissivity + Mosaic Emissivity + eps0SL(i, j) = eps0SL(i, j) + SLsrfl(i, j, n) * WKxyz6(i, j, n) + ! Upw_IR : + Mosaic Upw.IR + Upw_IR(i, j) = Upw_IR(i, j) + SLsrfl(i, j, n) * WKxyz7(i, j, n) + ! SLlmo : + Mosaic Mon.Ob. + SLlmo(i, j) = SLlmo(i, j) + SLsrfl(i, j, n) * SLlmol(i, j, n) + ! SLuus : Grid u* + Mosaic u* + SLuus(i, j) = SLuus(i, j) + SLsrfl(i, j, n) * SLuusl(i, j, n) + ! SLuts : Grid u*T* + Mosaic u*T* + SLuts(i, j) = SLuts(i, j) + SLsrfl(i, j, n) * SLutsl(i, j, n) + ! SLuqs : Grid u*q* + Mosaic u*q* + SLuqs(i, j) = SLuqs(i, j) + SLsrfl(i, j, n) * SLuqsl(i, j, n) +#if(iso) + do wiso = 1, niso + SLuqs_iso(wiso, i, j) = SLuqs_iso(wiso, i, j) + SLsrfl(i, j, n) * SLuqsl_iso(wiso, i, j, n) + enddo +#endif +#if(BS) + ! Grid u*s* + Mosaic u*s* + uss_HY(i, j) = uss_HY(i, j) + SLsrfl(i, j, n) * SLussl(i, j, n) +#endif + ! u*s* + ! +...NO ! SLussl(i,j,n) = uss_SV(ikl) + ! + Upper Update = wrong Source of Atmospher.Snow! +#if(BS) + ! Salt.Part.Concent., only if there is a snow layer + qsrfHY(i, j) = qsrfHY(i, j) + SLsrfl(i, j, n) * WKxyz8(i, j, n) * min(1, nssSNo(i, j, n)) +#endif +#if(PO) + ! Frazil Thickness + HFraPO(i, j) = HFraPO(i, j) + SLsrfl(i, j, n) * HFra(i, j, n) +#endif + ! Surface Air Temperature + TairSL(i, j) = TairSL(i, j) + SLsrfl(i, j, n) * tsrfSL(i, j, n) + ! Run OFF Intensity + draiTV(i, j) = draiTV(i, j) + SLsrfl(i, j, n) * Rnof(i, j, n) +#if(TC) + ! Grid u*b* + Mosaic u*b* + uqTC(i, j, 1) = uqTC(i, j, 1) + SLsrfl(i, j, n) * SLubsl(i, j, n) + ! Salt.Part.Concent. + qsTC(i, j, 1) = qsTC(i, j, 1) + SLsrfl(i, j, n) * WKxyz8(i, j, n) * (1 - min(1, nssSNo(i, j, n))) +#endif + enddo + sno0HY(i, j) = snowHY(i, j) + pktaSL(i, j) = TairSL(i, j) / exp(cap * log(pstDY(i, j) + ptopDY)) + ! Brightness Temp. + tviRA(i, j) = sqrt(sqrt(Upw_IR(i, j) / stefan)) + ! Air Densitity + rhAir = rolvDY(i, j, mz) * 1.e3 + ! Sensible Heat Flux + hsenSL(i, j) = -SLuts(i, j) * rhAir * cp + ! Surf.Specif.Humid. [to adapt over soil] + qvapSL(i, j) = qvsiDY(i, j, mzz) +#if(iso) + ! todo : compute Riso of the vapor in equilibrium with the surface + ! todo : get Riso of snow / water + fractcalk + ! todo : Riso of snow from dzsSNo = dzsnSV + ! todo : Riso of water from wasSNo_iso (negligible?) and SWaSNo_iso (?) + mixing of the two ? + do wiso = 1, niso + qvapSL_iso(wiso, i, j) = Rdefault(wiso) * qvapSL(i, j) + enddo +#endif + ! Latent Heat Flux + hlatSL(i, j) = -SLuqs(i, j) * rhAir * Lv_H2O + ! Total Evaporat. [mm w.e.] + evapTV(i, j) = evapTV(i, j) - SLuqs(i, j) * rhAir * dt__SV +#if(iso) + ! todo : evapTV_iso -> compute Riso + ! todo : need to track SLuqs -> SLuqsl_iso -> see above + do wiso = 1, niso + evapTV_iso(wiso, i, j) = Rdefault(wiso) * evapTV(i, j) + enddo +#endif + ! Integrated Run OFF + runoTV(i, j) = runoTV(i, j) + draiTV(i, j) * dt__SV + firmSL(i, j) = Upw_IR(i, j) + + ! +--Sea-Ice Ice Floe Size + ! + ===================== + + ! +--Prescription from SST + ! + --------------------- + + if(VarSST <= epsi .and. maskSL(i, j) == 1) then + ! Prescribed from SST (not use anymore by anyone CK 20/02/20) + ! FraOcn = (TsolTV(i,j,1,1)-Tfr_LB)/TSIdSV + ! Prescribed from rea/ocean model + FraOcn = 1.-sicsIB(i, j) + + ! UpperLimit + FraOcn = min(unun, FraOcn) + ! LowerLimit + FraOcn = max(OcnMin, FraOcn) + ! New Ocean (ocean % at current dt) + SLsrfl(i, j, 1) = FraOcn + ! Old Sea Ice (SIC at previous dt) + SrfSIC = SLsrfl(i, j, 2) + ! 1 if SICdt-1 > epsi ; 0 if SICdt-1<epsi + SIc0OK = max(zero, sign(unun, SrfSIC - epsi)) + ! New Sea ice (SIC at current dt) + SLsrfl(i, j, 2) = 1.-FraOcn + ! 1 if SICdt > epsi ; 0 if Sidct < epsi + SIceOK = max(zero, sign(unun, SLsrfl(i, j, 2) - epsi)) + ! OCN Fraction + ifra_t = ifraTV(i, j, 1) + ifraTV(i, j, 2) + ifraTV(i, j, 1) = SLsrfl(i, j, 1) * 100. + ifraTV(i, j, 1) = min(ifraTV(i, j, 1), ifra_t) + ifraTV(i, j, 2) = ifra_t - ifraTV(i, j, 1) + + ! +--Sea-Ice Vertical Discretization + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! if no sic dt 0, if SIC dt then + ! if SICdt-1 then at least 1 layer or number of the dt-1 layers >1 + ! if not SICdt-1 then 3 layers + nssSNo(i, j, 2) = & + (max(1 & + , nssSNo(i, j, 2)) * SIc0OK & + + 3 * (1.-SIc0OK) * SIceOK) + ! + + nisSNo(i, j, 2) = & + (max(1 & + , nisSNo(i, j, 2)) * SIc0OK & + + 3 * (1.-SIc0OK) * SIceOK) + issSNo(i, j, 2) = nisSNo(i, j, 2) + ! + + do l = 1, nsno + ! If SIC dt then + ! if SICdt-1 then at least the bottom layer + ! with 10cm or any value > 10cm (dt-1 thickness for all the other old layers) + ! if not SICdt-1 then 4 layers of 0.5,0.05,0.001,0.0/ m (=> 3 real layers) + dzsSNo(i, j, 2, l) = & + (max & + (SIc_OK(min(2, l)) * SIcMIN & + , dzsSNo(i, j, 2, l)) * SIc0OK & + + dzSIce(min(4, l)) * (1.-SIc0OK) * SIceOK) + ! + + tisSNo(i, j, 2, l) = & + (tisSNo(i, j, 2, l) * SIc0OK & + + TsolTV(i, j, 1, 1) * (1.-SIc0OK)) + ! + + ! If sicdt then + ! If SICdt-1 then at least the bottom layer + ! with 920 or any value of the sea ice pack >920 (dt-1 ro for all the other old layers) + ! if not SICdt-1 then 920 for all new layers + rosSNo(i, j, 2, l) = & + (max & + (SIc_OK(min(2, l)) * ro_Ice & + , rosSNo(i, j, 2, l)) * SIc0OK & + + ro_Ice * (1.-SIc0OK) * SIceOK) + ! + + g1sSNo(i, j, 2, l) = & + (g1sSNo(i, j, 2, l) * SIc0OK & + + G1_dSV * (1.-SIc0OK) * SIceOK) + ! + + g2sSNo(i, j, 2, l) = & + (g2sSNo(i, j, 2, l) * SIc0OK & + + 30.*(1.-SIc0OK) * SIceOK) + ! + + nhsSNo(i, j, 2, l) = istdSV(2) +#if(SInew) + nhsSNo(i, j, 2, l) = nhsSNo(i, j, 2, l) + & + (nhsSNo(i, j, 2, l) * SIc0OK + & + istdSV(2) * (1.-SIc0OK) * SIceOK) * maskSL(i, j) +#endif + + enddo + +#if(AO) + ! COUPLING AO_CK! 20/02/2020 + if(weightAO_sit(i, j) == 0) then !full NEMO + ! coupling of sea ice thickness from NEMO + if(aohic > 0) then !coupling time step + zntot = 0. + do l = 1, nsno + ! zntot of ice layers + if(rosSNo(i, j, 2, l) > 900 .and. dzsSNo(i, j, 2, l) > 0) then + zntot = zntot + dzsSNo(i, j, 2, l) + endif + enddo + do l = 1, nsno + ! NEMO minimal sea ice thickness is 10cm as in MAR + if(rosSNo(i, j, 2, l) > 900 .and. dzsSNo(i, j, 2, l) > 0 & + .and. hicAO(i, j) >= 0.1 .and. zntot > 0) then + dzsSNo(i, j, 2, l) = dzsSNo(i, j, 2, l) * hicAO(i, j) / zntot + endif + enddo + endif + endif + ! end coupling AO_CK SEA ICE THICKNESS 20/02/2020 + ! coupling of snow thickness on the sea ice from NEM + ! full NEMO + if(weightAO_snt(i, j) == 0) then + if(aohsn > 0) then !coupling time ste + if(SIc0OK == 1 .and. SIceOK == 1) then + ! Sea ice at previous time step and at the current time step + ! => changes the thickness of the snow by applying a ratio + zntot = 0. + do l = 1, nsno + ! zntot of snow layers + if(rosSNo(i, j, 2, l) < 900 .and. dzsSNo(i, j, 2, l) > 0) then + zntot = zntot + dzsSNo(i, j, 2, l) + endif + enddo + do l = 1, nsno + if(rosSNo(i, j, 2, l) < 900 .and. dzsSNo(i, j, 2, l) > 0 & + .and. zntot > 0 .and. nssSNo(i, j, 2) > 1) then + if(hsnoAO(i, j) >= 0.005) then + ! ratio new/old + dzsSNo(i, j, 2, l) = dzsSNo(i, j, 2, l) * hsnoAO(i, j) / zntot + else + ! if NEMO snow thickness lower than minimal snow thickness in MAR => 0 ? + dzsSNo(i, j, 2, l) = 0. + nssSNo(i, j, 2) = max(3., nssSNo(i, j, 2) - 1.) + endif + endif + enddo + endif + if(SIc0OK == 0 .and. SIceOK == 1 & + .and. hsnoAO(i, j) >= 0.005) then + !No sea ice at the previous time step but new sea ice at the current time step + !+1 one snow layer + nssSNo(i, j, 2) = nssSNo(i, j, 2) + 1. + ! snow thickness from NEMO + dzsSNo(i, j, 2, int(nssSNo(i, j, 2))) = hsnoAO(i, j) + ! temp neige/surface from NEMO + tisSNo(i, j, 2, int(nssSNo(i, j, 2))) = 270. + ! density from NEMO + rosSNo(i, j, 2, int(nssSNo(i, j, 2))) = 300. + ! G1 fresh snow + g1sSNo(i, j, 2, int(nssSNo(i, j, 2))) = G1_dSV + ! G2 fresh snow + g2sSNo(i, j, 2, int(nssSNo(i, j, 2))) = 30. + ! faceted cristal + nhsSNo(i, j, 2, int(nssSNo(i, j, 2))) = istdSV(1) + endif + endif + endif + ! end coupling AO_CK SNOW THICKNESS 20/02/2020 +#endif + + do l = 1, llx + TsolTV(i, j, 2, l) = & + TsolTV(i, j, 2, l) * (1 - maskSL(i, j)) & + + (TsolTV(i, j, 2, l) * SIc0OK & + + TsolTV(i, j, 1, l) * (1.-SIc0OK)) * maskSL(i, j) + ! + + eta_TV(i, j, 2, l) = & + eta_TV(i, j, 2, l) * (1 - maskSL(i, j)) & + + eta_TV(i, j, 2, l) * SIc0OK * maskSL(i, j) + ! +... No Pore in Ice => No Water + enddo + ! + +#if(WI) + write(6, 6001) jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, jsecGE, TsolTV(i, j, 1, 1) & + , FraOcn, ifraTV(i, j, 1), TsolTV(i, j, 2, 1) & + , nisSNo(i, j, 2), nssSNo(i, j, 2) +#endif + ! + + endif + + ! +--Otherwise SST and FrLead have been computed in the Sea-Ice Polynya Model + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! +--Rainfall, Snowfall Time Integral at previous Time Step + ! + ------------------------------------------------------ + + rai0HY(i, j) = rainHY(i, j) ! Rainfall Time Integral + sfa0HY(i, j) = snowHY(i, j) ! Snowfall Time Integral + + ! Wind Horizontal Components at previous Time Step + ! -------------------------------------------------------- + +#if(ZA) + ua_0BS(i, j) = uairDY(i, j, mz) + va_0BS(i, j) = vairDY(i, j, mz) +#endif + + ! +--Work Array Reset + ! + ================ + + WKxy1(i, j) = 0. + WKxy2(i, j) = 0. + WKxy3(i, j) = 0. + WKxy5(i, j) = 0. + WKxy6(i, j) = 0. + WKxy7(i, j) = 0. + + do k = 1, mw + WKxyz1(i, j, k) = 0. + WKxyz2(i, j, k) = 0. + WKxyz3(i, j, k) = 0. + WKxyz4(i, j, k) = 0. + WKxyz5(i, j, k) = 0. + WKxyz6(i, j, k) = 0. + WKxyz7(i, j, k) = 0. + WKxyz8(i, j, k) = 0. + enddo + + ENDdo !i + ENDdo !j + !$OMP END PARALLEL DO + + ! +--Blown Snow/Dust Accumulation + ! + ============================ + + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(wx) + if(lSV_v1 == 2) write(6, 6011) uss_HY(iSV_v1, jSV_v1) * 1.e3 +6011 format(10x, 'After SISVAT(1): us* [mm/s] =', f9.3) +#endif + + !c #BS do i=ip11,mx1 + !c #BS do j= 1,my + !c #BS WKxy6(i ,j ) = + !c #BS& uss_HY(im1(i),j )+2.0*uss_HY(i ,j ) + !c #BS& + uss_HY(ip1(i),j ) + !c #BS end do + !c #BS end do + + !c #BS do j=jp11,my1 + !c #BS do i=ip11,mx1 + !c #BS WKxy5(i ,j ) = WKxy6(i ,jm1(j)) + !c #BS WKxy7(i ,j ) = WKxy6(i ,jp1(j)) + !c #BS end do + !c #BS end do + + !c#BS do j=jp11,my1 + !c#BS do i=ip11,mx1 + !c#BS uss_HY(i ,j ) = + !c#BS. WKxy7(i ,j ) + !c#BS. + WKxy6(i ,j ) + WKxy6(i ,j ) + !c#BS. + WKxy5(i ,j ) + + ! Previous three Loops Stand for the following unvectorized Loop: + ! WKxy2(i,j) = uss_HY(im1(i),jp1(j)) + ! . +2.d0*uss_HY(i ,jp1(j)) + uss_HY(ip1(i),jp1(j)) + ! . +2.d0*uss_HY(im1(i),j) + ! . +4.d0*uss_HY(i ,j) +2.d0*uss_HY(ip1(i),j) + ! . + uss_HY(im1(i),jm1(j)) + ! . +2.d0*uss_HY(i ,jm1(j)) + uss_HY(ip1(i),jm1(j)) + !c#BS end do + !c#BS end do + + !c #BD do i=1,mx + !c #BD do j=1,my + !c #BD WKxy3(i,j) = uqTC(im1(i),jp1(j),1) + !c #BD. +2.d0*uqTC(i ,jp1(j),1) + uqTC(ip1(i),jp1(j),1) + !c #BD. +2.d0*uqTC(im1(i),j ,1) + !c #BD. +4.d0*uqTC(i ,j ,1) +2.d0*uqTC(ip1(i),j ,1) + !c #BD. + uqTC(im1(i),jm1(j),1) + !c #BD. +2.d0*uqTC(i ,jm1(j),1) + uqTC(ip1(i),jm1(j),1) + !c #BD end do + !c #BD end do + + !c #BS do j=1,my + !c #BS do i=1,mx + !c #BS WKxy5(i,j) = 0. + !c #BS WKxy6(i,j) = 0. + !c #BS end do + !c #BS end do + + !spatial smoothing commented - C.Amory BS 2018 + !c #BS do j=jp11,my1 + !c #BS do i=ip11,mx1 + !c #BS do k=-1,1 ; do n=-1,1 + !c #BS uu= 1 ; vv=1 + !c #BS if(sign(1., uairdy(i,j,mz))/=sign(1.,real(k))) + !c #BS. uu=sqrt(abs(uairdy(i,j,mz))) + !c #BS if(sign(1., vairdy(i,j,mz))/=sign(1.,real(n))) + !c #BS. vv=sqrt(abs(vairdy(i,j,mz))) + !c #BS uu=max(1.,min(4.,uu)) + !c #BS vv=max(1.,min(4.,vv)) + !c #BS ww=1. + !c #BS if(n==0) ww=uu + !c #BS if(k==0) ww=vv + !c #BS if(n==0.and.k==0) ww=(uu+vv)*2. + !c #BS if(abs(k)==1.and.abs(n)==1) ww=(uu+vv)/2. + !c #BS WKxy5(i,j)=WKxy5(i,j)+ww*uss_HY(i+k,j+n) + !c #BS WKxy6(i,j)=WKxy6(i,j)+ww + !c #BS end do ; end do + !c #BS end do + !c #BS end do + ! + ! + !c #BS do j=jp11,my1 + !c #BS do i=ip11,mx1 + !c #BS uss_HY(i,j)=WKxy5(i,j)/WKxy6(i,j) + !c #BS end do + !c #BS end do + !end spatial smoothing + + snow_filter = .true. + if(snow_filter .and. mod(iterun, 2) == 0) call sno_filtering + +#if(BS) + do i = 1, mx + do j = 1, my + ! uss_HY(i,j) = uss_HY(i,j) * 62.5e-3 + ! snowHY(i,j) = snowHY(i,j) + dt__SV * rolvDY(i,j,mz)*uss_HY(i,j) !BUGBUG + weacIB(i, j, 1) = weacIB(i, j, 1) - dt__SV * rolvDY(i, j, mz) * uss_HY(i, j) & + * 1000. +#if(BD) + uqTC(i, j, 1) = WKxy3(i, j) * 62.5e-3 +#endif + enddo + enddo +#endif + + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(wx) + if(lSV_v1 == 2) write(6, 6012) uss_HY(iSV_v1, jSV_v1) * 1.e3 +6012 format(10x, 'After SISVAT(2): us* [mm/s] =', f9.3) +#endif + + ! +--Additional OUTPUT for VERIFICATION + ! + ---------------------------------- +#if(WR) + do j = jp11, my1 + do i = ip11, mx1 + if(ifrVER(i, j) /= 100) write(6, 660) isolSL(i, j), i, j, ifrVER(i, j) & + ,(ifraTV(i, j, n), n=1, nvx) +660 format(' WARNING: Mosaic', i2, ' (', 2i4, ') = ', i4, i6, 2i4) + enddo + enddo + i = imez + 10.*111.111e3 / dx + j = jmez + write(6, 6060) itexpe, jdarGE, labmGE(mmarGE), iyrrGE & + , jhurGE, minuGE, GElatr(i, j) / degrad & + , tairDY(i, j, mz), virDY(i, j, mz), 1.e3 * rolvDY(i, j, mz) & + , hsenSL(i, j), hlatSL(i, j), -86400.0 * SLuqs(i, j) & + , 1.e3 * rainHY(i, j), evapTV(i, j), runoTV(i, j) +6060 format(i6, i3, '-', a3, '-', i4, ':', i2, ':', i2, f6.2, '?N', & + f9.3, ' K', f6.3, f6.3, ' kg/m3', 2(f6.1, ' W/m2'), & + f6.3, ' mm/day', 3(f9.3, ' mm')) +#endif + ! +--Verification of Vectorization + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#if(VR) + write(6, 6100) +6100 format(/, 'Verification of Vectorization: Before CALL') + do n = mw, 1, -1 + do j = my, 1, -1 + write(6, 6110)(ij0ver(i, j, n), i=1, mx) +6110 format(132i1) + enddo + write(6, 6103) +6103 format(1x) + enddo + write(6, 6101) +6101 format(/, 'Verification of Vectorization: After CALL') + do n = mw, 1, -1 + do j = my, 1, -1 + write(6, 6110)(ij_ver(i, j, n), i=1, mx) + enddo + write(6, 6103) + enddo + do n = 1, mw + do j = 1, my + do i = 1, mx + if(ijdver(i, j, n) /= 0 .and. ij_ver(i, j, n) /= 1) write(6, 6102) i, j, n, ijdver(i, j, n) +6102 format(' Vectorization ERROR on', 3i4, ' (', i6, ')') + enddo + enddo + enddo +#endif + + if(.not. INI_SV) & + INI_SV = .true. + + return +endsubroutine PHY_SISVAT_MP diff --git a/MAR/code_mar/phymar.f90 b/MAR/code_mar/phymar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8eb9eec11efdeb97af5ef600c8cc8a93ae21e0e9 --- /dev/null +++ b/MAR/code_mar/phymar.f90 @@ -0,0 +1,96 @@ +subroutine phymar + ! +------------------------------------------------------------------------+ + ! | MAR phymar 07-12-2020 MAR | + ! | subroutine phymar is used to define physical constants used in MAR | + ! | | + ! +------------------------------------------------------------------------+ + use mardim + use marphy + use mar_ge + use radcep + + implicit none + + ! +--LMDZ Time Constants + ! + =================== + logical YR_360, YR_365 ! y_360 + character(len=10) CALENDAR + integer n + integer ioopen, ioread + + ! njyr30: Nb of Days since Begin of the Year, before Current Month + integer, parameter :: njyr30(0:12) = & + (/0, 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330/) + ! njyb30: Leap Year Correction to njyrGE + integer, parameter :: njyb30(0:12) = & + (/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/) + ! njmo30: Nb of Days in each Month of the Year + integer, parameter :: njmo30(0:12) = & + (/0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30/) + ! njmb30: Leap Year Correction to njmo30 + integer, parameter :: njmb30(0:12) = & + (/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/) + + ! njyrGE : Number of Days since Begin of the Year before Current Month + njyrGE = (/0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334/) + ! njybGE : Leap Year Correction to current Day of the Year + njybGE = (/0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1/) + ! njmoGE : Number of Days in each Month of the Year + njmoGE = (/0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/) + ! njmbGE : Leap Year Correction to njmoGE + njmbGE = (/0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/) + + YR_360 = .false. + YR_365 = .false. + + CMIP_scenario = "ssp370" ! RCP26,RCP45,...,ssp126,ssp245,... + open(unit=10, file="MARscenario.ctr", status="old", iostat=ioopen) + if(ioopen == 0) then + read(10, *, iostat=ioread) CMIP_scenario + if(ioread == 0) then + print *, "phymar CMIP scenario="//trim(CMIP_scenario) + endif + read(10, *, iostat=ioread) CALENDAR + if(ioread == 0) then + if(TRIM(CALENDAR) == "YR_360") YR_360 = .true. + if(TRIM(CALENDAR) == "yr_360") YR_360 = .true. + if(TRIM(CALENDAR) == "YR_365") YR_365 = .true. + if(TRIM(CALENDAR) == "yr_365") YR_365 = .true. + + if(TRIM(CMIP_scenario) == "SSP126") CMIP_scenario = "ssp126" + if(TRIM(CMIP_scenario) == "SSP245") CMIP_scenario = "ssp245" + if(TRIM(CMIP_scenario) == "SSP370") CMIP_scenario = "ssp370" + if(TRIM(CMIP_scenario) == "SSP585") CMIP_scenario = "ssp585" + if(TRIM(CMIP_scenario) == "SSP26") CMIP_scenario = "ssp126" + if(TRIM(CMIP_scenario) == "SSP45") CMIP_scenario = "ssp245" + if(TRIM(CMIP_scenario) == "SSP70") CMIP_scenario = "ssp370" + if(TRIM(CMIP_scenario) == "SSP85") CMIP_scenario = "ssp585" + endif + else + print *, "phymar ERROR: MARscenario.ctr no found!!!" + endif + close(10) + + if(YR_360) then + print *, "phymar YR_360=.true." + njmoGE = njmo30 + njmbGE = njmb30 + njyrGE = njyr30 + njybGE = njyb30 + endif + + if(YR_365) then + print *, "phymar YR_365=.true." + do n = 0, 12 + njmbGE(n) = 0 + njybGE(n) = 0 + enddo + endif + + ! +--Time Constant + ! + ------------- + ! nhyrGE : Number of Hours in one Year + nhyrGE = (njyrGE(12) + njmoGE(12)) * 24 + + return +endsubroutine phymar diff --git a/MAR/code_mar/phyrad_cep.f90 b/MAR/code_mar/phyrad_cep.f90 new file mode 100644 index 0000000000000000000000000000000000000000..44813f435824fe13be63a29120304d22161cb4ec --- /dev/null +++ b/MAR/code_mar/phyrad_cep.f90 @@ -0,0 +1,696 @@ +#include "MAR_pp.def" +subroutine PHYrad_CEP_mp(dST_UA) + + ! +------------------------------------------------------------------------+ + ! | MAR PHYSICS XF 07-12-2020 MAR | + ! | | + ! | subroutine PHYrad_CEP interfaces MAR with the new | + ! | ECMWF Solar/Infrared Radiative Transfer Scheme | + ! | | + ! | f77 / f90 MAR /ECMWF Interface | + ! | | + ! | ECMWF Code Source: J.-J. Morcrette, 28 nov 2002 | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_hy + use mar_ra + use mar_sl + use mar_wk + use mar_io +#if(AR) + use mar_tc +#endif + ! +--Interface Variables + ! + ==================== + use radcep + + implicit none + + integer i, j, k, m + real dST_UA ! Distance Soleil-Terre [UA] + !real RAcldE(mx, my, mz) ! Cloud Emissivity [-] + !real htngIR(mx, my, mz) ! IR Heating [K/s] + !real htngSO(mx, my, mz) ! Solar Heating [K/s] + + ! +--INPUT + ! + ----- + + logical PHYrad_CEP_ERR + + integer yymmdd ! Date in the form yyyyMMdd + integer i_hhss ! Number of seconds in the day + + real AlbCEP(klonr) ! Surface Albedo + real pa_CEP(klonr, klevr) ! Air Pressure (layer) + real pahCEP(klonr, klevr + 1) ! Air Pressure (layer interface) + real fcdCEP(klonr, klevr) ! Cloud Fraction (dropplets) + real emsCEP(klonr) ! Surface IR Emissivity + real lsmCEP(klonr) ! Land/Sea Mask: (1.=land 0.=ocean) + real cszCEP(klonr) ! cosine (solar zenithal Distance) + real czeMIN ! Minimum accepted for cszCEP + real larCEP(klonr) ! Latitude [radian] + real lorCEP(klonr) ! Longitude [radian] + real ta_CEP(klonr, klevr) ! Air Temperature + real tasCEP(klonr) ! Surface Temperature + + real AerCEP(klonr, nn_aer, klevr) ! Aerosol Concentration ! + real O3rCEP(klonr, klevr) ! O3 Concentration + + real cldMAX(mx, my) ! Cloud Max Fraction [-] + real CD_OD1(klonr, klevr) ! Cloud Optical Depth [-] + real CDtOD1(klonr) ! Cloud Optical Depth [-] + ! ! (vertically integrated) + real Ae_ODa(klonr, klevr) ! Aeros.Optical Depth [-] + real AetODa(klonr) ! Aeros.Optical Depth [-] + ! ! (vertically integrated) + real qv_CEP(klonr, klevr) ! Vapor Concentr. [kg/kg] + real qi_CEP(klonr, klevr) ! Cryst. Concentr. [kg/kg] + real qw_CEP(klonr, klevr) ! Droppl. Concentr. [kg/kg] + real sw_CEP(klonr, klevr) ! Saturation % water [kg/kg] + real qr_CEP(klonr, klevr) ! Drops Concentr. [kg/kg] + integer n, l, nae + real ww, nn, ss + + ! +--OUTPUT + ! + ------ + + real FIRn_c(klonr, klevr + 1) ! CLEAR-SKY LW NET FLUXES + real FIRn_t(klonr, klevr + 1) ! TOTAL LW NET FLUXES + real FSOn_c(klonr, klevr + 1) ! CLEAR-SKY SW NET FLUXES + real FSOn_t(klonr, klevr + 1) ! TOTAL SW NET FLUXES + real FSOs_t(klonr) ! TOTAL-SKY SURFACE SW DOWNWARD FLUX + + integer ij0MAX, ij_MAX, OMP_GET_THREAD_NUM + parameter(ij0MAX=mx2 * my2) + integer nbvMAX, nb_MAX + parameter(nbvMAX=ij0max / klonr) + integer klonrb + parameter(klonrb=ij0max - klonr * nbvMAX) + + integer ikl, lkl, nkl + integer ij, nnn, nvc + integer k2i(klonr) ! i index corresp. to kl + integer k2j(klonr) ! j index corresp. to kl +#if(VR) + integer ij0ver(mx, my) ! For Verif. of Vectoriz. + integer ij_ver(mx, my) ! For Verif. of Vectoriz. + integer ij2, ijdver(mx, my) ! For Verif. of Vectoriz. +#endif + + ! +--Surface Albedo + ! + -------------- + + real bsegal, albmax, albx, dalb, albu + real czeMAX, czrx + real siceOK, ciceOK, zangOK, sign_T, ColdOK + real sign_S, snowOK + + real qsfac + + ! +--OUTPUT + ! + ------ + + integer io, CEPerr(mx, my) + real zlevel, pr_atm, qcloud, fcloud, tmp + real heatng ! Total Heating [K/s] + + ! +--DATA + ! + ==== + +#if(GR) + ! qsfac : qs_HY contribution to qi_cep + data qsfac/1.0/ +#elif(AC) + ! qsfac for Antarctica + data qsfac/0.3/ +#else + data qsfac/0.5/ +#endif + data bsegal/2.00e0/ + data albmax/0.99e0/ + ! czeMAX: 80.deg (Segal et al., 1991 JAS) + data czeMAX/0.173648178/ + ! MIN (Solar Zenithal Distance) + data czeMIN/5.00e-6/ + + ! +--INITIALIZATION + ! + ============== + +#if(DB) + open(unit=30, status='unknown', file='PHYrad_CEP.txt') + rewind 30 +#endif + + if(iterun == 0) then + ij_MAX = mx2 * my2 + if(mod(ij_MAX, klonr) == 0) then + nb_MAX = ij_MAX / klonr + else + nb_MAX = ij_MAX / klonr + 1 + endif + endif + + qcloud = 0. + fcloud = 0. + + ! +--Time & Insolation (top of the atmosphere) + ! + ========================================= + + yymmdd = min(iyrrGE, 2004) * 10000 + mmarGE * 100 + jdarGE + i_hhss = jhurGE * 3600 + minuGE * 60 + jsecGE + + ! +--Zenith Angle Correction of Snow Albedo + ! + ====================================== + + if(mod(iterun, jtRadi) == 0) then ! CTR + if(.not. VSISVAT) then ! CTR + + do j = jp11, my1 + do i = ip11, mx1 + + siceOK = 1 - min(iabs(isolSL(i, j) - 2), iun) + ciceOK = 1 - min(iabs(isolSL(i, j) - 3), iun) + + zangOK = max(siceOK, ciceOK) + + sign_T = sign(unun, TfSnow - TairSL(i, j)) + ColdOK = max(zero, sign_T) + zangOK = max(zangOK, ColdOK) + + sign_S = zero + snowOK = max(zero, sign_S) + zangOK = max(zangOK, snowOK) + +#if(CP) + zangOK = 0.0e+0 +#endif + + ! +--Snow and/or ice covered surface + ! + ------------------------------- + + albx = alb0SL(i, j) + czrx = max(czeMAX, czenGE(i, j)) + dalb = 0.32e0 * ((bsegal + unun) / (unun + 2.e0 * bsegal * czrx) & + - unun) / bsegal + dalb = max(dalb, zero) + albx = dalb + alb0SL(i, j) + albx = min(albx, albmax) + ! +*** Influence of Sun Zenith Angle + ! + (Segal et al., 1991 JAS 48, p.1025) + + ! +--Underlying Surface Albedo + ! + ------------------------- + + albu = alb0SL(i, j) + + ! +--Actual Albedo + ! + ------------- + + albeSL(i, j) = zangOK * albx + (1 - zangOK) * albu + + enddo + enddo + + ENDif ! CTR + + ! +--Effective Radiating Surface Temperature + ! + ======================================= + + write(6, 397) jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE + +397 format(' Call of PHYrad_CEP_mp IN : ' & + , i2, '/', i2, '/', i4, ' ', i2, ':', i2, ':', i2) + + !$OMP PARALLEL + RADin2 = .false. + !$OMP END PARALLEL + + !$OMP PARALLEL do & + !$OMP firstprivate(AlbCEP,pa_CEP,pahCEP,fcdCEP, & + !$OMP emsCEP,lsmCEP,cszCEP,larCEP,lorCEP, & + !$OMP AerCEP,O3rCEP,qv_CEP,qi_CEP,qw_CEP, & + !$OMP sw_CEP,qr_CEP,ta_CEP,tasCEP,k2i,k2j, & + !$OMP FIRn_c,FIRn_t,FSOn_c,FSOn_t,FSOs_t,tmp,n, & + !$OMP CD_OD1,CDtOD1,Ae_ODa,AetODa,i,lkl,ikl,nae) + do j = jp11, my1 + do i = ip11, mx1 + + WKxy1(i, j) = 0.0 + + do n = 1, mw + WKxy1(i, j) = WKxy1(i, j) + & + eps0SL(i, j) * SLsrfl(i, j, n) * & + tsrfSL(i, j, n)**4. + enddo + + tviRA(i, j) = sqrt(sqrt(WKxy1(i, j) & + + (1.-eps0SL(i, j)) * RAd_ir(i, j) / stefan)) + cld_SL(i, j) = 0. + cldMAX(i, j) = 0. + CEPerr(i, j) = 0 +#if(VR) + ij0ver(i, j) = 0 + ij_ver(i, j) = 0 + ijdver(i, j) = 0 +#endif + + ! +--Solar and IR Transfer through the Atmosphere + ! + ============================================ + + ! +--Grid Point Dependant Variables --> PHYrad_CEP "Vector"Variables + ! + ------------------------------------------------------------------ + + do ikl = 1, klonr + k2i(ikl) = i + k2j(ikl) = j +#if(VR) + ij0ver(i, j) = ij0ver(i, j) + 1 + ijdver(i, j) = ijdver(i, j) + ij +#endif + + ! +--Geographic Coordinates + ! + ^^^^^^^^^^^^^^^^^^^^^^ + larCEP(ikl) = sign(1., GElatr(i, j)) * & + min(89.9 * degrad, abs(GElatr(i, j))) + lorCEP(ikl) = GElonh(i, j) * hourad + lorCEP(ikl) = lorCEP(ikl) & + - pi * 2.*min(sign(1., lorCEP(ikl)), 0.) + + ! +--Albedo + ! + ^^^^^^ + AlbCEP(ikl) = albeSL(i, j) + + ! +--Surface + ! + ^^^^^^^ + pahCEP(ikl, mzz) = (pstDY(i, j) * sigmid(mzz) + ptopDY) * 1.e3 + + emsCEP(ikl) = eps0SL(i, j) ! Emissivity + lsmCEP(ikl) = 1 - maskSL(i, j) ! Land/sea Mask + cszCEP(ikl) = max(czenGE(i, j), czeMIN) ! cos(zenith.Dist.) + + tasCEP(ikl) = tairSL(i, j) + + enddo + + do lkl = 1, mz + do ikl = 1, klonr + ! +--Pressure + ! + ^^^^^^^^ + pahCEP(ikl, lkl) = (pstDY(i, j) * sigmid(lkl) + ptopDY) * 1.e3 + pa_CEP(ikl, lkl) = (pstDY(i, j) * sigma(lkl) + ptopDY) * 1.e3 + + ! +--Temperature + ! + ^^^^^^^^^^^ + ta_CEP(ikl, lkl) = tairDY(i, j, lkl) + + ! +--Water Concentration (qsHY: Von Walden et al. 2003, JAM 42, p.1400) + ! + ^^^^^^^^^^^^^^^^^^^^^ ( Fall snow 24 mim ) + ! ( Blown snow 11 mim, only over ice sheet) + ! Vapor + qv_CEP(ikl, lkl) = max(1.e-6, qvDY(i, j, lkl)) + ! Crystals + qi_CEP(ikl, lkl) = 0. + ! XF qi_CEP : exp((tairDY(i, j, lkl)-273.15) + qi_CEP(ikl, lkl) = qiHY(i, j, lkl) & + + (1.-min(1., exp((tairDY(i, j, lkl) - 273.15) * 0.1))) & + * (qsHY(i, j, lkl) * qsfac) + ! Dropplets + qw_CEP(ikl, lkl) = 0. + qw_CEP(ikl, lkl) = qwHY(i, j, lkl) + ! Saturation % W + sw_CEP(ikl, lkl) = min(qvswDY(i, j, lkl), 0.03) + ! Rain Drops + qr_CEP(ikl, lkl) = 0. + qr_CEP(ikl, lkl) = qrHY(i, j, lkl) + + if(gplvDY(i, j, lkl) * grvinv - sh(i, j) > 50.) then +#if(GR) + qi_CEP(ikl, lkl) = qiHY(i, j, lkl) + 0.80 * qsHY(i, j, lkl) +#endif + +#if(EU) + qi_CEP(ikl, lkl) = qiHY(i, j, lkl) + qsHY(i, j, lkl) + ! qw_CEP(ikl,lkl) = qw_CEP(ikl,lkl) * 1.15 + ! qr_CEP(ikl,lkl) = qr_CEP(ikl,lkl) * 1.15 + ! qi_CEP(ikl,lkl) = qi_CEP(ikl,lkl) * 1.1 + ! qv_CEP(ikl,lkl) = qv_CEP(ikl,lkl) * 1.05 +#endif + endif + + !C #EU ... * 1.15 instead + + ! +--Cloud Fraction (liquid water) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + fcdCEP(ikl, lkl) = cfraHY(i, j, lkl) + + ! +--O3 Concentration + ! + ^^^^^^^^^^^^^^^^^^^^^ + O3rCEP(ikl, lkl) = O3_MAR(i, j, lkl) + + enddo + enddo + + ! +--Aerosol Concentration + ! + ^^^^^^^^^^^^^^^^^^^^^ + do nae = 1, nn_aer + do lkl = 1, mz + do ikl = 1, klonr + AerCEP(ikl, nae, lkl) & + = Ae_MAR(k2i(ikl), k2j(ikl), nae, lkl) + enddo + enddo + enddo + + ! +--Radiative Transfert Computation + ! + ------------------------------- + + ! + ********** + call PHYrad2CEP(klonr, klevr, nn_aer, yymmdd, i_hhss & + , dST_UA, AlbCEP, pa_CEP, pahCEP, fcdCEP & + , emsCEP, lsmCEP, cszCEP, larCEP, lorCEP & + , AerCEP, O3rCEP, qv_CEP, qi_CEP, qw_CEP & + , sw_CEP, qr_CEP, ta_CEP, tasCEP & + , FIRn_c, FIRn_t, FSOn_c, FSOn_t, FSOs_t & + , CD_OD1, CDtOD1, Ae_ODa, AetODa, iyrrGE & + , radINI, radIN2, CMIP_scenario) + ! + ********** + + ! + ------------------------------- + + RADini = .true.; RADin2 = .true. + + ! +--Grid Point Dependant Variables <-- PHYrad_CEP "Vector"Variables + ! + ------------------------------------------------------------------ + + do ikl = 1, klonr + +#if(VR) + ij2 = ij2 + 1 + ijdver(i, j) = ijdver(i, j) - ij2 + ij_ver(i, j) = ij_ver(i, j) + 1 +#endif + + ! +--Surface Cloud/Aerosol Optical Depth + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(CDtOD1(ikl))) & + RAcdtO(i, j) = CDtOD1(ikl) + if(.not. isnan(AetODa(ikl))) & + RAertO(i, j) = AetODa(ikl) + + ! +--Surface Downward Radiative Fluxes + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(FIRn_t(ikl, 1))) & + RAdOLR(i, j) = -FIRn_t(ikl, 1) + + if(.not. isnan(FSOs_t(ikl)) .and. FSOs_t(ikl) < 1350) then + if(FSOs_t(ikl) < 0.1) FSOs_t(ikl) = 0. + RAdsol(i, j) = FSOs_t(ikl) + sol_SL(i, j) = FSOs_t(ikl) * (1.-albeSL(i, j)) + else + CEPerr(i, j) = CEPerr(i, j) + 1 + endif + + if(.not. isnan(FSOn_t(ikl, 1))) & + RAdOSR(i, j) = -FSOn_t(ikl, 1) + + if(.not. isnan(FIRn_t(ikl, 1 + klevr))) then + RAd_ir(i, j) = FIRn_t(ikl, 1 + klevr) & + + eps0SL(i, j) * TairSL(i, j) * TairSL(i, j) & + * TairSL(i, j) * TairSL(i, j) & + * 5.670373e-8 +#if(EU) + !XF 04/12/2020 + RAd_ir(i, j) = RAd_ir(i, j) + 1. +#endif +#if(GR) + !XF 04/12/2020 + RAd_ir(i, j) = RAd_ir(i, j) + 1. +#endif + +#if(EU) + if(sol_SL(i, j) > 0) then + tmp = RAd_ir(i, j) * 0.03 + RAd_ir(i, j) = RAd_ir(i, j) * 1.03 + RAdsol(i, j) = max(RAdsol(i, j) * 0.90, RAdsol(i, j) - tmp * 3.) + sol_SL(i, j) = RAdsol(i, j) * (1.-albeSL(i, j)) + endif +#endif + else + CEPerr(i, j) = CEPerr(i, j) + 1 + endif + + ! +--Surface IR Net Radiative Fluxes + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(FIRn_t(ikl, mzz))) & + RAfnIR(i, j, mzz) = FIRn_t(ikl, mzz) + if(.not. isnan(FIRn_c(ikl, mzz))) & + RAfncIR(i, j, mzz) = FIRn_c(ikl, mzz) + enddo + + do lkl = 1, mz + do ikl = 1, klonr + + ! +--Atmosph. Net Radiative Fluxes + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(FIRn_t(ikl, lkl))) & + RAfnIR(i, j, lkl) = FIRn_t(ikl, lkl) + if(.not. isnan(FSOn_t(ikl, lkl))) & + RAfnSO(i, j, lkl) = FSOn_t(ikl, lkl) + if(.not. isnan(FIRn_c(ikl, lkl))) & + RAfncIR(i, j, lkl) = FIRn_c(ikl, lkl) + if(.not. isnan(FSOn_c(ikl, lkl))) & + RAfncSO(i, j, lkl) = FSOn_c(ikl, lkl) + + ! +--Cloud Fraction + ! + ^^^^^^^^^^^^^^^^ + if(.not. isnan(fcdCEP(ikl, lkl))) then + cldMAX(i, j) = max(fcdCEP(ikl, lkl), cldMAX(i, j)) + CldFRA(i, j, lkl) = fcdCEP(ikl, lkl) + endif + + ! +--Atmosph.Cloud/Aerosol Optical Depth + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(CD_OD1(ikl, lkl))) & + RAcd_O(i, j, lkl) = CD_OD1(ikl, lkl) + if(.not. isnan(Ae_ODa(ikl, lkl))) & + RAer_O(i, j, lkl) = Ae_ODa(ikl, lkl) + + ! +--Radiative Heating + ! + ^^^^^^^^^^^^^^^^^ + WKxyz1(i, j, lkl) = -(FIRn_t(ikl, lkl + 1) - FIRn_t(ikl, lkl)) & + * gravit / (cp * 1.e3 * pstDY(i, j) * dsigm1(lkl)) + WKxyz2(i, j, lkl) = -(FSOn_t(ikl, lkl + 1) - FSOn_t(ikl, lkl)) & + * gravit / (cp * 1.e3 * pstDY(i, j) * dsigm1(lkl)) + + ! +--O3 Concentration + ! + ^^^^^^^^^^^^^^^^^^^^^ + if(.not. isnan(O3rCEP(ikl, lkl))) & + O3_MAR(i, j, lkl) = O3rCEP(ikl, lkl) + + enddo + enddo + + ! +--Cloud Fraction + ! + ^^^^^^^^^^^^^^^^ + do ikl = 1, klonr + + cld_SL(i, j) = cldMAX(i, j) + clduSL(i, j) = 0. + cldmSL(i, j) = 0. + clddSL(i, j) = 0. + do lkl = 1, mz + if(pahCEP(ikl, lkl) < 44000) & + clduSL(i, j) = max(clduSL(i, j), CldFRA(i, j, lkl)) + if(pahCEP(ikl, lkl) >= 44000 .and. pahCEP(ikl, lkl) <= 68000) & + cldmSL(i, j) = max(cldmSL(i, j), CldFRA(i, j, lkl)) + if(pahCEP(ikl, lkl) > 68000) & + clddSL(i, j) = max(clddSL(i, j), CldFRA(i, j, lkl)) + enddo + enddo + + ! +--Radiative Heating + ! + ^^^^^^^^^^^^^^^^^ + do lkl = 1, mz + do ikl = 1, klonr + tmp = (WKxyz1(i, j, lkl) + WKxyz2(i, j, lkl)) & + * dt / pkDY(i, j, lkl) + + if(.not. isnan(tmp) .and. abs(tmp) < 10) then + pktRAd(i, j, lkl) = tmp + !htngIR(i, j, lkl) = WKxyz1(i, j, lkl) * 86400. + !htngSO(i, j, lkl) = WKxyz2(i, j, lkl) * 86400. + else + CEPerr(i, j) = CEPerr(i, j) + 1 + endif + enddo + enddo + + ! +--Aerosol Concentration + ! + ^^^^^^^^^^^^^^^^^^^^^ + do nae = 1, nn_aer + do lkl = 1, mz + do ikl = 1, klonr + if(.not. isnan(AerCEP(ikl, nae, lkl))) & + Ae_MAR(k2i(ikl), k2j(ikl), nae, lkl) & + = AerCEP(ikl, nae, lkl) + enddo + enddo + enddo + + enddo + enddo + !$OMP END PARALLEL DO + + write(6, 398) jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE + +398 format(' Call of PHYrad_CEP_mp OUT : ' & + , i2, '/', i2, '/', i4, ' ', i2, ':', i2, ':', i2) + + ! +--Lateral Boundary Conditions for Radiative Variables + ! + =================================================== + + do k = 1, mz + do j = 1, my + pktRAd(1, j, k) = pktRAd(ip11, j, k) + pktRAd(mx, j, k) = pktRAd(mx1, j, k) + enddo + do i = 1, mx + pktRAd(i, 1, k) = pktRAd(i, jp11, k) + pktRAd(i, my, k) = pktRAd(i, my1, k) + enddo + enddo + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0. + WKxyz2(i, j, k) = 0. + enddo + enddo + enddo + + ! ------------------------------------------------------------ + + PHYrad_CEP_ERR = .false. + + do j = 4, my - 3 + do i = 4, mx - 3 + if(CEPerr(i, j) > 0) then + write(6, 399) iyrrGE, mmarGE, jdarGE, & + jhurGE, i, j, CEPerr(i, j) +399 format('XF WARNING: PHYrad_CEP_mp NaN on ', i4, '/', i2, '/', & + i2, i3, 'h, (i,j)=', i4, i4, ', #err=', i4) + PHYrad_CEP_ERR = .true. + endif + + ww = 0; nn = 0; ss = 0 + + do k = -1, 1 + do l = -1, 1 + ww = 1 + if(k == 0 .or. l == 0) ww = 2 + if(k == 0 .and. l == 0) ww = 0 + if(RAdsol(i + k, j + l) < 100) ww = 0 + nn = nn + ww + ss = ss + RAdsol(i + k, j + l) * ww + enddo + enddo + + if(nn == 12 .and. RAdsol(i, j) < (ss / nn) * 0.10) then + write(6, 400) iyrrGE, mmarGE, jdarGE, & + jhurGE, i, j +400 format('ERROR: likely error of // in PHYrad_CEP_mp on', & + i4, '/', i2, '/', i2, i3, 'h, (i,j)=', i4, i4) + RAdsol(i, j) = ss / nn + print *, "CHECK your SWD output!!!!" + endif + enddo + + ss = 0; ww = 0 + + do i = 4, mx - 3 + ss = ss + RAdsol(i, j + 0) + ww = ww + RAdsol(i, j + 1) + enddo + ss = ss / real(mx - 3 - 4 + 1) + ww = ww / real(mx - 3 - 4 + 1) + + if((ss < 1 .and. ww > 100) .or. (ss > 100 .and. ww < 1)) then + write(6, 400) iyrrGE, mmarGE, jdarGE, jhurGE, 0, j + print *, "CHECK your SWD output!!!!" + stop + endif + + enddo + + ! ------------------------------------------------------------ + + do j = 2, my - 1 + do i = 2, mx - 1 + do n = 1, mz + + ww = 0; nn = 0; ss = 0 + + do k = -1, 1 + do l = -1, 1 + ww = 1 + if(k == 0 .or. l == 0) ww = 2 + if(k == 0 .and. l == 0) ww = 0 + nn = nn + ww + ss = ss + abs(pktRAd(i + k, j + l, n)) * ww + enddo + enddo + + if(abs(pktRAd(i, j, n)) > (ss / nn) + 1.5 & + .or. abs(pktRAd(i, j, n)) > 3.+2.*n / mz) then + write(6, 390) iyrrGE, mmarGE, jdarGE, jhurGE, i, j, n +390 format('ERROR: likely error of pktRAd in PHYrad_CEP_mp on', & + i4, '/', i2, '/', i2, i3, 'h, (i,j)=', i4, i4, i4) + pktRAd(i, j, n) = sign(1., pktRAd(i, j, n)) * (ss / nn) + endif + + enddo + enddo + enddo + + ! ------------------------------------------------------------ + + ! C +--OUTPUT for Verification + ! C + ----------------------- + +#if(VR) + write(6, 6000) +6000 format(/, 'Verification of Vectorization: Before CALL') + do j = my, 1, -1 + write(6, 6010)(ij0ver(i, j), i=1, mx) +6010 format(132i1) + enddo + + write(6, 6001) +6001 format(/, 'Verification of Vectorization: After CALL') + do j = my, 1, -1 + write(6, 6010)(ij_ver(i, j), i=1, mx) + enddo + + do j = 1, my + do i = 1, mx + if(ijdver(i, j) /= 0 .and. ij_ver(i, j) /= 1) write(6, 6002) i, j, ijdver(i, j) +6002 format(' Vectorization ERROR on', 2i4, ' (', i6, ')') + enddo + enddo +#endif + + endif + +#if(DB) + close(unit=30) +#endif + + return +endsubroutine PHYrad_CEP_mp diff --git a/MAR/code_mar/phyrad_top.f90 b/MAR/code_mar/phyrad_top.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c4c9725ecbe9abb0afcf148fab7dc836d8ef5f05 --- /dev/null +++ b/MAR/code_mar/phyrad_top.f90 @@ -0,0 +1,527 @@ +#include "MAR_pp.def" +subroutine PHYrad_top(Dis_ST) + ! +------------------------------------------------------------------------+ + ! | MAR PHYSICS (INSOL) 15-11-2007 MAR | + ! | subroutine PHYrad_top computes | + ! | Time Insolation at the Top of the Atmosphere | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | REFER.: Ch. Tricot, personal communication | + ! | ^^^^^^^ M.F. Loutre, personal communication and thesis (1993) | + ! | | + ! | INPUT : mmarGE, jdarGE: Month and Day of the Year | + ! | ^^^^^^^ jhurGE, minuGE, jsecGE: Hour, Minute, and Second | + ! | GElat0, GElon0: Latitude, Longitude | + ! | GElatr(mx,my) : Latitude (radians) | + ! | GElonh(mx,my) : Longitude (hours) | + ! | itizGE(mx,my) : Time Zone | + ! | | + ! | OUTPUT: rsunGE : Insolation normal to Atmosphere Top (W/m2) | + ! | ^^^^^^^ czenGE(mx,my) : Cosinus of the Zenithal Distance | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use marsnd + use mar_wk + use mar_io + + implicit none + + ! +--Global Variables + ! + ================ + + real Dis_ST + + ! +--LOCAL VARIABLES + ! + =============== + + integer i, j, k, m + real pirr, xl, so + real xllp, xee, xse + real xlam, dlamm, anm, ranm, ranv, anv, tls + real Tyear, step, rlam, sd, cd, deltar, delta + + real ddt, arg, et, argc, ahc + real c1, c2, c3, s1, s2, s3 + real timdl, timh, ahor, ahorr, RadLat, chor, zenitr + integer nj, lhc + + real omesun +#if(AZ) + real slopx, slopy, omenor + real comes, somes, omeswr, anormr, omenwr + integer momask +#endif + +#if(MM) + real dxdx, azim_0, azim_1, azimdd, azimut, r_azim + real azimxx, azimxa, azimxs, azimyy, azimya, azimys + real ddxx_2, ddyy_2, ddxy_2, ddzz, tmnt_2, cmnt + integer k_azim, nax, nal, na, na2, ka + integer i_azim, j_azim, j_azmn, j_azmx, i_azmn, i_azmx, nocoun + integer knazim, ni1, ni2, nj1, nj2 + integer i1, i2, j1, j2, ni +#endif + + real om, ecc, perh, xob + + ! +--DATA + ! + ==== + + data om/0.0172142d0/ + + ! +--Present Day Insolation + ! + ---------------------- + ! Eccentricity + data ecc/0.01673/ + ! Longitude of the Perihelion (degrees) + data perh/102.4/ + ! Obliquity (degrees) + data xob/23.445/ + +#if(k6) + ! +--6 kBP Insolation + ! + ---------------- + ! Eccentricity + data ecc/0.018682/ + ! Longitude of the Perihelion (degrees) + data perh/0.87/ + ! Obliquity (degrees) + data xob/24.105/ +#endif + +#if(k10) + ! +--10 kBPInsolation + ! + ---------------- + ! Eccentricity + data ecc/0.019419/ + ! Longitude of the Perihelion (degrees) + data perh/294.81/ + ! Obliquity (degrees) + data xob/24.226/ +#endif + + ! +--Insolation at the Top of the Atmosphere (TIME PARAMETERS) + ! + =============================================================== + + ! +--Solar declination : delta + ! + ------------------------- + + nj = jdarGE + njyrGE(mmarGE) + Tyear = 365.25d0 + step = 360.0d0 / Tyear + + pirr = degrad / 3600.0 + xl = perh + 180.0 + so = sin(xob * degrad) + ! +...so : sinus of obliquity + + xllp = xl * degrad + xee = ecc * ecc + xse = sqrt(1.0d0 - xee) + xlam = (ecc / 2.0 + ecc * xee / 8.0d0) * (1.0 + xse) * sin(xllp) - xee / 4.0 * & + (0.5 + xse) * sin(2.0 * xllp) + ecc * xee / 8.0 * (1.0 / 3.0 + xse) * & + sin(3.0 * xllp) + xlam = 2.0d0 * xlam / degrad + dlamm = xlam + (nj - 80) * step + ! +...xlam : true long. sun for mean long. = 0 + ! +...dlamm : mean long. sun for ma-ja + anm = dlamm - xl + ranm = anm * degrad + xee = xee * ecc + ranv = ranm + (2.0 * ecc - xee / 4.0) * sin(ranm) + 5.0 / 4.0 * ecc * ecc * & + sin(2.0 * ranm) + 13.0 / 12.0 * xee * sin(3.0 * ranm) + anv = ranv / degrad + tls = anv + xl + rlam = tls * degrad + ! +...tls : longitude vraie (degrees) + ! +...rlam : longitude vraie (radian) + ! +...anv : anomalie vraie (degrees) + ! +...ranv : anomalie vraie (radian) + + sd = so * sin(rlam) + cd = sqrt(1.0d0 - sd * sd) + ! +...sd and cd: cosinus and sinus of solar declination angle (delta) + ! +...sinus delta = sin (obl)*sin(lambda) with lambda = real longitude + ! +...(Phd. thesis of Marie-France Loutre, ASTR-UCL, Belgium, 1993) + + deltar = atan(sd / cd) + delta = deltar / degrad + ! +...delta: Solar Declination (degrees, angle sun at equator) + + ! +--Eccentricity Effect + ! + ------------------- + + Dis_ST = (1.0 - ecc * ecc) / (1.0 + ecc * cos(ranv)) + ddt = 1.0 / Dis_ST + ! +...ddt : 1 / normalized earth's sun distance + + ! +--Insolation normal to the atmosphere (W/m2) + ! + ------------------------------------------ + + !XF + rsunGE = ddt * ddt * 1360.8d0 + + ! +--Time Equation (Should maybe be modified in case other than present + ! + ------------- conditions are used, minor impact) + + arg = om * nj + c1 = cos(arg) + c2 = cos(2.d0 * arg) + c3 = cos(3.d0 * arg) + s1 = sin(arg) + s2 = sin(2.d0 * arg) + s3 = sin(3.d0 * arg) + + et = 0.0072d0 * c1 - 0.0528d0 * c2 - 0.0012d0 * c3 & + - 0.1229d0 * s1 - 0.1565d0 * s2 - 0.0041d0 * s3 + ! +...et (hour) + ! + = difference between true solar and mean solar hour angles. + ! + (connected to the earth orbital rotation speed) + + ! +--Insolation at the Top of the Troposphere (Auxiliary Variables) + ! + ============================================================== + + ! +--Day Length, Time Sunrise and Sunset at Sounding Grid Point (iSND, jSND) + ! + ----------------------------------------------------------------------- + + i = iSND + j = jSND + + argc = -tan(GElatr(i, j)) * tan(deltar) + if(abs(argc) > 1.d0) then + ahc = 0.d0 + if(argc > 1.d0) then + lhc = -1 + timdl = 00.d0 + ! +... Polar Night + else + lhc = 1 + timdl = 24.d0 + ! +... Midnight Sun + endif + tlsrGE = 00.d0 + tlssGE = 00.d0 + else + ahc = acos(argc) + lhc = 0 + + if(ahc < 0.d0) ahc = -ahc + ahc = ahc / hourad + timdl = ahc * 2.d0 + tlsrGE = 12.d0 - ahc + itizGE(i, j) - et - GElonh(i, j) + tlssGE = tlsrGE + timdl + endif + + tl__GE = jhurGE + minuGE / 60.d0 - itizGE(i, j) + + ! +--Time Angle + ! + ---------- + + do j = 1, my + do i = 1, mx + timh = jhurGE + minuGE / 60.d0 + ahor = timh + GElonh(i, j) - 12.d0 - et + ! +... ahor : time angle (hours) + + ahorr = ahor * hourad + ! +... ahorr : time angle (radians) + + chor = cos(ahorr) + + ! +--Solar Zenithal Distance zenitr (radians) and + ! + Insolation (W/m2) at the Atmosphere Top === + ! + ======================================= + + czenGE(i, j) = slatGE(i, j) * sd & + + clatGE(i, j) * cd * chor + czenGE(i, j) = max(czenGE(i, j), zero) + + cverGE(i, j) = czenGE(i, j) + + ! +--Slope Impact + ! + ------------ + +#if(AZ) + zenitr = acos(czenGE(i, j)) + WKxy3(i, j) = sin(zenitr) + WKxy4(i, j) = sin(ahorr) +#endif + enddo + enddo + +#if(AZ) + ! +--Slope Azimuth + ! + ~~~~~~~~~~~~~ + if(iterun <= 1) then + do j = 1, my + do i = 1, mx + slopx = (sh(ip1(i), j) - sh(im1(i), j)) * dxinv3(i, j) + slopy = (sh(i, jp1(j)) - sh(i, jm1(j))) * dyinv3(i, j) + ! slopGE ...... Cosine of Fall Line Angle + slopGE(i, j) = sqrt(slopx * slopx + slopy * slopy) + slopGE(i, j) = cos(atan(slopGE(i, j))) + ! omenor : Fall Line Azimuth (Upslope Direction) + if(abs(slopx) > zero) then + omenor = atan(slopy / slopx) + if(slopx < zero) & + omenor = omenor + pi + if(omenor > pi) & + omenor = -2.0d0 * pi + omenor + if(omenor < -pi) & + omenor = 2.0d0 * pi + omenor + else + if(slopy > zero) then + omenor = 0.5d0 * pi + else + omenor = 1.5d0 * pi + endif + endif + ! omenGE(i,j) : Fall Line Azimuth (Downslope Direction) + ! (in MAR Reference Frame) + ! (positive counterclockwise) + omenGE(i, j) = omenor - pi + enddo + enddo + ! +--Mountains Mask + ! + ~~~~~~~~~~~~~~ + momask = 1 +#endif +#if(MM) + if(momask /= 1) stop'++++++++ Preprocessing Error: #AZ not removed ++++++++++++++' + dxdx = dx * dx + daziGE = 2.0d0 * pi / n_azim + do k_azim = 1, n_azim + azim_0 = (k_azim - 1) * daziGE + azim_1 = k_azim * daziGE + do j = 1, mmy + do i = 1, mmx + cmntGE(i, j, k_azim) = 0.0d00 + enddo + enddo + if(abs(cos(azim_0)) > abs(sin(azim_0))) then + nax = mx1 / 2 + else + nax = my1 / 2 + endif + nal = 30 + nax = min(nax, nal) + do na = 1, nax + na2 = na / 2 + na2 = max(na2, 1) + azimdd = daziGE / na + do j = 1, mmy + do i = 1, mmx + WKxy1(i, j) = 0.0d00 + WKxy2(i, j) = 0.0d00 + enddo + enddo + do ka = 1, na + azimut = azim_0 + azimdd * (ka - 0.5d0) + azimxx = (na + demi) * cos(azimut) + i_azim = azimxx + azimxa = abs(azimxx) + azimxs = sign(unun, azimxx) + azimyy = (na + demi) * sin(azimut) + j_azim = azimyy + azimya = abs(azimyy) + azimys = sign(unun, azimyy) + if(i_azim == 0 .and. j_azim == 0) then + if(azimxa > azimya) then + i_azim = azimxs + else + j_azim = azimys + endif + endif + do j = 2, my1 + j_azmn = 1 - j + j_azmx = my - j + do i = 2, mx1 + i_azmn = 1 - i + i_azmx = mx - i + nocoun = 0 + if(j_azim > j_azmx .or. j_azim < j_azmn) nocoun = 1 + if(i_azim > i_azmx .or. i_azim < i_azmn) nocoun = 1 + if(nocoun == 1) go to 150 + ddxx_2 = i_azim * i_azim * dxdx + ddyy_2 = j_azim * j_azim * dxdx + ddxy_2 = ddxx_2 + ddyy_2 + ! Correction for Earth Curvature + ddzz = sh(i + i_azim, j + j_azim) - sh(i, j) & + - sqrt(earthr * earthr + ddxy_2) + earthr + ddzz = max(ddzz, zero) + tmnt_2 = ddzz * ddzz / ddxy_2 + cmnt = sqrt(tmnt_2 / (unun + tmnt_2)) + WKxy1(i, j) = WKxy1(i, j) + cmnt + WKxy2(i, j) = WKxy2(i, j) + unun +150 continue + enddo + enddo + enddo + do j = 2, my1 + do i = 2, mx1 + if(WKxy2(i, j) > 0.d0) then + WKxy1(i, j) = WKxy1(i, j) / WKxy2(i, j) + cmntGE(i, j, k_azim) = max(WKxy1(i, j), cmntGE(i, j, k_azim)) + endif + enddo + enddo + enddo + enddo +#endif +#if(AZ) + endif + + ! +--Sun Azimuth + ! + ~~~~~~~~~~~~~ + do j = 1, my + do i = 1, mx + WKxy3(i, j) = max(epsi, WKxy3(i, j)) + ! comes: Cosine of Sun Azimuth + comes = (sd - slatGE(i, j) * czenGE(i, j)) & + / (clatGE(i, j) * WKxy3(i, j)) + ! somes: Sine of Sun Azimuth + somes = (cd * WKxy4(i, j)) / WKxy3(i, j) + if(abs(comes) > zero) then + omesun = atan(somes / comes) + if(comes < zero) omesun = omesun + pi + if(omesun > pi) omesun = -2.0d0 * pi + omesun + if(omesun < -pi) omesun = 2.0d0 * pi + omesun + else + if(somes > zero) then + omesun = 0.5d0 * pi + else + omesun = 1.5d0 * pi + endif + endif + + if(i == iSND .and. j == jSND) omeswr = omesun / degrad + ! omesun : Sun Azimuth (in MAR Reference Frame) + ! (positive counterclockwise) + omesun = -2.0d0 * pi + omesun + GEddxx * degrad + ! +--Minimum Zenithal Distance + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + czmnGE(i, j) = 0.0d00 +#endif +#if(MM) + r_azim = omesun / daziGE + k_azim = r_azim + if(k_azim <= 0) then + r_azim = r_azim + n_azim + k_azim = k_azim + n_azim + endif + knazim = k_azim + 1 + if(knazim > n_azim) knazim = knazim - n_azim + czmnGE(i, j) = cmntGE(i, j, k_azim) + (r_azim - k_azim) & + * (cmntGE(i, j, knazim) - cmntGE(i, j, k_azim)) +#endif +#if(AZ) + ! +--Cosine of Solar Normal Angle + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + cverGE(i, j) = slopGE(i, j) * czenGE(i, j) & + + WKxy3(i, j) * slopGE(i, j) * sqrt(unun - slopGE(i, j)) & + * cos(omesun - omenGE(i, j)) + cverGE(i, j) = max(zero, cverGE(i, j)) + if(czenGE(i, j) <= czmnGE(i, j)) cverGE(i, j) = 0.0d00 + enddo + enddo + ! +--Output + ! + ====== +#endif +#if(MM) + if(iterun == 0) then + ni1 = imez / 20 + 1 + ni2 = imez / 20 + 1 + nj1 = jmez / 20 + 1 + nj2 = jmez / 20 + 1 + do nj = nj2, nj1, -1 + j1 = (nj - 1) * 20 + 1 + j2 = nj * 20 + do ni = ni1, ni2 + i1 = (ni - 1) * 20 + 1 + i2 = ni * 20 + write(4, 60)(i, i=i1, i2), & + (j,(1.d-3 * sh(i, j), i=i1, i2), j=j2, j1, -1) +60 format(///, 'TOPOGRAPHY', & + /, '==========', /, 4x, 20i4, /,(i4, 20f4.1)) + + do k_azim = 1, n_azim + azimut = (k_azim - 0.5d0) * daziGE / degrad + write(4, 61) azimut, & + (i, i=i1, i2), & + (j,(cmntGE(i, j, k_azim), i=i1, i2), j=j2, j1, -1) +61 format(///, 'AZIMUTH ', f6.1, & + /, '================', /, 4x, 20i4, /,(i4, 20f4.2)) + enddo + enddo + enddo + endif +#endif + + if((jmmMAR == 0 .and. jssMAR == 0 .and. & + ((IO_loc >= 2 .and. jhurGE == 0) .or. & + (IO_loc >= 2 .and. mod(jhurGE, 3) == 0) .or. & + (IO_loc >= 3))) .or. & + IO_loc >= 7) then + + ahor = timh + GElonh(iSND, jSND) - 12.d0 - et + zenitr = acos(czenGE(iSND, jSND)) / degrad +#if(AZ) + anormr = acos(cverGE(iSND, jSND)) / degrad + omenwr = GEddxx - omenGE(iSND, jSND) / degrad + if(omenwr < 0.) omenwr = omenwr + 360.d0 + if(omenwr > 360.) omenwr = omenwr - 360.d0 + omeswr = 360.d0 - omeswr + if(omeswr < 0.) omeswr = omeswr + 360.d0 + if(omeswr > 360.) omeswr = omeswr - 360.d0 +#endif + + write(4, 1) GElat0, GElon0, jdarGE, mmarGE, jhurGE, minuGE, jsecGE +1 format(/, ' lat.=', f6.1, 3x, 'long.=', f7.1, 4x, 'date :', i3, '-', i2, & + ' / ', i2, ' h.UT', i3, ' min.', i3, ' sec.') + write(4, 2) iSND, jSND, GElatr(iSND, jSND) / degrad, GElonh(iSND, jSND) +2 format(' Sounding at (', i3, i3, ') / (', f6.2, 'dg,', f6.2, 'ho)') + write(4, 3) rsunGE * cverGE(iSND, jSND), ahor, zenitr & + , delta +3 format(' Insolation [W/m2] = ', f7.2, ' Hor.Angle = ', f7.2, & + ' Zenith.Angle = ', f7.2 & + , /, ' Solar Declination = ', f7.2) + + if(lhc == -1) & + write(4, 4) tlsrGE, timdl, tlssGE +4 format(' Sun Rise Time [h] = ', f7.2, ' Day Leng. = ', f7.2, & + ' Sun Set Time = ', f7.2, ' -- POLAR NIGHT --') + if(lhc == 0) & + write(4, 5) tlsrGE, timdl, tlssGE +5 format(' Sun Rise Time [h] = ', f7.2, ' Day Leng. = ', f7.2, & + ' Sun Set Time = ', f7.2, ' -- SOLAR TIME --') + if(lhc == 1) & + write(4, 6) tlsrGE, timdl, tlssGE +6 format(' Sun Rise Time [h] = ', f7.2, ' Day Leng. = ', f7.2, & + ' Sun Set Time = ', f7.2, ' -- MIDNIGHT SUN --') + endif + + ! +--Work Arrays Reset + ! + ================= +#if(AZ) + do j = 1, my + do i = 1, mx +#endif +#if(MM) + WKxy1(i, j) = 0.d0 + WKxy2(i, j) = 0.d0 +#endif +#if(AZ) + WKxy3(i, j) = 0.d0 + WKxy4(i, j) = 0.d0 + enddo + enddo +#endif + return +end diff --git a/MAR/code_mar/qsat0d.f90 b/MAR/code_mar/qsat0d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..75ce8319f71e3f66fba04e452af0253fdae6866f --- /dev/null +++ b/MAR/code_mar/qsat0d.f90 @@ -0,0 +1,49 @@ +function qsat0D(ttq, ss, pstar, pt, lsf) + ! +------------------------------------------------------------------------+ + ! | MAR PHYSICS Mc 30-05-2007 MAR | + ! | Function qsat0D computes the Saturation Specific Humidity (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : ttq : Air Temperature (K) | + ! | ^^^^^^^ pstar * ss + pt: Pressure of sigma level ss (kPa) | + ! | | + ! | OUTPUT : esat: Saturation Vapor Pressure (hPa) | + ! | ^^^^^^^ qsat0D: Saturation Specific Humidity (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + + implicit none + + real qsat0D, ttq, ss, pstar, pt + integer lsf + + ! +--Local Variables + ! + ================ + + real pr, esat + real, parameter :: tfreeze = 273.16d0 + + pr = 10.d0 * (pstar * ss + pt) + ! +...pr : pressure (hPa) + + if(ttq >= tfreeze .or. lsf == 0) then + esat = 6.1078d0 * exp(5.138d0 * log(tfreeze / ttq)) & + * exp(6827.d0 * (unun / tfreeze - unun / ttq)) + ! +... esat : saturated vapor pressure with respect to water + ! +*** Dudhia (1989) JAS, (B1) and (B2) p.3103 + ! + See also Pielke (1984), p.234 and Stull (1988), p.276 + else + esat = 6.107d0 * exp(6150.d0 * (unun / tfreeze - unun / ttq)) + ! +... esat : saturated vapor pressure with respect to ice + ! +*** Dudhia (1989) JAS, 1989, (B1) and (B2) p.3103 + endif + + ! + ****** + qsat0D = max(eps9, .622d0 * esat / (pr - .378d0 * esat)) + ! + ****** + + return +end diff --git a/MAR/code_mar/qsat2d.f90 b/MAR/code_mar/qsat2d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2ca4023247009c4eebe35c21d8baa9a11d479dd5 --- /dev/null +++ b/MAR/code_mar/qsat2d.f90 @@ -0,0 +1,127 @@ +subroutine qsat2D(tair2D, pst2D, tsrf2D, qvsi2D, qvsw2D) + + ! +------------------------------------------------------------------------+ + ! | MAR PHYSICS Mc 30-05-2007 MAR | + ! | subroutine qsat2D computes the Saturation Specific Humidity (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : tair2D: Air Temperature (K) | + ! | pst2D: Model Pressure Thickness (kPa) | + ! | tsrf2D: Surface Air Temperature (K) | + ! | | + ! | OUTPUT : qvsi2D: Saturation Specific Humidity over Ice (kg/kg) | + ! | ^^^^^^^ qvsw2D: Saturation Specific Humidity over Water (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_dy + + implicit none + + ! Input - Output + ! ============== + ! in + ! -- + real, intent(in) :: tair2D(klon, klev) + real, intent(in) :: pst2D(klon) + real, intent(in) :: tsrf2D(klon) + ! out + ! --- + real, intent(out) :: qvsi2D(klon, klev + 1) + real, intent(out) :: qvsw2D(klon, klev + 1) + + ! +--Local Variables + ! + =============== + + integer i, j, k, m + integer il, klq + + real :: W2xyz5(klon, klev + 1) + real :: W2xyz6(klon, klev + 1) + real :: W2xyz7(klon, klev + 1) + real :: W2xyz8(klon, klev + 1) + + real WatIce, ExpWat, ExpWa2, ExpIce + + ! +--DATA + ! + ==== + data WatIce/273.16e0/ + data ExpWat/5.138e0/ + data ExpWa2/6827.e0/ + data ExpIce/6150.e0/ + + ! +--Work Area Init + ! + =============== + do klq = 1, klev + 1 + do il = 1, klon + W2xyz5(il, klq) = 0.0 + W2xyz6(il, klq) = 0.0 + W2xyz7(il, klq) = 0.0 + W2xyz8(il, klq) = 0.0 + enddo + enddo + + ! +--Temperature (K) and Pressure (hPa) + ! + ================================== + + do klq = 1, klev + do il = 1, klon + W2xyz5(il, klq) = tair2D(il, klq) + W2xyz6(il, klq) = (pst2D(il) * sigma(klq) + ptopDY) * 10.0d0 + enddo + enddo + + do il = 1, klon + W2xyz5(il, klev + 1) = tsrf2D(il) + W2xyz6(il, klev + 1) = (pst2D(il) + ptopDY) * 10.0d0 + enddo + + ! +--Saturation Vapor Pressure over Ice + ! + ================================== + + do klq = 1, klev + 1 + do il = 1, klon + ! +... Dudhia (1989) JAS, (B1) and (B2) p.3103 + W2xyz7(il, klq) = 6.1070d0 * exp(ExpIce * (unun / WatIce - unun / W2xyz5(il, klq))) + + W2xyz8(il, klq) = .622d0 * W2xyz7(il, klq) & + / (W2xyz6(il, klq) - .378d0 * W2xyz7(il, klq)) + + ! +--Saturation Vapor Pressure over Water + ! + ==================================== + ! +... Dudhia (1989) JAS, (B1) and (B2) p.3103 + ! + See also Pielke (1984), p.234 and Stull (1988), p.276 + W2xyz7(il, klq) = 6.1078d0 * exp(ExpWat * log(WatIce / W2xyz5(il, klq))) & + * exp(ExpWa2 * (unun / WatIce - unun / W2xyz5(il, klq))) + ! +... Saturation Vapor Specific Concentration over Water + ! + (even for temperatures less than freezing point) + qvsw2D(il, klq) = max(eps9, .622d0 * W2xyz7(il, klq) & + / (W2xyz6(il, klq) - .378d0 * W2xyz7(il, klq))) + + ! +--Water Phase Discriminator + ! + ========================= + ! +... W2xyz7(il,klq) = 1 if Tair > 273.16 + ! + 0 if Tair < 273.16 + W2xyz7(il, klq) = max(zero, sign(unun, W2xyz5(il, klq) - WatIce)) + + ! +--Saturation Vapor Specific Concentration over Ice + ! + ================================================ + ! + + qvsi2D(il, klq) = max(eps9, qvsw2D(il, klq) * W2xyz7(il, klq) & + + W2xyz8(il, klq) * (unun - W2xyz7(il, klq))) + + ! +--Work Area Reset + ! + =============== + W2xyz5(il, klq) = 0.0 + W2xyz6(il, klq) = 0.0 + W2xyz7(il, klq) = 0.0 + W2xyz8(il, klq) = 0.0 + enddo + enddo + + return +endsubroutine qsat2D diff --git a/MAR/code_mar/qsat3d.f90 b/MAR/code_mar/qsat3d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..90d53bbc810644852cbaa69e14bfcea6ad973612 --- /dev/null +++ b/MAR/code_mar/qsat3d.f90 @@ -0,0 +1,104 @@ +subroutine qsat3d + ! +------------------------------------------------------------------------+ + ! | MAR PHYSICS Mc 30-05-2007 MAR | + ! | subroutine qsat3d computes the Saturation Specific Humidity (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : TairSL: Surface Air Temperature (K) | + ! | ^^^^^^^ TairDY: Air Temperature (K) | + ! | pstDY: Model Pressure Thickness (kPa) | + ! | | + ! | OUTPUT : qvswDY: Saturation Specific Humidity over Water (kg/kg) | + ! | ^^^^^^^ qvsiDY: Saturation Specific Humidity over Ice (kg/kg) | + ! | | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd, only: sigma + use mar_dy, only: pstDY, ptopDY, tairDY, qvswDY, qvsiDY + use mar_sl, only: TairSL + use mar_wk, only: WKxyz5, WKxyz6, WKxyz7, WKxyz8 + + implicit none + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + real WatIce, ExpWat, ExpWa2, ExpIce + + ! +--DATA + ! + ==== + data WatIce/273.16e0/ + data ExpWat/5.138e0/ + data ExpWa2/6827.e0/ + data ExpIce/6150.e0/ + + ! +--Temperature (K) and Pressure (hPa) + ! + ================================== + + !$OMP PARALLEL do default(shared) private(i,j,k) + do j = 1, my + do k = 1, mz + ! do j=1,my + do i = 1, mx + WKxyz5(i, j, k) = tairDY(i, j, k) + WKxyz6(i, j, k) = (pstDY(i, j) * sigma(k) + ptopDY) * 10.0d0 + enddo + ! end do + enddo + + ! do j=1,my + do i = 1, mx + WKxyz5(i, j, mzz) = TairSL(i, j) + WKxyz6(i, j, mzz) = (pstDY(i, j) + ptopDY) * 10.0d0 + enddo + ! end do + + ! +--Saturation Vapor Pressure over Ice + ! + ================================== + do k = 1, mzz + ! do j=1,my + do i = 1, mx + WKxyz7(i, j, k) = 6.1070d0 * exp(ExpIce * (unun / WatIce - unun / WKxyz5(i, j, k))) + ! +... Dudhia (1989) JAS, (B1) and (B2) p.3103 + + WKxyz8(i, j, k) = .622d0 * WKxyz7(i, j, k) / (WKxyz6(i, j, k) - .378d0 * WKxyz7(i, j, k)) + + ! +--Saturation Vapor Pressure over Water + ! + ==================================== + WKxyz7(i, j, k) = 6.1078d0 * exp(ExpWat * log(WatIce / WKxyz5(i, j, k))) & + * exp(ExpWa2 * (unun / WatIce - unun / WKxyz5(i, j, k))) + ! +... Dudhia (1989) JAS, (B1) and (B2) p.3103 + ! + See also Pielke (1984), p.234 and Stull (1988), p.276 + + qvswDY(i, j, k) = max(eps9, .622d0 * WKxyz7(i, j, k) & + / (WKxyz6(i, j, k) - .378d0 * WKxyz7(i, j, k))) + ! +... Saturation Vapor Specific Concentration over Water + ! + (even for temperatures less than freezing point) + + ! +--Water Phase Discriminator + ! + ========================= + WKxyz7(i, j, k) = max(zero, sign(unun, WKxyz5(i, j, k) - WatIce)) + ! +... WKxyz7(i,j,k) = 1 if Tair > 273.16 + ! + 0 if Tair < 273.16 + + ! +--Saturation Vapor Specific Concentration over Ice + ! + ================================================ + qvsiDY(i, j, k) = max(eps9, qvswDY(i, j, k) * WKxyz7(i, j, k) & + + WKxyz8(i, j, k) * (unun - WKxyz7(i, j, k))) + + ! +--Work Area Reset + ! + =============== + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +end diff --git a/MAR/code_mar/qse_0d.f90 b/MAR/code_mar/qse_0d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..064bda4712f808c694c0797c783418944220c81e --- /dev/null +++ b/MAR/code_mar/qse_0d.f90 @@ -0,0 +1,77 @@ +function qse_0D(tt, sigma, ps, ptop) + + !--------------------------------------------------------------------------+ + ! Tue 30-Jun-2009 | + ! fonction qse_0D computes ECMWF saturation specific humidities | + ! | + !--------------------------------------------------------------------------+ + + implicit none + + real ps, sigma, ptop, foeew, zcor + real tt, pp, qswT + real rkbol, rnavo, r, rmd, rmv + real rd, rv, restt, r2es, r3les + real r3ies, r4les, r4ies, retv, rtt + real qse_0D + + data rkbol/1.380658e-23/ + data rnavo/6.0221367e+23/ + data rmd/28.9644/ + data rmv/18.0153/ + data restt/611.21/ + data r3les/17.502/ + data r3ies/22.587/ + data r4les/32.19/ + data r4ies/-0.7/ + data rtt/273.16/ + + r = rnavo * rkbol + rd = 1000.*r / rmd + rv = 1000.*r / rmv + r2es = restt * rd / rv + retv = rv / rd - 1 + + pp = ps * sigma + ptop + + foeew = r2es * exp((r3les * (tt - rtt)) / (tt - r4les)) + + qswT = foeew / (1000.*pp) + zcor = 1./(1.-retv * qswT) + qswT = qswT * zcor + + qse_0D = qswT + + ! FROM ECMWF + ! ---------- + ! # + ! # computes qsat for water , USAGE qsat T P + ! # + ! set -e + ! if [ $1 ] ; then + ! dummy=0 + ! else + ! echo "computes qsat for water; USAGE: qsat T P " >&2 ; exit 2 + ! fi + ! if [ $2 ] ; then + ! dummy=0 + ! else + ! echo "computes qsat for water; USAGE: qsat T P " >&2 ; exit 2 + ! fi + ! echo $1 $2 | awk 'BEGIN { \ + ! rkbol=1.380658e-23; rnavo=6.0221367e+23; r=rnavo*rkbol; \ + ! rmd=28.9644; rmv=18.0153; rd=1000.*r/rmd; rv=1000.*r/rmv; \ + ! restt=611.21; r2es=restt*rd/rv; r3les=17.502; r3ies=22.587; \ + ! r4les=32.19; r4ies=-0.7; + ! retv=rv/rd-1; rtt=273.16} + ! {t=$1; p=$2; \ + ! foeew=r2es*exp((r3les*(t-rtt))/(t-r4les)) ; \ + ! qs=foeew/p ; zcor=1/(1-retv*qs);qs=qs*zcor ; print qs}' + ! # + ! # computes satration water vapor pressure over water as in the IFS + ! # usage: qsat T P ! T in K and P in Pa e.g. qsat 293 1e5 + ! # + + RETURN + +END diff --git a/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.f.gz b/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.f.gz new file mode 100644 index 0000000000000000000000000000000000000000..43837b055d1992bf58d13601818e45a2ae9ba02c Binary files /dev/null and b/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.f.gz differ diff --git a/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.x.gz b/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.x.gz new file mode 100644 index 0000000000000000000000000000000000000000..2b023836a623ad9282f6613394ad86370e577856 Binary files /dev/null and b/MAR/code_mar/radCEP.d/PHYradDRIV.d/PHYradDRIV.x.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/PHYrad2CEP.F90.radaca.write.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/PHYrad2CEP.F90.radaca.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..8798d429c0dbc2be3028c1f6c2e729e690d71f22 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/PHYrad2CEP.F90.radaca.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/_.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/_.gz new file mode 100644 index 0000000000000000000000000000000000000000..b04d5a157ca9e6e6df37a689a0931ef4bb80fa96 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/_.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90-NOT-CORRECT-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90-NOT-CORRECT-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..6546b07987ea69bc09175195c9c0602b1233e5f6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90-NOT-CORRECT-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e2a8c67a6143560001e39683f154fd60562efc59 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/col2box.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/legtri.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/legtri.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e24964eb84f36c34ce6b5b011af326a28e03859 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/legtri.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/qsat.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/qsat.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e5d6354a908aacd8688ea9758d9c33bd40a6e051 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/qsat.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90-NOT-CORRECT-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90-NOT-CORRECT-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..ed48dc71092beca278ba8e08717215c75cc5270e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90-NOT-CORRECT-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d8baec71842336b81d83e07b7fdc3dd8f9ad8505 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.write.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..313e3f62ae18496dc41319020a354a52c82735c8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radaca.F90.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90-BAK.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90-BAK.gz new file mode 100644 index 0000000000000000000000000000000000000000..158f87a3e8fc6db694204aef2c176bee2c2c0c72 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90-BAK.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.Original.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.Original.gz new file mode 100644 index 0000000000000000000000000000000000000000..803e5f44a37acd9ec9d7ddcf8b9f04c1d0b1de1c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.Original.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..66d185003ae3f1a67f4e3191f715e5da10a8bc2a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radlsw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/Divers.d/radozc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radozc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6e6c570ba66bb165d6da619a3ee76444f5b4433c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/Divers.d/radozc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/PHYrad2CEP.F90.gz b/MAR/code_mar/radCEP.d/Source.d/PHYrad2CEP.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..26a66ff179406e5c535938cad6d61572e1969b0c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/PHYrad2CEP.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/StandA.F90.gz b/MAR/code_mar/radCEP.d/Source.d/StandA.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5c4c3802f6532a7f0f5b154bb8b3656f017914d4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/StandA.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2452bb548cdb7c598dbb72f6388f596c2ca2c0fe Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90-ERROR-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90-ERROR-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..37c73b3b5e5618735896a9373abcfedbe1a83dd3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90-ERROR-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c43ea73f6f3a0f01131b719cf4cf5839a236f32d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwb.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwbv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwbv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..93b4f01052e3ef4fc4d6b206fb6f55111955aecf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwbv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9fb802e12f13998001783d7695489451fd603089 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwtt.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwtt.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c3bf23ad841cdcc3a4ad982388662e75901f9bcf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwtt.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwttm.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwttm.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..772d8449d446702501b58baa40ea4a8c82a44690 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwttm.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwu.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b08e90d5aab6c18e8d1233a4bfdf7afddd7001c6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a7b3c3ae9e343dfc53d1a84d1f086e7257c6608 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvb.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvb.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba0b9a16ce315e021405eb32d7e9df28a4d20bd6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvb.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvd.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..19b7d015aa7fdbba072f0439b07e0735e12156e9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2e271eabb4f93b588c9c7ec1ae950eee8ac87e8d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/lw____.d/lwvn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6324424cc357d869118edcb792754138a8781974 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90-ERROR-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90-ERROR-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..534ef4a19b7bd8e7a4150a50df7914d8819a9345 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90-ERROR-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bb49533fe62529b5b53dbd1d9d2032b47a2b4990 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwb.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwbv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwbv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9cfca8055c650d4b096798afb7fe297eb3576b1b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwbv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..78a406aabdef4107b1a84595b7804b3de940f366 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwtt.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwtt.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b5bebc51ed21cdc631f75104658637fb7ce081fe Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwtt.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwttm.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwttm.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5de039bf5ce72a9a5a144466039843b9216d3f4f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwttm.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bed90cc6ce0dbe5df057088696c4e34045283d9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.original.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.original.gz new file mode 100644 index 0000000000000000000000000000000000000000..a91d8d3f97016e3d7e96e09e99bfce7cc6015481 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwu.F90.original.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..02e242f1d892bc22a41a14da04964ddb5850fec6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.original.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.original.gz new file mode 100644 index 0000000000000000000000000000000000000000..44972b1aeffdff428150932b45c1deb339ed30f6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwv.F90.original.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvb.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvb.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ba4254d0d573586555e0e3d53755f880ac405d9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvb.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvd.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..78b554194ea25b232d11a48969d8a949ecacd4e7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a950567354497c17bd6d67d1f6250468b5b490b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/olw___.d/olwvn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e0444adadbc797a4fa28240dbce30336b7b1252 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4080967a56f5b1e301828071a4728195668f3d04 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3d363063ad5e64f812a5584f6daf7af10f8fd56b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a6ab12212c94ef1eca8617e5dc53e39b374df9be Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c03b22e840c3cd0ffbfb852688a5c06a1b54af8e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e051883ed0ad8a359957579cb73ad1212530b24 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b5c17b122b6643b04cb2b799b64283d678100c50 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..862a278bb3960d57111f17cf3cb150ef357d1ac8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1f2eec8030732582edd39824afee9289eb5234a0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5c492513a02428779dd937abba4aa1c0b4d1245b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..711357aa278cb0f6472415f208c1580c491db663 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..668fd808709fd77230bd72871766d1babd9321d7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fcf423cc1beffa30cf85197b4a8991605eed8c0a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8aedeaab4c2eca6b1bbd8267ce7459407e0fb29f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0617d4de4181bfbe8721742fafb53d92a99fc584 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..36461150d224ee42a16bfd2bf0504c4d6e36622a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_cmbgb9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..b478d2286063dc2585797df3dbf1864ebe9e355b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..921514dff86126e0e75974cd0778eb01c926db3e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_ecrt_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_gasabs1a_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_gasabs1a_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c432494e67bafcf27d30237210fc0a1a1d63e454 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_gasabs1a_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_init_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_init_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..04b1c8a7d910535fc6e71b8a9ad125036ace21ec Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_init_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf3e10db2cbf437059ed30739847a2e0ba71a3bf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..69221b1ab28e60cd72fcf63d66c4703baea3e2c7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fdd0f2be7701cecbde7f60cb1716c6547b33d722 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..21be69f5c6659fa7d436b49720e289a4a28afd18 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..23c92023a8b86459bdb2e7171a6d9afee880f533 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..55c49d44cdcf6a6ab86c5615e8d25c118b97f9cf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1cd2f9475ee12a8d25f30557d5958b6e2ce4d4f4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5cec7a4cf79c56ad6d553a622c85007116ba0c89 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f46f8bbb9aae6bb1063665459d5990294d322eb0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ea77217c8252b7a3fa7c57b7dd58cbc517000951 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..da9f8d8131f24e82017ae308bfc16903d499146e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..715d8a83ccfc26c135ea2017a5dce968f141583c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb3.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1dce3169f2c7560f33b29ff54c23a1feb1b6e975 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..75255083da73d22bc1310b30fef3283ad6b83e5f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..525525e1c1ac358296e88fadbe2c6c0f90896b4e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb4.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..af147af9b08d296e3fc858f8373b5b9c4a6f0a5e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..81d426dbdf36d6995ffc232e9439824cc639aa4c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..1863fe06dbd0899fa19c4e687b7d01e67e69e9f4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb5.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d7480fafb735266bbea61ae3979e8c7312860b04 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e1732b7cf3583e9d56e9a1cf2cdfbb7a35001a1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..72299d9f267ec128a28e81111b2302c719f43a25 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..54a48b81f9a8b0ec9c47a47c984ff2e104afdfc9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_kgb9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rrtm_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rrtm_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee4ee074a218bee88839d984a0db4cfecdbd80d4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rrtm_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..65d0e803501c7989df85cba64d5533a51cf8546d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba76bb0cd00e2ce1225bc1d41db95f37ea3ef93d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_rtrn1a_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_setcoef_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_setcoef_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ddf8bec092dc18701ea93c880a35c7c536155a8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_setcoef_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a56c8988c2dc1e8f19e60a2fafa5703ff81272e7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..00ff52250602f7758c38e17038030df37e482a4f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1aaa27bd30ad2ad2b575ae83d7f1f31f1dfaf680 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..54e4369bb6a4ebcf5ce6b5e352172ee2f6fe4e39 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..aad4e6a533a7c9a5190302a79d84c5ee26e36e23 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2c2fdfe411890bd1aa0c9c2b83437fa0b171ecd3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ef3c5a4b6a749929cc3e821762c57a137bcc951d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c4fb702ee821fb96de51819b4f75ca6454b6ff66 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.OLD.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.OLD.gz new file mode 100644 index 0000000000000000000000000000000000000000..8cbf3a590efaf0d823fc08f578175dee449db98e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.OLD.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4e85577e52e801cf8192526ab481d75af66b99d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1aedb4ad4ace7d8978aa05dd6a81e5c74d2dbbe9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5248c1af763c0dcb65770da608b9e8ad7ddb8697 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bde9363a01807860bf0a0eaf7b87a3ef8374b73a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..48bd613c3f941ce08680596f25f58f4c59a2041a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f981247cebaad89cb11d7ec3030401882308b541 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..09cab3f798bc655d7bc15975c39163eb06f68bf4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..617d8ae8bb3727225fd0eeca68eabee63e1a929e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d.NOsplit/rrtm_taumol9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..930d37352969009ce86ed19bb458b67fda169548 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..befae2317dfb3e5900e891ab99d5afc5ec923e03 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f130e2f5a784349cd7eb2cac51dfdead20dffd4d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..96574c83c24421f9f9acb96e828de6b700287ae0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d39f727cc166bbd5cd9827bd69c2929471f54b03 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..030f1498ceac2c855e6e7341260e1086f5e51289 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..14b22b6f1494d1a7a9f9caa23ea929df4bc2b5de Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2124008c2a276bd16dcb0c7d33158afc92567779 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..66f930027c90ee077efb97a6bb6968f35412f8ed Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..edeccbd1b33e168a8800b86f6d17fba70a9e849e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc3cc2671010fa7cf4477d24c0e828ac582a5fdd Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..eeedc73f596f2c3d06ac4769d1746e826e6b5c2e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ccbd820bcc76a9bbc3605d30184cfdcc12b7df90 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..be821ac1f0aaa4b9927f0bd8407108f7355dccd4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8f1f64755095095f4182d90f28f7022a369e5648 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4cfd1f3f12d534f25abd555e824ebd4eb9c8de99 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_cmbgb9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..b478d2286063dc2585797df3dbf1864ebe9e355b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..921514dff86126e0e75974cd0778eb01c926db3e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.write.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..f303b87524e4350b41cb8c193d7c8786cda537fc Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_ecrt_140gp.F90.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c432494e67bafcf27d30237210fc0a1a1d63e454 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.write.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..8617c70f5ad51f91297b88dc1ff67f469501c3a8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_gasabs1a_140gp.F90.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..04b1c8a7d910535fc6e71b8a9ad125036ace21ec Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.write.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..2fca3d0a202b0a8f0f00e742647b2f999ea83140 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_init_140gp.F90.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..cb58b1308020b68d0747de080c9c1793408d6ecf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a21fdc85b3670e049089039be46aa0968a0e0509 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..a13b05049d5aa403cc88c13de8e60f042f3e56b0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..69221b1ab28e60cd72fcf63d66c4703baea3e2c7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..293d43e2db93b6e49212dd84eaadee1d9c4ebde2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fdd0f2be7701cecbde7f60cb1716c6547b33d722 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..773b78d386d099e660e9d5c5d93a1b6c70c017af Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..41ca7d04506ab9a24757c652d858d78edde11f6b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d36e5670987ab43044b66716e120daa113c5f2ee Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3d16b89b84d94ede82f02188265322f4e4b58021 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..707a8f1b5106f0bcf669462a281e092aaa79fc51 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb12_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..905fa68158c0349dc103d29e68f4e8fbaa407d17 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f437ba1991e7d445e52889a796c34d3d24c017bd Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..43fd38cdd0edc06576c844341fbeebfed2937928 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e9a576fd9a90b69ab3ff2905c8aec61785d73208 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..92ee6c940996f2eed7e01804719f1501c1758f74 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb13_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..05f18244ccce7b41e81f8f5f40d4a3306a75e3a1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..55c49d44cdcf6a6ab86c5615e8d25c118b97f9cf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..19167a041ef7e4ea7bb3af17918e062f9f71b4a8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3528ef01ff7649024d27f507fe4f64ef19bfaeda Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..843c9254390cd9d5c7bc5829c87ce33856608f41 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d27a47d477076ded966b2221662ee243c9edb1b7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5b65f4cf91fed2ebc9bc45180f98b22fb936da20 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb15_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..f14f926f27afb892021f49fcf0fa1ad29060e07a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5b065fbbb7eecfdb61e13a8b71e1953b0c1bee69 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5fcc890888e95fa3383aa7eb3abebe5ec7731c86 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f364029bd9e69d9c9c841e193785bbbf00d03814 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..05c70e2135ad08ab9c44992b27e1d202fdedf8aa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb16_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fcd83442529c6bd86d0db1e71c6576015b3138e7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ec015db1ebea2fdce62e6036f3a931227412cdc4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb1_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..94284619095c3d6c9aa94859c44fae04592abe2a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..65c25a78c34314e29d7d9274c45ec92beede0fc5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..10625ad5b7efed8e527c4d1892afc19338aef5a5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c046558f0ff66f911b57d4986a0342c7a5b69bb1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb2_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..e73f27db9b613facd821e156e615941f584b39bc Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a4d7caa06f4ce39a327d2ee9f90941aff1745d20 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..da9f8d8131f24e82017ae308bfc16903d499146e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..715d8a83ccfc26c135ea2017a5dce968f141583c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..76277542e144fa4594379faeab5b6ab5dafc35a3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4d77aa3f61f9aec14adc1cb3d7c0a0c197c6ffe5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..733012de2e0f98222b94bd1670f4e9bf7c280878 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ed493473b037f42e71c168b55410c9c64e8acb83 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c49eca86cd38d325c1f13e0e22171226ec00d3bb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2ef555d2333ad4ab9019344b155f536ad605cb84 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..badbcef93a46c8ec0e86b8307dda6a3c39326bcd Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb3_B4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..d89b215b0f18388af11b37758862543cdf1cea6c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b5e0a9c488d763f280976aac54adeb4a20b8bafa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..75255083da73d22bc1310b30fef3283ad6b83e5f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..525525e1c1ac358296e88fadbe2c6c0f90896b4e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..142297c645f3029d286ba6924bd6517a7c35fa44 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3c46b9c36221ea6d294384f7f502cc050d10baef Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..700a37964f01fba9fc411baa74357fa493858b38 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..308415cb363a2dd436ac22c161214bd5b400153e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f2c2eb6f24fde9cc8bb9ab2acf210eb335f63735 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fa97d718b8bab6ae162f371da351242bea220000 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..03331afcc4fd498112c055b0b294f32bace6302e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb4_B4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..793803e8e836a5d3d91c64f6aa6835bca6615941 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2baf4389a6ed35a233340ed9f0ff03c49a98e4cd Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-f90DB.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-f90DB.gz new file mode 100644 index 0000000000000000000000000000000000000000..81d426dbdf36d6995ffc232e9439824cc639aa4c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-f90DB.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-ifcP3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-ifcP3.gz new file mode 100644 index 0000000000000000000000000000000000000000..1863fe06dbd0899fa19c4e687b7d01e67e69e9f4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5.o-ifcP3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f75e60d21b9ac81251091433640199b3e28a5da0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..319956bf681b66705b93abe549b1885dc00afbf7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..19a8916758a9c4bbbc8a8ac4bca4e00e67dd4496 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c814e8f9bee8d6806adfaedd30ebfe67b2a9e18 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..96bc4dfbf2933dc363e8366a20dbc40cdc4d7565 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7c75a5293e7aead26fc7905e84e9dc2116174bc5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..17b8d8c127537f1c04efe7e07c6db608502c766a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb5_B4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d7480fafb735266bbea61ae3979e8c7312860b04 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..4e8bea71375231ef3c465e620ae0d08da26f9a34 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f2773c291f43080ea5ad5e98f965c32f222d39e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c466035c5a7b6dc331cf7df8929f14f12fed6df Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9af6e0277e83cfe611a733d2ed5b9c10bcaec2b4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e30d8e27def2e853b42e31510deea8cd50962eba Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_BB.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_BB.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a29dc0f4e905e4c4baf7a9263e45a69299838b1a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb7_BB.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..127763942835191424e0a87d5eb9143a07e9f5eb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..72299d9f267ec128a28e81111b2302c719f43a25 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..fff0b413e3b13efc45d97fca5d09c4abc02f0eea Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c1aea8ee8f72815a95d17d769b2e6f7f7a78c28 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_00.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_00.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd32ccf8a825e95b1ca88bba37ecb079b2fd8dff Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_00.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7035e7a25c4a39fcf5dff15840af3b07bbb375ac Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..08999648146b190e171005bfa5e6ec0b5a335376 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_A2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_BB.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_BB.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..04f4b5e76d1222d5a8086e45bc4343e2b88ab8f7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_kgb9_BB.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rrtm_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rrtm_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d779fcc0d6ebab3972c728bf6d55c9c7e4b7e406 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rrtm_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..65d0e803501c7989df85cba64d5533a51cf8546d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba76bb0cd00e2ce1225bc1d41db95f37ea3ef93d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.write.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.write.gz new file mode 100644 index 0000000000000000000000000000000000000000..34cfc629fd95483eba200f582fbf1e3d3341e2b5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_rtrn1a_140gp.F90.write.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_setcoef_140gp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_setcoef_140gp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ddf8bec092dc18701ea93c880a35c7c536155a8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_setcoef_140gp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..254d84d7ae1c3a99f65f00ec2ecaf6198b90837b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..611eea3caad18832bc7c53498621289935acb5de Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..66f7bec9bb9c48bf5193741641bd5d3b75269e08 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b8a81326fb0bed59a5d6ca71ada969c4e4097c6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a15a356e40c4df6db0197113054c371723a7f519 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..143bbdfc421c26b07ec10bba9ed6d03971aec97a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..05545efd4d6ad3ab60bf94daa845692e5eab8212 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ca146044295f91c98d386df3fc2390a51d1dc068 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90-ERROR-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90-ERROR-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..ca14ef55a7818e2e5732a1d3262d6529508f90ae Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90-ERROR-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.OLD.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.OLD.gz new file mode 100644 index 0000000000000000000000000000000000000000..8cbf3a590efaf0d823fc08f578175dee449db98e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.OLD.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a79921dc87c9751487601c55be149a7d9f3b3d24 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e22b3a070faa4c28c412e1f909b287167f221ae5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.ABSA3.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.ABSA3.gz new file mode 100644 index 0000000000000000000000000000000000000000..b63bb609c40799e28b62a359f736bb2632b89f41 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.ABSA3.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.NoDebug.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.NoDebug.gz new file mode 100644 index 0000000000000000000000000000000000000000..354779d6e9d1f2633a316e12a6fcfa09b35328aa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol3.F90.write.NoDebug.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..398a3d2b87febc6706e9b524d1ab031b7a2f2d13 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1151d6c2e5d932579e9552f2bf45215415faef22 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4e9ca71f480a30bcf4d6e42e6a4396b6e86191ed Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2021e67b908061e22792ed48325ab548fd6b72ce Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f044a5973c3fe12da5cf95767ee15e70e7f5a131 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0c519d1eec904a1e6fa597daad8017c32633a262 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/rrtm_taumol9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d198a461d61e4194ee0d79725c7617a062f3547f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9a1e5816add83ae012ec4b489b15c512509bce67 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..069705ee164b4513c2aadb45342abe7369200a10 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cef942aafaba3f738e28b360c092afe2e2a28110 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta13.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..385f2f83a95f65ead6ab488985f4a2466d8a2f3c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta14.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0de3ea3f63fab32194648a0bb09f761743ba7f41 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta15.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..96ed714fa6a294034393117ba6ba52c493a18d5d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta16.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..988f6b88a72c3ad9cc261707a6a5aee0b9d9d0e4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta2.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4f58c27a5af04478c59b46a6c447915ae70bfa0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..313c570daa3acd3a2683d5b3c92bb9ca0405da4e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta4.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e42752b4571f04dfefcfcbde107dd92ae4d4b1ac Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta5.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..af04585308480a7153df10515c438cf44faa58ed Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta6.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2234df324990d64d3568914d09d6b6120271a142 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta7.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d83012236878841a181c814d545b61218488c5c0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta8.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9567874d02c33339315c97cb06e6f9419d1fdcaf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta9.F90.gz b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8195e5928befe40e8d1cc4bf7428f14c22f24e58 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/rrtm__.d/yoerrta9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerh.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerh.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b1c9b4465e079110d29d0a186da962781fa95fa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerh.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerl.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerl.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..304a35650d7187aa834205da01f0f21bca07e68e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerl.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaersn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaersn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..88212f1aeef26216797befe69110df11d6760429 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaersn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..993576583287d70e379ce0f64df8a3812d7fc7f6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suaerv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucld.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucld.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..32dec68049e478e7aae46cc7b30e6ecca64d5540 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucld.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucldp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucldp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..418b8f7fb1c9a6d56d6993a19a59b1d07960bee0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucldp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclop.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclop.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..22a633675137d5b3fcabde2e201a378d3a9982cb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclop.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclopn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclopn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b5be7fb3b9d68f68e6e216f08e703e25ca8d474c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suclopn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucst.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..82bdf918ac02192c220de9119f2be9cd91788ce1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sucst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaebc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaebc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..49f724cd1399bd570f57fcd00e99e2f3af2c0253 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaebc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaec.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaec.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..91e41dac879eae7487ccbc97b09a3a3afa575b6e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaec.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaeor.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaeor.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..39d7b00540992f3803a2a3d3ebe2fca72d2692de Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaeor.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesd.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee0bcb1a99b90dcaa9afc4a2f21bcf6382b2f360 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaess.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaess.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4489a7bb4a684149ff0ad643ad13f2c468a0190 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaess.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesu.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c7f22656fa3acfbc3c2cd58c2431757be872925e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecaesu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bde7273ce35db4406ec02396940211579f2e14ff Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozo.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozo.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2236f428dfe0182921d4b34e4cfc847ecea228a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suecozo.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c7cd25b3baa2b717a70ffd2ac5663a61ee0ca7c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulwn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..65a4557b6df82894a4817512ad80cd0d882b9a1d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/sulwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suolwn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suolwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..93d94b864c555b90af91addd4bb77e0f5e4dc72d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suolwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9eb7689c598279cd76cb0c99ca7472558f5bd162 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.original.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.original.gz new file mode 100644 index 0000000000000000000000000000000000000000..6cdec8b9c50062f89137dc268f3dc1797c890989 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suovlp.F90.original.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..51368e90d5a1ba88efdf12ef9f889b7614b875b8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_1990.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_1990.gz new file mode 100644 index 0000000000000000000000000000000000000000..0d44adafba37960aba91ca9713b5324faeb8864d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_1990.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_2090.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_2090.gz new file mode 100644 index 0000000000000000000000000000000000000000..ab7d3617571fa11e23a83e647fad665609b4a0e2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surdi.F90_2090.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtab.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtab.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a190028dbe1936020d773ea21672b70d785491b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtab.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtftr.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtftr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae1c46aba30b87a6913dec6d59d27c2eea9d9133 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtftr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtpk.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtpk.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c1d0812434eda42321c83c9f2dbafe6f6b567a45 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtpk.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtrf.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtrf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f83294232f47ffb546364a5e5161bfe29d5d2ef Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/surrtrf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/susw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/susw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a1556898573209b4cffa37e387fa3e5d249d780d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/susw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suswn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suswn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..09329043b18d37d3baf1ba7070fd84ce63553879 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d.NOsplit/suswn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerh.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerh.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b1c9b4465e079110d29d0a186da962781fa95fa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerh.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerl.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerl.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..304a35650d7187aa834205da01f0f21bca07e68e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerl.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suaersn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaersn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..88212f1aeef26216797befe69110df11d6760429 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaersn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerv.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerv.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..993576583287d70e379ce0f64df8a3812d7fc7f6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suaerv.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/sucld.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucld.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..32dec68049e478e7aae46cc7b30e6ecca64d5540 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucld.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/sucldp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucldp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..418b8f7fb1c9a6d56d6993a19a59b1d07960bee0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucldp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suclop.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suclop.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..22a633675137d5b3fcabde2e201a378d3a9982cb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suclop.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suclopn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suclopn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b5be7fb3b9d68f68e6e216f08e703e25ca8d474c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suclopn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/sucst.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..48c09a951f039df14cf9b55410d8bd3ba4be01c4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/sucst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..2f161dd54e89a288964044272e9132ac529132d6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..95b03d532147a70b9f473d06b9b8c98ba7f1d473 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d1d1ffb054154a28c367c7574615ce2b5fd933b0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1cd43809ecf2b59837e2c0851f371d2b51154b66 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_03.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_03.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..81a0a8f235f3b1ad77bb57c9fa438e5935fd01bb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_03.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_04.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_04.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4879ead6a77c8e90d55925c658ea72c1e6bc4d8e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_04.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_05.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_05.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd0234cf319135cd5d74f5516dc8bbf70d9a5efb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_05.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_06.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_06.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8973ac32f9e89e5d1916ae219472018043fd6e3a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_06.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_07.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_07.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d62a21681a1b88527e2c28a79cffeb5e3567cc7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_07.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_08.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_08.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..eb102e5937c69a2ffa0e9bd2a66bf4b824746a57 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_08.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_09.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_09.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1a8cc41dd48e0ffd7571b7d04103f124ba35af03 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_09.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cca5b485c3f1ccf560f1753f63a3c187b36827cf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a8b5a5c722ec325e3c0bdc1dfecfbfc64f171bb Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..de249e9aba739e2f82c9600479b1f54833cdd9f5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaebc_12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..e2841cc478917aebe9ad70474baba1bbcc967e63 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6d480240309117482b542becc7f10ce6658eeee0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaec.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..12dc4228f1225d4b82a0dc4c8babf482c4d3b681 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..73a8eb845af490d931feecb9c4b16e2c5de3f2b0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..46ac99f1ff1e7b163a776998922682195f624e34 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..704cdb8308d8f79625c92c2c969cb2aa32aab5dc Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_03.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_03.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d01537f94d9fd0162263f1d2de861adf81443f62 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_03.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_04.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_04.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d2b74d6f09913e65ce782e90188c55eb96b9f2c4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_04.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_05.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_05.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1bf86258dd1c1b3d88fe8ce2df6eee0346306906 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_05.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_06.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_06.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d980f98f81dc29887e2d99e7f58efc4b131e14a2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_06.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_07.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_07.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f59c61f0818ab3e61687274923b350d45e22e278 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_07.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_08.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_08.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..728f93fc7d20b3cbee0d4765a9a2eb7c840ae84c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_08.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_09.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_09.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7fa8ecaa4fcc996749e21cb4e4e4f1b374d963b1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_09.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3afe506a9a93c17b3422f7ebf2e7d2ce23acbc9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c98fede01a6c7eefcaa0f719831236b93e880920 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b43f3c4fb288e3c0b2d2f798012a733ea3238e7c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaeor_12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..af06d39a5a4dbbefeb5a3fe0c49b63908722e333 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a0ad8d021d9544517867645c28f4c9443d79764 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fb4e41a76e68cafd9a46a37d9d17e8397fb1d63f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..55b9f35e37b46da04e1f05f16eb786a0e3b1bb5a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_03.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_03.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..488ed7e52964d42fc6c3abad3e2a1a0f4fcdf856 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_03.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_04.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_04.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4391d8cf7bce5092a7a07f6f21ebbf7475408cd8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_04.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_05.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_05.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..33d62202f0651474587d6f17408b988c0e1d90dc Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_05.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_06.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_06.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9d71f952c592694e22ecaf002d116e6ecbfa8f0e Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_06.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_07.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_07.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..40b955dbefbf1ef20abe072e1c14d5ce2d39ae64 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_07.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_08.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_08.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6bb474205f046b4a3ffe2e1b05c218dc5a69d758 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_08.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_09.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_09.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1031f35eecd1dd22a7f1f0fd488ba02c6a9e2833 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_09.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e2a071565ad21b13ee10e21a8a1b8684523223f6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..be32768a9a851e509b69a6c2e2607abc89b3c1a9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..97894bd66684fd90c9c1e04156b827d441083808 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesd_12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..d91ed6b5a6913c52467a852cc4d252dbb822399a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bde1a89c660e9084216bee37c832bbe39438726 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9e933ba8ba51a28ee974ba769cc2da02f21f67c5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..257fa80b751edcd626c84715cc8163410f22deff Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_03.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_03.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7fdb8687c0b18d3417c3425327b8a06a509e6a91 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_03.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_04.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_04.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e59560000651add376ee353a19780f708ade2a8a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_04.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_05.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_05.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf588f4d8a6884d8582c4896b64bb106ce10064d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_05.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_06.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_06.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..45d805e137de6036dfacdf1e98286a50975013ad Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_06.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_07.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_07.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..12b2efa88fe0a9f8a69f984adab8741a7c6bfdaa Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_07.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_08.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_08.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e506adac3c86965d835999a7337b2cdb6984ba5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_08.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_09.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_09.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..78376773dadeb947d034f92d2966b92407560426 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_09.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa094b29e6aec609a9d3df29653a11822f8f480a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9735238e0ea0bd83deb1a3c85d80b70448ff1b32 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4a811f0e4d4767dcdd9f35c73e0944dd7ebfe0e5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaess_12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..7bca3ee77850ba9922cbd995cee97c3e28f1d5d7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..226c8d1b31255e27a672dd821496fd13781c6e74 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_01.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_01.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..589e95235629b7f2b4478d9247b8cf44f8f74c2b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_01.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_02.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_02.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3b8b4ae038363156fdc10967e4c22bec50fcb365 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_02.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_03.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_03.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5488301a5ed50724853478c8c52312a7ad75d211 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_03.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_04.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_04.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9f043860c6fc8d57592167fb7729ef1a55e09b77 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_04.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_05.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_05.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..774f64493820ef2b3ac9af71cae05fda6c446f6f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_05.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_06.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_06.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e20f53e731bad8483971b0f6df36bf32cbcd858 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_06.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_07.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_07.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..04b079837b7c95c9b2253ae253c9390d106e7e54 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_07.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_08.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_08.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c011149a47c712f734ea51ea9aba26f2de01ef01 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_08.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_09.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_09.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e495ae48a2d27deb5df8c14377ed64114404d67d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_09.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_10.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e3267cf172537a575c6e1c047eb10ddd7af34ac7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_11.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ec41b8e126a52cd80a591b4b1a5400f9d1647db9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_12.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a8159ea9aa5d8654506a775e478eb0bd257a66a4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecaesu_12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90-to-split.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90-to-split.gz new file mode 100644 index 0000000000000000000000000000000000000000..25a18a16d4688752e8f6e87c78c89c3f7e02d1f0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90-to-split.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bde7273ce35db4406ec02396940211579f2e14ff Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozo.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozo.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2236f428dfe0182921d4b34e4cfc847ecea228a Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suecozo.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/sulw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/sulw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c7cd25b3baa2b717a70ffd2ac5663a61ee0ca7c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/sulw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/sulwn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/sulwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..65a4557b6df82894a4817512ad80cd0d882b9a1d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/sulwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suolwn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suolwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..93d94b864c555b90af91addd4bb77e0f5e4dc72d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suolwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9eb7689c598279cd76cb0c99ca7472558f5bd162 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.original.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.original.gz new file mode 100644 index 0000000000000000000000000000000000000000..6cdec8b9c50062f89137dc268f3dc1797c890989 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suovlp.F90.original.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/surdi.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/surdi.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8bbe8e754ec7ccce26b4f9ed83f8f77a43ae0c3f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/surdi.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtab.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtab.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a190028dbe1936020d773ea21672b70d785491b Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtab.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtftr.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtftr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae1c46aba30b87a6913dec6d59d27c2eea9d9133 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtftr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtpk.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtpk.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c1d0812434eda42321c83c9f2dbafe6f6b567a45 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtpk.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtrf.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtrf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f83294232f47ffb546364a5e5161bfe29d5d2ef Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/surrtrf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/susw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/susw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a1556898573209b4cffa37e387fa3e5d249d780d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/susw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/su____.d/suswn.F90.gz b/MAR/code_mar/radCEP.d/Source.d/su____.d/suswn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..09329043b18d37d3baf1ba7070fd84ce63553879 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/su____.d/suswn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..51f675d8e8d06a4fe488865fd2db4137b897d55d Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90-NOT-CORRECT-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90-NOT-CORRECT-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..08e8a462d8695be68d09d3331cb4980b5d5045f0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90-NOT-CORRECT-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..903e45b72a35d96499681254355ecdcf36e5d8b7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw1s.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw2s.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw2s.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1407e4a10f55bcd901acfa6395ff3ab3f8ce0d1c Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/sw2s.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swclr.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swclr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..55201e172a412b0232aaa088e5e6f8670c5bea30 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swclr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90-BAK.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90-BAK.gz new file mode 100644 index 0000000000000000000000000000000000000000..3dddea0e8f5a3fa7b4c0b5ee35a486fee6cf9b79 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90-BAK.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..45697f747f15dc0be7a683dbd16c23c36865a936 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swde.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90-NOT-CORRECT-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90-NOT-CORRECT-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..d1007e0aef6a6a51b0cbb5fd9d9bd3dcc356b913 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90-NOT-CORRECT-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1cec30a6aa578c6d36664cb22b1f29dc903797dd Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swni.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90-NOT-CORRECT-on-dexp.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90-NOT-CORRECT-on-dexp.gz new file mode 100644 index 0000000000000000000000000000000000000000..9fb13d91fb5c7a38f14cdbb5e7f904fd2577f91f Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90-NOT-CORRECT-on-dexp.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1141c0a9a68080073cdb63934191960ded6ce825 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..401479b71f6fedd8a0bfad9c6e3f81f6c86cc4ad Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt1.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..44a94ced3374f929a0f1dcf19fff12502b988caf Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swtt1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90-NOT-CORRECT-on-zahir.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90-NOT-CORRECT-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..19b1457bbaef1f2047197c16e417048ebf5de039 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90-NOT-CORRECT-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..48c98f4e7571b0ab6ada46a67dd6690a58596a31 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/Source.d/sw____.d/swuvo3.F90.gz b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swuvo3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e1c5e9e0ab49db434cc243b10f98f2ede366cae0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/Source.d/sw____.d/swuvo3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/include/fctast.h.gz b/MAR/code_mar/radCEP.d/include/fctast.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..759ea17e45d572ef237201028f6189c4a15a0aae Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/fctast.h.gz differ diff --git a/MAR/code_mar/radCEP.d/include/fcttim.h-ERROR-on-zahir.gz b/MAR/code_mar/radCEP.d/include/fcttim.h-ERROR-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..db7b01669be464c36337f36d15956ce0538f24d2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/fcttim.h-ERROR-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/include/fcttim.h.gz b/MAR/code_mar/radCEP.d/include/fcttim.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..06a8c1529abc3017a68fd8a0a9e9bebc011f8fff Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/fcttim.h.gz differ diff --git a/MAR/code_mar/radCEP.d/include/fcttre.h.gz b/MAR/code_mar/radCEP.d/include/fcttre.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..d19a769ab3b892de56d74776e195aadba2e8c717 Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/fcttre.h.gz differ diff --git a/MAR/code_mar/radCEP.d/include/fcttrm.h.gz b/MAR/code_mar/radCEP.d/include/fcttrm.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..c4e43b75344c442aa12c3c138a9086bb261adb98 Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/fcttrm.h.gz differ diff --git a/MAR/code_mar/radCEP.d/include/naerad.h.gz b/MAR/code_mar/radCEP.d/include/naerad.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..215e34c96eb097820faf1e581d18d0308a169e1f Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/naerad.h.gz differ diff --git a/MAR/code_mar/radCEP.d/include/tsmbkind.h.gz b/MAR/code_mar/radCEP.d/include/tsmbkind.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..1d3fe125c29f6331b84e051e4410ed2356792f6f Binary files /dev/null and b/MAR/code_mar/radCEP.d/include/tsmbkind.h.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_0/parkind1.F90.gz b/MAR/code_mar/radCEP.d/module.d_0/parkind1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..949a07adf1536af9ab355ecddb0b9428ec84e36b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_0/parkind1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_0/parkind2.F90.gz b/MAR/code_mar/radCEP.d/module.d_0/parkind2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8937b72d0a854f5a43500e553a7ae4a0ed240ddc Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_0/parkind2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90-ERROR-on-zahir.gz b/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90-ERROR-on-zahir.gz new file mode 100644 index 0000000000000000000000000000000000000000..4aa03e2853abf2aead9a2ae1147f88fd68b70207 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90-ERROR-on-zahir.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90.gz b/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..07e164c7b0d240364cacc813e544c5d3503c514f Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_0/strhandler.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.ORI.gz b/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.ORI.gz new file mode 100644 index 0000000000000000000000000000000000000000..842bb8ee1ba7bf412470196626fc6dbc44b97518 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.ORI.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ff801eb191cf29ea1f5d22ee9f694955f731f03 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parcli.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parclimf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parclimf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2230f323dc678ae4a1321e57a655a570ad2a2d1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parclimf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parcma.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parcma.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7adb7c43410fd9aa8dfa38781f2d0abd4e6801c4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parcma.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/pardim.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/pardim.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..876223c2eb39b6edfcc407acf2791fd71bfbd26e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/pardim.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/pardimo.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/pardimo.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..43046c3dbbf727cbee288454e6078edb4e00e712 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/pardimo.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parerob.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parerob.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6dafb380717ca989b6027557310e71ce812ad642 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parerob.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parfpos.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parfpos.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6d58e2c02e8d5ca6b08bb93afaa187200c527eb2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parfpos.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/pargc5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/pargc5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c751222f69c257f297d13f040ddce66eeebb4747 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/pargc5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parptrs.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parptrs.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3abed1572940309d67c876f24f15738d7d7421a2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parptrs.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parrint.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parrint.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3c76484a16766a978e4317c304d8cc85e83ed56b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parrint.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..75c1e0e0702cb7456e397982b32a6aa758e440cd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..129608aa6e5badc6aad30c994bb86b3119e1b69d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parrrtm.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c4af57146a8317325775590558917b6cf97764a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e7f4e650c78267d4f3ff80202febbf27bc5811a2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/parrtm1d.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/script.bash.gz b/MAR/code_mar/radCEP.d/module.d_1/script.bash.gz new file mode 100644 index 0000000000000000000000000000000000000000..0a58c95707f3f4dba500c705bfdbf9766b67c9d5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/script.bash.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/tsmbkind.h.gz b/MAR/code_mar/radCEP.d/module.d_1/tsmbkind.h.gz new file mode 100644 index 0000000000000000000000000000000000000000..1d3fe125c29f6331b84e051e4410ed2356792f6f Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/tsmbkind.h.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeaer.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeaer.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4b3694d3675258eeec6cf554aa2140ae79465652 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeaer.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeaerc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeaerc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a1369ea54c015a500884c0d279fc38b3710f16de Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeaerc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeaerd.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeaerd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a77c15dc22a6c9132d52d16f68d58110895fe50e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeaerd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeast.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeast.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..29472dfeec6c9322d8e6f757321f0f374d79e18e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeast.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoecld.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoecld.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0c995df28e0cd6b795e629ee5c5d0499a64c208a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoecld.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoecldp.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoecldp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c694483e4ab9b9ff4581d912ceecb842a9ff20d7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoecldp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeclop.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeclop.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9bc0e7b377c0d94b8466cddadc6f347345fdf8ac Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeclop.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoedbug.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoedbug.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a9ab1a2ff4608f1f91a41df12e2c2c41ac59c0d4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoedbug.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoelw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoelw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..71179b6ab80c8e520b61722748d74f09f9cf2609 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoelw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoemeth.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoemeth.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e73856a0412ecdd874d85abd549ccdc1508c880b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoemeth.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoencst.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoencst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..227f3e7db1bceb1b9da8a089675ffcb73c7e8bcb Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoencst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeolw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeolw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4058a86ea177db3ebc8da86d45ea81016b2a2ed1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeolw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeovlp.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeovlp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..66a8f561a881f47de99c927cfb4eb47c20dd4b5c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeovlp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeozoc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeozoc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ce9a6f745bb2d13a05b33071fbc381dee32811aa Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeozoc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoephli.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoephli.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..664b1b3dd1fcd64951742e4937b6fbef951eb13b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoephli.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoephy.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoephy.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..999c398e55fc9938126c0a0e41005e75ea074b0d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoephy.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerad.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerad.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e6b006c93d86e75b296a3bf945e6cdc99b1dffb2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerad.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerdi.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerdi.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..78218d0a02918f94214b169ce15ce6e674b3f5b5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerdi.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerdu.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerdu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6d3b6e4b8412f312993d021beb5b00eab89d0537 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerdu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerip.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerip.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d4e72d6d737b889f27745ae9d55209cdd88c10ac Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerip.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta1.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..63fe419d2fe74da4fbf017c0a33445e5933a58a1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta10.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e99d73109dde4b12b6824bb774fa158cc3fe6688 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta11.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..57b7d8fd7ef90ba985546a206a8fbdc3a5213bff Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta12.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c30c6baa3b7457bf8e2fa5c4fe5ebb861516c7a5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta13.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..47432ff8725690361295e17043368ff4dd1018af Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta14.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7226d16bb29f2e33ef1f6c259d8ffdc5ff7dca50 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta15.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae9b1025a49acc8d711f4aeed9c0e1304c7539dd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta16.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6047ea89c422436880fcbc8d062fced99a6ef961 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c84d448091c8d55d75d4f80f443bd3b11fe8412 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta3.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c70d05b4d9a108a6c57907a17c74b63b3b4c59a5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta4.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4c55013c5fd5971b3ca19e6f545bf1395b9c7bcd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0407c56280db717f066b10deaba02a0b58438bd9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta6.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0511d928470e6d05f7fc9ffaa818ea9ce479a38c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta7.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..269726fdd3b388a509cff01a97d23507b4c8ba88 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta8.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..84c834f53f29c6db008e917b151df74a9d8dda4b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrta9.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrta9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cef475159bf4e168e96bde7ab43644f23b183189 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrta9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtab.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtab.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc796e5ff6eeba849ed0f58019bebde31884b3b0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtab.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtam.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtam.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6aae673153d6635b6cb127aade6febfe70a84d06 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtam.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtbg2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtbg2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e3e3147af9b1cb61bb693428de214cc47813ee8a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtbg2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtftr.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtftr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fa63f77562907ddcc1e8aa4dac7171b6853c11ac Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtftr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto1.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..616903d7d75488946ccbbe323ae24c85b4b01c7e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto10.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a746cb141f626e2087a74b24eab7fda853097bd0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto11.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..10775f2db6fc2abfff4ee19940542abc8d7961f7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto12.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..690c92235d25a5a2ff6b787369481d76ca81c95a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto13.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a34807bae1f58c2595c1059986da02fe4b08f6e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto14.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0788f3c0838474dee79e2c72c6a9b0f0f84f7308 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto15.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..47d0e8f7d0bca2f5a7d7aa48c65f754308ada9e7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto16.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..85ce53ce7c24eb8a600546a3a87150460ddae73f Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b9c5ce10ba6b1b526e8c98fe9402fbcd2f1b11d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto3.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1efc16cfe8878a706e7c412b2e7191545f24b4d2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto4.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..216fab90eaea244659c4864f1bbab5ffd1eb4447 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d1f394d4e14e0769c044989a5598a7c8f752dab5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto6.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7822224d06e1601915f37b6fdf171de90fccbf1d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto7.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9df512e312134e0518506cf19b9c074b4cec7ba4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto8.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4463047ce777364e0a6c8f3c1612edb46b8f2faf Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrto9.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrto9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1f77649156fa7496a3a8e7dfa013c8e8ea703c9c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrto9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtrf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtrf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..26b7c895d5cf8788a464134d04467810a4ed9418 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtrf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtrwt.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtrwt.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c6562038569c599864d6769b880e50081c6f9b6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtrwt.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoerrtwn.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoerrtwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..fef6e9314c7dd0bda61987d2e17fffd1bf35d215 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoerrtwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoesat.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoesat.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..dbb84fe9e078488b53d4e8ecccbf28230d33ba3c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoesat.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoesw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoesw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..64063ec247f675afb11d817292447ac6d459de41 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoesw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoethf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoethf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..577bb09f5032e70a76143476ac57443e1d6a8540 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoethf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoetluc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoetluc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3fb579bcb238671b883d1ce99f6391d5ec7435b6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoetluc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoevdf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoevdf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4f97bf6321412bd823198e2a37dc66ab74927f3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoevdf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoevdfs.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoevdfs.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c171493fba643f69b7ca490f917d6d3a2bfe1e01 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoevdfs.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoeveg.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoeveg.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5b8dd320f146c6d7c9f648d3f0d56b3501e4972d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoeveg.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yoewcou.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yoewcou.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f910b5c7e4b25a4dc9891544ce5907f598162618 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yoewcou.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yomcst.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yomcst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..db313ae14ffd4f8b5692a71b8ebc6bc9bafdc439 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yomcst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yomlun.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yomlun.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e2766c08bef1942003078c81f7638fd4c27e39b3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yomlun.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1/yomrip.F90.gz b/MAR/code_mar/radCEP.d/module.d_1/yomrip.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..97629e6ec2265604b73613d05c1d7f8dc16c7c1f Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1/yomrip.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcli.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcli.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ff801eb191cf29ea1f5d22ee9f694955f731f03 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcli.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parclimf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parclimf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2230f323dc678ae4a1321e57a655a570ad2a2d1 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parclimf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcma.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcma.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7adb7c43410fd9aa8dfa38781f2d0abd4e6801c4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parcma.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardim.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardim.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..876223c2eb39b6edfcc407acf2791fd71bfbd26e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardim.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardimo.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardimo.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..43046c3dbbf727cbee288454e6078edb4e00e712 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pardimo.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parerob.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parerob.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6dafb380717ca989b6027557310e71ce812ad642 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parerob.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parfpos.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parfpos.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6d58e2c02e8d5ca6b08bb93afaa187200c527eb2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parfpos.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pargc5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pargc5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c751222f69c257f297d13f040ddce66eeebb4747 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/pargc5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parptrs.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parptrs.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3abed1572940309d67c876f24f15738d7d7421a2 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parptrs.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrint.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrint.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3c76484a16766a978e4317c304d8cc85e83ed56b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrint.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..75c1e0e0702cb7456e397982b32a6aa758e440cd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2f817a63b6c1ee0a6788a3ee2796ad828cca8b63 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrrtm.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.ORIGINAL.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.ORIGINAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c4af57146a8317325775590558917b6cf97764a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.ORIGINAL.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b754fb2b3fcde30080a930a6099063575f0adcb Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/parrtm1d.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/script.bash.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/script.bash.gz new file mode 100644 index 0000000000000000000000000000000000000000..0a58c95707f3f4dba500c705bfdbf9766b67c9d5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/script.bash.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaer.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaer.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..366f49c0c31bcfebed3f20daeb8278bd2928d924 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaer.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..89c8d591ec9861f0d02ce0eee2c98339f3ed4138 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerd.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerd.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..792a214a42f4beb133583f38b257761b7273e221 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeaerd.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeast.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeast.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..35de9724ba7bf062e0e8561439309d98571ecb37 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeast.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecld.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecld.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..927c474ef4bc21bdda7b3e100f8b2836ec33052c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecld.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecldp.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecldp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9948118e3bd53f334c0f204ad7ed211d9e151f18 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoecldp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeclop.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeclop.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..db89e80c8c3baa7b248a3dae7293e876b36e4790 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeclop.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoedbug.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoedbug.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a9ab1a2ff4608f1f91a41df12e2c2c41ac59c0d4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoedbug.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoelw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoelw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b688685a9c28fe3faf08fc5eda54e0c3b6332f3e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoelw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoemeth.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoemeth.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6acf76a6f5fb62e9d291c3605e3cfd113d6dcc14 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoemeth.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoencst.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoencst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b1cf15c41b5a08ea07f151261ab305b01793fbf0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoencst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeolw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeolw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0ddfe0be0f68b86cfb5df0aea04bfdf117c053e9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeolw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeovlp.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeovlp.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cdf9f6ba190c14ff919bf172b7f900d0c80b8464 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeovlp.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeozoc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeozoc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a8d1aa76a42d200a96e81286c0e2ee8f27e83249 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeozoc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephli.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephli.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..afe2783b87be7cef63f64543a706584ac96063d7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephli.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephy.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephy.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ca3b1fd1ec6237e9febc77f4cf28236bfb6e528 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoephy.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerad.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerad.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c495844fd8091329bdef7fa59eb20bc274d6abe5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerad.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdi.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdi.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..58f3fc644d7a29e1ece346bfa5e2583640a65988 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdi.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdu.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdu.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a58e6aa634904ef7f5736183e63fa3d8a2c45567 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerdu.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerip.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerip.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8a2daa4be6e9c19e3ff6b29ab84496db48c0efef Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerip.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta1.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..546e262d62b301a4c4fbfdea2a36fb5cb53ab6bb Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta10.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..975e00e9a0a47563535a6daaf274f6a71fa4e73e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta11.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2ab35396691f39e5db7992d3d20ba1e2f3bb0ec5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta12.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ea140c9766dfa837588182771009570b9fe8bbe0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta13.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc17e7faa6e037918232a812b95d2d75bba3a6d4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta14.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0be444d685c1c70fe1cbd97b5fb427a106dfaad0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta15.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0623f4c72a4a361bee5b57c58b8e6af77d8054a3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta16.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7e2bd70900f488fed972e86ff15577ace95fbcac Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..ac6712a34c2f23e6630bd1d290cdfd8d7f892ffe Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta3.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8101c378e402db8b5fd262bce830ae5b1d2c9002 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta4.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e1dc29111f8b0e233bb9fd9e345fc0fccc3e378a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..1307bfac9bcc8d9f7c02312c178b3ea5124cbfc3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta6.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..420351efa89f022384afb37da45a9ac4c0cf8664 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta7.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..845b0359a1a2b8b16e03d48ab9ec488da8d082f3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta8.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..43b99121a3c76ec022a1c4229ed2a76709851f18 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta9.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..994356a29d6dd9879438d1738d1b2ea1a75ef1d0 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrta9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtab.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtab.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd54e0956baf2e0e69927bda7b5680c7db72682d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtab.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtam.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtam.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..c84bd7897b0f0ad29a10810813c5deaad85da779 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtam.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtbg2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtbg2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..a56d2202782b87f0cf3f9191dbae9345204372f8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtbg2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtftr.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtftr.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d591700b3745c32570551ef26fe985725172434d Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtftr.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto1.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto1.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c216e213a3c06d0fea9b3b7633ff0c4c0f68fa4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto1.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto10.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto10.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..f2f4e98b3cd0e70a1e529482a5a1f10178336173 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto10.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto11.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto11.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..eadcd6c4a3bbbfc064a94f7d978a520871f03301 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto11.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto12.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto12.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..9aa001d14f35bbe2e2f88655504b02481205cc8e Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto12.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto13.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto13.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ede3d58ef9f9f1f23cc4fa5080ef3c0588c64f8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto13.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto14.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto14.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ee60e2bd95bb376c0ad98322869fb2632361ad7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto14.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto15.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto15.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..52e298586ecfe99b953c4ed59cdd5c026681faa6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto15.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto16.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto16.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..02ca1f49aca569f40cd12b310cc71805340265d3 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto16.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto2.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto2.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b8008c0145cb1787f972d4d5af570bde0bf741dc Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto2.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto3.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto3.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..52087602a9f0fb5820510a1703fa83a27dc07842 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto3.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto4.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto4.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..dba7b0ef7d0db4f9a3d23d38b57e09b5bdc73fe8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto4.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto5.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto5.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c5673fbbfc7a11924941ad04b68ab4d4c7062c4 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto5.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto6.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto6.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..98283c6e1ae181079575064837612855459dba86 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto6.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto7.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto7.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..63a9a669fccd86ccf445a9e42866c3cf3e37afec Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto7.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto8.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto8.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d7c63501e2896d7dac86bac99e5733509cfc2117 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto8.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto9.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto9.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..0840cd6b5af64f4c7ee510778ce5622d650d6ab7 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrto9.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..efd211f3304dd3d7fcfc686f569171e6ca3bb9bd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrwt.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrwt.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..5da3bca260215c591b73e1c8597566e2a563d4bd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtrwt.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtwn.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtwn.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4a5cdfd00f0be5605e423197eb86919baeb3a1a Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoerrtwn.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesat.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesat.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..14e39267c9181d23c9430e08788d4a29f07c1b32 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesat.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesw.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesw.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..81b22611e4e5a511f001255fd4a7dda50ca4a290 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoesw.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoethf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoethf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..8135703212b19fa31b39a6b50c4e6fff6e171458 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoethf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoetluc.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoetluc.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..3fb579bcb238671b883d1ce99f6391d5ec7435b6 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoetluc.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdf.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdf.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..05d8241d9cd5219018e0c2d863e25f421044c2eb Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdf.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdfs.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdfs.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..743017889f66c803e033aaf884403311e18b9db9 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoevdfs.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeveg.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeveg.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..2ec5330d0f679606f42d3c492dd441eae8bbee0c Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoeveg.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoewcou.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoewcou.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..e089e555ebdc2926f1ba5e6722efeb0f7f2db721 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yoewcou.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomcst.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomcst.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..b61baf7d2b8d6a9d78f9a191ed5ab4dfa7cb55cd Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomcst.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomlun.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomlun.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..d151ab2fa12669dedead62b199003bc3683031d8 Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomlun.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomrip.F90.gz b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomrip.F90.gz new file mode 100644 index 0000000000000000000000000000000000000000..df1e79aa82898f1e9b3f76f6bb0101467c1cdc5b Binary files /dev/null and b/MAR/code_mar/radCEP.d/module.d_1_no_OMP/yomrip.F90.gz differ diff --git a/MAR/code_mar/radCEP.d/radCEP.README.gz b/MAR/code_mar/radCEP.d/radCEP.README.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b25e6a58f8802e9a13cb6db02cfea7da6fe4af5 Binary files /dev/null and b/MAR/code_mar/radCEP.d/radCEP.README.gz differ diff --git a/MAR/code_mar/radCEP.d/radCEP.bash.gz b/MAR/code_mar/radCEP.d/radCEP.bash.gz new file mode 100644 index 0000000000000000000000000000000000000000..84110fae489dad9906400ffdb49ccac1f14ee12e Binary files /dev/null and b/MAR/code_mar/radCEP.d/radCEP.bash.gz differ diff --git a/MAR/code_mar/radcep_mod.f90 b/MAR/code_mar/radcep_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..db2629288fcd1e4ae05faf83637421dabdc5af03 --- /dev/null +++ b/MAR/code_mar/radcep_mod.f90 @@ -0,0 +1,30 @@ +module radcep + use mardim + implicit none + integer, parameter :: klonr = 1 + integer, parameter :: klevr = mz + integer, parameter :: nn_aer = 6 + character(len=6), save :: CMIP_scenario + + real, save, allocatable :: Ae_MAR(:, :, :, :) + real, save, allocatable :: O3_MAR(:, :, :) + + logical :: RADini = .false. + logical :: RADin2 = .false. + common / c_RADini / RADini, RADin2 + !$OMP threadprivate( /c_RADini/) + save + +contains + + subroutine radcep_init() + + use mardim, only: mx, my, mz + implicit none + + allocate(Ae_MAR(mx, my, nn_aer, mz)) + allocate(O3_MAR(mx, my, mz)) + + endsubroutine radcep_init + +endmodule radcep diff --git a/MAR/code_mar/sbcnew.f90 b/MAR/code_mar/sbcnew.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c2f6931956d58edc22ae1e5d96a38192a56badfd --- /dev/null +++ b/MAR/code_mar/sbcnew.f90 @@ -0,0 +1,2947 @@ +#include "MAR_pp.def" +subroutine sbcnew + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE XF 29-09-2021 MAR | + ! | subroutine sbcnew for Greenland/Svalbard 3D simulation | + ! | | + ! | Simulation GRD | + ! +------------------------------------------------------------------------+ + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + use mardsv + + implicit none + + integer i, j, k, m + character * 10 TypeGL + + character*5 :: RCP_CMIP5 + common / c_RCP_CMIP5 / RCP_CMIP5 + integer n, l, nbr + real ro_old, minuONE + + ! 1) Name of simulation + ! ===================== + + TypeGL = 'ERR' +#if(GR) + TypeGL = 'GR' +#endif +#if(AC) + TypeGL = 'AN' +#endif + + if(TypeGL(1:2) == "AN") then + if(mx == 352 .and. my == 300) TypeGL = 'AN20km' + if(mx == 201 .and. my == 171) TypeGL = 'AN35km' + if(mx == 216 .and. my == 222) TypeGL = 'AN35km' + if(mx == 176 .and. my == 148) TypeGL = 'AN35km' + if(mx == 141 .and. my == 120) TypeGL = 'AN50km' + if(mx == 176 .and. my == 148) TypeGL = 'AN35km' + if(len(TypeGL) == 2) then + print *, "Domain AN not defined in sbcnew.f" + stop + endif + endif + + if(TypeGL(1:2) == "GR") then + if(mx == 60 .and. my == 95) TypeGL = 'GRini' ! MAR tests + if(mx == 215 .and. my == 390) TypeGL = 'GR7_5km' + if(mx == 250 .and. my == 200) TypeGL = 'GR6km' ! Russian Island + if(mx == 165 .and. my == 300) TypeGL = 'GR10km' + if(mx == 306 .and. my == 312) TypeGL = 'GR11km' + if(mx == 140 .and. my == 250) TypeGL = 'GR12_5km' ! Greenland + if(mx == 240 .and. my == 270) TypeGL = 'GR12_5km' ! Greenland + Arctic + if(mx == 115 .and. my == 210) TypeGL = 'GR15km' + if(mx == 210 .and. my == 230) TypeGL = 'GR15km' ! Greenland + Arctic + if(mx == 119 .and. my == 209) TypeGL = 'GR15km' + if(mx == 95 .and. my == 165) TypeGL = 'GR20km' + if(mx == 96 .and. my == 165) TypeGL = 'GR20km' + if(mx == 80 .and. my == 135) TypeGL = 'GR25km' + if(mx == 100 .and. my == 150) TypeGL = 'GR25km' + if(mx == 68 .and. my == 118) TypeGL = 'GR30km' + if(mx == 65 .and. my == 110) TypeGL = 'GR32_5km' + if(mx == 60 .and. my == 100) TypeGL = 'GR35km' + if(mx == 55 .and. my == 95) TypeGL = 'GR37_5km' + if(mx == 60 .and. my == 80) TypeGL = 'GR50km' + if(mx == 60 .and. my == 70) TypeGL = 'AC75km' + if(mx == 85 .and. my == 95) TypeGL = 'SVa' ! Svalbard + if(trim(TypeGL) == "GR") then + print *, "Domain GR not defined in sbcnew.f" + stop + endif + endif + + ! 2) inisnow + ! ========== + if(TypeGL(1:2) == "GR" .or. TypeGL(1:2) == "AN") then + if(itexpe == 0) call inisnow(TypeGL) + if(itexpe <= 10) then + n = 1 + do i = 1, mx; do j = 1, my + if(mskSNo(i, j, n) > 0) then + do k = 1, nssSNo(i, j, n) + ro_old = rosSNo(i, j, n, k) + if(rosSNo(i, j, n, k) <= 300 .and. rosSNo(i, j, n, k) >= 100) then + rosSNo(i, j, n, k) = 300. + endif + if(rosSNo(i, j, n, 1) >= 800 .and. rosSNo(i, j, n, k) >= 800) then + ! warning, might be wrong for Antarctica + ! todo : check for Antarctica + tisSNo(i, j, n, k) = max(273.15 - 20, tisSNo(i, j, n, k)) + endif + if(ro_old /= rosSNo(i, j, n, k)) then + dzsSNo(i, j, n, k) = dzsSNo(i, j, n, k) / rosSNo(i, j, n, k) * ro_old + print *, "acc", i, j, k, ro_old, rosSNo(i, j, n, k) + endif + enddo + endif + enddo; + enddo + do l = 1, 10 + call UPDsnow + enddo + endif + endif + + ! 3) UPDsnow + ! ========== + if(TypeGL(1:2) == "GR" .or. TypeGL(1:2) == "AN") then + if(iterun <= 20 .and. jdarGE == 1) call UPDsnow + endif + + ! 4) srfsnow + ! ========== + ! srfsnow read a file to impose a constant snow density + if(iterun == 0) call srfsnow(.false., TypeGL) + + ! 5) OUTone + ! ========= + if(TypeGL(1:2) == "AN") then + minuONE = minuGE + jsecGE / 60. + if((minuONE >= 0 .and. minuONE < 0 + dt / 60.) .or. & + (minuONE >= 5 .and. minuONE < 5 + dt / 60.) .or. & + (minuONE >= 10 .and. minuONE < 10 + dt / 60.) .or. & + (minuONE >= 15 .and. minuONE < 15 + dt / 60.) .or. & + (minuONE >= 20 .and. minuONE < 20 + dt / 60.) .or. & + (minuONE >= 25 .and. minuONE < 25 + dt / 60.) .or. & + (minuONE >= 30 .and. minuONE < 30 + dt / 60.) .or. & + (minuONE >= 35 .and. minuONE < 35 + dt / 60.) .or. & + (minuONE >= 40 .and. minuONE < 40 + dt / 60.) .or. & + (minuONE >= 45 .and. minuONE < 45 + dt / 60.) .or. & + (minuONE >= 50 .and. minuONE < 50 + dt / 60.) .or. & + (minuONE >= 55 .and. minuONE < 55 + dt / 60.)) then + call OUTone(TypeGL, 5) + endif + endif + + ! 6) OUTsta + ! ========= + ! if(iterun>=1)then + ! call OUTsta('066','058', 1) + ! call OUTsta('063','053', 2) + ! end if + + ! 7) ASSsnow + ! ========== + ! if (mmarGE>4.and.mmarGE<10) call ASSsnow + + return +endsubroutine sbcnew + +subroutine srfsnow(constantDensity, TypeGL) + use mardim + use mar_sv + use marssn + use mar_ge + implicit none + + logical, intent(in) :: constantDensity + character*10, intent(in) :: TypeGL + ! +-- Local Variables + ! + =============== + real ro_srf(mx, my) + character * 100 filein + character * 3 mxc, myc + logical file_exists + + write(6, 150) jdarGE, mmarGE, iyrrGE, trim(TypeGL(1:7)), mx, my +150 format(' srfsnow at ', i2, '-', i2, '-', i4, ':', & + ' type=', a7, ' mx=', i4, ' my=', i4) + if(constantDensity) then + if(TypeGL(1:2) == "AN") then + write(mxc, '(i3)') mx + if(mx < 100) write(mxc, '(i2)') mx + write(myc, '(i3)') my + if(my < 100) write(myc, '(i2)') my + ! MARini in ~/MAR/usr/ produced with compute_MARini-AN.jnl + filein = 'MARini-'//trim(TypeGL)//'-'// & + trim(mxc)//'x'//trim(myc)//'.cdf' + inquire(file=trim(filein), exist=file_exists) + if(file_exists) then + write(6, *) 'srfsnow, Reading ', TRIM(filein) + write(6, *) "RHOSINI" + call CF_READ3D(TRIM(filein), 'RHOSINI', 1, mx, my, 1, ro_srf) + ! ! conversion 0-1 m to fresh snow : 5% less dense + ro_srf = ro_srf * 0.95 + else + write(6, *) " ERROR: ", trim(filein), " does not exist" + write(6, *) " >> Use ~/MAR/usr/compute_MARini-AN.jnl" + write(6, *) " or set constantDensity=.false. in sbcnew" + ! stop + endif + else + print *, " not for ", trim(TypeGL), ", only for Ant. (AN)" + ro_srf = -999. + endif + else + ro_srf = -999. + endif + +endsubroutine srfsnow + +subroutine ice_sheet_model_coupling + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + use mardsv + + implicit none + + integer, parameter :: mxx1 = 60 ! 25km + integer, parameter :: myy1 = 110 ! 25km + integer, parameter :: xx1 = 9 ! 25km + integer, parameter :: yy1 = 17 ! 25km + + ! integer ,parameter :: mxx1 = 51 ! 30km + ! integer ,parameter :: myy1 = 93 ! 30km + ! integer ,parameter :: xx1 = 9 ! 30km + ! integer ,parameter :: yy1 = 16 ! 30km + + ! integer ,parameter :: mxx1 = 42 ! 35km + ! integer ,parameter :: myy1 = 78 ! 35km + ! integer ,parameter :: xx1 = 9 ! 35km + ! integer ,parameter :: yy1 = 15 ! 35km + + real, parameter :: convrd = 180.0 / 3.141592 ! rad => deg + real, parameter :: convhd = 15.0 ! hour => deg + + real tmp1(mxx1, myy1), file_OK + real lat1(mx, my), lon1(mx, my), bed(mx, my) + real newmsk(mx, my), newsh(mx, my), oldsh(mx, my), oldmsk(mx, my) + + integer i, j + character * 100 file_name + + logical file_exists + + file_name = "GRISLI4MAR.cdf" + + open(unit=10, file="MARscenario.ctr", status="old", err=1000) + rewind 10 + read(10, *, end=1001) + read(10, *, end=1001) + read(10, '(a100)', end=1001) file_name +1000 continue +1001 continue + close(10) + + INQUIRE(FILE=trim(file_name), EXIST=file_exists) + + if(file_exists) then + + write(6, 12) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE +12 format('XF WARNING: call of ice_sheet_model_coupling: ', i5, 4i3) + + write(*, *) "WARNING: itexpe must be an integer*8 in MARCTR.inc" + + lon1 = 0; lat1 = 0; bed = 0; newsh = 0; newmsk = 0 + + call CF_READ2D(trim(file_name), 'LON', 1, mxx1, myy1, 1, tmp1) + do i = 1, mxx1; do j = 1, myy1 + lon1(i + xx1, j + yy1) = tmp1(i, j) + enddo; + enddo + + call CF_READ2D(trim(file_name), 'LAT', 1, mxx1, myy1, 1, tmp1) + do i = 1, mxx1; do j = 1, myy1 + lat1(i + xx1, j + yy1) = tmp1(i, j) + enddo; + enddo + + call CF_READ2D(trim(file_name), 'BED', 1, mxx1, myy1, 1, tmp1) + do i = 1, mxx1; do j = 1, myy1 + bed(i + xx1, j + yy1) = tmp1(i, j) + enddo; + enddo + + call CF_READ2D(trim(file_name), 'newSH', 1, mxx1, myy1, 1, tmp1) + do i = 1, mxx1; do j = 1, myy1 + newsh(i + xx1, j + yy1) = tmp1(i, j) + enddo; + enddo + + call CF_READ2D(trim(file_name), 'newMSK', 1, mxx1, myy1, 1, tmp1) + do i = 1, mxx1; do j = 1, myy1 + newmsk(i + xx1, j + yy1) = tmp1(i, j) + enddo; + enddo + + oldmsk = mskSNo(:, :, 1) + oldsh = sh + + do i = 1, mx; do j = 1, my + + if(newmsk(i, j) > 0) then + + ! !SH + if(abs(newsh(i, j) - sh(i, j)) > 0.1) then + + sh(i, j) = newsh(i, j) + sh(i, j) = max(sh(i, j), bed(i, j)) + + write(6, 13) i, j, oldsh(i, j), sh(i, j) +13 format(2i4, " ice sheet SH:", f7.1, '=>', f7.1) + endif + + ! ! MSK + if(mskSNo(i, j, 1) > 0 .and. mskSNo(i, j, 1) < 100 .and. & + abs(lon1(i, j) - GElonh(i, j) * convhd) < 0.01 .and. & + abs(lat1(i, j) - GElatr(i, j) * convrd) < 0.01 .and. & + abs(newmsk(i, j) - mskSNo(i, j, 1)) > 0.01) then + + mskSNo(i, j, 1) = newmsk(i, j) + mskSNo(i, j, 1) = max(0.001, mskSNo(i, j, 1)) + mskSNo(i, j, 1) = min(99.999, mskSNo(i, j, 1)) + + ifraTV(i, j, 1) = mskSNo(i, j, 1) + ifraTV(i, j, 2) = 100.-mskSNo(i, j, 1) + + SLsrfl(i, j, 1) = mskSNo(i, j, 1) / 100. + SLsrfl(i, j, 2) = 1.-mskSNo(i, j, 1) / 100. + + write(6, 14) i, j, oldmsk(i, j), mskSNo(i, j, 1) +14 format(2i4, " ice sheet MSK:", f7.2, '=>', f7.2) + endif + + endif + + enddo; + enddo + ! else + ! print *, trim(file_name) // " not found" + endif + +endsubroutine ice_sheet_model_coupling + +subroutine ASSsnow + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE XF MAR | + ! +------------------------------------------------------------------------+ + ! + + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + implicit none + ! + + ! +--General Variables + ! + ================= + + ! +--Local Variables + ! + ================= + + real, parameter :: melt_thrsd = 8.5 ! mmWE/day + real, parameter :: dzsn_thrsd = 0.05 ! m + + integer :: i, j, k + integer :: day, day_1st_may, day_current, kksn, n + integer :: ASS_up, ASS_do + + character*20 :: filename + character*4 :: YYYYc + + real :: melt_current, thrsd, dz, dzsn + + real :: tmp1(60, 112), tmp2(60, 112) + real :: msk_sat(mx, my), melt_sat(mx, my) + + ! + SMMR/SSMI data set reading + + day_1st_may = 122 - min(1, mod(iyrrGE, 4)) + + day_current = njyrGE(mmarGE) + & + njybGE(mmarGE) * max(0, 1 - mod(iyrrGE, 4)) + jdarGE + + day = day_current - day_1st_may + 1 + + write(YYYYc, '(i4)') iyrrGE + + msk_sat = 0; melt_sat = 1 + + filename = 'MELT_'//YYYYc//'.nc' + + call CF_READ2D(filename, 'MSK_SAT', 1, 60, 112, 1, tmp1) + do i = 1, 60; do j = 1, 112 + msk_sat(i + 9, j + 20) = tmp1(i, j) + enddo; + enddo + + call CF_READ2D(filename, 'MELT02', day, 60, 112, 1, tmp1) + call CF_READ2D(filename, 'MELT02', min(153, day + 1), 60, 112, 1, tmp2) + do i = 1, 60; do j = 1, 112 + if(tmp1(i, j) == 0) melt_sat(i + 9, j + 20) = 1 + if(tmp1(i, j) == 1) melt_sat(i + 9, j + 20) = 2 + if(tmp1(i, j) == tmp2(i, j) .and. tmp1(i, j) == 1) melt_sat(i + 9, j + 20) = 3 + if(tmp1(i, j) == tmp2(i, j) .and. tmp1(i, j) == 0) melt_sat(i + 9, j + 20) = 0 + enddo; + enddo + + do i = 1, mx; do j = 1, my; n = 1 + if(mskSNo(i, j, 1) >= 90 .and. msk_sat(i, j) >= 3) then + + melt_current = -1 * (wem_IB(i, j, n) - wem0IB(i, j, n)) + + dzsn = 0; k = nssSNo(i, j, n) + 1 + do while(dzsn <= dzsn_thrsd .or. k > nssSNo(i, j, n) - 2) + k = k - 1 + dzsn = dzsn + dzsSNo(i, j, n, k) + kksn = k + enddo + + ! ! 15hTU = midday + + ASS_up = 0 + ASS_do = 0 + + do k = 1, 3 + if(melt_sat(i, j) <= 1 .and. & + melt_current >= 1.1 * melt_thrsd * (3.+2.*real(k)) / 10. .and. & + jhurGE <= 15 + (k - 1) * 5) then + ASS_up = k + thrsd = melt_thrsd * (3.+2.*real(k)) / 10. + endif + enddo ! 15h => 5/10 ; 20h => 7/10 ; 25h => 9/10 + + if(melt_sat(i, j) <= 1 .and. melt_current > melt_thrsd) ASS_up = 0 + + do k = 1, 4 + if(melt_sat(i, j) >= 2 .and. & + melt_current <= 0.9 * melt_thrsd * real(k) / 4. .and. & + jhurGE >= 15 + k * 2) then + ASS_do = k + thrsd = melt_thrsd * real(k) / 4. + endif + enddo ! 17h => 1/4 ; 19h => 2/4 ; 21h => 3/4 ; 23h => 4/4 + + if(ASS_up >= 1) then + + dz = 0 + do k = nssSNo(i, j, n), kksn, -1 + + tisSNo(i, j, n, k) = min(tisSNo(i, j, n, k), & + 273.15 - (dzsn - dz) / dzsn) + dz = dzsSNo(i, j, n, k) + dz + + enddo + + write(*, *) ' ' + write(*, 11) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, i, j, & + melt_current, melt_thrsd, ASS_up +11 format(' ASSsnow (up) at', i5, 4i3, & + ' for (', i3, ','i3, ') : ', f5.2, '>', f6.2, i2) + write(*, *) ' ' + + endif + + if(ASS_do >= 1) then + + dz = 0 + do k = nssSNo(i, j, n), kksn, -1 + + tisSNo(i, j, n, k) = 273.15 + (dzsn - dz) / dzsn + dz = dzsSNo(i, j, n, k) + dz + + enddo + + write(*, *) ' ' + write(*, 12) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, i, j, & + melt_current, melt_thrsd, ASS_do +12 format(' ASSsnow (down) at', i5, 4i3, & + ' for (', i3, ','i3, ') : ', f5.2, '<', f6.2, i2) + write(*, *) ' ' + + endif + + endif + enddo; + enddo + +endsubroutine ASSsnow + +subroutine inisnow(TypeGL) + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE XF | + ! | subroutine inisnow initialises the SNOW MODEL | + ! | Modified to run with mw = 5 Charlotte Lang 13/03/2015 | + ! +------------------------------------------------------------------------+ + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + use mardsv +#if(iso) + use mariso, only: iso_init_type, rosSNo_iso, wasSNo_iso, SWaSNo_iso, & + snohSN_iso, eta_TV_iso +#endif + implicit none + + ! +--Local Variables + ! + =============== + ! snow profiles compatible with SISVAT_zSn snow discretization splitting/agregation + ! Profil_15_30m : 29.7 m in 15 layer + real, parameter :: Profil_15_30m(15) = (/0.01, 0.01, 0.03, 0.04, 0.05, 0.26, 0.6, 1., & + 1.60, 2.30, 3.00, 3.70, 4.70, 5.70, 6.70/) + ! Profil_10 : 1 m in 10 layers + real, parameter :: Profil_10(10) = (/0.005, 0.01, 0.02, 0.03, 0.04, 0.05, 0.075, 0.10, 0.25, 0.42/) + ! Profil_15 : 1 m in 15 layers + real, parameter :: Profil_15(15) = (/0.005, 0.01, 0.015, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, & + 0.08, 0.09, 0.1, 0.12, 0.14, 0.17/) + real, parameter :: profil_29_20m(29) = (/0.004, 0.004, 0.005, 0.006, 0.008, 0.011, & + 0.016, 0.022, 0.03, 0.04, 0.053, 0.069, 0.089, & + 0.114, 0.144, 0.182, 0.228, 0.286, 0.358, & + 0.45, 0.56, 0.71, 0.90, 1.15, 1.48, 1.92, 2.5, & + 3.34, 5.321/) + ! from C Agosta but bottom layer corrected to reach 20m (from 4.5 to 5.321) + ! dz_min : theoritical snow discretization dz_min*i^2 as in SISVAT_zSn + real, parameter :: dz_min = 0.005 + + real depth, ela + real ini_snow(mx, my), ann_temp(mx, my) + real g2s, denss + real ice_depth, distup + integer nbr_layer + + integer i, j, k + integer ni, nj, nk, n, isn + integer i_sea, j_sea, i_tundra, j_tundra + integer i_dry, j_dry, i_abla, j_abla + integer i_perco, j_perco, INI, iveg_13 + + real, parameter :: convhd = 15. ! hour => deg + real, parameter :: convrd = 180./3.141592 ! rad => deg + + character * 10 TypeGL + character * 99 Filename + character * 3 mxc, myc + + real ro_ini(mx, my, 10), ti_ini(mx, my, 10) + real g1_ini(mx, my, 10), g2_ini(mx, my, 10), zn_ini(mx, my) + real tmp1(mx, my) + + real ns1(mx, my) + real ni1(mx, my) + + real, allocatable ::snwae(:, :, :) + real, allocatable :: znsn(:, :, :) + real, allocatable :: ag1(:, :, :) + real, allocatable :: dz1(:, :, :) + real, allocatable :: nh1(:, :, :) + real, allocatable :: g11(:, :, :) + real, allocatable :: g21(:, :, :) + real, allocatable :: ti1(:, :, :) + real, allocatable :: ro1(:, :, :) + real, allocatable :: wa1(:, :, :) + + character * 4 iyrrGEc + + ! Antarctica + ! ---------- + !+ Interpolated surface snow density (~/MAR/usr/compute_MARini-AN.jnl) + real rosSNo_ini(mx, my), tasSNo_ini(mx, my), smbSNo_ini(mx, my) + ! local variables + real x0, y0, dh + integer ii, jj + real ro_i, ro_w, R_gc, E_1, E_2, Ao + real dz, ro_up, tas, fe_ro, deltaPa, drhodz + logical file_exists + logical, parameter :: verboseAntarctica = .true. + integer firstPoint + + ! mean_dens : mean surface density [kg/m3] + real mean_dens + ! mean_temp : mean annual surface temperature [K] + real mean_temp + real lat_scale, sh_scale, ln_smb, alpha0, alpha1 + ! C0, C1 : constant, 0.07 for z <= 550 kg m-3 + real, parameter :: C0 = 0.07 + real, parameter :: C1 = 0.03 + ! rho_i : ice density [kg m-3] + real, parameter :: rho_ice = 917. + ! E_c : activation energy [J mol-1] + real, parameter :: E_c = 60000. + ! E_g : activation energy [J mol-1] + real, parameter :: E_g = 42400. + ! R : gas constant [J mol-1 K-1] + real, parameter :: R = 8.3144621 + real E0, E1, z550, rho0, rho1 + logical reset_snow + + allocate(snwae(mx, my, nsno)) + allocate(znsn(mx, my, nsno)) + + allocate(ag1(mx, my, nsno)) + allocate(dz1(mx, my, nsno)) + allocate(nh1(mx, my, nsno)) + allocate(g11(mx, my, nsno)) + allocate(g21(mx, my, nsno)) + allocate(ti1(mx, my, nsno)) + allocate(ro1(mx, my, nsno)) + allocate(wa1(mx, my, nsno)) + + reset_snow = .true. + + ! +--DATA + ! + ==== + + ann_temp = tfsnow + 48.38 - (0.007924 * sh) - (0.7512 * (GElatr / degrad)) + + ! Mean Climatological Ann. Temperature + ag1 = real(jdarGE + njyrGE(mmarGE)) / 365.+iyrrGE + + ! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if(nsno < 20) then + print *, "inisnow: nsno in mar_sv_mod.f90 should be > 20" + print *, " nsno=", nsno + stop + endif + + if(mw /= 2) then + print *, "inisnow: mw in mardim_mod.f90 should be 2" + print *, " mw=", mw + stop + endif + ! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ! +--TT srf + ! + ====== + do j = 1, my + do i = 1, mx + tairSL(i, j) = pktaDY(i, j, mz) & + * (pstDYn(i, j) + ptopDY)**cap + tairSL(i, j) = min(tairDY(i, j, mz), tairSL(i, j)) + tairSL(i, j) = tairDY(i, j, mz) !+CA+! + enddo + enddo + + ! +--Mask initialisation + ! + =================== + iveg_13 = 0 + do i = 1, mx + do j = 1, my + if(ivegTV(i, j, 1) == 14 .or. ivegTV(i, j, 1) == -1) then + print *, "warning iveg=-1", i, j + iveg_13 = 1 + ivegTV(i, j, 1) = -1 + endif + enddo + enddo + + do i = 1, mx + do j = 1, my + do k = 1, mw + mskSNo(i, j, k) = 0 + ! ifraTV = SFR = NSTsfr + if(isolSL(i, j) >= 3 .and. k /= nsx) mskSNo(i, j, k) = ifraTV(i, j, k) + if(isolSL(i, j) >= 3 .and. k == nsx) mskSNo(i, j, k) = 0. + if(isolSL(i, j) >= 3 .and. iveg_13 == 1) then + if(ivegTV(i, j, k) == -1 .and. k == 1) then + ivegTV(i, j, k) = 0. + mskSNo(i, j, k) = ifraTV(i, j, k) + alaiTV(i, j, k) = 0. + glf_TV(i, j, k) = 0. + else + mskSNo(i, j, k) = 0. + endif + endif + enddo + enddo + enddo + + ! +--Surface initialisation + ! + ====================== + + ! 1) Ocean and Sea Ice Points + ! --------------------------- + + dzsSNo = 0.; rosSNo = 0.; g1sSNo = 0.; g2sSNo = 0. + nhsSNo = 0.; tisSNo = 0.; wasSNo = 0.; agsSNo = 0. + nssSNo = 0; nisSNo = 0; issSNo = 0; snohSN = 0. + SWaSNo = 0. + + do j = 1, my + do i = 1, mx + do n = 1, nsx + TsrfSL(i, j, n) = tairSL(i, j) + TvegTV(i, j, n) = tairSL(i, j) + if((isolSL(i, j) < 3)) then + i_sea = i + j_sea = j + isolTV(i, j) = 0 + SLsrfl(i, j, 1) = 1. + ifraTV(i, j, 1) = 100 + AlbSTV(i, j) = 0.15 ! / 2 in SISVAT + ! to not have problem when the ice sea melt + do isn = 1, llx + TsolTV(i, j, n, isn) = SST_LB(i, j) + eta_TV(i, j, n, isn) = 1. + enddo + endif + enddo + enddo + enddo + + ! 2) Snow zone + ! ------------ + INI = 1 + write(mxc, '(i3)') mx + if(mx < 100) write(mxc, '(i2)') mx + write(myc, '(i3)') my + if(my < 100) write(myc, '(i2)') my + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + if(TypeGL(1:2) == "GR") INI = 2 + if(TypeGL(1:2) == "SV") INI = 4 + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if(TypeGL(1:5) /= "GRini" .and. ( & + TypeGL(1:2) == "GR" .or. & + TypeGL == "SV7.5km" .or. TypeGL == "SV5km")) then + INI = 3 + write(iyrrGEc, '(i4)') iyrrGE + Filename = 'MARini-'//trim(TypeGL)//'-'// & + trim(mxc)//'x'//trim(myc)//'-'// & + iyrrGEc//'.cdf' + print *, "Read of "//trim(Filename) + call CF_READ3D(TRIM(Filename), 'AG1', 1, mx, my, nsno, ag1) + call CF_READ3D(TRIM(Filename), 'DZ1', 1, mx, my, nsno, dz1) + call CF_READ3D(TRIM(Filename), 'NH1', 1, mx, my, nsno, nh1) + call CF_READ3D(TRIM(Filename), 'G11', 1, mx, my, nsno, g11) + call CF_READ3D(TRIM(Filename), 'G21', 1, mx, my, nsno, g21) + call CF_READ3D(TRIM(Filename), 'TI1', 1, mx, my, nsno, ti1) + call CF_READ3D(TRIM(Filename), 'RO1', 1, mx, my, nsno, ro1) + call CF_READ3D(TRIM(Filename), 'WA1', 1, mx, my, nsno, wa1) + call CF_READ2D(TRIM(Filename), 'NS1', 1, mx, my, 1, ns1) + call CF_READ2D(TRIM(Filename), 'NI1', 1, mx, my, 1, ni1) + endif + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + if(TypeGL(1:2) == "AN") then + INI = 5 + ! reset + if(reset_snow) INI = 7 + ! From old snowfiles + write(iyrrGEc, '(i4)') iyrrGE + Filename = 'MARini-'//trim(TypeGL)//'-'// & + trim(mxc)//'x'//trim(myc)//'-'// & + iyrrGEc//'.cdf' + inquire(file=trim(Filename), exist=file_exists) + if(file_exists) then + INI = 6 !CKittel yearly IniSNOW from ANT-35km snow conditions + print *, "Read of "//trim(Filename) + call CF_READ3D(TRIM(Filename), 'AG1', 1, mx, my, nsno, ag1) + call CF_READ3D(TRIM(Filename), 'DZ1', 1, mx, my, nsno, dz1) + call CF_READ3D(TRIM(Filename), 'NH1', 1, mx, my, nsno, nh1) + call CF_READ3D(TRIM(Filename), 'G11', 1, mx, my, nsno, g11) + call CF_READ3D(TRIM(Filename), 'G21', 1, mx, my, nsno, g21) + call CF_READ3D(TRIM(Filename), 'TI1', 1, mx, my, nsno, ti1) + call CF_READ3D(TRIM(Filename), 'RO1', 1, mx, my, nsno, ro1) + call CF_READ3D(TRIM(Filename), 'WA1', 1, mx, my, nsno, wa1) + call CF_READ2D(TRIM(Filename), 'NS1', 1, mx, my, 1, ns1) + call CF_READ2D(TRIM(Filename), 'NI1', 1, mx, my, 1, ni1) + endif + + if(INI == 5) then + firstPoint = 0. + Filename = 'MARini-'//trim(TypeGL)//'-'// & + trim(mxc)//'x'//trim(myc)//'.cdf' + inquire(file=trim(Filename), exist=file_exists) + if(file_exists) then + write(6, *) " Reading ", TRIM(Filename) + write(6, *) 'RHOSINI' + call CF_READ3D(TRIM(Filename), 'RHOSINI', 1, mx, my, 1, rosSNo_ini) + write(6, *) 'STINI' + call CF_READ3D(TRIM(Filename), 'STINI', 1, mx, my, 1, tasSNo_ini) + write(6, *) 'SMBINI' + call CF_READ3D(TRIM(Filename), 'SMBINI', 1, mx, my, 1, smbSNo_ini) + write(6, *) " > end reading" + smbSNo_ini = max(smbSNo_ini, 20.) + else + write(6, *) " ERROR: ", trim(Filename), " does not exist" + write(6, *) " >> Use ~/MAR/usr/compute_MARini-AN.jnl" + stop + endif + endif + endif + + write(6, *) + write(6, 150) jdarGE, mmarGE, iyrrGE, trim(TypeGL(1:7)), & + mx, my, mz, mw, nsno, INI +150 format('inisnow at ', i2, '-', i2, '-', i4, ':', & + ' type=', a7, ' mx=', i4, ' my=', i4, & + ' mz=', i3, ' mw=', i3, ' nsno=', i3, ' INI=', i2) + write(6, *) + + do j = 1, my + do i = 1, mx + if(isolSL(i, j) >= 3) then + if(GElonh(i, j) * convhd > -43) then ! Equilibrium line (m) + ELA = -32759.680 + 1001.782 & + * GElatr(i, j) * convrd & + - 7.331 * GElatr(i, j) * GElatr(i, j) & + * convrd * convrd + else + ELA = -23201.445 + 746.249 & + * GElatr(i, j) * convrd & + - 5.640 * GElatr(i, j) * GElatr(i, j) & + * convrd * convrd + endif + ELA = max(650., ELA) + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + denss = max(450., 1700.*(1.-(sh(i, j) / (1.5 * ELA))**2)) + g2s = max(5., 20.*(1.-(sh(i, j) / (1.5 * ELA))**2)) + ! Svalbard + if(INI == 4) then + g2s = 3 + ann_temp(i, j) = 273.15 - 10 + endif + + ! Antarctica + if(INI == 5 .and. GElatr(i, j) < -1.047) then !-1.047 = -60 deg., for large area with Ant + extraland + g2s = 3 + ! mean annual temperature + ann_temp(i, j) = tasSNo_ini(i, j) + endif + + ! firn density: exp interpollated between 920 and denss + ! firn temp : linearly interpollated between TairSL and T annual + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do n = 1, nsx + if(mskSNo(i, j, n) > 0 .and. n /= nsx) then + nbr_layer = 15 + if(INI == 7) nbr_layer = 29 !CK reset + else + nbr_layer = 0 + endif + nisSNo(i, j, n) = 0. + ice_depth = 20. + depth = ice_depth + if(nbr_layer > 0) then + do k = 1, nbr_layer + ! ca 4 m in 8 layers of Profil_8 + if(nbr_layer == 15 .and. ice_depth == 30.) then + dzsSNo(i, j, n, k) = Profil_15_30m(nbr_layer - k + 1) + else if(nbr_layer == 29 .and. ice_depth == 20.) then + ! INI==7, CK from reset Cecile + dzsSNo(i, j, n, k) = profil_29_20m(nbr_layer - k + 1) + else + dzsSNo(i, j, n, k) = max(0.01, & + ice_depth * Profil_15(nbr_layer - k + 1)) + endif + depth = depth - dzsSNo(i, j, n, k) / 2. !+CA+! + nhsSNo(i, j, n, k) = 0. + g1sSNo(i, j, n, k) = 99. + g2sSNo(i, j, n, k) = 99. + wasSNo(i, j, n, k) = 0. + agsSNo(i, j, n, k) = 0. + tairSL(i, j) = min(273., tairSL(i, j)) + distup = min(1., max(0., 1.-depth / ice_depth)) + tisSNo(i, j, n, k) = ann_temp(i, j) * (1.-distup**2) & + + tairSL(i, j) * distup**2 + rosSNo(i, j, n, k) = denss * (1.-distup**2) & + + 300.*distup**2 + ! Svalbard + if(INI == 4) & + rosSNo(i, j, n, k) = min(920., max(500., & + 500.+(400.-sh(i, j)))) + ! All + if(k >= nbr_layer - 5) & + rosSNo(i, j, n, k) = min(250.+50.*(nbr_layer - k), & + rosSNo(i, j, n, k)) + if(rosSNo(i, j, n, k) >= roCdSV + 70) rosSNo(i, j, n, k) = 920 + if(rosSNo(i, j, n, k) < roCdSV + 70) g2sSNo(i, j, n, k) = g2s + ! Greenland + if(INI == 2) then + rosSNo(i, j, n, k) = ro_ini(i, j, nbr_layer - k + 1) + tisSNo(i, j, n, k) = ti_ini(i, j, nbr_layer - k + 1) * (1.-distup**2) & + + tairSL(i, j) * distup**2 + g1sSNo(i, j, n, k) = g1_ini(i, j, nbr_layer - k + 1) + g2sSNo(i, j, n, k) = g2_ini(i, j, nbr_layer - k + 1) + endif + if(INI == 3 .or. INI == 6) tisSNo(i, j, n, k) = ti1(i, j, k) + + ! All + rosSNo(i, j, n, k) = max(200., rosSNo(i, j, n, k)) + rosSNo(i, j, n, k) = min(920., rosSNo(i, j, n, k)) + tisSNo(i, j, n, k) = min(273., tisSNo(i, j, n, k)) + depth = depth - dzsSNo(i, j, n, k) / 2. + if(rosSNo(i, j, n, k) >= roCdSV + 70) nisSNo(i, j, n) = k + enddo ! k = 1,nbr_layer + ! Antarctica + if(INI == 5 .and. GElatr(i, j) < -1.047) then ! + if(rosSNo_ini(i, j) == 470) firstPoint = firstPoint + 1 + if(firstPoint == 1 .and. verboseAntarctica) then + print *, "[Ant] snowpack initialization" + endif + ! surface layer + rosSNo(i, j, n, nbr_layer) = rosSNo_ini(i, j) + deltaPa = 0.0 + & + rosSNo_ini(i, j) * & + dzsSNo(i, j, n, nbr_layer) / 2.* & + gravit * 1e-6 ! overburden pressure (MPa) + ! lower layers + if(nbr_layer > 1) then + ro_w = 1000 ! water density (kg m-3) + ro_i = 917 ! ice density (kg m-3) + R_gc = 8.3144621 ! gas constant (J mol-1 K-1) + E_1 = 10160 ! activation energy (J mol-1) + E_2 = 60000 ! activation energy (J mol-1) + Ao = 2.54e4 ! constante (MPa-3 s-1) + tas = tasSNo_ini(i, j) ! mean surface temperature (K) + do k = nbr_layer - 1, 1, -1 + ro_up = rosSNo(i, j, n, k + 1) + dz = (dzsSNo(i, j, n, k + 1) + dzsSNo(i, j, n, k)) / 2. + drhodz = -9999 + deltaPa = deltaPa + ro_up * dz * gravit * 1.e-6 + if(firstPoint == 1 .and. verboseAntarctica) then + print *, "[Ant] i,j,n,k: ", i, j, n, k + endif + if(ro_up <= 550.) then + ! Ligtenberg (2011) > Barnola (1991) + ! drhodz : 11 -> (m-1) + drhodz = 11 * ro_up / ro_w * (ro_i - ro_up) * & + exp(-E_1 / (R_gc * tas)) + if(firstPoint == 1 .and. verboseAntarctica) then + print *, "[Ant] drdz : ", drhodz + print *, "[Ant] drdz 1: ", 11 * ro_up * (ro_i - ro_up) + print *, "[Ant] drdz 2: ", E_1 / (R_gc * tas) + print *, "[Ant] drdz 3: ", exp(-E_1 / (R_gc * tas)) + endif + else + ! Ligtenberg (2011) > Barnola (1991) + fe_ro = 10.** & + (-37.455 * (ro_up / 1000.)**3 & + + 99.743 * (ro_up / 1000.)**2 & + - 95.027 * (ro_up / 1000.) & + + 30.673) + ! drhodz : Ao (MPa-3 s-1); deltaPa (MPa) + drhodz = Ao * deltaPa**3 * ro_up / & + (smbSNo_ini(i, j) / (365 * 24 * 3600)) * & + ro_up * fe_ro * exp(-E_2 / (R_gc * tas)) + if(firstPoint == 1 .and. verboseAntarctica) then + print *, "[Ant] Ao*ro_up: ", Ao * ro_up + print *, "[Ant] smb: ", smbSNo_ini(i, j) / (365 * 24 * 3600) + print *, "[Ant] fe: ", fe_ro + print *, "[Ant] dPa: ", deltaPa + print *, "[Ant] ddPa: ", ro_up * dz * gravit * 1e-6 + print *, "[Ant] exp: ", exp(-E_2 / (R_gc * tas)) + endif + endif ! ro_up<=550. + rosSNo(i, j, n, k) = rosSNo(i, j, n, k + 1) + drhodz * dz + if(firstPoint == 1 .and. verboseAntarctica) then + print *, "[Ant] ro_up: ", ro_up + print *, "[Ant] dz: ", dz + print *, "[Ant] tas: ", tas + print *, "[Ant] drhodz: ", drhodz + print *, "[Ant] rosSNo: ", rosSNo(i, j, n, k) + endif + enddo ! k = nbr_layer-1,1,-1 + do k = 1, nbr_layer + g1sSNo(i, j, n, k) = 99. + g2sSNo(i, j, n, k) = g2s + rosSNo(i, j, n, k) = max(300., rosSNo(i, j, n, k)) + rosSNo(i, j, n, k) = min(920., rosSNo(i, j, n, k)) + if(rosSNo(i, j, n, k) >= roCdSV) nisSNo(i, j, n) = k + enddo + endif ! nbr_layer>1 + endif ! INI==5 (Antarctica) + endif ! if (nbr_layer> 0 ) + + ! Antarctica reset + if(INI == 7 .and. GElatr(i, j) < -1.047) then + ! initialize mean variables (unrealistic) + mean_temp = TfSnow + mean_dens = 300. + ! loop on grid cells + ! approximations for mean_temp and mean_dens + ! from Feulner et al., 2013 (DOI: 10.1175/JCLI-D-12-00636.1) + ! Fig. 3 and 5 : the lapse rate vs. latitude at high latitude is about 0.55 °C °lat-1 + ! with a moist-adiabatic lapse rate of 5 °C km-1 everywhere except for Antarctica, + ! for Antarctica, a dry-adiabatic lapse rate of 9.8 °C km-1 is assumed. + + ! Antarctica mean temperature : function of altitude and latitude + ! for altitudes 0. to 500. m, lat_scale varies from 1.3 to 0.6 °C °lat-1 + lat_scale = (0.6 - 1.3) / 500.*sh(i, j) + 1.3 + lat_scale = max(min(lat_scale, 1.3), 0.6) + ! for altitudes 0. to 500. m, sh_scale varies from 6.5 to 9.8 °C km-1 + sh_scale = (9.8 - 6.5) / 500.*sh(i, j) + 6.5 + sh_scale = max(min(sh_scale, 9.8), 6.5) + mean_temp = TfSnow - 7.-sh_scale * sh(i, j) / 1000. & + +lat_scale * (GElatr(i, j) * 180./pi + 60.) + + ! Antarctica surface density : function of mean annual temperature + ! surface density of 350. kg m-3 at Dome C and 450. kg m-3 at Prud'homme (Agosta et al. 2013) + ! 350 kg m-3 is a typical value for the Antarctic plateau around 3200 m. + ! Weinhart et al 2020 https://doi.org/10.5194/tc-14-3663-2020 and Sugiyama et al. 2011 oi: 10.3189/2012JoG11J201 + ! 320 kg m-3 is reached at Dome A, 4100 m a.s.l. + ! Dome C : st_ant_param(3233, -75.1) = -47.7 + ! Dumont d'Urville : st_ant_param(0, -66.66) = -15.7 + mean_dens = (450.-320.) / (-15.7 + 47.7) * (mean_temp - TfSnow + 15.7) + 450. + mean_dens = min(450., max(320., mean_dens)) + + depth = ice_depth + do k = 1, 29 + nhsSNo(i, j, n, k) = 0. + g1sSNo(i, j, n, k) = 99. + g2sSNo(i, j, n, k) = 3. + wasSNo(i, j, n, k) = 0. + agsSNo(i, j, n, k) = 0. + ! distance to surface + depth = depth - dzsSNo(i, j, n, k) / 2. + distup = min(1., max(0., depth / ice_depth)) + ! TsisSV : Temperature [K], square interpolation between Tsf_SV (surface) and mean_temp (bottom) + tisSNo(i, j, n, k) = tairSL(i, j) * (1.-distup**2) + mean_temp * distup**2 + ! firn density : densification formulas from : + ! Ligtenberg et al 2011 eq. (6) (www.the-cryosphere.net/5/809/2011/) + ! equivalent to Arthern et al. 2010 eq. (4) "Nabarro-Herring" (doi:10.1029/2009JF001306) + ! Integration of the steady state equation + ! ln_smb approximated as a function of temperature + ln_smb = max((mean_temp - TfSnow) * 5./60.+8., 3.) + ! alpha0, alpha1 : correction coefficient as a function of ln_SMB from Ligtenberg 2011, adjusted for alpha1 + alpha0 = max(1.435 - 0.151 * ln_smb, 0.25) + alpha1 = max(2.0111 - 0.2051 * ln_smb, 0.25) + E0 = C0 * gravit * exp((E_g - E_c) / & + (R * mean_temp)) * ro_ice * alpha0 + E1 = C1 * gravit * exp((E_g - E_c) / & + (R * mean_temp)) * ro_ice * alpha1 + z550 = log((ro_ice / mean_dens - 1.) / & + (ro_ice / 550.-1.)) / E0 + rho0 = exp(E0 * depth) / (ro_ice / & + mean_dens - 1 + exp(E0 * depth)) * ro_ice + rho1 = exp(E1 * depth) / (ro_ice & + / mean_dens - 1 + exp(E1 * depth)) * ro_ice + if(depth <= z550) then + rosSNo(i, j, n, k) = exp(E0 * depth) / & + (ro_ice / mean_dens - 1 & + + exp(E0 * depth)) * ro_ice + else + rosSNo(i, j, n, k) = exp(E1 * (depth - z550)) & + / (ro_ice / 550.-1 + & + exp(E1 * (depth - z550))) * ro_ice + endif + depth = depth - dzsSNo(i, j, n, k) / 2. + enddo + endif ! INI==7 (reset) + + nssSNo(i, j, n) = nbr_layer + issSNo(i, j, n) = 0 + snohSN(i, j, n) = 0. + SWaSNo(i, j, n) = 0. + TsrfSL(i, j, n) = tairSL(i, j) + TvegTV(i, j, n) = tairSL(i, j) + if(isolSL(i, j) == 3) then + isolTV(i, j) = 12 + iwafTV(i, j) = 0 + ivegTV(i, j, n) = 0 + alaiTV(i, j, n) = 0. + glf_TV(i, j, n) = 0. + ! SLsrfl(i,j,1) = 1. + ! ifraTV(i,j,1) = 100 + AlbSTV(i, j) = 0.55 + do isn = 1, llx + TsolTV(i, j, n, isn) = max(230., tisSNo(i, j, n, 1)) + eta_TV(i, j, n, isn) = 0. + enddo + else + ! albedo / 2 in SISVAT if satured soil + AlbSTV(i, j) = 0.25 + do isn = 1, llx + eta_TV(i, j, n, isn) = max(0.01, eta_TV(i, j, n, isn)) + if(nbr_layer > 0) then + TsolTV(i, j, n, isn) = max(230., tisSNo(i, j, n, 1)) + eta_TV(i, j, n, isn) = 0. + endif + enddo + endif + enddo + + if(INI == 3 .or. INI == 6) then + do n = 1, 1 !nsx-1 + nssSNo(i, j, n) = ns1(i, j) + nisSNo(i, j, n) = ni1(i, j) + if(nsno < 20) then + print *, "inisnow: nsno<20!"; stop + endif + do k = 1, nsno + agsSNo(i, j, n, k) = ag1(i, j, k) + dzsSNo(i, j, n, k) = dz1(i, j, k) + nhsSNo(i, j, n, k) = nh1(i, j, k) + g1sSNo(i, j, n, k) = g11(i, j, k) + g2sSNo(i, j, n, k) = g21(i, j, k) + wasSNo(i, j, n, k) = wa1(i, j, k) + tisSNo(i, j, n, k) = max(ti1(i, j, k), 230.) + rosSNo(i, j, n, k) = min(920.00, max(ro1(i, j, k), 300.)) + if(rosSNo(i, j, n, k) > 900) then + wasSNo(i, j, n, k) = 0. + tisSNo(i, j, n, k) = min(270.15, tisSNo(i, j, n, k)) + endif + enddo + enddo + endif + endif + enddo + enddo + +#if(iso) + ! isotopic initialization of snowpack + call mariso_init_sno(iso_init_type, rosSNo, wasSNo, SWaSNo, rosSNo_iso, wasSNo_iso, SWaSNo_iso) + ! isotopic initialization of soil + call mariso_init_tv(iso_init_type, eta_TV, eta_TV_iso) + snohSN_iso = 0. +#endif + + do i = 1, mx + do j = 1, my + do k = 1, nsx + do n = 1, nsno + if(agsSNo(i, j, k, n) <= 1000 .and. dzsSNo(i, j, k, n) > 0) then + agsSNo(i, j, k, n) = real(jdarGE + njyrGE(mmarGE)) / 365.+iyrrGE + endif + enddo + enddo + enddo + enddo + + ! +--Initial snow height + ! + =================== + do j = 1, my + do i = 1, mx + do k = 1, nvx + zn0IB(i, j, k) = 0.0 + mb0IB(i, j, k) = 0.0 + if(nssSNo(i, j, k) > 0) then + do nk = nsno, 1, -1 + if(nssSNo(i, j, k) < nk) dzsSNo(i, j, k, nk) = 0. + enddo + znsn(i, j, nsno) = dzsSNo(i, j, k, nsno) + snwae(i, j, nsno) = rosSNo(i, j, k, nsno) & + * dzsSNo(i, j, k, nsno) * 1.d3 / ro_Wat + do nk = nsno - 1, 1, -1 + znsn(i, j, nk) = dzsSNo(i, j, k, nk) + znsn(i, j, nk + 1) + snwae(i, j, nk) = rosSNo(i, j, k, nk) * dzsSNo(i, j, k, nk) * 1.d3 & + / ro_Wat + snwae(i, j, nk + 1) + enddo + zn0IB(i, j, k) = max(0., znsn(i, j, 1)) + mb0IB(i, j, k) = max(0., snwae(i, j, 1)) + endif + if(nssSNo(i, j, 1) >= 10) then + ni = i + nj = j + endif + enddo + enddo + enddo + + ! +--Output + ! + ====== + open(unit=111, status='replace', file='inisnow.out') + do nk = 1, 1 + write(111, *) 'Coord:', ni, nj + write(111, 401) + do n = nsno, 1, -1 + write(111, 402) n, znsn(ni, nj, n), dzsSNo(ni, nj, 1, n) * 1000, & + tisSNo(ni, nj, 1, n), rosSNo(ni, nj, 1, n), & + wasSNo(ni, nj, 1, n), snwae(ni, nj, n), & + agsSNo(ni, nj, 1, n), zero, zero, g1sSNo(ni, nj, 1, n), & + g2sSNo(ni, nj, 1, n), nhsSNo(ni, nj, 1, n) + enddo + write(111, *) 'mb0IB :', mb0IB(ni, nj, 1) + write(111, *) 'zn0IB :', zn0IB(ni, nj, 1) + write(111, *) 'nssSNo :', nssSNo(ni, nj, 1) + write(111, *) 'nisSNo :', nisSNo(ni, nj, 1) + write(111, *) 'SH :', sh(ni, nj) + write(111, *) 'tairSL :', tairSL(ni, nj) + write(111, *) 'tsrfSL :', tsrfSL(ni, nj, 1) + write(111, *) 't2_SL :', t2_SL(ni, nj) + write(111, *) 'd1_SL :', d1_SL(ni, nj) + write(111, *) 'SL_z0 :', SL_z0(ni, nj, 1) + write(111, *) 'SL_r0 :', SL_r0(ni, nj, 1) + write(111, *) 'SLuusl :', SLuusl(ni, nj, 1) + write(111, *) 'SLutsl :', SLutsl(ni, nj, 1) + write(111, *) 'eps0SL :', eps0SL(ni, nj) + enddo + close(111) + +401 format(/, ' Internal Characteristics', & + /, ' ========================', & + /, ' n | z | dz | T | rho | W |', & + ' z(WE) | Age | Extin | UW | Dendr.| Spher.| Hist. |', & + /, ' | [m] | [mm] | [K] | kg/m3 | kg/kg |', & + ' [mm] | [d] | | mim/s | /Sphe.| /Size | |', & + /, '----+-------+-------+--------+-------+-------+', & + '-------+-------+-------+-------+-------+-------+-------+') +402 format((i3, ' |', f6.2, ' |', f6.1, ' |', f7.2, ' |', f6.1, ' |', & + f6.3, ' |', f7.0, '|', f6.1, ' |', f6.3, ' |', f6.2, ' |', & + 2(f6.1, ' |'), i4, ' |')) + + deallocate(snwae) + deallocate(znsn) + deallocate(ag1) + deallocate(dz1) + deallocate(nh1) + deallocate(g11) + deallocate(g21) + deallocate(ti1) + deallocate(ro1) + deallocate(wa1) + + return +endsubroutine inisnow + +subroutine UPDsnow + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE XF MAR | + ! +------------------------------------------------------------------------+ + ! + + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mar_ib + + implicit none + + ! +--Local Variables + ! + ================= + integer i, j, k, n + real dz_old, zn_old, mb_old, ro_old, dz_tot + real maxlimit, minlimit + real, parameter :: change = 0.01 ! percentage change (0-1) + maxlimit = 22 + minlimit = 20 ! Max/Min Snow Height +! #if(GR) +! maxlimit = 31 +! minlimit = 29 +! #endif + + ! checking of zn1IB + ! ----------------- + do i = 1, mx + do j = 1, my + do n = 1, nsx + dz_tot = 0. + do k = nsno, 1, -1 + dz_tot = dzsSNo(i, j, n, k) + dz_tot + enddo + if(dz_tot > maxlimit) then + k = 1 + zn_old = zn0IB(i, j, n) + dz_old = dzsSNo(i, j, n, k) + mb_old = dzsSNo(i, j, n, k) * rosSNo(i, j, n, k) + ro_old = rosSNo(i, j, n, k) + if(dz_old > 1.01) then + dzsSNo(i, j, n, k) = dzsSNo(i, j, n, k) - 1. + rosSNo(i, j, n, k) = max(rosSNo(i, j, n, k + 1), rosSNo(i, j, n, k) * & + (1.-change)) + else + dzsSNo(i, j, n, k) = 0.1 * dzsSNo(i, j, n, k) + rosSNo(i, j, n, k) = rosSNo(i, j, n, k + 1) + endif + + zn0IB(i, j, n) = zn0IB(i, j, n) + & + (dzsSNo(i, j, n, k) - dz_old) + mb0IB(i, j, n) = mb0IB(i, j, n) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + wet0IB(i, j, n) = wet0IB(i, j, n) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + if(n == 1) smbh0IB(i, j) = smbh0IB(i, j) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + + write(*, *) ' ' + write(*, 10) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, i, j, & + dz_tot, dz_tot - (zn_old - zn0IB(i, j, n)), & + ro_old, rosSNo(i, j, n, k) +10 format(' UPDsnow (min) at', i5, 4i3, & + ' for (', i3, ','i3, ') : ZN ', f5.2, '=>', f5.2, & + ' RO ', f8.1, '=>', f8.1) + write(*, *) ' ' + endif + if(mskSNo(i, j, n) > 0 .and. n /= nsx .and. dz_tot > minlimit / 10. .and. dz_tot < minlimit) then + k = 1 + zn_old = zn0IB(i, j, n) + dz_old = dzsSNo(i, j, n, k) + mb_old = dzsSNo(i, j, n, k) * rosSNo(i, j, n, k) + ro_old = rosSNo(i, j, n, k) + ! warning : it might not be ok for Antarctica + ! todo : check if ok for Antarctica + ! tisSNo(i,j,n,k) = min(tisSNo(i,j,n,k)*0.999,272.15) + tisSNo(i, j, n, k) = min(tisSNo(i, j, n, k), 272.15) + if(tisSNo(i, j, n, k) <= 273.15 - 15) then + tisSNo(i, j, n, k) = (tisSNo(i, j, n, k) * dzsSNo(i, j, n, k) + 273.15 - 15 * 1) / (dzsSNo(i, j, n, k) + 1) + endif + + dzsSNo(i, j, n, k) = dzsSNo(i, j, n, k) + 1. + + if(dz_tot > minlimit - 1.) then + rosSNo(i, j, n, k) = rosSNo(i, j, n, k) * (1.+change) + wasSNo(i, j, n, k) = wasSNo(i, j, n, k) * (1.-change) + else + wasSNo(i, j, n, k) = wasSNo(i, j, n, k) * dz_old & + / dzsSNo(i, j, n, k) + endif + + if(rosSNo(i, j, n, k) > 875) then + rosSNo(i, j, n, k) = ro_ice + wasSNo(i, j, n, k) = 0. + endif + + zn0IB(i, j, n) = zn0IB(i, j, n) + & + (dzsSNo(i, j, n, k) - dz_old) + mb0IB(i, j, n) = mb0IB(i, j, n) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + wet0IB(i, j, n) = wet0IB(i, j, n) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + if(n == 1) smbh0IB(i, j) = smbh0IB(i, j) + rosSNo(i, j, n, k) & + * dzsSNo(i, j, n, k) - mb_old + + write(*, *) ' ' + write(*, 11) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, i, j, & + dz_tot, dz_tot + (zn0IB(i, j, n) - zn_old), & + ro_old, rosSNo(i, j, n, k) +11 format(' UPDsnow (add) at', i5, 4i3, & + ' for (', i3, ','i3, ') : ZN ', f5.2, '=>', f5.2, & + ' RO ', f8.1, '=>', f8.1) + write(*, *) ' ' + endif + enddo + enddo + enddo +endsubroutine UPDsnow + +subroutine FILsnow + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE XF MAR | + ! +------------------------------------------------------------------------+ + + use marphy + use marctr + use mar_sv + use mardim + use margrd + use mar_ge + use mar_dy + use mar_lb + use mar_sl + use mar_bs + use mar_io + use mar_tv + use marssn + use mardsv + use mar_ib + + implicit none + + ! +--Local Variables + ! + ================= + + integer i, j, k, n, l, filtering + real ro_new, ww, g1_new, g2_new, ti_new, al_new + real nbr1, nbr2 + + do i = 2, mx - 1; do j = 2, my - 1; do n = 1, nsx - 1 !*CL* + if(mskSNo(i, j, n) >= 50) then !*CL* + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + nbr1 = 0; nbr2 = 0 + g1_new = 0; g2_new = 0; ro_new = 0; ti_new = 0; al_new = 0 + + do k = -1, 1; do l = -1, 1 + if(mskSNo(i + k, j + l, n) >= 50 .and. & + rosSNo(i + k, j + l, n, max(1, nssSNo(i + k, j + l, n))) < roCdSV) then + ww = 1 + if(k == 0 .or. l == 0) ww = 2 + if(k == 0 .and. l == 0) ww = 4 + + ww = ww * dzsSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) + + if(g1sSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) >= 0) then + g1_new = g1_new + g1sSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + g2_new = g2_new + g2sSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + endif + + ro_new = ro_new + rosSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + ti_new = ti_new + tisSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + al_new = al_new + albxSL(i + k, j + l, n) * ww + + nbr1 = nbr1 + ww + nbr2 = nbr2 + 1 + + endif + enddo; + enddo + + g1_new = g1_new / nbr1 + g2_new = g2_new / nbr1 + ro_new = ro_new / nbr1 + ti_new = ti_new / nbr1 + al_new = al_new / nbr1 + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + filtering = 0 + + if(nbr2 == 9 .and. & + g2sSNo(i, j, n, nssSNo(i, j, n)) > 1.1 * g2_new .and. & + rosSNo(i, j, n, nssSNo(i, j, n)) < roCdSV .and. & + albxSL(i, j, n) < al_new - 0.05 .and. & + g2_new < 50. .and. & + albxSL(i, j, n) < 0.70 .and. & + albxSL(i, j, n) > 0.50 .and. & + g2sSNo(i, j, n, nssSNo(i, j, n)) < 75.) filtering = 1 + + ! if(nbr2==9.and.albxSL(i,j,n)<al_new-0.1 .and. + ! . g2sSNo(i,j,n,nssSNo(i,j,n))<80 .and. + ! . g1sSNo(i,j,n,nssSNo(i,j,n))<80 ) filtering=2 + + if(filtering > 0) then + + write(*, *) ' ' + write(*, 12) iyrrGE, mmarGE, jdarGE, jhurGE, minuGE, i, j, filtering, & + rosSNo(i, j, n, nssSNo(i, j, n)), ro_new, & + g1sSNo(i, j, n, nssSNo(i, j, n)), g1_new, & + g2sSNo(i, j, n, nssSNo(i, j, n)), g2_new, & + albxSL(i, j, n), al_new +12 format('Filtering', & + i5, 4i3, ' for (', i3, ','i3, ')', i2, f6.1, '=>', f6.1, & + f6.1, '=>', f6.1, ',', f7.2, '=>', f7.2, f5.2, '=>', f5.2) + write(*, *) + + g1sSNo(i, j, n, nssSNo(i, j, n)) = min(g1_new, & + g1sSNo(i, j, n, nssSNo(i, j, n))) + g2sSNo(i, j, n, nssSNo(i, j, n)) = min(g2_new, & + g2sSNo(i, j, n, nssSNo(i, j, n))) + tisSNo(i, j, n, nssSNo(i, j, n)) = min(ti_new, & + tisSNo(i, j, n, nssSNo(i, j, n))) + ro_new = min(ro_new, & + rosSNo(i, j, n, nssSNo(i, j, n))) + dzsSNo(i, j, n, nssSNo(i, j, n)) = dzsSNo(i, j, n, nssSNo(i, j, n)) & + * rosSNo(i, j, n, nssSNo(i, j, n)) & + / ro_new + rosSNo(i, j, n, nssSNo(i, j, n)) = ro_new + endif + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if(mmarGE <= 3 .or. mmarGE >= 11) then + tisSNo(i, j, n, 1) = min(273.14, tisSNo(i, j, n, 1)) + endif + + endif; + enddo; + enddo; + enddo + +endsubroutine FILsnow + +subroutine OUTone(TypeGL, ONEint) + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT XF MAR | + ! | | + ! +------------------------------------------------------------------------+ + use marphy + use marctr + use mardim + use margrd + use mar_dy + use mar_ge + use mar_sl + use mar_hy + use mar_ra + use mar_sv + use marssn + use mar_ib + use mar_io + use mar_wk + use mar_ca + use mar_tv + use mar_te + use mar_tu + + implicit none + + INCLUDE 'NetCDF.inc' + + ! +--Local Variables + ! + ================ + ! + + character * (40) fnamNC_one + common / out_nc_one_loc / fnamNC_one + ! +... fnamNC_one: To retain file name. + + integer NdimNC_one + PARAMETER(NdimNC_one=8) + ! +...Number of defined spatial dimensions (exact) + + integer MXdim + PARAMETER(MXdim=9000) + ! +...Maximum Number of all dims: recorded Time Steps + ! + and also maximum of spatial grid points for each direction. + + integer MX_var + PARAMETER(MX_var=120) + ! +...Maximum Number of Variables + + integer NattNC_one + PARAMETER(NattNC_one=2) + ! +...Number of real attributes given to all variables + + ! ------------------------------------------------------------ + integer, intent(in) :: ONEint ! interval (min) + integer, parameter :: ONElev = mz ! nbr levels (<=mz) + integer, parameter :: ONEnbr = 200 ! max nbr of stations + !CA integer , parameter :: ONEint = 5 ! interval (min) + ! ------------------------------------------------------------ + + integer i, j, k + integer ONEsta ! real nbr of stations + integer io + integer i_one(ONEnbr), j_one(ONEnbr) + character * 6 name_tmp + character * 16 attr_tmp + real x0, y0 + real x_tmp, y_tmp, lon_tmp, lat_tmp, sh_tmp + integer i_tmp, j_tmp + real lon_one(ONEnbr), lat_one(ONEnbr), sh_one(ONEnbr) + real x_one(ONEnbr), y_one(ONEnbr) + real one1(ONEnbr), one2(ONEnbr) + real one3(ONEnbr), one4(ONEnbr) + real one5(ONEnbr), one6(ONEnbr) + real one7(ONEnbr, ONElev), one8(ONEnbr, ONElev) + real one9(ONEnbr, ONElev), one10(ONEnbr, ONElev) + real one11(ONEnbr, nsno), one12(ONEnbr, nsno) + real one13(ONEnbr, nsno) + real one14(ONEnbr, llx), one15(ONEnbr, llx) + real one16(8) + real one0snf(ONEnbr), one0rnf(ONEnbr) + real one0rof(ONEnbr), one0evp(ONEnbr) + real uu(ONElev), vv(ONElev) + real WS(ONEnbr, ONElev), WD(ONEnbr, ONElev) + real RH(ONEnbr, ONElev) + + real starti, starta + real yearNC_one(MXdim) + real dateNC_one(MXdim) + real timeNC_one(MXdim) + real VALdim(MXdim, 0:NdimNC_one) + + integer njmo, ipr_nc_one + integer jourNC_one(MXdim) + integer moisNC_one(MXdim) + integer NvatNC_one(NattNC_one) + integer nDFdim(0:NdimNC_one) + + character * (13) NAMdim(0:NdimNC_one) + character * (31) UNIdim(0:NdimNC_one) + character * (13) SdimNC_one(4, MX_var) + character * (31) unitNC_one(MX_var) + character * (13) nameNC_one(MX_var) + character * (50) lnamNC_one(MX_var) + character * (100) tit_nc_one + character * (13) NAMrat(NattNC_one) + character * 120 tmpINP + character * 20 n_one(ONEnbr) + character * 2 station + character * 10 TypeGL + + integer n1000, n100a, n100, n10_a, n10, n1, m10, jd10, jd1 + integer it, mois, mill, itotNC_one + integer NtotNC_one, ID__nc_one + integer nbr_day, nbr_output, dt2 + + integer ii, jj, kk, ll, s, n, mm, nn, one, imex, jmex, t + real qsat0D, q, qst, r, rst, epsilon + + integer ii_sh, jj_sh + real dsh, dshmin + + logical file_exists + + common / OUTone_i / ONEsta, nDFdim, ipr_nc_one, i_one, j_one + common / OUTone_r / yearNC_one, dateNC_one, timeNC_one + common / OUTone_c / n_one + common / OUTone_0 / one0snf, one0rnf, one0rof, one0evp + + real, parameter :: a = & + 6371.229 * 1000.0 ! radius of the Earth + real, parameter :: conv = & + 15.0 * 3.141592 / 180.0 ! Conversion + ! ! hour ==> rad + + ! 1. Station Location Initialization + ! ================================== + + if(iterun == 0) then + + print *, ' ' + print *, 'OUTone initialisation for '//trim(TypeGL) + print *, '================================' + print *, ' ' + + if(TypeGL(1:2) == "AN") then + ONEsta = 0 + call stereosouth_inverse(GElon0, GElat0, GEddxx, x0, y0) + inquire(file='ONEstation.dat', exist=file_exists) + if(file_exists) then + open(unit=10, status='old', file='ONEstation.dat') + !CA write(6,*) "ONEtest 4" + io = 0 + do while(io == 0) + read(10, '(A)', iostat=io) tmpINP + if(io == 0) then + if(tmpINP(1:4) == ' ') then + read(tmpINP, & + '(4x,A6,4x,A21,1x,f6.2,1x,f11.7,1x,f10.1)') & + name_tmp, attr_tmp, lat_tmp, lon_tmp, sh_tmp + call stereosouth_inverse(lon_tmp, lat_tmp, & + GEddxx, x_tmp, y_tmp) + i_tmp = nint((x_tmp - x0) * 1000./dx) + imez + j_tmp = nint((y_tmp - y0) * 1000./dy) + jmez + ! find the closest surface elevation among + ! the four surrounding grid cells + dshmin = sh(i_tmp, j_tmp) + ii_sh = i_tmp + jj_sh = j_tmp + do jj = j_tmp - 1, j_tmp + 1 + dsh = abs(sh_tmp - sh(i_tmp, jj)) + if(dsh < dshmin) then + ii_sh = i_tmp + jj_sh = jj + dshmin = dsh + endif + enddo + do ii = i_tmp - 1, i_tmp + 1 + dsh = abs(sh_tmp - sh(ii, j_tmp)) + if(dsh < dshmin) then + ii_sh = ii + jj_sh = j_tmp + dshmin = dsh + endif + enddo + i_tmp = ii_sh + j_tmp = jj_sh + ! save grid point + if(i_tmp >= 1 .and. i_tmp <= mx & + .and. j_tmp >= 1 .and. j_tmp <= my) then + ONEsta = ONEsta + 1 + s = ONEsta + n_one(s) = name_tmp + i_one(s) = i_tmp + j_one(s) = j_tmp + lon_one(s) = lon_tmp + lat_one(s) = lat_tmp + sh_one(s) = sh_tmp + x_one(s) = x_tmp + y_one(s) = y_tmp + endif + endif + endif + enddo + close(unit=10) + else + write(6, *) "==================================" + write(6, *) "ERROR: ONEstation.dat file missing" + write(6, *) "STOP in OUTone" + write(6, *) "==================================" + stop + endif + if(ONEsta > ONEnbr) then + print *, "ERROR: number of stations in ONEstation.dat" + print *, "is greater than ONEnbr (", ONEnbr, ")" + print *, ">> increase ONEnbr in subrout. OUTone" + stop + endif + call stereosouth_inverse(GElon0, GElat0, GEddxx, x0, y0) + else + ONEsta = ONEnbr + endif + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if(trim(TypeGL) == 'GR25km') then + s = 1 + i_one(s) = 20; j_one(s) = 63; n_one(s) = "Aasiat"; s = s + 1 ! + i_one(s) = 28; j_one(s) = 126; n_one(s) = "Alert"; s = s + 1 ! + i_one(s) = 28; j_one(s) = 55; n_one(s) = "Aurora"; s = s + 1 ! + i_one(s) = 52; j_one(s) = 57; n_one(s) = "Aputiek"; s = s + 1 ! + i_one(s) = 43; j_one(s) = 75; n_one(s) = "Barber"; s = s + 1 ! + i_one(s) = 31; j_one(s) = 67; n_one(s) = "Crawford 1"; s = s + 1 ! + i_one(s) = 31; j_one(s) = 66; n_one(s) = "Crawford 2"; s = s + 1 ! + i_one(s) = 65; j_one(s) = 91; n_one(s) = "Daneborg"; s = s + 1 ! + i_one(s) = 62; j_one(s) = 101; n_one(s) = "Dove Bugt"; s = s + 1 ! (63,101) + i_one(s) = 12; j_one(s) = 103; n_one(s) = "Dundas"; s = s + 1 ! + i_one(s) = 30; j_one(s) = 52; n_one(s) = "Dye-2"; s = s + 1 ! + i_one(s) = 34; j_one(s) = 46; n_one(s) = "Dye-3"; s = s + 1 ! + i_one(s) = 27; j_one(s) = 67; n_one(s) = "ETH-camp"; s = s + 1 ! + i_one(s) = 22; j_one(s) = 56; n_one(s) = "GIMEX-Mast 1"; s = s + 1 ! + i_one(s) = 23; j_one(s) = 56; n_one(s) = "GIMEX-Mast 2"; s = s + 1 ! + i_one(s) = 24; j_one(s) = 56; n_one(s) = "GIMEX-Mast 5"; s = s + 1 ! + i_one(s) = 25; j_one(s) = 56; n_one(s) = "GIMEX-Mast 6"; s = s + 1 ! + i_one(s) = 26; j_one(s) = 56; n_one(s) = "GIMEX-Mast 6-9"; s = s + 1 ! + i_one(s) = 27; j_one(s) = 56; n_one(s) = "GIMEX-Mast 9"; s = s + 1 ! + i_one(s) = 21; j_one(s) = 104; n_one(s) = "Gits"; s = s + 1 ! (21,104) + i_one(s) = 43; j_one(s) = 79; n_one(s) = "Gisp2 (Summit)"; s = s + 1 ! + i_one(s) = 44; j_one(s) = 79; n_one(s) = "Grip"; s = s + 1 ! + i_one(s) = 28; j_one(s) = 121; n_one(s) = "Hall Land"; s = s + 1 ! + i_one(s) = 27; j_one(s) = 108; n_one(s) = "Humboldt"; s = s + 1 ! + i_one(s) = 36; j_one(s) = 31; n_one(s) = "Ikermiuarsuk"; s = s + 1 ! + i_one(s) = 24; j_one(s) = 66; n_one(s) = "Ilulissat"; s = s + 1 ! + i_one(s) = 26; j_one(s) = 67; n_one(s) = "Jar1"; s = s + 1 ! + i_one(s) = 25; j_one(s) = 67; n_one(s) = "Jar2"; s = s + 1 ! + i_one(s) = 25; j_one(s) = 66; n_one(s) = "Jar3"; s = s + 1 ! + i_one(s) = 48; j_one(s) = 79; n_one(s) = "Julie"; s = s + 1 ! + i_one(s) = 23; j_one(s) = 56; n_one(s) = "Kangerdlugssuaq"; s = s + 1 ! + i_one(s) = 22; j_one(s) = 30; n_one(s) = "Kangilinnguit"; s = s + 1 ! + i_one(s) = 44; j_one(s) = 128; n_one(s) = "Kap M. Jesup "; s = s + 1 ! + i_one(s) = 51; j_one(s) = 66; n_one(s) = "Kar"; s = s + 1 ! + i_one(s) = 43; j_one(s) = 78; n_one(s) = "Kenton"; s = s + 1 ! + i_one(s) = 40; j_one(s) = 78; n_one(s) = "Klinck (Mast10)"; s = s + 1 ! + i_one(s) = 42; j_one(s) = 49; n_one(s) = "Kulu"; s = s + 1 ! + i_one(s) = 52; j_one(s) = 91; n_one(s) = "Nasa-E"; s = s + 1 ! + i_one(s) = 36; j_one(s) = 53; n_one(s) = "Nasa-SE"; s = s + 1 ! + i_one(s) = 29; j_one(s) = 86; n_one(s) = "Nasa-U"; s = s + 1 ! + i_one(s) = 44; j_one(s) = 84; n_one(s) = "Matt"; s = s + 1 ! + i_one(s) = 29; j_one(s) = 29; n_one(s) = "Narssarssuaq"; s = s + 1 ! + i_one(s) = 30; j_one(s) = 102; n_one(s) = "NEEM1"; s = s + 1 ! + i_one(s) = 31; j_one(s) = 102; n_one(s) = "NEEM2"; s = s + 1 ! + i_one(s) = 38; j_one(s) = 90; n_one(s) = "Ngrip"; s = s + 1 ! + i_one(s) = 56; j_one(s) = 122; n_one(s) = "Nord"; s = s + 1 ! + i_one(s) = 19; j_one(s) = 44; n_one(s) = "Nuuk (Godthab)"; s = s + 1 ! + i_one(s) = 21; j_one(s) = 34; n_one(s) = "Paamiut"; s = s + 1 ! + i_one(s) = 34; j_one(s) = 24; n_one(s) = "Prins Ch"; s = s + 1 ! + i_one(s) = 29; j_one(s) = 27; n_one(s) = "Qaqortoq"; s = s + 1 ! + i_one(s) = 33; j_one(s) = 50; n_one(s) = "Saddle"; s = s + 1 ! + i_one(s) = 18; j_one(s) = 48; n_one(s) = "Sioralik"; s = s + 1 ! Maniitsoq + i_one(s) = 18; j_one(s) = 55; n_one(s) = "Sisimiut"; s = s + 1 ! + i_one(s) = 31; j_one(s) = 38; n_one(s) = "South Dome"; s = s + 1 ! + i_one(s) = 44; j_one(s) = 78; n_one(s) = "Summit (Cathy)"; s = s + 1 ! + i_one(s) = 46; j_one(s) = 49; n_one(s) = "Tasiilaq"; s = s + 1 ! + i_one(s) = 13; j_one(s) = 104; n_one(s) = "Thules"; s = s + 1 ! + i_one(s) = 47; j_one(s) = 104; n_one(s) = "Tunu-N"; s = s + 1 ! + i_one(s) = 21; j_one(s) = 82; n_one(s) = "Upernavik"; s = s + 1 ! + i_one(s) = 67; j_one(s) = 71; n_one(s) = "Uunartoq"; s = s + 1 ! + one = s - 1 + ONEsta = one + + endif + + if(trim(TypeGL) == 'SVa') then + n_one(1) = 'Svalbard Lufthavn' + i_one(1) = 36; j_one(1) = 44 + + n_one(2) = 'Hopen' + i_one(2) = 60; j_one(2) = 26 + + n_one(3) = 'NY-Alesund' + i_one(3) = 27; j_one(3) = 52 + + n_one(4) = 'Sveagruva' + i_one(4) = 36; j_one(4) = 40 + + n_one(5) = 'Barentsburg' + i_one(5) = 32; j_one(5) = 42 + + n_one(6) = 'Adventalen' + i_one(6) = 36; j_one(6) = 44 + + n_one(7) = 'Breinosa (Kho Aurora Station)' + i_one(7) = 36; j_one(7) = 40 + + n_one(8) = 'Janssonhaugen' + i_one(8) = 36; j_one(8) = 40 + + n_one(9) = 'Gruvefjellet' + i_one(9) = 34; j_one(9) = 40 + + n_one(10) = 'Kapp Lee' + i_one(10) = 48; j_one(10) = 42 + + n_one(11) = 'Rijpfjorden' + i_one(11) = 45; j_one(11) = 39 + + n_one(12) = 'Kvitoya' + i_one(12) = 67; j_one(12) = 68 + + n_one(13) = 'Kongsoya' + i_one(13) = 65; j_one(13) = 53 + + n_one(14) = 'Verlegenhuken' + i_one(14) = 38; j_one(14) = 64 + + n_one(15) = 'Edgeoya-Kapp Heuglin' + i_one(15) = 53; j_one(15) = 44 + + n_one(16) = 'Svarttangen' + i_one(16) = 49; j_one(16) = 36 + + n_one(17) = 'Isfjord Radio' + i_one(17) = 32; j_one(17) = 42 + + n_one(18) = 'Hornsund' + i_one(18) = 35; j_one(18) = 30 + + n_one(19) = 'Svalbard LH - Plataberget' + i_one(19) = 36; j_one(19) = 43 + + one = 19 + ONEsta = one + + endif + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + print *, ' ' + print *, 'Weather Stations MAR coordinates' + print *, ' for Simulation '//trim(TypeGL); print *, ' ' + print *, ' N ii jj Name' + print *, '------------------------------' + + do ll = 1, ONEsta + i_one(ll) = max(1, min(i_one(ll), mx)) + j_one(ll) = max(1, min(j_one(ll), my)) + write(*, '(3i4,x,a20)') ll, i_one(ll), j_one(ll), n_one(ll) + enddo + + print *, '------------------------------' + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! 1.2 variables initialization + ! ---------------------------- + one0snf = 0. + one0rnf = 0. + one0rof = 0. + one0evp = 0. + + ! 2. NetCDF File Initialization + ! ============================= + + n1000 = 1 + iyrrGE / 1000 + n100a = mod(iyrrGE, 1000) + n100 = 1 + n100a / 100 + n10_a = mod(n100a, 100) + n10 = 1 + n10_a / 10 + n1 = 1 + mod(n10_a, 10) + m10 = 1 + mmarGE / 10 + m1 = 1 + mod(mmarGE, 10) + jd10 = 1 + jdarGE / 10 + jd1 = 1 + mod(jdarGE, 10) + + ! + 2.1 Output File Label + ! + --------------------- + + fnamNC_one = 'ONE.' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) & + //'.'//explIO & + //'.nc ' + + ! + 2.2 Output Title + ! + ---------------- + + tit_nc_one = 'ONE' & + //' - Exp: '//explIO & + //' - ' & + //labnum(n1000)//labnum(n100) & + //labnum(n10)//labnum(n1) & + //labnum(m10)//labnum(m1) & + //labnum(jd10)//labnum(jd1) + + ! + 2.3 Time Variable (hour) + ! + ------------------------ + + ! ++++++++++++++++++++++++++++ + ipr_nc_one = 0 + nbr_output = int(real(max(1, int(nterun * dt / 86400))) & + * 24.0 * 60.0 / real(ONEint)) + nDFdim(0) = nbr_output + nDFdim(0) = 0 ! Unlimited + ! ++++++++++++++++++++++++++++ + + NAMdim(0) = 'time' + UNIdim(0) = 'HOURS since 1901-01-15 00:00:00' + + if(nbr_output > MXdim) & + STOP '*** out_nc_one - ERROR : MXdim to low ***' + + ! starti : Starting Time + starti = jhurGE + minuGE / 60.0 + jsecGE / 3600.0 - dt / 3600.0 + + ! starta : Nb Days before iyrrGE + ! (iyrrGE -1901) / 4 : Nb Leap Years + ! njyrGE(mmarGE) : Nb Days before mmarGE + ! njybGE(mmarGE) : including Leap Day + starta = (351 + (iyrrGE - 1902) * 365 & + + (iyrrGE - 1901) / 4 & + + njyrGE(mmarGE) & + + njybGE(mmarGE) * max(0, 1 - mod(iyrrGE, 4)) & + + jdarGE - 1) * 24 & + + jhurGE + (minuGE * 60 + jsecGE - dt) / 3600. + + do it = 1, nbr_output + timeNC_one(it) = starti + (it - 1) * ONEint / 60. + VALdim(it, 0) = starta + (it - 1) * ONEint / 60. + dateNC_one(it) = timeNC_one(it) + jourNC_one(it) = jdarGE + timeNC_one(it) / 24. + enddo + mois = mmarGE + mill = iyrrGE + do it = 1, nbr_output + if(mois == 2 .and. & + mod(mill, 4) == 0) then + njmo = njmoGE(mois) + 1 + else + njmo = njmoGE(mois) + endif + + if(jourNC_one(it) > njmo) then + do t = it, nbr_output + jourNC_one(t) = jourNC_one(t) - njmo + enddo + mois = mois + 1 + if(mois > 12) then + mois = 1 + mill = mill + 1 + endif + endif + moisNC_one(it) = mois + yearNC_one(it) = mill + + if(dateNC_one(it) > 24.-epsi) then + do t = it, nbr_output + dateNC_one(t) = mod(dateNC_one(t), 24.) + enddo + endif + enddo + + do it = 1, nbr_output + dateNC_one(it) = dateNC_one(it) & + + 1.d+2 * jourNC_one(it) & + + 1.d+4 * moisNC_one(it) & + + 1.d+6 * yearNC_one(it) + enddo + + ! + 2.4 Define horizontal spatial dimensions + ! + ---------------------------------------- + + do i = 1, mx + VALdim(i, 1) = xxkm(i) + enddo + nDFdim(1) = mx; NAMdim(1) = 'x'; UNIdim(1) = 'km' + + do j = 1, my + VALdim(j, 2) = yykm(j) + enddo + nDFdim(2) = my; NAMdim(2) = 'y'; UNIdim(2) = 'km' + + do k = 1, ONElev + VALdim(k, 3) = sigma(mz - k + 1) + enddo + nDFdim(3) = ONElev; NAMdim(3) = 'level'; UNIdim(3) = '[sigma]' + + do k = 1, ONEsta + VALdim(k, 4) = k + enddo + nDFdim(4) = ONEsta; NAMdim(4) = 'station'; UNIdim(4) = '[-]' + + do k = 1, nsx + VALdim(k, 5) = k + enddo + nDFdim(5) = nsx; NAMdim(5) = 'sector'; UNIdim(5) = '[index]' + + do k = 1, nsno + VALdim(k, 6) = k + enddo + nDFdim(6) = nsno; NAMdim(6) = 'snolay'; UNIdim(6) = '[index]' + + do k = 1, nsol + 1 + VALdim(k, 7) = k + enddo + nDFdim(7) = nsol + 1; NAMdim(7) = 'sollay'; UNIdim(7) = '[-]' + + do k = 1, 8 + VALdim(k, 8) = k + enddo + nDFdim(8) = 8; NAMdim(8) = 'info'; UNIdim(8) = '[-]' + + ! + 2.5 Variable's Choice (Table ONEvou.dat) + ! + ---------------------------------------- + + do ll = 1, ONEsta + + if(LL <= 9) then + write(station, '(i1)') ll + else + write(station, '(i2)') ll + endif + + nameNC_one(ll) = "S"//station + SdimNC_one(1, ll) = "info" + SdimNC_one(2, ll) = "-" + SdimNC_one(3, ll) = "-" + SdimNC_one(4, ll) = "-" + unitNC_one(ll) = "-" + lnamNC_one(ll) = n_one(ll) + + enddo + + OPEN(unit=10, status='old', file='ONEvou.dat') + + itotNC_one = ONEsta +980 continue + READ(10, '(A120)', end=990) tmpINP + if(tmpINP(1:4) == ' ') then + itotNC_one = itotNC_one + 1 + READ(tmpINP, '(4x,5A9,A12,A50)') & + nameNC_one(itotNC_one), & + SdimNC_one(1, itotNC_one), & + SdimNC_one(2, itotNC_one), & + SdimNC_one(3, itotNC_one), & + SdimNC_one(4, itotNC_one), & + unitNC_one(itotNC_one), & + lnamNC_one(itotNC_one) + endif + GOTO 980 +990 continue + + CLOSE(unit=10) + + NtotNC_one = itotNC_one + ! +... NtotNC_one : Total number of variables writen in NetCDF file. + + ! + 2.6 List of NetCDF attributes given to all variables + ! + ---------------------------------------------------- + + NAMrat(1) = 'actual_range' + NvatNC_one(1) = 2 + + NAMrat(NattNC_one) = '[var]_range' + NvatNC_one(NattNC_one) = 2 + + ! + 2.7 Automatic Generation of the NetCDF File Structure + ! + ----------------------------------------------------- + + ! + ************** + call UNscreate(fnamNC_one, tit_nc_one, & + NdimNC_one, nDFdim, MXdim, NAMdim, UNIdim, & + VALdim, & + MX_var, NtotNC_one, nameNC_one, SdimNC_one, & + unitNC_one, & + lnamNC_one, & + NattNC_one, NAMrat, NvatNC_one, & + ID__nc_one) + ! + ************** + + ! + 2.8 Write Time - Constants + ! + -------------------------- + + imex = int(mx / 2) + jmex = int(my / 2) + + Wkxy1 = GElonh * 15. ! Hour->degrees + WKxy2 = GElatr / degrad ! rad ->degree + WKxy3 = real(isolSL) ! REAL type + WKxy4(:, :) = real(mskSNo(:, :, 1)) ! REAL type + + ! + ************ + call UNwrite(ID__nc_one, 'LON', 1, mx, my, 1, Wkxy1) + call UNwrite(ID__nc_one, 'LAT', 1, mx, my, 1, Wkxy2) + call UNwrite(ID__nc_one, 'SH', 1, mx, my, 1, sh) + call UNwrite(ID__nc_one, 'SRF', 1, mx, my, 1, Wkxy3) + call UNwrite(ID__nc_one, 'SLO', 1, mx, my, 1, slopTV) + call UNwrite(ID__nc_one, 'MSK', 1, mx, my, 1, WKxy4) + ! + ************ + + open(unit=1000, status='replace', file='OUTone.jnl') + + do ll = 1, ONEsta + + one16(1) = i_one(ll) + one16(2) = j_one(ll) + one16(3) = Wkxy1(i_one(ll), j_one(ll)) + one16(4) = Wkxy2(i_one(ll), j_one(ll)) + one16(5) = sh(i_one(ll), j_one(ll)) + one16(6) = Wkxy4(i_one(ll), j_one(ll)) + one16(7) = dx * (i_one(ll) - imez) * 1.e-3 + one16(8) = dx * (j_one(ll) - jmez) * 1.e-3 + + if(LL <= 9) then + write(station, '(i1)') ll + else + write(station, '(i2)') ll + endif + + call UNwrite(ID__nc_one, "S"//station, 1, 8, 1, 1, one16) + + write(1000, 1001) one16(7), one16(8), n_one(ll) +1001 format('LABEL ', 2(f8.2, ','), '-1,0,.10 @TR+', a20) + + enddo + + ! + 2.9 Re-Open file if already created. + ! + ----------------------------------- + + write(*, *) ' ' + write(*, *) 'End of OUTone initialisation' + write(*, *) '============================' + write(*, *) ' ' + + GOTO 1000 + + else + + ! + ************ + call UNwopen(fnamNC_one, ID__nc_one) + ! + ************ + + endif + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + ! 3. Write Time-dependent variables + ! ================================= + ! ipr_nc_one = ipr_nc_one + 1 : not use with Fortran 77 + ipr_nc_one = ipr_nc_one + 1 + + ! write(*,*) ' ' + ! write(*,10) ipr_nc_one,iyrrGE,mmarGE,jdarGE,jhurGE,minuGE + ! 10 format(' OUTone call (',i4,'):',i5,4i3) + ! write(*,*) + + if(nDFdim(0) == 0) then + dt2 = dt + if(iterun >= nterun - 1) dt2 = 0 + ! starta : Nb Days before iyrrGE + ! iyrrGE - 1901) / 4 : Nb Leap Years + ! njyrGE(mmarGE) : Nb Days before mmarGE + ! njybGE(mmarGE) : including Leap Day + starta = (351 + (iyrrGE - 1902) * 365 & + + (iyrrGE - 1901) / 4 & + + njyrGE(mmarGE) & + + njybGE(mmarGE) & + * max(0, 1 - mod(iyrrGE, 4)) & + + jdarGE - 1) * 24 & + + jhurGE + (minuGE * 60 + jsecGE - dt2) / 3600.! + ! + ************ + call UNwrite(ID__nc_one, 'time', ipr_nc_one, 1, 1, 1, starta) + ! + ************ + endif + + ! + ************ + call UNwrite(ID__nc_one, 'DATE', ipr_nc_one, 1, 1, 1, & + dateNC_one(ipr_nc_one)) + call UNwrite(ID__nc_one, 'year', ipr_nc_one, 1, 1, 1, & + yearNC_one(ipr_nc_one)) + ! + ************ + + ! + ************ + starta = iyrrGE + call UNwrite(ID__nc_one, 'YYYY', ipr_nc_one, 1, 1, 1, starta) + starta = mmarGE + call UNwrite(ID__nc_one, 'MM', ipr_nc_one, 1, 1, 1, starta) + starta = jdarGE + call UNwrite(ID__nc_one, 'DD', ipr_nc_one, 1, 1, 1, starta) + starta = jhurGE + call UNwrite(ID__nc_one, 'HH', ipr_nc_one, 1, 1, 1, starta) + starta = minuGE + call UNwrite(ID__nc_one, 'MIN', ipr_nc_one, 1, 1, 1, starta) + starta = jsecGE + call UNwrite(ID__nc_one, 'SS', ipr_nc_one, 1, 1, 1, starta) + ! + ************ + + if(ipr_nc_one == 1) & + call UNwrite(ID__nc_one, 'SLO', 1, mx, my, 1, slopTV) + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = GElonh(ii, jj) * 15. ! Hour->degrees + one2(ll) = GElatr(ii, jj) / degrad ! rad ->degree + one3(ll) = sh(ii, jj) + one4(ll) = real(isolSL(ii, jj)) ! REAL type + one5(ll) = x_one(ll) + one6(ll) = y_one(ll) + enddo + ! + ************ + call UNwrite(ID__nc_one, 'lonMAR', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'latMAR', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'sh_MAR', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'solTyp', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + call UNwrite(ID__nc_one, 'x_MAR', ipr_nc_one, ONEsta, 1, 1, one5(1:ONEsta)) + call UNwrite(ID__nc_one, 'y_MAR', ipr_nc_one, ONEsta, 1, 1, one6(1:ONEsta)) + ! + ************ + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = lon_one(ll) + one2(ll) = lat_one(ll) + one3(ll) = sh_one(ll) + enddo + ! + ************ + call UNwrite(ID__nc_one, 'lonAWS', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'latAWS', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'sh_AWS', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + ! + ************ + + Do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + + ! + 3.1 Computation of Relative Humidity + ! + ------------------------------------ + + do kk = 1, ONElev + + epsilon = 0.622 + q = qvDY(ii, jj, mz - kk + 1) + qst = qsat0D(tairDY(ii, jj, mz - kk + 1), & + sigma(mz - kk + 1), pstDY(ii, jj), ptopDY, 1) + + r = q / max(epsi, 1.-q) + rst = qst / max(epsi, 1.-qst) + + RH(ll, kk) = (r / (epsilon + r)) & + / max(epsi,(rst / (epsilon + rst))) * 100. + + RH(ll, kk) = max(0., min(100., RH(ll, kk))) + + ! + 3.2 Computation of wind direction and wind speed + ! + ------------------------------------------------ + ! wd = 180 + ((atan2(U_moy / windspeed_moy, V_moy / windspeed_moy)) * (180 / Pi)) + + if(uairDY(ii, jj, mz - kk + 1) /= 0.0 .and. & + vairDY(ii, jj, mz - kk + 1) /= 0.0) then + + uu(kk) = (GElonh(ii + 1, jj) - GElonh(ii, jj)) * conv / dx & + * a * cos(GElatr(ii, jj)) * & + uairDY(ii, jj, mz - kk + 1) + & + (GElonh(ii, jj + 1) - GElonh(ii, jj)) * conv / dx & + * a * cos(GElatr(ii, jj)) * & + vairDY(ii, jj, mz - kk + 1) + + vv(kk) = (GElatr(ii + 1, jj) - GElatr(ii, jj)) / dx * a & + * uairDY(ii, jj, mz - kk + 1) + & + (GElatr(ii, jj + 1) - GElatr(ii, jj)) / dx * a & + * vairDY(ii, jj, mz - kk + 1) + + WD(ll, kk) = 0.0 + + if(uu(kk) > 0.0 .and. vv(kk) >= 0.0) & + WD(ll, kk) = 3.0 * pi / 2.0 - atan(vv(kk) / uu(kk)) + if(uu(kk) < 0.0 .and. vv(kk) >= 0.0) & + WD(ll, kk) = 5.0 * Pi / 2.0 - atan(vv(kk) / uu(kk)) + if(uu(kk) < 0.0 .and. vv(kk) <= 0.0) & + WD(ll, kk) = 5.0 * Pi / 2.0 - atan(vv(kk) / uu(kk)) + if(uu(kk) > 0.0 .and. vv(kk) <= 0.0) & + WD(ll, kk) = 3.0 * Pi / 2.0 - atan(vv(kk) / uu(kk)) + if(uu(kk) == 0.0 .and. vv(kk) >= 0.0) & + WD(ll, kk) = Pi + if(uu(kk) == 0.0 .and. vv(kk) <= 0.0) & + WD(ll, kk) = 0.0 + if(WD(ll, kk) > 2 * Pi) & + WD(ll, kk) = WD(ll, kk) - 2 * Pi + + WD(ll, kk) = WD(ll, kk) * 180.0 / Pi + + if(WD(ll, kk) < 0.0) & + WD(ll, kk) = WD(ll, kk) + 360.0 + + WD(ll, kk) = max(0.0, min(360.0, WD(ll, kk))) + + WS(ll, kk) = sqrt(uairDY(ii, jj, mz - kk + 1) * uairDY(ii, jj, mz - kk + 1) + & + vairDY(ii, jj, mz - kk + 1) * vairDY(ii, jj, mz - kk + 1)) + + else + WS(ll, kk) = 0.0 + WD(ll, kk) = 0.0 + endif + + enddo + + enddo + + ! + 3.3 Output + ! + ---------- + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + do kk = 1, ONElev + one7(ll, kk) = tairDY(ii, jj, mz - kk + 1) - 273.15 + one8(ll, kk) = uairDY(ii, jj, mz - kk + 1) + one9(ll, kk) = vairDY(ii, jj, mz - kk + 1) + one10(ll, kk) = qvDY(ii, jj, mz - kk + 1) * 1000. + enddo + enddo + ! + ************ + call UNwrite(ID__nc_one, 'TT', ipr_nc_one, ONEsta, ONElev, 1, one7(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'UU', ipr_nc_one, ONEsta, ONElev, 1, one8(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'VV', ipr_nc_one, ONEsta, ONElev, 1, one9(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'WS', ipr_nc_one, ONEsta, ONElev, 1, WS(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'WD', ipr_nc_one, ONEsta, ONElev, 1, WD(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'QQ', ipr_nc_one, ONEsta, ONElev, 1, one10(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'RH', ipr_nc_one, ONEsta, ONElev, 1, RH(1:ONEsta, :)) + ! + ************ + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + do kk = 1, ONElev + ! pkta : *100kPa^cap -> K at 1000hPa standard pressure + one7(ll, kk) = pktaDY(ii, jj, mz - kk + 1) * 100.**cap + enddo + enddo + + call UNwrite(ID__nc_one, 'PT', ipr_nc_one, ONEsta, ONElev, 1, one7(1:ONEsta, :)) + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + do kk = 1, ONElev + one7(ll, kk) = TUkvm(ii, jj, mz - kk + 1) + one8(ll, kk) = ect_TE(ii, jj, mz - kk + 1) + one9(ll, kk) = gplvDY(ii, jj, mz - kk + 1) * grvinv + one10(ll, kk) = wairDY(ii, jj, mz - kk + 1) + enddo + enddo + ! + ************ + call UNwrite(ID__nc_one, 'KZ', ipr_nc_one, ONEsta, ONElev, 1, one7(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'TKE', ipr_nc_one, ONEsta, ONElev, 1, one8(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'ZZ', ipr_nc_one, ONEsta, ONElev, 1, one9(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'WW', ipr_nc_one, ONEsta, ONElev, 1, one10(1:ONEsta, :)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + do kk = 1, ONElev + one7(ll, kk) = qiHY(ii, jj, mz - kk + 1) * 1000. + one8(ll, kk) = qwHY(ii, jj, mz - kk + 1) * 1000. + one9(ll, kk) = qsHY(ii, jj, mz - kk + 1) * 1000. + one10(ll, kk) = qrHY(ii, jj, mz - kk + 1) * 1000. + enddo + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'QI', ipr_nc_one, ONEsta, ONElev, 1, one7(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'QW', ipr_nc_one, ONEsta, ONElev, 1, one8(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'QS', ipr_nc_one, ONEsta, ONElev, 1, one9(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'QR', ipr_nc_one, ONEsta, ONElev, 1, one10(1:ONEsta, :)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = tairSL(ii, jj) - 273.15 + one2(ll) = pstDY(ii, jj) * 10. + one3(ll) = (rainHY(ii, jj) - one0rnf(ll)) * 1000. + one0rnf(ll) = rainHY(ii, jj) + one4(ll) = (snowHY(ii, jj) + crysHY(ii, jj) - one0snf(ll)) * 1000. + one0snf(ll) = snowHY(ii, jj) + crysHY(ii, jj) + one5(ll) = rainCA(ii, jj) * 1000. + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'ST', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'SP', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'rnf', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'snf', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + call UNwrite(ID__nc_one, 'CP', ipr_nc_one, ONEsta, 1, 1, one5(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = Radsol(ii, jj) + one2(ll) = Rad_IR(ii, jj) + one3(ll) = hsenSL(ii, jj) + one4(ll) = hlatSL(ii, jj) + one5(ll) = firmSL(ii, jj) + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'SWD', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'LWD', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'LWU', ipr_nc_one, ONEsta, 1, 1, one5(1:ONEsta)) + call UNwrite(ID__nc_one, 'SHF', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'LHF', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = albeSL(ii, jj) + one2(ll) = cld_SL(ii, jj) + one3(ll) = runoTV(ii, jj) - one0rof(ll) + one0rof(ll) = runoTV(ii, jj) + one4(ll) = evapTV(ii, jj) - one0evp(ll) + one0evp(ll) = evapTV(ii, jj) + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'AL', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'CC', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'rof', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'evp', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = 0.0; one2(ll) = 0.0; one3(ll) = 0.0 + do k = mzabso + 1, mz + one3(ll) = (pstDY(ii, jj) * sigma(k) + ptopDY) & + / (ra * tairDY(ii, jj, k) * (1.+.608 * qvDY(ii, jj, k))) & + * (gpmiDY(ii, jj, k) - gpmiDY(ii, jj, k + 1)) + one1(ll) = one1(ll) + one3(ll) * qwHY(ii, jj, k) + one2(ll) = one2(ll) + one3(ll) * qiHY(ii, jj, k) + enddo + one4(ll) = 1.5 * (one1(ll) / 20.d-6 + one2(ll) / 40.d-6) * grvinv + enddo + + ! + ******* + call UNwrite(ID__nc_one, 'COD', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + ! + ******* + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = SLlmo(ii, jj) + one2(ll) = SLuus(ii, jj) + one3(ll) = SLuts(ii, jj) + one4(ll) = SLuqs(ii, jj) + one5(ll) = SaltSN(ii, jj, 1) + enddo + + ! + ******* + call UNwrite(ID__nc_one, 'LMO', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'UUS', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'UTS', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'UQS', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + call UNwrite(ID__nc_one, 'UUSsalt', ipr_nc_one, ONEsta, 1, 1, one5(1:ONEsta)) + ! + ******* + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SL_wge = 0.0; SLlwge = 0.0; SLuwge = 0.0 + + ! + ***** + call WGustE + ! + ***** + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = SL_wge(ii, jj) + one2(ll) = SLlwge(ii, jj) + one3(ll) = SLuwge(ii, jj) + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'WGE', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'WGL', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'WGU', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = SL_z0(ii, jj, 1) + one2(ll) = SL_r0(ii, jj, 1) + one3(ll) = SWaSNo(ii, jj, 1) + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'Z0', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'R0', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'SWA', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + do k = 1, nsx + do j = 1, my + do i = 1, mx + zn1IB(i, j, k) = 1. + zn2IB(i, j, k) = 0. + zn3IB(i, j, k) = 0. + wet_IB(i, j, k) = 0. + enddo + enddo + enddo + + do kk = nsno, 1, -1 + do k = 1, nsx + do j = 1, my + do i = 1, mx + zn3IB(i, j, k) = dzsSNo(i, j, k, kk) + zn3IB(i, j, k) + wet_IB(i, j, k) = rosSNo(i, j, k, kk) * dzsSNo(i, j, k, kk) & + * 1.d3 / ro_Wat * (1.+0.*wasSNo(i, j, k, kk)) & + + wet_IB(i, j, k) + zn1IB(i, j, k) = zn1IB(i, j, k) & + * max(zero, sign(unun, & + ro_ice - 20.-rosSNo(i, j, k, kk))) + zn2IB(i, j, k) = dzsSNo(i, j, k, kk) * zn1IB(i, j, k) & + + zn2IB(i, j, k) + enddo + enddo + enddo + enddo + + do k = 1, nsx + do j = 1, my + do i = 1, mx + wet_IB(i, j, k) = wet_IB(i, j, k) + SWaSNo(i, j, k) + zn2IB(i, j, k) = zn2IB(i, j, k) * (1.-zn1IB(i, j, k)) + zn1IB(i, j, k) = zn3IB(i, j, k) - zn0IB(i, j, k) + mbIB(i, j, k) = wet_IB(i, j, k) - mb0IB(i, j, k) + enddo + enddo + enddo + + do ll = 1, ONEsta + ii = i_one(ll) + jj = j_one(ll) + one1(ll) = zn1IB(ii, jj, 1) + one2(ll) = zn2IB(ii, jj, 1) + one3(ll) = zn3IB(ii, jj, 1) + one4(ll) = mbIB(ii, jj, 1) + one5(ll) = real(nssSNo(ii, jj, 1)) + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'ZN', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'ZN1', ipr_nc_one, ONEsta, 1, 1, one1(1:ONEsta)) + call UNwrite(ID__nc_one, 'ZN2', ipr_nc_one, ONEsta, 1, 1, one2(1:ONEsta)) + call UNwrite(ID__nc_one, 'ZN3', ipr_nc_one, ONEsta, 1, 1, one3(1:ONEsta)) + call UNwrite(ID__nc_one, 'MB', ipr_nc_one, ONEsta, 1, 1, one4(1:ONEsta)) + call UNwrite(ID__nc_one, 'NSsn', ipr_nc_one, ONEsta, 1, 1, one5(1:ONEsta)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta; do nn = 1, nsno + ii = i_one(ll); jj = j_one(ll) + if(nn <= nssSNo(ii, jj, 1)) then + one11(ll, nn) = dzsSNo(ii, jj, 1, nssSNo(ii, jj, 1) - nn + 1) + one12(ll, nn) = rosSNo(ii, jj, 1, nssSNo(ii, jj, 1) - nn + 1) + else + one11(ll, nn) = NF_FILL_REAL + one12(ll, nn) = NF_FILL_REAL + endif + enddo; + enddo + ! + ************ + call UNwrite(ID__nc_one, 'DZsn', ipr_nc_one, ONEsta, nsno, 1, one11(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'ROsn', ipr_nc_one, ONEsta, nsno, 1, one12(1:ONEsta, :)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta; do nn = 1, nsno + ii = i_one(ll); jj = j_one(ll) + if(nn <= nssSNo(ii, jj, 1)) then + one11(ll, nn) = g1sSNo(ii, jj, 1, nssSNo(ii, jj, 1) - nn + 1) + one12(ll, nn) = g2sSNo(ii, jj, 1, nssSNo(ii, jj, 1) - nn + 1) + else + one11(ll, nn) = NF_FILL_REAL + one12(ll, nn) = NF_FILL_REAL + endif + enddo; + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'G1sn', ipr_nc_one, ONEsta, nsno, 1, one11(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'G2sn', ipr_nc_one, ONEsta, nsno, 1, one12(1:ONEsta, :)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta; do nn = 1, nsno + ii = i_one(ll); jj = j_one(ll) + if(nn <= nssSNo(ii, jj, 1)) then + one11(ll, nn) = tisSNo(ii, jj, 1, nn) - TfSnow + one12(ll, nn) = wasSNo(ii, jj, 1, nn) + else + one11(ll, nn) = NF_FILL_REAL + one12(ll, nn) = NF_FILL_REAL + endif + enddo; + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'TIsn', ipr_nc_one, ONEsta, nsno, 1, one11(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'WAsn', ipr_nc_one, ONEsta, nsno, 1, one12(1:ONEsta, :)) + ! + ************ + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + do ll = 1, ONEsta; do nn = 1, nsol + 1 + ii = i_one(ll); jj = j_one(ll) + one14(ll, nn) = TsolTV(ii, jj, 1, nn) - TfSnow + one15(ll, nn) = Eta_TV(ii, jj, 1, nn) + enddo; + enddo + + ! + ************ + call UNwrite(ID__nc_one, 'SLT', ipr_nc_one, ONEsta, nsol + 1, 1, one14(1:ONEsta, :)) + call UNwrite(ID__nc_one, 'SLQ', ipr_nc_one, ONEsta, nsol + 1, 1, one15(1:ONEsta, :)) + ! + ************ + +1000 continue + + ! + 3.4 NetCDF File Closure + ! + ----------------------- + + if(ID__nc_one /= -1) then + + ! + ************ + call UNclose(ID__nc_one) + ! + ************ + + endif + + WKxy1 = 0; WKxy2 = 0; WKxy3 = 0; WKxy4 = 0 + +endsubroutine OUTone + +subroutine WGustE + ! +-------------------------------------------------------------------+ + ! | | + ! | MAR GUSTS 14-09-2001 MAR | + ! | subroutine WGustE computes diagnostic Wind Gust Estimates | + ! | | + ! +-------------------------------------------------------------------+ + ! | | + ! | This routine aims at estimating wind gusts. It also includes the | + ! | computation of a bounding interval around the estimate which aims | + ! | to contain with a high probability observed gusts. | + ! | | + ! | Ref. : Brasseur O., MWR, 129, 5-25. | + ! | ^^^^^^^ | + ! | | + ! | Input : - uairDY : U-wind | + ! | ^^^^^^^ - vairDY : V-wind | + ! | - wairDY : W-wind | + ! | - tairDY : REAL temperature | + ! | - tairSL : surface temperature | + ! | - qvDY : specific humidity | + ! | - qwHY : cloud dropplets | + ! | - qiHY : ice crystals | + ! | - qrHY : rain | + ! | - qsHY : snow | + ! | - SLuts : surface heat flux | + ! | - ect_TE : turbulent kinetic energy | + ! | - zzDY : level heights | + ! | - sh : surface elevation | + ! | - sigma : sigma levels | + ! | - pstDY : pressure depth | + ! | - ptopDY : pressure at the top of the model | + ! | | + ! | Output: - SL_wge : gust estimate (m/s) | + ! | ^^^^^^^ - SLlwge : lower bound of the bounding interval (m/s) | + ! | - SLuwge : upper bound of the bounding interval (m/s) | + ! | | + ! +-------------------------------------------------------------------+ + + use mardim + use margrd + use mar_dy + use mar_hy + use mar_te + use mar_sl + + implicit none + + ! +---Local variables + ! + --------------- + + integer i, j, k, l + INTEGER lev_up, lev_dw, top_bl, kzi + + real int_buo, local_tke, tke_min, aux0, aux1, aux2 + real coeff, dtkemin, ra, cp, gravit, cap + real ENERGY_low, ENERGY_est + real coeffmin, srf_TKE, wstar, rzero + + real tetae(mz), tetav(mz), buoy(mz), normv(mz), filECT(mz) + real mean_tke(mz), tmpECT(mz) + + ! +---Data + ! + ---- + + DATA dtkemin/1.e-5/ + DATA coeffmin/0.01/ + DATA cap/0.28586/ + DATA ra/287./ + DATA cp/1004./ + DATA gravit/9.81/ + DATA rzero/0.0/ + + ! + ==================================================== + + do j = 1, my + do i = 1, mx + + ! + ==================================================== + + do k = 1, mz + + ! +---Compute Virtual and Equivalent Potential Temperature + ! + ---------------------------------------------------- + + tetav(k) = tairDY(i, j, k) & + * (100./(pstDY(i, j) * sigma(k) + ptopDY))**cap & + * (1.+0.608 * qvDY(i, j, k) - qwHY(i, j, k) - qiHY(i, j, k) & + - qrHY(i, j, k) - qsHY(i, j, k)) + ! + ^^^ Virtual potential temperature + + ! +---Compute wind norm + ! + ----------------- + + normv(k) = SQRT(uairDY(i, j, k) * uairDY(i, j, k) & + + vairDY(i, j, k) * vairDY(i, j, k) & + + wairDY(i, j, k) * wairDY(i, j, k) / 10000.) + + enddo + + ! +---Compute Integrated Buoyancy + ! + --------------------------- + + k = mz + int_buo = (0.5 * tetav(k) + 0.5 * tetav(k - 1) & + - 0.5 * tetav(mz) - 0.5 * tetav(mz - 1)) * gravit & + / (0.5 * tetav(mz) + 0.5 * tetav(mz - 1)) / 2. & + *(gplvDY(i, j, k - 1) - gplvDY(i, j, k)) / gravit + int_buo = MAX(0., int_buo) + buoy(k) = int_buo + + k = mz - 1 + int_buo = int_buo - (0.5 * tetav(k) + 0.5 * tetav(k - 1) & + - 0.5 * tetav(mz) - 0.5 * tetav(mz - 1)) * gravit & + / (0.5 * tetav(mz) + 0.5 * tetav(mz - 1)) / 2. & + *(gplvDY(i, j, k - 1) - gplvDY(i, j, k)) / gravit + int_buo = MAX(0., int_buo) + buoy(k) = int_buo + + do k = mz, 2, -1 + + int_buo = int_buo - (0.5 * tetav(k) + 0.5 * tetav(k - 1) & + - 0.5 * tetav(mz) - 0.5 * tetav(mz - 1)) * gravit & + / (0.5 * tetav(mz) + 0.5 * tetav(mz - 1)) / 2. & + *(gplvDY(i, j, k - 1) - gplvDY(i, j, k)) / gravit + buoy(k) = int_buo + + enddo + + ! +---Filtering of turbulent kinetic energy + ! + ------------------------------------- + + tmpECT(1) = ect_TE(i, j, 1) + tmpECT(mz) = ect_TE(i, j, mz) + filECT(1) = ect_TE(i, j, 1) + filECT(mz) = ect_TE(i, j, mz) + + do k = 2, mz - 1 + if(i /= 1 .and. i /= mx .and. j /= 1 .and. j /= my) then + tmpECT(k) = (4.*ect_TE(i, j, k) & + + 2.*ect_TE(i - 1, j, k) + 2.*ect_TE(i + 1, j, k) & + + 2.*ect_TE(i, j - 1, k) + 2.*ect_TE(i, j + 1, k) & + + 1.*ect_TE(i - 1, j - 1, k) + 1.*ect_TE(i - 1, j + 1, k) & + + 1.*ect_TE(i + 1, j - 1, k) + 1.*ect_TE(i + 1, j + 1, k)) / 16. + endif + enddo + + do k = 2, mz - 1 + aux1 = (gplvDY(i, j, k - 1) - gplvDY(i, j, k)) / gravit + aux2 = (gplvDY(i, j, k) - gplvDY(i, j, k + 1)) / gravit + filECT(k) = 0.25 * (2.*tmpECT(k) & + + 2.*(aux2 / (aux1 + aux2)) * tmpECT(k - 1) & + + 2.*(aux1 / (aux1 + aux2)) * tmpECT(k + 1)) + enddo + + ! +---Determination of mean tke below level k + ! + - - - - - - - - - - - - - - - - - - - - + + aux1 = 0. + aux2 = 0. + + do k = mz - 1, 2, -1 + aux1 = aux1 + (gplvDY(i, j, k) + gplvDY(i, j, k + 1)) / 2. & + *filECT(k) & + * (gplvDY(i, j, k) - gplvDY(i, j, k + 1)) + aux2 = aux2 + (gplvDY(i, j, k) + gplvDY(i, j, k + 1)) / 2. & + *(gplvDY(i, j, k) - gplvDY(i, j, k + 1)) + enddo + + mean_tke(k) = aux1 / aux2 + + ! +---Compute wstar + ! + ------------- + +#if(WW) + wstar = MAX(zero,(-gravit * zi__TE(i, j) / 290.*SLuts(i, j))**(1./3.)) +#endif + + ! +---Evaluation of Gust Wind Speed + ! + ----------------------------- + + ! +---Initial value + ! + - - - - - - - + + SL_wge(i, j) = MAX(SL_wge(i, j), normv(mz)) + SLuwge(i, j) = MAX(SLuwge(i, j), normv(mz)) + SLlwge(i, j) = MAX(SLlwge(i, j), normv(mz)) + + lev_dw = 1 + lev_up = mz + top_bl = mz + + do k = mz - 1, 2, -1 + + ! +---Determination of the Top of Boundary Layer + ! + - - - - - - - - - - - - - - - - - - - - - + + coeff = coeffmin & + + 0.1 * ((gplvDY(i, j, k) - gplvDY(i, j, mz + 1)) & + / gravit - 2000.) / 1000. + + tke_min = coeff * (filECT(mz) + filECT(mz - 1)) * 0.5 + + if(top_bl == mz .and. & + filECT(k + 1) > tke_min .and. & + filECT(k) <= tke_min) top_bl = k + + ! +---Upper bound on Gust Wind Speed + ! + - - - - - - - - - - - - - - - - + + local_tke = (filECT(k) + filECT(k - 1)) * 0.5 + + if(local_tke > tke_min .and. top_bl == mz) then + + if(SLuwge(i, j) < normv(k)) then + SLuwge(i, j) = MAX(SLuwge(i, j), normv(k)) + ! + ^^^ Max Wind Speed (m/s) + lev_up = k + ! + ^^^ Level of Max Wind Speed (m/s) + endif + + endif + + ! +---Lower bound on Wind Gust + ! + - - - - - - - - - - - - + ! buoy : Sink + ENERGY_low = 2.5 / 11.*filECT(k) + buoy(k) + ! + + if(ENERGY_low >= 0.) then + SLlwge(i, j) = MAX(normv(k), SLlwge(i, j)) + ! + ^^^ Min Wind Speed (m/s) + lev_dw = k + endif + + ! +---Estimate of Wind Gust + ! + - - - - - - - - - - - + ! buoy : Sink + ENERGY_est = MAX(mean_tke(k), 2.5 / 11.*filECT(k)) + buoy(k) + + if(ENERGY_est >= 0.) then + SL_wge(i, j) = MAX(0.5 * (normv(k) + normv(k - 1)), SL_wge(i, j)) + endif + + ENDdo ! {Loop on k} + + ! + ==================================================== + ! + + ENDdo ! {Loop on i} + ENDdo ! {Loop on j} + ! + + ! + ==================================================== + + return +endsubroutine WGustE diff --git a/MAR/code_mar/sisvat.f90 b/MAR/code_mar/sisvat.f90 new file mode 100644 index 0000000000000000000000000000000000000000..65b0f3402edcb6cbadc1b1f3cfa16702c19a0cac --- /dev/null +++ b/MAR/code_mar/sisvat.f90 @@ -0,0 +1,2386 @@ +#include "MAR_pp.def" +subroutine SISVAT(itPhys) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT 10-nov-2021 MAR | + ! | subroutine SISVAT contains the fortran 77 code of the | + ! | Soil/Ice Snow Vegetation Atmosphere Transfer Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: daHost : Date Host Model | + ! | ^^^^^ | + ! | | + ! | INPUT: LSmask : 1: Land MASK | + ! | ^^^^^ 0: Sea MASK | + ! | ivgtSV = 0,...,12: Vegetation Type | + ! | isotSV = 0,...,12: Soil Type | + ! | 0: Water, Liquid (Sea, Lake) | + ! | 12: Water, Solid (Ice) | + ! | | + ! | INPUT: coszSV : Cosine of the Sun Zenithal Distance [-] | + ! | ^^^^^ sol_SV : Surface Downward Solar Radiation [W/m2] | + ! | IRd_SV : Surface Downward Longwave Radiation [W/m2] | + ! | drr_SV : Rain Intensity [kg/m2/s] | + ! | dsn_SV : Snow Intensity [mm w.e./s] | + ! | dsnbSV : Snow Intensity, Drift Fraction [-] | + ! | dbs_SV : Drift Amount [mm w.e.] | + ! | za__SV : Surface Boundary Layer (SBL) Height [m] | + ! | VV__SV :(SBL Top) Wind Velocity [m/s] | + ! | VV10SV : 10-m Wind Velocity [m/s] | + ! | TaT_SV : SBL Top Temperature [K] | + ! | rhT_SV : SBL Top Air Density [kg/m3] | + ! | QaT_SV : SBL Top Specific Humidity [kg/kg] | + ! | qsnoSV : SBL Mean Snow Content [kg/kg] | + ! | LAI0SV : Leaf Area Index [-] | + ! | glf0SV : Green Leaf Fraction [-] | + ! | alb0SV : Soil Basic Albedo [-] | + ! | slopSV : Surface Slope [-] | + ! | dt__SV : Time Step [s] | + ! | | + ! | INPUT / isnoSV = total Nb of Ice/Snow Layers | + ! | OUTPUT: ispiSV = 0,...,nsno: Uppermost Superimposed Ice Layer | + ! | ^^^^^^ iiceSV = total Nb of Ice Layers | + ! | istoSV = 0,...,5 : Snow History (see istdSV data) | + ! | | + ! | INPUT / alb_SV : Surface-Canopy Albedo [-] | + ! | OUTPUT: emi_SV : Surface-Canopy Emissivity [-] | + ! | ^^^^^^ IRs_SV : Soil IR Flux (negative) [W/m2] | + ! | LMO_SV : Monin-Obukhov Scale [m] | + ! | us__SV : Friction Velocity [m/s] | + ! | uts_SV : Temperature Turbulent Scale [m/s] | + ! | uqs_SV : Specific Humidity Velocity [m/s] | + ! | uss_SV : Blowing Snow Turbulent Scale [m/s] | + ! | usthSV : Blowing Snow Erosion Threshold [m/s] | + ! | Z0m_SV : Momentum Roughness Length [m] | + ! | Z0mmSV : Momentum Roughness Length (time mean) [m] | + ! | Z0mnSV : Momentum Roughness Length (instantaneous)[m] | + ! | Z0SaSV : Sastrugi Roughness Length [m] | + ! | Z0e_SV : Erosion Snow Roughness Length [m] | + ! | Z0emSV : Erosion Snow Roughness Length (time mean) [m] | + ! | Z0enSV : Erosion Snow Roughness Length (instantaneous)[m] | + ! | Z0roSV : Subgrid Topo Roughness Length [m] | + ! | Z0h_SV : Heat Roughness Length [m] | + ! | snCaSV : Canopy Snow Thickness [mm w.e.] | + ! | rrCaSV : Canopy Water Content [kg/m2] | + ! | psivSV : Leaf Water Potential [m] | + ! | TvegSV : Canopy Temperature [K] | + ! | TsisSV : Soil/Ice Temperatures (layers -nsol,-nsol+1,..,0)| + ! | & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | ro__SV : Soil/Snow Volumic Mass [kg/m3] | + ! | eta_SV : Soil/Snow Water Content [m3/m3] | + ! | G1snSV : snow dendricity/sphericity | + ! | G2snSV : snow sphericity/grain size | + ! | dzsnSV : Snow Layer Thickness [m] | + ! | agsnSV : Snow Age [day] | + ! | BufsSV : Snow Buffer Layer [kg/m2] .OR. [mm] | + ! | BrosSV : Snow Buffer Layer Density [kg/m3] | + ! | BG1sSV : Snow Buffer Layer Dendricity / Sphericity [-] | + ! | BG2sSV : Snow Buffer Layer Sphericity / Size [-] [0.1 mm] | + ! | rusnSV : Surficial Water [kg/m2] .OR. [mm] | + ! | | + ! | OUTPUT: no__SV : OUTPUT file Unit Number [-] | + ! | ^^^^^^ i___SV : OUTPUT point i Coordinate [-] | + ! | j___SV : OUTPUT point j Coordinate [-] | + ! | n___SV : OUTPUT point n Coordinate [-] | + ! | lwriSV : OUTPUT point vec Index [-] | + ! | | + ! | OUTPUT: IRu_SV : Upward IR Flux (+, upw., effective) [K] | + ! | ^^^^^^ hSalSV : Saltating Layer Height [m] | + ! | qSalSV : Saltating Snow Concentration [kg/kg] | + ! | RnofSV : RunOFF Intensity [kg/m2/s] | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | NLaysv = New Snow Layer Switch [-] | + ! | albisv : Snow/Ice/Water/Soil Integrated Albedo [-] | + ! | SoCasv : Absorbed Solar Radiation by Canopy (Normaliz)[-] | + ! | SoSosv : Absorbed Solar Radiation by Surfac.(Normaliz)[-] | + ! | tau_sv : Fraction of Radiation transmitted by Canopy [-] | + ! | TBr_sv : Brightness Temperature [K] | + ! | IRupsv : Upward IR Flux (-, upw.) [W/m2] | + ! | IRv_sv : Vegetation IR Flux [W/m2] | + ! | rrMxsv : Canopy Maximum Intercepted Rain [kg/m2] | + ! | Sigmsv : Canopy Ventilation Factor [-] | + ! | ram_sv : Aerodynamic Resistance for Momentum [s/m] | + ! | rah_sv : Aerodynamic Resistance for Heat [s/m] | + ! | HSv_sv : Vegetation Sensible Heat Flux [W/m2] | + ! | HLv_sv : Vegetation Latent Heat Flux [W/m2] | + ! | Rootsv : Root Water Pump [kg/m2/s] | + ! | Evp_sv : Evaporation [kg/m2] | + ! | EvT_sv : Evapotranspiration [kg/m2] | + ! | HSs_sv : Surface Sensible Heat Flux + => absorb.[W/m2] | + ! | HLs_sv : Surface Latent Heat Flux + => absorb.[W/m2] | + ! | Lx_H2O : Latent Heat of Vaporization/Sublimation [J/kg] | + ! | Tsrfsv : Surface Temperature [K] | + ! | LAI_sv : Leaf Area Index (snow included) [-] | + ! | LAIesv : Leaf Area Index (effective / transpiration) [-] | + ! | glf_sv : Green Leaf Fraction of NOT fallen Leaves [-] | + ! | sEX_sv : Verticaly Integrated Extinction Coefficient [-] | + ! | LSdzsv : Vertical Discretization Factor [-] | + ! | = 1. Soil | + ! | = 1000. Ocean | + ! | z_snsv : Snow Pack Thickness [m] | + ! | zzsnsv : Snow Pack Thickness [m] | + ! | albssv : Soil Albedo [-] | + ! | Evg_sv : Soil+Vegetation Emissivity [-] | + ! | Eso_sv : Soil+Snow Emissivity [-] | + ! | psi_sv : Soil Water Potential [m] | + ! | Khydsv : Soil Hydraulic Conductivity [m/s] | + ! | | + ! | ETVg_d : VegetationEnergy Power Forcing [W/m2] | + ! | ETSo_0 : Snow/Soil Energy Power, before Forcing [W/m2] | + ! | ETSo_1 : Snow/Soil Energy Power, after Forcing [W/m2] | + ! | ETSo_d : Snow/Soil Energy Power Forcing [W/m2] | + ! | EqSn_0 : Snow Energy, before Phase Change [J/m2] | + ! | EqSn_1 : Snow Energy, after Phase Change [J/m2] | + ! | EqSn_d : Snow Energy, net Forcing [J/m2] | + ! | Enrsvd : SVAT Energy Power Forcing [W/m2] | + ! | Enrbal : SVAT Energy Balance [W/m2] | + ! | Wats_0 : Soil Water, before Forcing [mm] | + ! | Wats_1 : Soil Water, after Forcing [mm] | + ! | Wats_d : Soil Water Forcing [mm] | + ! | SIWm_0 : Snow initial Mass [mm w.e.] | + ! | SIWm_1 : Snow final Mass [mm w.e.] | + ! | SIWa_i : Snow Atmos. initial Forcing [mm w.e.] | + ! | SIWa_f : Snow Atmos. final Forcing(noConsumed)[mm w.e.] | + ! | SIWe_i : SnowErosion initial Forcing [mm w.e.] | + ! | SIWe_f : SnowErosion final Forcing(noConsumed)[mm w.e.] | + ! | SIsubl : Snow sublimed/deposed Mass [mm w.e.] | + ! | SImelt : Snow Melted Mass [mm w.e.] | + ! | SIrnof : Surficial Water + Run OFF Change [mm w.e.] | + ! | SIvAcr : Sea-Ice vertical Acretion [mm w.e.] | + ! | Watsvd : SVAT Water Forcing [mm] | + ! | Watbal : SVAT Water Balance [W/m2] | + ! | | + ! | dsn_Ca,snCa_n : Snow Contribution to the Canopy[m w.e.] | + ! | drr_Ca,rrCa_n,drip: Rain Contribution to the Canopy [kg/m2] | + ! | vk2 : Square of Von Karman Constant [-] | + ! | sqrCm0 : Factor of Neutral Drag Coeffic.Momentum [s/m] | + ! | sqrCh0 : Factor of Neutral Drag Coeffic.Heat [s/m] | + ! | EmiVeg : Vegetation Emissivity [-] | + ! | EmiSol : Soil Emissivity [-] | + ! | EmiSno : Snow Emissivity [-] | + ! | EmiWat : Water Emissivity [-] | + ! | Z0mSea : Sea Roughness Length [m] | + ! | Z0mLnd : Land Roughness Length [m] | + ! | sqrrZ0 : u*t/u* | + ! | f_eff : Marticorena & B. 1995 JGR (20) | + ! | A_Fact : Fundamental * Roughness | + ! | Z0mBSn : BSnow Roughness Length [m] | + ! | Z0mBS0 : Mimimum BSnow Roughness Length (blown* ) [m] | + ! | Z0m_Sn : Snow Roughness Length (surface) [m] | + ! | Z0m_S0 : Mimimum Snow Roughness Length [m] | + ! | Z0m_S1 : Maximum Snow Roughness Length [m] | + ! | Z0_GIM : Minimum GIMEX Roughness Length [m] | + ! | Z0_ICE : Sea Ice ISW Roughness Length [m] | + ! | | + ! | # TUNING PARAMETERS : | + ! | # OPTIONS: #BS: Wind Dependant Roughness Length of Snow | + ! | # ^^^^^^^ #ZS: Wind Dependant Roughness Length of Sea | + ! | # #FL: Dead Leaves are assumed to been fallen | + ! | # #RS: Z0h = Z0m / 100 over the ocean | + ! | # #US: u* computed from aerodynamic resistance | + ! | # #WV: OUTPUT | + ! | # #WR: OUTPUT for Verification | + ! | # #SR: Variable Tracing | + ! | # #CP: Col de Porte Turbulence Parameterization | + ! | # #GL: Greenland Parameterization | + ! | | + ! | | + ! | TUNING PARAMETER: | + ! | ^^^^^^^^^^^^^^^^ | + ! | z0soil : Soil Surface averaged Bumps Height (see _qSo)[m] | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_iii_jjj_n | #E0: OUTPUT on ASCII File (SISVAT Variables) | + ! | # | Energy Budg. Verif.: Soil+(Sea-Ice)+Snow | + ! | # |(#E0 MUST BE PREPROCESSED BEFORE #e1 & #e2 !) | + ! | # SISVAT_iii_jjj_n | #m0: OUTPUT/Verification: H2O Conservation | + ! | | | + ! | # stdout | #s0: OUTPUT of Snow Buffer Layer | + ! | | unit 6, subroutine SISVAT **ONLY** | + ! | # stdout | #sb: OUTPUT of Snow Erosion | + ! | | unit 6, subroutine SISVAT_BSn **ONLY** | + ! | # stdout | #sz: OUTPUT of Roughness Length & Drag Coeff. | + ! | | unit 6, subroutine SISVAT **ONLY** | + ! | # stdout | #wz: OUTPUT of Roughness Length (Blown Snow) | + ! | | unit 6, subroutines SISVAT, PHY_SISVAT | + ! | | + ! | SUGGESTIONS of MODIFICATIONS: see lines beginning with "C +!!!" | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mar_sv + use marlsv + use mardsv + use mar0sv + use marxsv + use mardim + use mar_ge + use marysv + use margrd +#if(CP) + use marcdp +#endif + + implicit none + + ! +--Internal Variables + ! + ================== + + ! TBr_sv : Brightness Temperature + real TBr_sv(klonv) + ! IRdwsv : DOWNward IR Flux + real IRdwsv(klonv) + ! IRupsv : UPward IR Flux + real IRupsv(klonv) + ! d_Bufs : Buffer Snow Layer Increment + real d_Bufs, Bufs_N + ! Buf_ro : Buffer Snow Layer Density + real Buf_ro, Bros_N + ! BufPro : Buffer Snow Layer Density + real BufPro + ! dt__SV2 : saved dt + real dt__SV2 + ! Buf_G1 : Buffer Snow Layer Dendr/Sphe[-] + real Buf_G1, BG1__N + ! Buf_G2 : Buffer Snow Layer Spher/Size[-] + real Buf_G2, BG2__N + ! Bdzssv : Buffer Snow Layer Thickness + real Bdzssv(klonv) + ! z_snsv : Snow-Ice, current Thickness + real z_snsv(klonv) + + ! +--Energy Budget + ! + ~~~~~~~~~~~~~~~~~~~~~ + ! ETVg_d : VegetationPower, Forcing + real ETVg_d(klonv) + ! ETSo_0 : Soil/Snow Power, before Forcing + real ETSo_0(klonv) + ! ETSo_1 : Soil/Snow Power, after Forcing + real ETSo_1(klonv) + ! ETSo_d : Soil/Snow Power, Forcing + real ETSo_d(klonv) +#if(e1) + ! EqSn_0 : Snow Energy, befor Phase Change + real EqSn_0(klonv) + ! EqSn_1 : Snow Energy, after Phase Change + real EqSn_1(klonv) + ! EqSn_d : Energy in Excess + real EqSn_d(klonv) +#endif + + ! +--Water (Mass) Budget + ! + ~~~~~~~~~~~~~~~~~~~~~ + ! Wats_0 : Soil Water, before Forcing + real Wats_0(klonv) + ! Wats_1 : Soil Water, after Forcing + real Wats_1(klonv) + ! Wats_d : Soil Water, Forcing + real Wats_d(klonv) + +#if(m1) + ! +--Snow/Ice(Mass) Budget + ! + ~~~~~~~~~~~~~~~~~~~~~ + ! SIsubl : Snow Sublimed/Deposed Mass + real SIsubl(klonv) + ! SImelt : Snow Melted Mass + real SImelt(klonv) + ! SIrnof : Local Surficial Water + Run OFF + real SIrnof(klonv) +#endif + + ! +--Sea-Ice (Mass) Budget + ! + ~~~~~~~~~~~~~~~~~~~~~ + ! SIvAcr : Sea-Ice Vertical Acretion + real SIvAcr(klonv) + + ! +--Local + ! + ----- + +#if(MT) + ! Garrat : SBL Scheme Switch + logical Garrat +#endif + ! SepLab : OUTPUT ASCII File Labels + character * 1 SepLab + character * 6 FilLab + character * 16 FilNam + common / SISVAT_loc_abc / SepLab, FilLab + ! FilLab : OUTPUT File Unit Number + integer noUNIT + ! FilNam : OUTPUT File Unit Number (New) + integer nwUNIT + common / SISVAT_loc_num / nwUNIT + integer iwr, itPhys + integer ikl, isn, isl, ist, it + ! Soil/Water Body Identifier + integer ist__s, ist__w + ! Seasonal Mask + integer growth + ! Land+Ice / Open Sea Mask + integer LISmsk + ! Snow-Ice / No Snow-Ice Mask + integer LSnMsk + ! Ice / No Ice Mask + integer IceMsk, IcIndx(klonv) + ! Snow / No Snow Mask + integer SnoMsk + ! Rain Contribution to the Canopy + real drr_Ca, rrCa_n, drip + ! Snow Contribution to the Canopy + real dsn_Ca, snCa_n, FallOK(klonv) + ! Fallen Snow Density (PAHAUT) + real roSMin, roSn_1, roSn_2, roSn_3 + ! Max. Fallen Snow Density + real roSMax + ! Fallen Snow Dendric.(GIRAUD) + real Dendr1, Dendr2, Dendr3 + ! Fallen Snow Spheric.(GIRAUD) + real Spher1, Spher2, Spher3, Spher4 + ! Polar Snow Switch + real Polair + real PorSno, Por_BS, Salt_f, PorRef +#if(sw) + real PorVol, rWater + real rusNEW, rdzNEW, etaNEW +#endif + real ro_new + ! Maximum Polar Temperature + real TaPole + ! Minimum realistic Temperature + real T__Min + ! Emissivity of Vegetation + real EmiVeg + ! Emissivity of Soil + real EmiSol + ! Emissivity of Snow + real EmiSno + ! Emissivity of a Water Area + real EmiWat + ! Square of Von Karman Constant + real vk2 + ! (u*)**2 + real u2star +#if(WR) + ! Friction Velocity (aer.resist.) + real u_star +#endif + ! Fallen Leaves Switch + real fallen + ! Sea Roughness Length + real Z0mSea, Z0hSea + ! Land Roughness Length + real Z0mLnd +#if(ZN) + ! u*t/u* + real sqrrZ0 +#endif + ! Marticorena & B. 1995 JGR (20) + real f_eff + ! Fundamental * Roughness + real A_Fact + ! Smooth R Snow Roughness Length + real Z0m_nu + ! BSnow Roughness Length + real Z0mBSn + ! Mimimum BSnow Roughness Length + real Z0mBS0 + ! Mimimum Snow Roughness Length + real Z0m_S0 + ! Maximum Snow Roughness Length + real Z0m_S1 +#if(SZ) + ! Regime Snow Roughness Length + real Z0Sa_N + ! 1.if Rgm Snow Roughness Length + real Z0SaSi +#endif +#if(GL) + ! Mimimum GIMEX Roughness Length + real Z0_GIM +#endif + ! Sea-Ice ISW Roughness Length + real Z0_ICE + ! Snow Surface Roughness Length + real Z0m_Sn, Z0m_90 + ! Snow Layer Switch + real SnoWat +#if(RN) + real rstar, alors + real rstar0, rstar1, rstar2 +#endif + ! 1. => Same Type of Grains + real SameOK + ! Averaged G1, same Grains + real G1same + ! Averaged G2, same Grains + real G2same + ! 1. => Lay1 Type: Dendritic + real typ__1 + ! dz X ro, if fresh Snow + real zroNEW + ! G1, if fresh Snow + real G1_NEW + ! G2, if fresh Snow + real G2_NEW + ! dz X ro, if old Snow + real zroOLD + ! G1, if old Snow + real G1_OLD + ! G2, if old Snow + real G2_OLD + ! Size, if fresh Snow + real SizNEW + ! Spheric.,if fresh Snow + real SphNEW + ! Size, if old Snow + real SizOLD + ! Spheric.,if old Snow + real SphOLD + ! Averaged Grain Size + real Siz_av + ! Averaged Grain Spher. + real Sph_av + ! Averaged Grain Dendr. + real Den_av + ! 1. => Average is Dendr. + real DendOK + ! Averaged G1, diff. Grains + real G1diff + ! Averaged G2, diff. Grains + real G2diff + ! Averaged G1 + real G1 + ! Averaged G2 + real G2 + ! Polynomial fit z0=f(T) + real param + ! Fit Z0_obs=f(T) (m) + real Z0_obs + ! min T of linear fit (K) + real tamin + ! max T of linear fit (K) + real tamax + ! Coefs for z0=f(T) + real coefa, coefb, coefc, coefd + ! Air temperature thresholds + real ta1, ta2, ta3 + ! z0 thresholds + real z01, z02, z03 + ! Critical param. + real tt_c, vv_c + ! Temporary variables + real tt_tmp, vv_tmp, vv_virt + ! .true. if Kotlyakov 1961 else density from obs. + logical density_kotlyakov +#if(BS) + ! Correc. factor for drift ratio + real Fac +#endif + + ! +--Energy Budget + ! + ~~~~~~~~~~~~~~~~~~~ +#if(e1) + ! Energy Imbalances Counter + integer noEBal + common / SISVAT__EBal / noEBal + ! Soil+Vegetat Power Forcing + real Enrsvd(klonv) + ! Soil+Snow , Power Balance + real EnsBal + ! Vegetat, Power Balance + real EnvBal +#endif + + ! +--Water (Mass) Budget + ! + ~~~~~~~~~~~~~~~~~~~ +#if(m0) + ! Water Imbalances Counter + integer noWBal + common / SISVAT__WBal / noWBal + ! Soil+Vegetat, before Forcing + real Watsv0(klonv) + ! Soil+Vegetat Water Forcing + real Watsvd(klonv) + ! Soil+Vegetat, Water Balance + real Watbal +#endif + + ! +--Snow (Mass) Budget + ! + ~~~~~~~~~~~~~~~~~~~ +#if(m1) + ! Water Imbalances Counter + integer noSBal + common / SISVAT__SBal / noSBal + ! Snow Initial/Final Mass + real SIWm_0(klonv), SIWm_1(klonv) + ! Snow Initial/Final ATM Forcing + real SIWa_i(klonv), SIWa_f(klonv) + ! Snow Initial/Final BLS Forcing + real SIWe_i(klonv), SIWe_f(klonv) + ! Snow Pack Mass Balance + real SnoBal +#endif + + ! +--Internal DATA + ! + ============= + +#if(MT) + ! SBL Scheme Switch + data Garrat/.true./ +#endif + ! Minimum realistic Temperature + data T__Min/200.00/ +#if(AC) + ! Maximum Polar Temperature + data TaPole/283.15/ +#endif + ! Maximum Polar Temperature + data TaPole/268.15/ +#if(EU) + ! Minimum Snow Density + data roSMin/25./ +#endif +#if(BS) + ! Minimum Snow Density + data roSMin/300./ +#endif +#if(AC) + ! Minimum Snow Density + data roSMin/300./ +#endif + ! Minimum Snow Density + data roSMin/300./ + !XF +#if(EU) + ! Max Fresh Snow Density + data roSMax/150./ +#endif + ! Max Fresh Snow Density + data roSMax/400./ + ! Critical Temp. (degC) + ! tt_c=-2. => rho->quickly to rho(vv_c) when T->-inf + data tt_c/-2.0/ + ! Critical Wind speed (m/s) + ! vv_c=14.3 => rho->300 when T->-inf + data vv_c/14.3/ + ! Fall.Sno.Density, Indep. Param. + data roSn_1/109./ + ! Fall.Sno.Density, Temper.Param. + data roSn_2/6./ + ! Fall.Sno.Density, Wind Param. + data roSn_3/26./ + ! Fall.Sno.Dendric.,Wind 1/Param. + data Dendr1/17.12/ + ! Fall.Sno.Dendric.,Wind 2/Param. + data Dendr2/128./ + ! Fall.Sno.Dendric.,Indep. Param. + data Dendr3/-20./ + ! Fall.Sno.Spheric.,Wind 1/Param. + data Spher1/7.87/ + ! Fall.Sno.Spheric.,Wind 2/Param. + data Spher2/38./ + ! Fall.Sno.Spheric.,Wind 3/Param. + data Spher3/50./ + ! Fall.Sno.Spheric.,Indep. Param. + data Spher4/90./ + ! Emissivities : Pielke, 1984, pp. 383,409 + ! EmisnoAO and EmiWatAO are defined and fixed in MAR_phy.inc !AO_CK 20/02/2020 + ! Emissivity of Soil + data EmiSol/0.94/ + ! Emissivity of Vegetation + data EmiVeg/0.98/ + ! Emissivity of a Water Area + data EmiWat/0.99/ + ! Emissivity of Snow + data EmiSno/0.99/ + + ! Fallen Leaves Switch + data fallen/0./ + ! MINimum Snow Roughness Length + ! for Momentum if Blowing Snow + ! Gallee et al. 2001 BLM 99 (19) + data Z0mBS0/0.5e-6/ + ! MINimum Snow Roughness Length + data Z0m_S0/0.00005/ + ! MINimum Snow Roughness Length +#if(MG) + ! MegaDunes included + data Z0m_S0/0.00200/ +#endif + ! MAXimum Snow Roughness Length + ! (Sastrugis) + data Z0m_S1/0.030/ +#if(GL) + ! Ice Min Z0 = 0.0013 m (Broeke) + ! Old Ice Z0 = 0.0500 m (Bruce) + ! 0.0500 m (Smeets) + ! 0.1200 m (Broeke) + data Z0_GIM/0.0015/ +#endif + ! Sea-Ice Z0 = 0.0010 m (Andreas) + ! (Ice Station Weddel -- ISW) + data Z0_ICE/0.0010/ + ! Square of Von Karman Constant + vk2 = vonkar * vonkar +#if(FL) + ! Fallen Leaves Switch + fallen = 1. +#endif + + ! +..BEGIN.main. + ! +--SISVAT Forcing VERIFICATION + ! + =========================== + + if(.not. iniOUT) then + iniOUT = .true. + if(IRs_SV(1) > -epsi) & + write(6, 600) +600 format(/, '### SISVAT ERROR, Soil IR Upward not defined ###', & + /, '### Initialize and Store IRs_SV ###') + + ! OUTPUT + ! ====== + + FilLab = 'SISVAT' + SepLab = '_' + nwUNIT = 51 + endif +#if(E0) + do ikl = 1, klonv + if(lwriSV(ikl) /= 0 .and. no__SV(lwriSV(ikl)) == 0) then + nwUNIT = nwUNIT + 1 + no__SV(lwriSV(ikl)) = nwUNIT + write(FilNam, '(a6,a1,2(i3.3,a1),i1)') & + FilLab, SepLab, i___SV(lwriSV(ikl)), & + SepLab, j___SV(lwriSV(ikl)), & + SepLab, n___SV(lwriSV(ikl)) + open(unit=nwUNIT, status='unknown', file=FilNam) + rewind nwUNIT + endif + enddo + do ikl = 1, klonv + if(lwriSV(ikl) /= 0) then + noUNIT = no__SV(lwriSV(ikl)) + write(noUNIT, 5000) daHost, i___SV(lwriSV(ikl)), & + j___SV(lwriSV(ikl)), & + n___SV(lwriSV(ikl)), & + Z0m_SV(ikl), & + albisv(ikl) +5000 format( & + /, a18, '| Grid Point ', 2i4, & + ' (', i2, ')', & + ' | Z0m =', f12.6, ' | Albedo = ', f6.3, ' |', & + /, ' -------+', 7('---------+'), 2('--------+')) + endif + enddo +#endif + + ! +--"Soil" Humidity of Water Bodies + ! + =============================== + + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! 1 => Soil + ist__s = min(ist, 1) + ! 1 => Water Body + ist__w = 1 - ist__s + do isl = -nsol, 0 + ! Soil + Water Body + eta_SV(ikl, isl) = eta_SV(ikl, isl) * ist__s & + + etadSV(ist) * ist__w + enddo + + ! +--Vertical Discretization Factor + ! + ============================== + ! Soil + Water Body + LSdzsv(ikl) = ist__s & + + OcndSV * ist__w + enddo + + ! +--Vegetation Temperature Limits + ! + ============================= + + do ikl = 1, klonv + TvegSV(ikl) = max(TvegSV(ikl), T__Min) ! T__Min = 200.K + + ! +--LAI Assignation and Fallen Leaves Correction (#FL) + ! + ================================================== + + LAI0SV(ikl) = LAI0SV(ikl) * min(1, ivgtSV(ikl)) ! NO LAI if + ! + ! no vegetation + + if(ivgtSV(ikl) == 13) then ! city + LAI0SV(ikl) = 0. + glf0SV(ikl) = 0. + endif + + glf_sv(ikl) = glf0SV(ikl) +#if(FL) + glf_sv(ikl) = 1. +#endif + LAI_sv(ikl) = LAI0SV(ikl) +#if(FL) + LAI_sv(ikl) = LAI_sv(ikl) * glf0SV(ikl) +#endif + enddo + + ! +--LAI in Presence of Snow + ! + ======================= + do ikl = 1, klonv + z_snsv(ikl) = 0.0 + enddo + do isn = 1, nsno + do ikl = 1, klonv + z_snsv(ikl) = z_snsv(ikl) + dzsnSV(ikl, isn) + zzsnsv(ikl, isn) = z_snsv(ikl) + enddo + enddo + ! + ASSUMPTION: LAI decreases when Snow Thickness increases, + ! + ^^^^^^^^^^ becoming 0 when Snow Thickn. = Displac.Height + do ikl = 1, klonv + LAI_sv(ikl) = LAI_sv(ikl) & + * (1.0 - zzsnsv(ikl, isnoSV(ikl)) & + / (DH_dSV(ivgtSV(ikl)) + epsi)) + LAI_sv(ikl) = max(LAI_sv(ikl), zero) + LAI_sv(ikl) = min(LAI_sv(ikl), argmax) + enddo + + ! +--Interception of Rain by the Canopy + ! + ================================== + + ! Vegetation Forcing + ! ------------------ +#if(m0) + do ikl = 1, klonv + Watsv0(ikl) = rrCaSV(ikl) ! Canopy Water Cont. + Watsvd(ikl) = drr_SV(ikl) ! Precipitation + enddo +#endif + + ! +--New Canopy Water Content + ! + ------------------------ + + do ikl = 1, klonv + ! Precip. Max. Intercept. + rrMxsv(ikl) = 0.2 * max(epsi, LAI_sv(ikl)) + ! Canopy Ventilation Coe. (DR97, eqn 3.6) + Sigmsv(ikl) = 1.0 - exp(-demi * LAI_sv(ikl)) + ! Intercepted Rain + drr_Ca = drr_SV(ikl) * Sigmsv(ikl) & + * dt__SV + ! New Canopy Water Contnt (DR97, eqn 3.28) + rrCa_n = rrCaSV(ikl) + drr_Ca + ! Water Drip + drip = rrCa_n - rrMxsv(ikl) + drip = max(zero, drip) + rrCa_n = rrCa_n - drip + ! Update Rain Contribut. + drr_SV(ikl) = drr_SV(ikl) + (rrCaSV(ikl) & + - rrCa_n) & + / dt__SV + RuofSV(ikl, 1) = RuofSV(ikl, 1) + max(0., drr_SV(ikl)) + ! Upd. Canopy Water Content + rrCaSV(ikl) = rrCa_n + + ! +--Interception of Snow by the Canopy + ! + ================================== + + ! cXF 03/03/2021 not relevant + ! ! Intercepted Snow + ! dsn_Ca = dsn_SV(ikl) * Sigmsv(ikl) * dt__SV + ! ! New Canopy Snow Thickn. + ! snCa_n = snCaSV(ikl) + dsn_Ca + ! drip = snCa_n - rrMxsv(ikl) + ! drip = max(zero, drip) + ! snCa_n = snCa_n - drip + ! ! Update Snow Contribut. + ! dsn_SV(ikl) = dsn_SV(ikl) + (snCaSV(ikl) - snCa_n) / dt__SV + ! ! Upd.Canopy Snow Thickn. + ! snCaSV(ikl) = snCa_n + snCaSV(ikl) = 0. + enddo + + ! +--Snow Fall from the Canopy + ! + ========================= + + ! + ASSUMPTION: snow fall from the canopy, + ! + ^^^^^^^^^^ when the temperature of the vegetation is positive + ! + (.OR. when snow over the canopy is saturated with water) + + ! do ikl = 1, klonv + ! FallOK(ikl) = max(zero, sign(unun, TvegSV(ikl) - TfSnow + epsi))& + ! * max(zero, sign(unun, snCaSV(ikl) - epsi)) + ! dsn_SV(ikl) = dsn_SV(ikl) + snCaSV(ikl) * FallOK(ikl)& + ! / dt__SV + ! snCaSV(ikl) = snCaSV(ikl) * (1. - FallOK(ikl)) +#if(AE) + ! +--Blowing Particles Threshold Friction velocity + ! + ============================================= + ! usthSV(ikl) = 1.0e+2 +#endif + ! end do + + ! +--Contribution of Snow to the Surface Snow Pack + ! + ============================================= + + if(SnoMod) then +#if(m1) + ! Snow Initial Mass (below the Canopy) and Forcing + ! ------------------------------------------------ + do ikl = 1, klonv + ! [mm w.e.] + SIWa_i(ikl) = (drr_SV(ikl) + dsn_SV(ikl)) * dt__SV + SIWe_i(ikl) = dbs_SV(ikl) + SIWm_0(ikl) = BufsSV(ikl) + HFraSV(ikl) * ro_Ice + do isn = 1, nsno + SIWm_0(ikl) = SIWm_0(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + enddo +#endif + ! +--Blowing Snow + ! + ------------ + if(BloMod) then + if(klonv == 1) then + if(isnoSV(1) >= 2 .and. & + TsisSV(1, max(1, isnoSV(1))) < 273. .and. & + ro__SV(1, max(1, isnoSV(1))) < 500. .and. & + eta_SV(1, max(1, isnoSV(1))) < epsi) then + ! + ********** + call SISVAT_BSn + ! + ********** + endif + else + ! + ********** + call SISVAT_BSn + ! + ********** + endif + endif +#if(ve) + ! ********** + call SISVAT_wEq('_BSn ', 1) + ! ********** +#endif + + ! +--Sea Ice + ! + ------- + + ! + ********** + call SISVAT_SIc(SIvAcr) + ! + ********** +#if(ve) + ! ********** + call SISVAT_wEq('_SIc ', 0) + ! ********** +#endif + + ! +--Buffer Layer + ! + ------------ + do ikl = 1, klonv + ! BufsSV(ikl) [mm w.e.], i.e [kg/m2] + d_Bufs = max(dsn_SV(ikl) * dt__SV, 0.) + dsn_SV(ikl) = 0. + Bufs_N = BufsSV(ikl) + d_Bufs +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6601) BufsSV(ikl), d_Bufs, Bufs_N +6601 format(/, 'Buffer *: ', 3e15.6) +#endif + ! +--Snow Density + ! + ^^^^^^^^^^^^ + Polair = zero +#if(NP) + Polair = max(zero, & + sign(unun, TaPole & + - TaT_SV(ikl))) +#endif + Polair = max(zero, sign(unun, TaPole - TaT_SV(ikl))) + ! Fallen Snow Density [kg/m3] Pahaut (CEN) + Buf_ro = max(rosMin, & + roSn_1 + roSn_2 * (TaT_SV(ikl) - TfSnow) & + + roSn_3 * sqrt(VV10SV(ikl))) + ! Fallen Snow Density Kotlyakov (1961) +#if(NP) + BufPro = max(rosMin, & + 104.*sqrt(max(VV10SV(ikl) - 6.0, 0.0))) +#endif + + ! Fallen Snow Density, Adapted for Antarctica + density_kotlyakov = .true. +#if(AC) + ! C.Agosta snow densisty as if BS is on b + density_kotlyakov = .false. +#endif +#if(BS) + ! C.Amory BS 2018 + density_kotlyakov = .false. +#endif + if(density_kotlyakov) then + tt_tmp = TaT_SV(ikl) - TfSnow + vv_tmp = VV10SV(ikl) + ! + ... [ A compromise between + ! + ... Kotlyakov (1961) and Lenaerts (2012, JGR, Part1) ] + if(tt_tmp >= -10) then + BufPro = max(rosMin, & + 104.*sqrt(max(vv_tmp - 6.0, 0.0))) ! Kotlyakov (1961) + else + vv_virt = (tt_c * vv_tmp + vv_c * (tt_tmp + 10)) & + / (tt_c + tt_tmp + 10) + BufPro = 104.*sqrt(max(vv_virt - 6.0, 0.0)) + endif + else + ! + ... [ density derived from observations of the first 50cm of + ! + ... snow - cf. Rajashree Datta - and multiplied by 0.8 ] + ! + ... C. Agosta, 2016-09 + !c #SD BufPro = 149.2 + 6.84*VV10SV(ikl) + 0.48*Tsrfsv(ikl) + !c #SD BufPro = 125 + 14*VV10SV(ikl) + 0.6*Tsrfsv(ikl) !MAJ CK and CAm + BufPro = 200 + 21 * VV10SV(ikl)!CK 29/07/19 + endif + ! Temperate Snow or Polar Snow + Bros_N = (1.-Polair) * Buf_ro & + + Polair * BufPro + + !XF !!!! + Bros_N = max(20., max(rosMin, Bros_N)) + Bros_N = min(400., min(rosMax - 1, Bros_N)) ! for dz_min in SISVAT_zSn + !XF !!!! + +#if(BS) + ! Density of deposited blown snow + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Bros_N = frsno + ro_new = ro__SV(ikl, max(1, isnoSV(ikl))) + ro_new = max(Bros_N, min(roBdSV, ro_new)) + Fac = 1 - ((ro__SV(ikl, max(1, isnoSV(ikl))) & + - roBdSV) / (500.-roBdSV)) + Fac = max(0., min(1., Fac)) + dsnbSV(ikl) = Fac * dsnbSV(ikl) + Bros_N = Bros_N * (1.0 - dsnbSV(ikl)) & + + ro_new * dsnbSV(ikl) +#endif + ! Instantaneous Density if deposited blown Snow (Melted* from Canopy) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Bros_N = Bros_N * (1.0 - FallOK(ikl)) & + + 300.*FallOK(ikl) + + ! Time averaged Density of deposited blown Snow + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + BrosSV(ikl) = (Bros_N * d_Bufs & + + BrosSV(ikl) * BufsSV(ikl)) & + / max(epsi, Bufs_N) +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6602) Buf_ro, Bros_N, BrosSV(ikl), dsnbSV(ikl) +6602 format('rho *: ', 3e15.6, ' dsnbSV: ', e15.6) +#endif + ! +-- S.Falling Snow Properties (computed as in SISVAT_zAg) + ! + ^^^^^^^^^^^^^^^^^^^^^^^ + ! Temperate Snow Dendricity + Buf_G1 = max(-G1_dSV, & + min(Dendr1 * VV__SV(ikl) - Dendr2, & + Dendr3)) + ! Temperate Snow Sphericity + Buf_G2 = min(Spher4, & + max(Spher1 * VV__SV(ikl) + Spher2, & + Spher3)) ! + ! Temperate Snow OR Polar Snow + Buf_G1 = (1.-Polair) * Buf_G1 & + + Polair * G1_dSV + Buf_G2 = (1.-Polair) * Buf_G2 & + + Polair * ADSdSV + ! NO Blown Snow + G1 = Buf_G1 + ! NO Blown Snow + G2 = Buf_G2 +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6603) BG1sSV(ikl), BG2sSV(ikl) +6603 format('G1,G2 *: ', 3e15.6) +#endif +#if(BS) + ! S.1. Meme Type de Neige / same Grain Type + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SameOK = max(zero, & + sign(unun, Buf_G1 * G1_dSV & + - eps_21)) + G1same = ((1.0 - dsnbSV(ikl)) * Buf_G1 + dsnbSV(ikl) * G1_dSV) + G2same = ((1.0 - dsnbSV(ikl)) * Buf_G2 + dsnbSV(ikl) * ADSdSV) + ! Blowing Snow Properties: G1_dSV, ADSdSV + ! S.2. Types differents / differents Types + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! =1.=> Dendritic + typ__1 = max(zero, sign(unun, epsi - Buf_G1)) + ! fract.Dendr.Lay. + zroNEW = typ__1 * (1.0 - dsnbSV(ikl)) & + + (1.-typ__1) * dsnbSV(ikl) + ! G1 of Dendr.Lay. + G1_NEW = typ__1 * Buf_G1 & + + (1.-typ__1) * G1_dSV + ! G2 of Dendr.Lay. + G2_NEW = typ__1 * Buf_G2 & + + (1.-typ__1) * ADSdSV + ! fract.Spher.Lay. + zroOLD = (1.-typ__1) * (1.0 - dsnbSV(ikl)) & + + typ__1 * dsnbSV(ikl) + ! G1 of Spher.Lay. + G1_OLD = (1.-typ__1) * Buf_G1 & + + typ__1 * G1_dSV + ! G2 of Spher.Lay. + G2_OLD = (1.-typ__1) * Buf_G2 & + + typ__1 * ADSdSV + ! Size Dendr.Lay. + SizNEW = -G1_NEW * DDcdSV / G1_dSV & + + (1.+G1_NEW / G1_dSV) & + * (G2_NEW * DScdSV / G1_dSV & + + (1.-G2_NEW / G1_dSV) * DFcdSV) + ! Spher.Dendr.Lay. + SphNEW = G2_NEW / G1_dSV + ! Size Spher.Lay. + SizOLD = G2_OLD + ! Spher.Spher.Lay. + SphOLD = G1_OLD / G1_dSV + ! Averaged Size + Siz_av = (zroNEW * SizNEW + zroOLD * SizOLD) + ! Averaged Sphericity + Sph_av = min(zroNEW * SphNEW + zroOLD * SphOLD & + , unun) + Den_av = min((Siz_av - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) & + / (DDcdSV - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) & + , unun) + ! Small Grains + ! Faceted Grains + DendOK = max(zero, & + sign(unun, Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV & + - Siz_av)) + ! +... REMARQUE: le type moyen (dendritique ou non) depend + ! + ^^^^^^^^ de la comparaison avec le diametre optique + ! + d'une neige recente de dendricite nulle + ! +... REMARK: the mean type (dendritic or not) depends + ! + ^^^^^^ on the comparaison with the optical diameter + ! + of a recent snow having zero dendricity + G1diff = (-DendOK * Den_av & + + (1.-DendOK) * Sph_av) * G1_dSV + G2diff = DendOK * Sph_av * G1_dSV & + + (1.-DendOK) * Siz_av + G1 = SameOK * G1same & + + (1.-SameOK) * G1diff + G2 = SameOK * G2same & + + (1.-SameOK) * G2diff +#endif + ! FallOK : Melted * from Canopy + BG1__N = ((1.-FallOK(ikl)) * G1 & + + FallOK(ikl) * 99.) & + * d_Bufs / max(epsi, d_Bufs) + ! FallOK : Melted * from Canopy + BG2__N = ((1.-FallOK(ikl)) * G2 & + + FallOK(ikl) * 30.) & + * d_Bufs / max(epsi, d_Bufs) + + ! +-- S.Buffer Snow Properties (computed as in SISVAT_zAg) + ! + ^^^^^^^^^^^^^^^^^^^^^^^ + ! Falling Snow + Buf_G1 = BG1__N + ! Falling Snow + Buf_G2 = BG2__N +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6604) Buf_G1, Buf_G2, FallOK(ikl) & + , TvegSV(ikl) +6604 format('G1,G2 F*: ', 3e15.6, ' T__Veg: ', e15.6) +#endif + ! S.1. Meme Type de Neige / same Grain Type + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SameOK = max(zero, & + sign(unun, Buf_G1 * BG1sSV(ikl) & + - eps_21)) + G1same = (d_Bufs * Buf_G1 + BufsSV(ikl) * BG1sSV(ikl)) & + / max(epsi, Bufs_N) + G2same = (d_Bufs * Buf_G2 + BufsSV(ikl) * BG2sSV(ikl)) & + / max(epsi, Bufs_N) + + ! S.2. Types differents / differents Types + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + typ__1 = max(zero, sign(unun, epsi - Buf_G1)) ! =1.=> Dendritic + ! fract.Dendr.Lay. + zroNEW = (typ__1 * d_Bufs & + + (1.-typ__1) * BufsSV(ikl)) & + / max(epsi, Bufs_N) + ! G1 of Dendr.Lay. + G1_NEW = typ__1 * Buf_G1 & + + (1.-typ__1) * BG1sSV(ikl) + ! G2 of Dendr.Lay. + G2_NEW = typ__1 * Buf_G2 & + + (1.-typ__1) * BG2sSV(ikl) + ! fract.Spher.Lay. + zroOLD = ((1.-typ__1) * d_Bufs & + + typ__1 * BufsSV(ikl)) & + / max(epsi, Bufs_N) + ! G1 of Spher.Lay. + G1_OLD = (1.-typ__1) * Buf_G1 & + + typ__1 * BG1sSV(ikl) + ! G2 of Spher.Lay. + G2_OLD = (1.-typ__1) * Buf_G2 & + + typ__1 * BG2sSV(ikl) + ! Size Dendr.Lay. + SizNEW = -G1_NEW * DDcdSV / G1_dSV & + + (1.+G1_NEW / G1_dSV) & + * (G2_NEW * DScdSV / G1_dSV & + + (1.-G2_NEW / G1_dSV) * DFcdSV) + ! Spher.Dendr.Lay. + SphNEW = G2_NEW / G1_dSV + ! Size Spher.Lay. + SizOLD = G2_OLD + ! Spher.Spher.Lay. + SphOLD = G1_OLD / G1_dSV + ! Averaged Size + Siz_av = (zroNEW * SizNEW + zroOLD * SizOLD) + Sph_av = min(zroNEW * SphNEW + zroOLD * SphOLD & + , unun) ! Averaged Sphericity + Den_av = min((Siz_av - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) & + / (DDcdSV - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) & + , unun) + ! Small Grains + ! Faceted Grains + DendOK = max(zero, & + sign(unun, Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV & + - Siz_av)) + ! +... REMARQUE: le type moyen (dendritique ou non) depend + ! + ^^^^^^^^ de la comparaison avec le diametre optique + ! + d'une neige recente de dendricite nulle + ! +... REMARK: the mean type (dendritic or not) depends + ! + ^^^^^^ on the comparaison with the optical diameter + ! + of a recent snow having zero dendricity + + G1diff = (-DendOK * Den_av & + + (1.-DendOK) * Sph_av) * G1_dSV + G2diff = DendOK * Sph_av * G1_dSV & + + (1.-DendOK) * Siz_av + G1 = SameOK * G1same & + + (1.-SameOK) * G1diff + G2 = SameOK * G2same & + + (1.-SameOK) * G2diff + + BG1sSV(ikl) = G1 & + * Bufs_N / max(epsi, Bufs_N) + BG2sSV(ikl) = G2 & + * Bufs_N / max(epsi, Bufs_N) +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6605) Buf_G1, typ__1 & + , DendOK, Den_av, Sph_av, Siz_av & + , G1same, G1diff, G1 +6605 format('B1,Typ : ', 2e15.6, 11x, 'OK,Den,Sph,Siz: ', 4e15.6 & + , /, ' ', 30x, 11x, 'sam,dif,G1 : ', 3e15.6) +#endif + ! +--Update of Buffer Layer Content & Decision about creating a new snow layer + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + BufsSV(ikl) = Bufs_N ! [mm w.e.] + ! Allows to create + ! a new snow Layer + ! if Buffer > SMndSV + ! Except if * Erosion dominates + NLaysv(ikl) = min(unun, & + max(zero, & + sign(unun, BufsSV(ikl) & + - SMndSV)) & + * max(zero, & + sign(unun, 0.50 & + - dsnbSV(ikl))) & + ! Allows to create + ! a new snow Layer + ! is Buffer > SMndSV*3 + + max(zero, & + sign(unun, BufsSV(ikl) & + - SMndSV * 3.00))) + ! [mm w.e.] -> [m] + Bdzssv(ikl) = 1.e-3 * BufsSV(ikl) * ro_Wat & + / max(epsi, BrosSV(ikl))!& [m w.e.] -> [m] +#if(s0) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT for Buffer G1, G2 variables + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6606) BG1sSV(ikl), BG2sSV(ikl) & + , NLaysv(ikl), BdzsSV(ikl) +6606 format('G1,G2 N*: ', 2e15.6, i15, e27.6) +#endif + enddo + + ! +--Snow Pack Discretization + ! + ======================== + if(klonv == 1) then + if(isnoSV(1) >= 1 .or. NLaysv(1) >= 1) then + ! + ********** + call SISVAT_zSn + ! + ********** + endif + else + ! + ********** + call SISVAT_zSn + ! + ********** + endif +#if(ve) + ! + ********** + call SISVAT_wEq('_zSn ', 0) + ! + ********** +#endif +#if(EF) + if(isnoSV(1) > 0) & + write(6, 6004) isnoSV(1), dsn_SV(1) * dt__SV + BufsSV(1), & + ((dzsnSV(1, isn) * ro__SV(1, isn)), isn=1, isnoSV(1)) +6004 format(i3, ' dsn+Buf=', f6.2, 6x, 'z dz *ro =', 10f6.2, & + (/, 35x, 10f6.2)) +#endif + + ! +--Add a new Snow Layer + ! + ==================== + + do ikl = 1, klonv +#if(EC) + if(NLaysv(ikl) > 0) & + write(6, 6005) isnoSV(ikl), 1.e3 * Bdzssv(ikl), Brossv(ikl), & + BG1ssv(ikl), BG2ssv(ikl) +6005 format(i3, ' dz = ', f6.3, 3x, ' ro = ', f6.1, 3x, & + ' G1 = ', f6.3, 3x, ' G2 = ', f6.1) +#endif + ! + + isnoSV(ikl) = isnoSV(ikl) + NLaysv(ikl) + isn = isnoSV(ikl) + dzsnSV(ikl, isn) = dzsnSV(ikl, isn) * (1 - NLaysv(ikl)) & + + Bdzssv(ikl) * NLaysv(ikl) + TsisSV(ikl, isn) = TsisSV(ikl, isn) * (1 - NLaysv(ikl)) & + + min(TaT_SV(ikl), TfSnow) * NLaysv(ikl) + ro__SV(ikl, isn) = ro__SV(ikl, isn) * (1 - NLaysv(ikl)) & + + Brossv(ikl) * NLaysv(ikl) + eta_SV(ikl, isn) = eta_SV(ikl, isn) * (1 - NLaysv(ikl)) ! + 0. + agsnSV(ikl, isn) = agsnSV(ikl, isn) * (1 - NLaysv(ikl)) & + + (real(jdarGE + njyrGE(mmarGE)) / 365.+iyrrGE) & + * NLaysv(ikl) + G1snSV(ikl, isn) = G1snSV(ikl, isn) * (1 - NLaysv(ikl)) & + + BG1ssv(ikl) * NLaysv(ikl) + G2snSV(ikl, isn) = G2snSV(ikl, isn) * (1 - NLaysv(ikl)) & + + BG2ssv(ikl) * NLaysv(ikl) + istoSV(ikl, isn) = istoSV(ikl, isn) * (1 - NLaysv(ikl)) & + + max(zero, sign(unun, TaT_SV(ikl) & + - TfSnow - eps_21)) * istdSV(2) & + * NLaysv(ikl) + BufsSV(ikl) = BufsSV(ikl) * (1 - NLaysv(ikl)) + NLaysv(ikl) = 0 + enddo + + ! +--Snow Pack Thickness + ! + ------------------- + + do ikl = 1, klonv + z_snsv(ikl) = 0.0 + enddo + do isn = 1, nsno + do ikl = 1, klonv + z_snsv(ikl) = z_snsv(ikl) + dzsnSV(ikl, isn) + zzsnsv(ikl, isn) = z_snsv(ikl) + enddo + enddo + + ! +--Diffusion of Surficial Water in the Snow Pack + ! + --------------------------------------------- + +#if(sw) + do isn = 1, nsno + do ikl = 1, klonv + PorVol = 1.-ro__SV(ikl, isn) / ro_Ice + PorVol = max(PorVol, zero) + rWater = ws0dSV * PorVol * ro_Wat * dzsnSV(ikl, isn) & + * max(zero, & + sign(unun, rusnSV(ikl) / ro_Wat - zzsnsv(ikl, isn) & + + dzsnSV(ikl, isn))) + rusNEW = max(rusnSV(ikl) - rWater, zero) + rWater = rusnSV(ikl) - rusNEW + rdzNEW = rWater & + + ro__SV(ikl, isn) * dzsnSV(ikl, isn) + etaNEW = rWater / max(epsi, rdzNEW) + rusnSV(ikl) = rusNEW + ro__SV(ikl, isn) = rdzNEW / max(epsi, dzsnSV(ikl, isn)) + eta_SV(ikl, isn) = eta_SV(ikl, isn) + etaNEW + enddo + enddo +#endif + + endif + +#if(EF) + if(isnoSV(1) > 0) & + write(6, 6006) isnoSV(1), dsn_SV(1) * dt__SV + BufsSV(1), & + ((dzsnSV(1, isn) * ro__SV(1, isn)), isn=1, isnoSV(1)) +6006 format(i3, ' dsn+Buf=', f6.2, 6x, '* dz *ro =', 10f6.2, & + (/, 35x, 10f6.2)) +#endif + +#if(BD) + ! +--Blowing Dust + ! + ============ + + if(BloMod) then + ! + *************** + call SISVAT_BDu + ! + *************** + endif +#endif + + ! +--Soil Albedo: Soil Humidity Correction + ! + ========================================== + + ! +... REFERENCE: McCumber and Pielke (1981), Pielke (1984) + ! + ^^^^^^^^^ + do ikl = 1, klonv + albssv(ikl) = & + alb0SV(ikl) * (1.0 - min(demi, eta_SV(ikl, 0) & + / etadSV(isotSV(ikl))))**0.5 + !XF + ! +... REMARK: Albedo of Water Surfaces (isotSV=0): + ! + ^^^^^^ alb0SV := 2 X effective value, while + ! + eta_SV := etadSV + enddo + + ! +--Snow Pack Optical Properties + ! + ============================ + + if(SnoMod) then + + ! + ****** + call SnOptP + ! + ****** + + else + do ikl = 1, klonv + sEX_sv(ikl, 1) = 1.0 + sEX_sv(ikl, 0) = 0.0 + albisv(ikl) = albssv(ikl) + enddo + endif +#if(ve) + ! + ********** + call SISVAT_wEq('SnOptP', 0) + ! + ********** +#endif + + ! +--Solar Radiation Absorption and Effective Leaf Area Index + ! + ======================================================== + + ! + ****** + call VgOptP + ! + ****** + + ! +--Surface-Canopy Emissivity + ! + ========================= + + do ikl = 1, klonv + + LSnMsk = min(iun, isnoSV(ikl)) + ! Veg Transmit.Frac. + tau_sv(ikl) = exp(-LAI_sv(ikl)) + ! Veg+Sno Emissivity + Evg_sv(ikl) = EmiVeg * (1 - LSnMsk) + EmiSno * LSnMsk + ! Sol+Sno Emissivity + Eso_sv(ikl) = EmiSol * (1 - LSnMsk) + EmiSno * LSnMsk + emi_SV(ikl) = & + (((EmiSol * tau_sv(ikl) & + + EmiVeg * (1.0 - tau_sv(ikl))) * LSmask(ikl)) & + + EmiWat * (1 - LSmask(ikl))) * (1 - LSnMsk) & + + EmiSno * LSnMsk + +#if(AO) + ! ocean + if(LSmask(ikl) == 0) then + ! covered by snow/ice + if(LSnMSK == 1) then + ! Imposed Values from NEMO + Evg_sv(ikl) = EmiSnoAO + Eso_sv(ikl) = EmiSnoAO + Emi_sv(ikl) = EmiSnoAO + ! open water + else + ! Imposed Values from NEMO + emi_sv(ikl) = EmiwatAO + endif + endif +#endif + enddo + + ! +--Soil/Vegetation Forcing/ Upward IR (INPUT, from previous time step) + ! + =================================================================== + + do ikl = 1, klonv +#if(e1) + Enrsvd(ikl) = -IRs_SV(ikl) +#endif + IRupsv(ikl) = IRs_SV(ikl) * tau_sv(ikl) ! Upward IR + enddo + + ! +--Turbulence + ! + ========== + + ! +--Latent Heat of Vaporization/Sublimation + ! + --------------------------------------- + + do ikl = 1, klonv + SnoWat = min(isnoSV(ikl), 1) + Lx_H2O(ikl) = & + (1.-SnoWat) * Lv_H2O & + + SnoWat * (Ls_H2O * (1.-eta_SV(ikl, isnoSV(ikl))) & + + Lv_H2O * eta_SV(ikl, isnoSV(ikl))) + enddo + + ! +--Roughness Length for Momentum + ! + ----------------------------- + + ! +--Land+Sea-Ice / Ice-free Sea Mask + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + IcIndx(ikl) = 0 + enddo + do isn = 1, nsno + do ikl = 1, klonv + IcIndx(ikl) = max(IcIndx(ikl), & + isn * max(0, & + sign(1, & + int(ro__SV(ikl, isn) - 900.)))) + enddo + enddo + + do ikl = 1, klonv + LISmsk = min(iiceSV(ikl), 1) + LISmsk = max(LSmask(ikl), LISmsk) + IceMsk = max(0, sign(1, IcIndx(ikl) - 1)) + SnoMsk = max(min(isnoSV(ikl) - iiceSV(ikl), 1), 0) + + ! +--Sea Roughness Length + ! + ^^^^^^^^^^^^^^^^^^^^^ + Z0mSea = 0.0002 + Z0hSea = 0.000049 + +#if(zs) + ! Doyle MWR 130 p.3088 2e col + Z0mSea = 0.0185 * us__SV(ikl) * us__SV(ikl) * grvinv +#endif + ! Wang MWR 129 p.1377 (21) + Z0mSea = 0.016 * us__SV(ikl) * us__SV(ikl) & + * grvinv & + + 0.11 * akmol & + / max(epsi, us__SV(ikl)) + +#if(zs) + ! Wang MWR 129 p.1377 (21) (adapted) + Z0mSea = 0.0185 * us__SV(ikl) * us__SV(ikl) & + * grvinv & + + 0.135 * akmol & + / max(epsi, us__SV(ikl)) +#endif + ! Wang MWR 129 p.1377 (22) + Z0hSea = max(0.000049, & + 0.20 * akmol & + / max(epsi, us__SV(ikl))) + + Z0mSea = max(Z0mSea, epsi) ! + + ! +--Land Roughness Length, Snow Contribution excluded + ! + ^^^^^^^^^^^^^^^^^^^^^^ Ice Contribution included + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! +--If vegetation Seasonal Cycle described by LAI : + growth = min(max(0, 7 - ivgtSV(ikl)), 1) + Z0mLnd = Z0mdSV(ivgtSV(ikl)) * LAI_sv(ikl) * growth & + / LAIdSV & + + Z0mdSV(ivgtSV(ikl)) * (1 - growth) + + ! +--If vegetation Seasonal Cycle described by GLF only: + Z0mLnd = & + fallen * Z0mLnd & + + (1.-fallen) * Z0mdSV(ivgtSV(ikl)) * glf_sv(ikl) * growth & + + Z0mdSV(ivgtSV(ikl)) * (1 - growth) + + ! +--Land Roughness Length, Influence of the Masking by Snow + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0mLnd = max(Z0mLnd, & + Z0mdSV(0) * (iun - IceMsk) & + + Z0_ICE * IceMsk) + Z0mLnd = Z0mLnd & + - (zzsnsv(ikl, isnoSV(ikl)) & + - zzsnsv(ikl, max(IcIndx(ikl), 0))) / 7. + Z0mLnd = max(Z0mLnd, 5.e-5) ! Min set := Z0 on * + ! +... Roughness disappears under Snow + ! + Assumption Height/Roughness Length = 7 is used + + ! +--Z0 Smooth Regime over Snow (Andreas 1995, CRREL Report 95-16, p. 8) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0m_nu = 5.e-5 ! z0s~(10-d)*exp(-vonkar/sqrt(1.1e-03)) + + ! +--Z0 Saltat.Regime over Snow (Gallee et al., 2001, BLM 99 (19) p.11) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + u2star = us__SV(ikl) * us__SV(ikl) + Z0mBSn = u2star * 0.536e-3 - 61.8e-6 + Z0mBSn = max(Z0mBS0, Z0mBSn) + + ! +--Z0 Smooth + Saltat. Regime + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0enSV(ikl) = Z0m_nu & + + Z0mBSn + + ! +--Rough Snow Surface Roughness Length (Typical Value) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#if(tz) + Z0m_Sn = 0.250e-3 ! Andreas 1995, CRREL Report 95-16, fig.1&p.2 +#endif + ! ! z0r~(10-d)*exp(-vonkar/sqrt(1.5e-03))-5.e-5 + Z0m_Sn = 2.000e-3 ! Calibration of MAR +#if(TZ) + Z0m_Sn = 1.000e-3 ! Exemple Tuning in RACMO + Z0m_Sn = 0.500e-3 ! Exemple Tuning in MAR +#endif + + ! +--Rough Snow Surface Roughness Length (Variable Sastrugi Height) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + A_Fact = 1.0000 ! Andreas et al., 2004, p.4 + ! ! ams.confex.com/ams/pdfpapers/68601.pdf + + ! Parameterization of z0 dependance on Temperature (C. Amory, 2017) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Z0=f(T) deduced from observations, Adelie Land, dec2012-dec2013 + coefa = 0.1658 !0.1862 !Ant + coefb = -50.3869 !-55.7718 !Ant + ta1 = 253.15 !255. Ant + ta2 = 273.15 + ta3 = 273.15 + 3 + z01 = exp(coefa * ta1 + coefb) !~0.2 ! ~0.25 mm + z02 = exp(coefa * ta2 + coefb) !~6 !~7 mm + z03 = z01 + coefc = log(z03 / z02) / (ta3 - ta2) + coefd = log(z03) - coefc * ta3 + if(TaT_SV(ikl) < ta1) then + Z0_obs = z01 + else if(TaT_SV(ikl) >= ta1 .and. TaT_SV(ikl) < ta2) then + Z0_obs = exp(coefa * TaT_SV(ikl) + coefb) + else if(TaT_SV(ikl) >= ta2 .and. TaT_SV(ikl) < ta3) then + ! ! if st > 0, melting induce smooth surface + Z0_obs = exp(coefc * TaT_SV(ikl) + coefd) + else + Z0_obs = z03 + endif + + ! Z0_obs = 1.000e-3 + + !cCA Snow roughness lenght deduced from observations + !cCA (parametrization if no Blowing Snow) + !cCA ----------------------------------- C. Agosta 09-2016 ----- + !cCA Substract Z0enSV(ikl) because re-added later in Z0mnSV(ikl) + Z0m_Sn = Z0_obs - Z0enSV(ikl) + !cCA ----------------------------------------------------------- + + param = Z0_obs / 1. ! param(s) | 1.(m/s)=TUNING +#if(SZ) + ! 0.0001 = TUNING + Z0Sa_N = (us__SV(ikl) - 0.2) * param & + * max(zero, sign(unun, TfSnow - eps9 & + - TsisSV(ikl, isnoSV(ikl)))) + ! 1 if erosion + ! Z0SaSi = max(zero,sign(unun,Z0Sa_N )) + Z0SaSi = max(zero, sign(unun, zero - eps9 - uss_SV(ikl)))! + Z0Sa_N = max(zero, Z0Sa_N) + Z0SaSV(ikl) = & + max(Z0SaSV(ikl), Z0SaSV(ikl) & + + Z0SaSi * (Z0Sa_N - Z0SaSV(ikl)) * exp(-dt__SV / 43200.)) & + - min(dz0_SV(ikl), Z0SaSV(ikl)) + ! CAUTION: The influence of the sastrugi direction is not yet included + ! A=5 if h~10cm + A_Fact = Z0SaSV(ikl) * 5.0 / 0.15 + Z0m_Sn = Z0SaSV(ikl) & + - Z0m_nu +#endif +#if(ZN) + ! +--Z0 Saltat.Regime over Snow (Shao & Lin, 1999, BLM 91 (46) p.222) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + sqrrZ0 = usthSV(ikl) / max(us__SV(ikl), 0.001) + sqrrZ0 = min(sqrrZ0, 0.999) + Z0mBSn = 0.55 * 0.55 * exp(-sqrrZ0 * sqrrZ0) & + * us__SV(ikl) * us__SV(ikl) * grvinv * 0.5 + ! +--Z0 Smooth + Saltat. Regime (Shao & Lin, 1999, BLM 91 (46) p.222) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0enSV(ikl) = (Z0m_nu**sqrrZ0) & + * (Z0mBSn**(1.-sqrrZ0)) + Z0enSV(ikl) = max(Z0enSV(ikl), Z0m_nu) +#endif +#if(ZA) + ! +--Z0 Smooth Regime over Snow (Andreas etAl., 2004 + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ ams.confex.com/ams/pdfpapers/68601.pdf) + Z0m_nu = 0.135 * akmol / max(us__SV(ikl), epsi) + ! +--Z0 Saltat.Regime over Snow (Andreas etAl., 2004 + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ ams.confex.com/ams/pdfpapers/68601.pdf) + Z0mBSn = 0.035 * u2star * grvinv + ! +--Z0 Smooth + Saltat. Regime (Andreas etAl., 2004 + ! ( used by Erosion) ams.confex.com/ams/pdfpapers/68601.pdf) + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0enSV(ikl) = Z0m_nu & + + Z0mBSn + ! +--Z0 Rough Regime over Snow (Andreas etAl., 2004 + ! + (.not. used by Erosion) ams.confex.com/ams/pdfpapers/68601.pdf) + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^ + u2star = (us__SV(ikl) - 0.1800) / 0.1 + Z0m_Sn = A_Fact * Z0mBSn * exp(-u2star * u2star) + Z0m_90 = (10.-0.025 * VVs_SV(ikl) / 5.) & + * exp(-0.4 / sqrt(.00275 + .00001 * max(0., VVs_SV(ikl) - 5.))) + Z0m_Sn = DDs_SV(ikl) * Z0m_90 / 45. & + -DDs_SV(ikl) * DDs_SV(ikl) * Z0m_90 / (90.*90.) +#endif + ! +--Z0 (Erosion) over Snow (instantaneous or time average) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Z0e_SV(ikl) = Z0enSV(ikl) + Z0e_SV(ikl) = Z0emSV(ikl) + + ! +--Momentum Roughness Length + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! Contribution of + ! Vegetation Form + ! Sastrugi Form + ! Snow Erosion + Z0mnSV(ikl) = Z0mLnd & + + (Z0m_Sn & + + Z0enSV(ikl)) * SnoMsk + + ! +--Mom. Roughness Length, Discrimination among Ice/Land and Ice-Free Ocean + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! Ice and Land + Ice-Free Ocean + Z0mnSV(ikl) = Z0mnSV(ikl) * LISmsk & + + Z0mSea * (1 - LISmsk) +#if(OR) + ! Subgrid Topogr. + Z0mnSV(ikl) = Z0mnSV(ikl) + Z0roSV(ikl) +#endif + +#if(GL) + ! +--GIS Roughness Length + ! + ^^^^^^^^^^^^^^^^^^^^^ + Z0mnSV(ikl) = & + (1 - LSmask(ikl)) * Z0mnSV(ikl) & + + LSmask(ikl) * max(Z0mnSV(ikl), max(Z0_GIM, & + Z0_GIM + (Z0_GIM * 10 - Z0_GIM) * (ro__SV(ikl, isnoSV(ikl)) - 600.) & + / (ro_ice - 600.))) +#endif + + ! +--Mom. Roughness Length, Instantaneous OR Box Moving Average in Time + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! Z0mnSV instant. + Z0m_SV(ikl) = Z0mnSV(ikl) + ! Z0mnSV Average + Z0m_SV(ikl) = Z0mmSV(ikl) + + ! +--Corrected Threshold Friction Velocity before Erosion ! Marticorena and + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ! Bergametti 1995 +#if(BS) + ! not used anymore since Marticorena and Bergametti disabled !CK 18/07/2018 + ! Z0e_SV(ikl) = min(Z0m_SV(ikl),Z0e_SV(ikl)) +#endif +#if(MB) + ! f_eff= log(0.35*(0.1 /Z0e_SV(ikl))**0.8) ! JGR 100 + ! (20) p. 16420 p.16426 2nd ? + ! f_eff=1.-(log( Z0m_SV(ikl)/Z0e_SV(ikl) )) & + ! /(max( f_eff ,epsi )) + ! CONTROL + ! f_eff= max( f_eff ,epsi ) + ! TUNING + ! f_eff=1.0 -(1.0 - f_eff) /5.00 + ! f_eff= min( f_eff ,1.00 ) + ! usthSV(ikl) = usthSV(ikl)/f_eff +#endif + + ! +--Roughness Length for Scalars + ! + ---------------------------- + Z0hnSV(ikl) = Z0mnSV(ikl) / 7.4 + ! (Taylor & Clark, QJRMS 127,p864) + ! Z0h = Z0m /100.0 over the Sahel +#if(SH) + Z0hnSV(ikl) = Z0mnSV(ikl) / 100.0 +#endif +#if(RN) + !XF #RN does not work over bare ice + !XF MAR is then too warm and not enough melt + rstar = Z0mnSV(ikl) * us__SV(ikl) / akmol + rstar = max(epsi, min(rstar, thous)) + alors = log(rstar) + rstar0 = 1.250e0 * max(zero, sign(unun, 0.135e0 - rstar)) & + + (1.-max(zero, sign(unun, 0.135e0 - rstar))) & + * (0.149e0 * max(zero, sign(unun, 2.500e0 - rstar)) & + + 0.317e0 & + * (1.-max(zero, sign(unun, 2.500e0 - rstar)))) + rstar1 = 0.*max(zero, sign(unun, 0.135e0 - rstar)) & + + (1.-max(zero, sign(unun, 0.135e0 - rstar))) & + * (-0.55e0 * max(zero, sign(unun, 2.500e0 - rstar)) & + - 0.565 & + * (1.-max(zero, sign(unun, 2.500e0 - rstar)))) + rstar2 = 0.*max(zero, sign(unun, 0.135e0 - rstar)) & + + (1.-max(zero, sign(unun, 0.135e0 - rstar))) & + * (0.*max(zero, sign(unun, 2.500e0 - rstar)) & + - 0.183 & + * (unun - max(zero, sign(unun, 2.500e0 - rstar)))) + if(ro__SV(ikl, isnoSV(ikl)) > 50 & + .and. ro__SV(ikl, isnoSV(ikl)) < roSdSV) then + Z0hnSV(ikl) = max(zero & + , sign(unun, zzsnsv(ikl, isnoSV(ikl)) - epsi)) & + * exp(rstar0 + rstar1 * alors + rstar2 * alors * alors) & + * 0.001e0 + Z0hnSV(ikl) * (1.-max(zero & + , sign(unun, zzsnsv(ikl, isnoSV(ikl)) - epsi))) + endif +#endif + + ! Ice-free Ocean + Ice and Land + Z0hnSV(ikl) = Z0hSea * (1 - LISmsk) & + + Z0hnSV(ikl) * LISmsk + + Z0h_SV(ikl) = Z0hnSV(ikl) + Z0h_SV(ikl) = Z0hmSV(ikl) + + ! +--Contributions of the Roughness Lenghths to the neutral Drag Coefficient + ! + ----------------------------------------------------------------------- + +#if(MT) + ! Min Z0_m (Garrat Scheme) + Z0m_SV(ikl) = max(2.0e-6, Z0m_SV(ikl)) +#endif + Z0m_SV(ikl) = min(Z0m_SV(ikl), za__SV(ikl) * 0.3333) + sqrCm0(ikl) = log(za__SV(ikl) / Z0m_SV(ikl)) + sqrCh0(ikl) = log(za__SV(ikl) / Z0h_SV(ikl)) + +#if(wz) + if(ikl == 1) write(6, 6661) dsn_SV(ikl), us__SV(ikl), Z0SaSi & + , Z0Sa_N, Z0SaSV(ikl), Z0m_Sn, Z0m_SV(ikl) +6661 format(7f9.6) +#endif + +#if(sz) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! OUTPUT of Roughness Length and Drag Coefficients + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6600) za__SV(ikl), Z0m_SV(ikl) & + , sqrCm0(ikl), za__SV(ikl) / Z0m_SV(ikl) & + , Z0SaSV(ikl), Z0h_SV(ikl) & + , sqrCh0(ikl), za__SV(ikl) / Z0h_SV(ikl) +6600 format(/, ' ** SISVAT *0 ' & + , ' za__SV = ', e12.4, ' Z0m_SV = ', e12.4 & + , ' sqrCm0 = ', e12.4, ' Za/Z0m = ', e12.4 & + , /, ' ' & + , ' Z0SaSV = ', e12.4, ' Z0h_SV = ', e12.4 & + , ' sqrCh0 = ', e12.4, ' Za/Z0h = ', e12.4) +#endif + + ! +--Vertical Stability Correction + ! + ----------------------------- + + ! +--Surface/Canopy Temperature + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Tsrfsv(ikl) = Sigmsv(ikl) * TvegSV(ikl) & + + (1.-Sigmsv(ikl)) * TsisSV(ikl, isnoSV(ikl)) + enddo + + ! +--Aerodynamic Resistance + ! + ^^^^^^^^^^^^^^^^^^^^^^ +#if(CP) + if(SnoMod .and. ColPrt) then +#endif + +#if(CP) + ! + ********** + call ColPrt_SBL + ! + ********** +#endif + +#if(CP) + else +#endif + +#if(MT) + if(Garrat) then + ! + ********** + call SISVAT_SBL + ! + ********** + else +#endif + + ! + ********** + call SISVATeSBL + ! + ********** + +#if(MT) + endif +#endif +#if(CP) + endif +#endif + + ! +--Friction Velocity + ! + ----------------- + +#if(US) + do ikl = 1, klonv +#if(WR) +#endif + u_star = sqrt(VV__SV(ikl) / ram_sv(ikl)) + write(6, *) u_star, us__SV(ikl) +#endif +#if(US) + us__SV(ikl) = sqrt(VV__SV(ikl) / ram_sv(ikl)) + enddo +#endif + + ! Canopy Energy Balance + ! ===================== + + ! + ********** + call SISVAT_TVg(ETVg_d) + ! + ********** + + ! +--Surface/Canopy Temperature + ! + ========================== + + do ikl = 1, klonv + Tsrfsv(ikl) = Sigmsv(ikl) * TvegSV(ikl) & + + (1.-Sigmsv(ikl)) * TsisSV(ikl, isnoSV(ikl)) + enddo + + ! Soil Energy Balance + ! =================== + do ikl = 1, klonv + ist = ntPhys + if(isnoSV(ikl) >= 1 .and. TaT_SV(ikl) >= 273.15) ist = ntPhys + 1 ! melting snow + if(isnoSV(ikl) <= 0 .and. isotSV(ikl) <= 0) ist = 1 ! sea + enddo + dt__SV2 = dt__SV + dt__SV = dt__SV / real(ist) + do it = 1, max(1, ist) + ! + ********** + call SISVAT_TSo(ETSo_0, ETSo_1, ETSo_d) + ! + ********** + enddo + dt__SV = dt__SV2 + +#if(ve) + ! + ********** + call SISVAT_wEq('_TSo ', 0) + ! + ********** +#endif + + ! +--Canopy Water Balance + ! + ===================== + + ! +--Soil Water Potential + ! + ------------------------ + + do isl = -nsol, 0 + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! DR97, Eqn.(3.34) + psi_sv(ikl, isl) = psidSV(ist) & + * (etadSV(ist) / max(epsi, eta_SV(ikl, isl))) & + **bCHdSV(ist) + + ! +--Soil Hydraulic Conductivity + ! + --------------------------- + ! DR97, Eqn.(3.35) + Khydsv(ikl, isl) = s2__SV(ist) & + * (eta_SV(ikl, isl)**(2.*bCHdSV(ist) + 3.)) + enddo + enddo + + ! + ********** + call SISVAT_qVg + ! + ********** + + ! Vegetation Forcing + ! ------------------ +#if(m0) + do ikl = 1, klonv + ! Canopy Precip. IN + ! Canopy Precip. OUT + ! Canopy Water Evap. + Watsvd(ikl) = (Watsvd(ikl) & + - drr_SV(ikl) & + - Evp_sv(ikl)) * dt__SV + enddo +#endif + + ! +--Melting / Refreezing in the Snow Pack + ! + ===================================== + + if(SnoMod) then + + ! + ********** + call SISVAT_qSn() + ! + ********** + +#if(ve) + ! + ********** + call SISVAT_wEq('_qSn ', 0) + ! + ********** +#endif + +#if(EF) + if(isnoSV(1) > 0) & + write(6, 6007) isnoSV(1), dsn_SV(1) * dt__SV + BufsSV(1), & + ((dzsnSV(1, isn) * ro__SV(1, isn)), isn=1, isnoSV(1)) +6007 format(i3, ' dsn+Buf=', f6.2, 6x, 'q dz *ro =', 10f6.2, & + (/, 35x, 10f6.2)) +#endif + + ! +--Snow Pack Thickness + ! + ------------------- + do ikl = 1, klonv + z_snsv(ikl) = 0.0 + enddo + do isn = 1, nsno + do ikl = 1, klonv + z_snsv(ikl) = z_snsv(ikl) + dzsnSV(ikl, isn) + zzsnsv(ikl, isn) = z_snsv(ikl) + enddo + enddo + + ! +--Energy in Excess is added to the first Soil Layer + ! + ------------------------------------------------- + do ikl = 1, klonv + z_snsv(ikl) = max(zero, & + sign(unun, epsi - z_snsv(ikl))) + TsisSV(ikl, 0) = TsisSV(ikl, 0) + EExcsv(ikl) & + / (rocsSV(isotSV(ikl)) & + + rcwdSV * eta_SV(ikl, 0)) + EExcsv(ikl) = 0. + enddo + +#if(m1) + ! Snow Final Mass (below the Canopy) and Forcing + ! ------------------------------------------------ + do ikl = 1, klonv + ! [mm w.e.] + SIWa_f(ikl) = (drr_SV(ikl) + dsn_SV(ikl)) * dt__SV + SIWe_f(ikl) = dbs_SV(ikl) + SIWm_1(ikl) = BufsSV(ikl) + HFraSV(ikl) * ro_Ice + do isn = 1, nsno + SIWm_1(ikl) = SIWm_1(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + enddo +#endif + endif + + ! Soil Water Balance + ! ===================== + + ! + ********** + call SISVAT_qSo(Wats_0, Wats_1, Wats_d) + ! + ********** + + ! +--Surface/Canopy Fluxes + ! + ===================== + + do ikl = 1, klonv + ! Downward IR + IRdwsv(ikl) = tau_sv(ikl) * IRd_SV(ikl) * Eso_sv(ikl) & + + (1.0 - tau_sv(ikl)) * IRd_SV(ikl) * Evg_sv(ikl) + ! Upward IR + IRupsv(ikl) = IRupsv(ikl) & + + 0.5 * IRv_sv(ikl) * (1.-tau_sv(ikl)) + ! Upward IR + ! (effective) + ! (positive) + IRu_SV(ikl) = -IRupsv(ikl) & + + IRd_SV(ikl) & + - IRdwsv(ikl) + ! Brightness Temperature + TBr_sv(ikl) = sqrt(sqrt(IRu_SV(ikl) / stefan)) + ! u*T* + uts_SV(ikl) = (HSv_sv(ikl) + HSs_sv(ikl)) / (rhT_SV(ikl) * Cp) + ! u*q* + uqs_SV(ikl) = (HLv_sv(ikl) + HLs_sv(ikl)) / (rhT_SV(ikl) * Lv_H2O) + + ! +--Surface/Canopy Temperature + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + Tsrfsv(ikl) = Sigmsv(ikl) * TvegSV(ikl) + (1.-Sigmsv(ikl)) * TsisSV(ikl, isnoSV(ikl)) + enddo + + ! +--Snow Pack Properties (sphericity, dendricity, size) + ! + =================================================== + + if(SnoMod) then + if(klonv == 1) then + if(isnoSV(1) >= 1 .and. itphys == 1) then + ! + ********** + call SISVAT_GSn + ! + ********** + endif + else + ! + ********** + call SISVAT_GSn + ! + ********** + endif + +#if(ve) + ! + ********** + call SISVAT_wEq('_GSn ', 0) + ! + ********** +#endif + + ! +--Surficial Water Freezing, including that of a Water Surface (isotSV=0) + ! + ====================================================================== + + endif + + ! +--OUTPUT + ! + ====== + +#if(E0) + do ikl = 1, klonv + if(lwriSV(ikl) /= 0) then + noUNIT = no__SV(lwriSV(ikl)) + write(noUNIT, 5001) & + (SoSosv(ikl) + SoCasv(ikl)) * sol_SV(ikl), & + IRdwsv(ikl), IRu_SV(ikl), & + HSv_sv(ikl) + HSs_sv(ikl), & + HLv_sv(ikl) + HLs_sv(ikl), TaT_SV(ikl), & + dsn_SV(ikl) * 3.6e3, drr_SV(ikl) * 3.6e3, & + SoSosv(ikl) * sol_SV(ikl), & + IRv_sv(ikl) * 0.5, & + HSv_sv(ikl), HLv_sv(ikl), TvegSV(ikl), & + SoCasv(ikl) * sol_SV(ikl), & + HSs_sv(ikl), HLs_sv(ikl), TsisSV(ikl, isnoSV(ikl)) +5001 format( & + ' |Net Solar| IR Down | IR Up | HS/Dwn=+|', & + ' HL/Dwn=+| Temper. | | Snow | Rain |', & + /, ' | [W/m2] | [W/m2] | [W/m2] | [W/m2] |', & + ' [W/m2] | [K] | | [mm/h] | [mm/h] |', & + /, ' -------+', 7('---------+'), 2('--------+'), & + /, ' SISVAT |', f8.1, ' |', f8.1, ' |', f8.1, ' |', f8.1, ' |', & + f8.1, ' |A', f7.2, ' |', 8x, ' |', 2(f7.2, ' |'), & + /, ' Canopy |', f8.1, ' |', 8x, ' |', f8.1, ' |', f8.1, ' |', & + f8.1, ' |', f8.2, ' |', 8x, ' |', 2(7x, ' |') & + /, ' Soil |', f8.1, ' |', 8x, ' |', 8x, ' |', f8.1, ' |', & + f8.1, ' |', f8.2, ' |', 8x, ' |', 2(7x, ' |')) +#endif + +#if(e1) + ! +--Energy Budget + ! + ------------- + ! Up Surf. IR + Enrsvd(ikl) = Enrsvd(ikl) & + ! Offset + + IRs_SV(ikl) & + ! Net Solar + + ((SoSosv(ikl) & + + SoCasv(ikl)) * sol_SV(ikl) & + ! Downward IR + + IRdwsv(ikl) & + ! Upward IR + + IRupsv(ikl) & + ! Sensible + + HSv_sv(ikl) + HSs_sv(ikl) & + ! Latent + + HLv_sv(ikl) + HLs_sv(ikl)) + write(noUNIT, 5002) Enrsvd(ikl), & + ETSo_0(ikl), ETSo_d(ikl), & + ETSo_0(ikl) + ETSo_d(ikl), ETSo_1(ikl), & + EqSn_0(ikl) / dt__SV, & + EqSn_d(ikl) / dt__SV, & + (EqSn_1(ikl) - EqSn_0(ikl) - EqSn_d(ikl)) / dt__SV, & + EqSn_1(ikl) / dt__SV +5002 format( & + ' -----------------+-------------------+', & + '-----------------+-+-----------------+', & + '-------------------+', & + /, ' SOIL/SNOW/VEGET. | |', & + ' Power, Forcing | |', & + ' |', & + /, ' |', 11x, ' |', & + f9.2, ' [W/m2] |', 11x, ' |', & + 11x, ' |', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+', & + ! ETSo_0 + /, ' SOIL/SNOW (TSo) | Energy/dt, Time 0 |', & + ! ETSo_d/ETSo_0+d + ' Power, Forcing | Sum Tim.0+Forc. |', & + ! ETSo_1 + ' Energy/dt, Time 1 |', & + ! ETSo_0 + /, ' |', f11.2, ' [W/m2] |', & + ! ETSo_d/ETSo_0+d + f9.2, ' [W/m2] |', f11.2, ' [W/m2] |', & + ! ETSo_1 + f11.2, ' [W/m2] |', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+', & + ! EqSn_0/dt + /, ' SNOW (qSn) | Energy/dt, Time 0 |', & + ! EqSn_d/dt, 1-0-d + ' Power, Excess | D(Tim.1-0-Forc.)|', & + ! EqSn_1/dt + ' Energy/dt, Time 1 |', & + ! EqSn_0/dt + /, ' |', f12.2, '[W/m2] |', & + ! EqSn_d/dt, 1-0-d + f9.2, ' [W/m2] |', f11.2, ' [W/m2] |', & + ! EqSn_1/dt + f12.2, '[W/m2] | ', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+') + + EnsBal = ETSo_1(ikl) - (ETSo_0(ikl) + Enrsvd(ikl)) + EnvBal = Enrsvd(ikl) - ETVg_d(ikl) + +#if(e2) + if((abs(EnsBal) > 5.e-1) .OR. (lwriSV(ikl) == 2)) then +#else + if(abs(EnsBal) .gt. 5.e-1) then +#endif + write(6, 6001) daHost, i___SV(lwriSV(ikl)), & + j___SV(lwriSV(ikl)), & + n___SV(lwriSV(ikl)), & + ETSo_1(ikl), ETSo_0(ikl), ETSo_d(ikl), & + ETSo_1(ikl) - ETSo_0(ikl) - ETSo_d(ikl), & + Enrsvd(ikl), ETVg_d(ikl), ETSo_d(ikl), & + Enrsvd(ikl) - ETVg_d(ikl) - ETSo_d(ikl) +6001 format(a18, 3i4, ' (EB1', f15.6, & + ') - [(EB0 ', f15.6, ')', & + /, 55x, '+(ATM->Snow/Soil', f15.6, ')] ', & + '= EBAL', f15.6, ' [W/m2]', & + /, 55x, ' (ATM->SISVAT', f18.6, & + /, 55x, '- Veg. ImBal.', f18.6, ') ', & + /, 55x, '- ATM->SnoSol', f18.6, ') ', & + '= ????', f15.6, ' [W/m2]') + noEBal = noEBal + 1 +#if(e2) + noEBal = noEBal - 1 +#endif + if(noEBal >= 10) stop 'TOO MUCH ENERGY IMBALANCES' + endif +#endif + + ! +--Snow Budget [mm w.e.] + ! + ----------------------- +#if(m1) + write(noUNIT, 5010) & + SIWm_0(ikl), SIWa_i(ikl) - SIWa_f(ikl) & + , SIWm_0(ikl) + SIWa_i(ikl) - SIWa_f(ikl) & + + SIWe_i(ikl) - SIWe_f(ikl) & + + SIsubl(ikl) & + - SImelt(ikl) & + - SIrnof(ikl) & + + SIvAcr(ikl) & + , SIWm_1(ikl), SIWe_i(ikl) - SIWe_f(ikl) & + , SIsubl(ikl) & + , -SImelt(ikl) & + , -SIrnof(ikl) & + , SIvAcr(ikl) +5010 format(' SNOW | Snow, Time 0 |', & + ' Snow, Forcing | Sum |', & + ' Snow, Time 1 |', & + /, ' |', f13.3, ' [mm] |', & + ' A', f9.3, ' [mm] |', f13.3, ' [mm] |', & + f13.3, ' [mm] |', & + /, ' |', 13x, ' |', & + ' E', f9.3, ' [mm] |', 13x, ' |', & + 13x, ' |', & + /, ' |', 13x, ' |', & + ' S', f9.3, ' [mm] |', 13x, ' |', & + 13x, ' |', & + /, ' |', 13x, ' |', & + '(M', f9.3, ' [mm])| (included in A) |', & + 13x, ' |', & + /, ' |', 13x, ' |', & + ' R', f9.3, ' [mm] |', 13x, ' |', & + 13x, ' |', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+') + SnoBal = SIWm_1(ikl) - (SIWm_0(ikl) & + + SIWa_i(ikl) - SIWa_f(ikl) & + + SIWe_i(ikl) - SIWe_f(ikl)) & + - SIsubl(ikl) & + + SIrnof(ikl) + + SnoBal = SnoBal - SIvAcr(ikl) + if(abs(SnoBal) > epsi) then + write(6, 6010) daHost, i___SV(lwriSV(ikl)), & + j___SV(lwriSV(ikl)), & + n___SV(lwriSV(ikl)), & + SIWm_1(ikl), SIWm_0(ikl), & + SIWa_i(ikl), SIWa_f(ikl), & + SIWe_i(ikl), SIWe_f(ikl), & + SIsubl(ikl), SImelt(ikl), & + SIrnof(ikl), SIvAcr(ikl), & + SnoBal +6010 format(a18, 3i4, ' (MB1', f12.6, & + ') - [(MB0 ', f12.6, 15x, ')', & + /, 51x, '+(ATM Forcing', f12.6, ' - ', f12.6, ')', & + /, 51x, '+(BLS Forcing', f12.6, ' - ', f12.6, ')', & + /, 51x, '-(Depo/Sublim', f12.6, 15x, ')', & + /, 51x, ' !Melting ', f12.6, ' included in A!', & + /, 51x, '+(Run OFF ', f12.6, 15x, ')', & + /, 51x, '-(Sea-Ice Acr', f12.6, 15x, ')', & + /, 29x, '= *BAL', f12.6, ' [mm w.e.]') + noSBal = noSBal + 1 + if(noSBal >= 10) stop 'TOO MUCH SNOW MASS IMBALANCE' + endif +#endif + + ! +--Water Budget + ! + ------------- +#if(m0) + ! Canopy Water Cont. + Soil Water Cont. + Watsv0(ikl) = Watsv0(ikl) & + + Wats_0(ikl) + ! Canopy Forcing + Soil Forcing + Watsvd(ikl) = Watsvd(ikl) & + + Wats_d(ikl) + write(noUNIT, 5003) & + Wats_0(ikl), Wats_d(ikl), & + Wats_0(ikl) + Wats_d(ikl), Wats_1(ikl), & + Watsv0(ikl), Watsvd(ikl), & + Watsv0(ikl) + Watsvd(ikl), Wats_1(ikl) & + + rrCaSV(ikl) +5003 format(' SOIL/SNOW (qSo) | Water, Time 0 |', & + ' Water, Forcing | Sum |', & + ' Water, Time 1 |', & + /, ' |', f13.3, ' [mm] |', & + f11.3, ' [mm] |', f13.3, ' [mm] |', & + f13.3, ' [mm] |', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+', & + /, ' SOIL/SNOW/VEGET. | Water, Time 0 |', & + ' Water, Forcing | Sum |', & + ' Water, Time 1 |', & + /, ' |', f13.3, ' [mm] |', & + f11.3, ' [mm] |', f13.3, ' [mm] |', & + f13.3, ' [mm] |', & + /, ' -----------------+-------------------+', & + '-----------------+-------------------+', & + '-------------------+') + + WatBal = Wats_1(ikl) + rrCaSV(ikl) & + - (Watsv0(ikl) + Watsvd(ikl)) + if(abs(WatBal) > epsi) then + write(6, 6002) daHost, i___SV(lwriSV(ikl)), & + j___SV(lwriSV(ikl)), & + n___SV(lwriSV(ikl)), & + Wats_1(ikl), rrCaSV(ikl), & + Watsv0(ikl), Watsvd(ikl), WatBal, & + Wats_1(ikl), & + Wats_0(ikl), Wats_d(ikl), & + Wats_1(ikl) - Wats_0(ikl) - Wats_d(ikl) +6002 format(30x, ' NEW Soil Water', 3x, ' Canopy Water', 3x, & + ' OLD SVAT Water', 4x, ' FRC SVAT Water', & + /, a18, 3i4, f15.6, ' + ', f15.6, ' - ', f15.6, & + ' - ', f15.6, ' ', 15x, ' ', & + /, 31x, '= ', f12.6, ' [mm] (Water Balance)', & + /, 30x, ' NEW Soil Water', 3x, ' ', 3x, & + ' OLD Soil Water', 4x, ' FRC Soil Water', & + /, 30x, f15.6, ' ', 15x, ' - ', f15.6, & + ' - ', f15.6, ' ', 15x, ' ', & + /, 31x, '= ', f12.6, ' [mm] (3 terms SUM)') + noWBal = noWBal + 1 + if(noWBal >= 10) stop 'TOO MUCH WATER IMBALANCES' + endif +#endif + + ! +--Water/Temperature Profiles + ! + -------------------------- +#if(E0) + write(noUNIT, 5004) +5004 format(' -----+--------+--+-----+--------+----+---+', & + '--------+----+---+--------+------+-+--------+--------+', & + /, ' n | z | dz | ro | eta |', & + ' T | G1 | G2 | Extinc | | HISTORY|', & + /, ' | [m] | [m] | [kg/m3]| [m3/m3]|', & + ' [K] | [-] | [-] | [-] | | [-] |', & + /, ' -----+--------+--------+--------+--------+', & + '--------+--------+--------+--------+--------+--------+') + write(noUNIT, 5005) rusnSV(ikl), albisv(ikl) +5005 format(' | | | |W', f6.3, ' |', & + ' | | |A', f6.3, ' | | |') + write(noUNIT, 5015) & + (isn, zzsnsv(ikl, isn), dzsnSV(ikl, isn), & + ro__SV(ikl, isn), eta_SV(ikl, isn), & + TsisSV(ikl, isn), & + G1snSV(ikl, isn), G2snSV(ikl, isn), & + sEX_sv(ikl, isn), istoSV(ikl, isn), & + isn=isnoSV(ikl), 1, -1) +5015 format((i5, ' |', 2(f7.3, ' |'), f7.1, ' |', & + f7.3, ' |', f7.2, ' |', 2(f7.1, ' |'), f7.3, ' |', & + 7x, ' |', i5, ' |')) + write(noUNIT, 5006) +5006 format(' -----+--------+--------+--------+--------+', & + '--------+--------+--------+--------+--------+--------+') + write(noUNIT, 5007) TBr_sv(ikl), & + TvegSV(ikl), rrCaSV(ikl) * 1.e3, & + EvT_sv(ikl) * 86.4e3 +5007 format(' Brgh |', 4(8x, '|'), f7.2, ' | [micm] |', 4(8x, '|'), & + /, ' VEGE |', 4(8x, '|'), 2(f7.2, ' |'), 2(8x, '|'), & + f7.3, ' |', 8x, '|') + write(noUNIT, 5014) +5014 format(' -----+--------+--------+--------+--------+', & + '--------+--------+--------+--------+--------+--------+', & + /, ' n | | dz | | eta |', & + ' T | | | | Root W.| W.Flow |', & + /, ' | | [m] | | [m3/m3]|', & + ' [K] | | | | [mm/d] | [mm/h] |', & + /, ' -----+--------+--------+--------+--------+', & + '--------+--------+--------+--------+--------+--------+') + do isl = 0, -nsol, -1 + write(noUNIT, 5008) isl, LSdzsv(ikl) * dz_dSV(isl), & + eta_SV(ikl, isl), & + TsisSV(ikl, isl), & + 86.4e3 * Rootsv(ikl, isl), & + 3.6e3 * Khydsv(ikl, isl) + enddo +5008 format((i5, ' |', 7x, ' |', f7.3, ' |', 7x, ' |', & + f7.3, ' |', f7.2, ' |', 2(7x, ' |'), 7x, ' |', & + f7.3, ' |', f7.2, ' |')) + write(noUNIT, 5006) + write(noUNIT, 5009) RnofSV(ikl) * 3.6e3 +5009 format(' |', 9(8x, '|'), f7.3, ' |') + write(noUNIT, 5006) + endif + enddo +#endif + ! +..END .main. + return + endsubroutine SISVAT diff --git a/MAR/code_mar/sisvat_bsn.f90 b/MAR/code_mar/sisvat_bsn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8c6711ffda572cc02f2420aee24cc8beeea4adc5 --- /dev/null +++ b/MAR/code_mar/sisvat_bsn.f90 @@ -0,0 +1,104 @@ +#include "MAR_pp.def" +subroutine SISVAT_BSn + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_BSn 04-apr-2020 MAR | + ! | subroutine SISVAT_BSn treats Snow Erosion | + ! | (not deposition anymore since 2-jun 2018) | + ! | | + ! | SISVAT_bsn computes the snow erosion mass according to both the | + ! | theoretical maximum erosion amount computed in SISVATesbl and the | + ! | availability of snow (currently in the uppermost snow layer only) | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # stdout | #sb: OUTPUT of Snow Erosion | + ! | | unit 6, subroutine SISVAT_BSn **ONLY** | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use marxsv + use marysv + + implicit none + + ! +--Local Variables + ! + =============== + + integer ikl, isn + real h_mmWE ! Eroded Snow Layer Min Thickness + real dbsaux(klonv) ! Drift Amount (Dummy Variable) + real dzweqo, dzweqn, bsno_x ! Conversion variables for erosion + real dz_new, rho_new + real snofOK ! Threshd Snow Fall + real Fac ! Correction factor for erosion + real densif ! Densification rate if erosion + + ! +--DATA + ! + ==== + + data h_mmWE/0.01e00/ ! Eroded Snow Layer Min Thickness + + ! +--EROSION + ! + ======= + + ! !do isn = nsno,2,-1 + do ikl = 1, klonv + + isn = isnoSV(ikl) + dzweqo = dzsnSV(ikl, isn) * ro__SV(ikl, isn) ! [kg/m2, mm w.e.] + + bsno_x = min(0., dbs_SV(ikl)) + ! Fac = min(1.,max(1-(ro__SV(ikl,isn)/700.),0.)**2) + ! Fac = min(1.,max(1-(qsnoSV(ikl)*1000/30.),0.)) + ! bsno_x = bsno_x*Fac + + dzweqn = dzweqo + bsno_x + dzweqn = max(dzweqn, h_mmWE) + dzweqn = min(dzweqn, dzweqo) + !XF + dbs_SV(ikl) = dbs_SV(ikl) + (dzweqo - dzweqn) + dbs_Er(ikl) = dbs_Er(ikl) + (dzweqo - dzweqn) + dzsnSV(ikl, isn) = dzweqn & + / max(epsi, ro__SV(ikl, isn)) + + ! ! Densification of the uppermost snow layer if erosion: + if((dzweqo - dzweqn) > 0 .and. & + dzsnSV(ikl, isn) > 0 .and. & + ro__SV(ikl, max(1, isnoSV(ikl))) < roBdSV) then + + ! !characteristic time scale for drifting snow compaction set to 24h + ! !linear densification rate [kg/m3/s] over 24h + densif = (450.-frsno) / (3600 * 24) + + ! !Attenuation of compaction rate from 450 to 500 kg/m3 + Fac = 1 - ((ro__SV(ikl, max(1, isnoSV(ikl))) & + - roBdSV) / (500.-roBdSV)) + Fac = max(0., min(1., Fac)) + + if(ro__SV(ikl, max(1, isnoSV(ikl))) > roBdSV) then + densif = densif * Fac + endif + + rho_new = min(roBdSV, ro__SV(ikl, isn) + densif * dt__SV) + dz_new = dzsnSV(ikl, isn) * ro__SV(ikl, isn) / rho_new + ro__SV(ikl, isn) = rho_new + dzsnSV(ikl, isn) = dz_new + endif + + if(dzsnSV(ikl, isn) > 0 .and. dzsnSV(ikl, isn) < 0.0001) then + dbs_SV(ikl) = dbs_SV(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + dbs_Er(ikl) = dbs_Er(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + dzsnSV(ikl, isn) = 0 + ro__SV(ikl, isn) = 0 + isnoSV(ikl) = max(0, isnoSV(ikl) - 1) + endif + + enddo + ! !end do + + return +ENDsubroutine SISVAT_BSn diff --git a/MAR/code_mar/sisvat_gsn.f90 b/MAR/code_mar/sisvat_gsn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f82acc3a7a4eb585d2ebf95800726e5816ede02e --- /dev/null +++ b/MAR/code_mar/sisvat_gsn.f90 @@ -0,0 +1,1054 @@ +#include "MAR_pp.def" +subroutine SISVAT_GSn + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_GSn 20-09-2003 MAR | + ! | subroutine SISVAT_GSn simulates SNOW Metamorphism | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT / isnoSV = total Nb of Ice/Snow Layers | + ! | OUTPUT: iiceSV = total Nb of Ice Layers | + ! | ^^^^^^ istoSV = 0,...,5 : Snow History (see istdSV data) | + ! | | + ! | INPUT: TsisSV : Soil/Ice Temperatures (layers -nsol,-nsol+1,..,0)| + ! | ^^^^^ & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | ro__SV : Soil/Snow Volumic Mass [kg/m3] | + ! | eta_SV : Soil/Snow Water Content [m3/m3] | + ! | slopSV : Surface Slope [-] | + ! | dzsnSV : Snow Layer Thickness [m] | + ! | dt__SV2 : Time Step [s] | + ! | | + ! | INPUT / G1snSV : Dendricity (<0) or Sphericity (>0) of Snow Layer | + ! | OUTPUT: G2snSV : Sphericity (>0) or Size of Snow Layer | + ! | ^^^^^^ | + ! | | + ! | Formalisme adopte pour la Representation des Grains: | + ! | Formalism for the Representation of Grains: | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | | + ! | 1 - -1 Neige Fraiche | + ! | / \ | ------------- | + ! | / \ | Dendricite decrite par Dendricite | + ! | / \ | Dendricity et Sphericite | + ! | / \ | | + ! | 2---------3 - 0 described by Dendricity | + ! | and Sphericity | + ! | |---------| | + ! | 0 1 | + ! | Sphericite | + ! | Sphericity | + ! | | + ! | 4---------5 - | + ! | | | | | + ! | | | | Diametre (1/10eme de mm) (ou Taille) | + ! | | | | Diameter (1/10th of mm) (or Size ) | + ! | | | | | + ! | | | | Neige non dendritique | + ! | 6---------7 - --------------------- | + ! | decrite par Sphericite | + ! | et Taille | + ! | described by Sphericity | + ! | and Size | + ! | | + ! | Les Variables du Modele: | + ! | Model Variables: | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | Cas Dendritique Cas non Dendritique | + ! | | + ! | G1snSV : Dendricite G1snSV : Sphericite | + ! | G2snSV : Sphericite G2snSV : Taille (1/10e mm) | + ! | Size | + ! | | + ! | Cas Dendritique/ Dendritic Case | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | Dendricite(Dendricity) G1snSV | + ! | varie de -G1_dSV (-99 par defaut / etoile) a 0 | + ! | division par -G1_dSV pour obtenir des valeurs entre 1 et 0 | + ! | varies from -G1_dSV (default -99 / fresh snow) to 0 | + ! | division by -G1_dSV to obtain values between 1 and 0 | + ! | | + ! | Sphericite(Sphericity) G2snSV | + ! | varie de 0 (cas completement anguleux) | + ! | a G1_dSV (99 par defaut, cas spherique) | + ! | division par G1_dSV pour obtenir des valeurs entre 0 et 1 | + ! | varies from 0 (full faceted) to G1_dSV | + ! | | + ! | Cas non Dendritique / non Dendritic Case | + ! | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + ! | Sphericite(Sphericity) G1snSV | + ! | varie de 0 (cas completement anguleux) | + ! | a G1_dSV (99 par defaut, cas spherique) | + ! | division par G1_dSV pour obtenir des valeurs entre 0 et 1 | + ! | varies from 0 (full faceted) to G1_dSV | + ! | | + ! | Taille (Size) G2snSV | + ! | superieure a ADSdSV (.4 mm) et ne fait que croitre | + ! | greater than ADSdSV (.4 mm) always increases | + ! | | + ! | Exemples: Points caracteristiques des Figures ci-dessus | + ! | ^^^^^^^^^ | + ! | | + ! | G1snSV G2snSV dendricite sphericite taille | + ! | dendricity sphericity size | + ! | ------------------------------------------------------------------ | + ! | [1/10 mm] | + ! | 1 -G1_dSV sph3SN 1 0.5 | + ! | 2 0 0 0 0 | + ! | 3 0 G1_dSV 0 1 | + ! | 4 0 ADSdSV 0 4. | + ! | 5 G1_dSV ADSdSV-vsphe1 1 3. | + ! | 6 0 -- 0 -- | + ! | 7 G1_dSV -- 1 -- | + ! | | + ! | par defaut: G1_dSV=99. | + ! | sph3SN=50. | + ! | ADSdSV= 4. | + ! | vsphe1=1. | + ! | | + ! | Methode: | + ! | ^^^^^^^^ | + ! | 1. Evolution Types de Grains selon Lois de Brun et al. (1992): | + ! | Grain metamorphism according to Brun et al. (1992): | + ! | Plusieurs Cas sont a distiguer / the different Cases are: | + ! | 1.1 Metamorphose Neige humide / wet Snow | + ! | 1.2 Metamorphose Neige seche / dry Snow | + ! | 1.2.1 Gradient faible / low Temperature Gradient | + ! | 1.2.2 Gradient moyen / moderate Temperature Gradient | + ! | 1.2.3 Gradient fort / high Temperature Gradient | + ! | Dans chaque Cas on separe Neige Dendritique et non Dendritique | + ! | le Passage Dendritique -> non Dendritique | + ! | se fait lorsque G1snSV devient > 0 | + ! | the Case of Dentritic or non Dendritic Snow is treated separately | + ! | the Limit Dentritic -> non Dendritic is reached when G1snSV > 0 | + ! | | + ! | 2. Tassement: Loi de Viscosite adaptee selon le Type de Grains | + ! | Snow Settling: Viscosity depends on the Grain Type | + ! | | + ! | 3. Update Variables historiques (cas non dendritique seulement) | + ! | nhSNow defaut | + ! | 0 Cas normal | + ! | istdSV(1) 1 Grains anguleux / faceted cristal | + ! | istdSV(2) 2 Grains ayant ete en presence d eau liquide | + ! | mais n'ayant pas eu de caractere anguleux / | + ! | liquid water and no faceted cristals before | + ! | istdSV(3) 3 Grains ayant ete en presence d eau liquide | + ! | ayant eu auparavant un caractere anguleux / | + ! | liquid water and faceted cristals before | + ! | | + ! | REFER. : Brun et al. 1989, J. Glaciol 35 pp. 333--342 | + ! | ^^^^^^^^ Brun et al. 1992, J. Glaciol 38 pp. 13-- 22 | + ! | (CROCUS Model, adapted to MAR at CEN by H.Gallee) | + ! | | + ! | REFER. : Marbouty, D. 1980, J. Glaciol 26 pp. xxx--xxx | + ! | ^^^^^^^^ (CROCUS Model, adapted to MAR at CEN by H.Gallee) | + ! | (for angular shapes) | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_GSn.vp | #vp: OUTPUT/Verification: Snow Properties | + ! | | unit 47, subroutines SISVAT_zSn, _GSn | + ! | # stdout | #wp: OUTPUT/Verification: Snow Properties | + ! | | unit 6, subroutine SISVAT_GSn | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use mar0sv + use mardim + use margrd + ! +--INPUT/OUTPUT + ! + ------------ + use marxsv + + implicit none + + ! +--OUTPUT + ! + ------ + integer i, j, k, m + integer dt__SV2 + + ! +--Local Variables + ! + ================ + logical vector + integer ikl + integer isn, isnp + integer istoOK + ! G1_bak, G2_bak : Old Values of G1, G2 + real G1_bak, G2_bak + ! ro_dry : Dry Density [g/cm3] + real ro_dry(klonv, nsno) + ! etaSno : Liquid Water Content [g/cm2] + real etaSno(klonv, nsno) + ! SnMass : Snow Mass [kg/m2] + real SnMass(klonv) + ! dTsndz : Temperature Gradient + real dTsndz + ! sWater : Water Content [%] + real sWater + real exp1Wa + ! dDENDR : Dendricity Increment + real dDENDR + ! DENDRn : Normalized Dendricity + real DENDRn + ! SPHERn : Normalized Sphericity + real SPHERn + ! Wet_OK : Wet Metamorphism Switch + real Wet_OK + real OK__DE + ! OK__wd : New G*, from wet Dendritic + real OK__wd + ! G1__wd : New G1, from wet Dendritic + real G1__wd + ! G2__wd : New G2, from wet Dendritic + real G2__wd + real OKlowT + real facVap + real OK_ldd + real G1_ldd + real G2_ldd + real DiamGx + real DiamOK + real No_Big + real dSPHER + real SPHER0 + real SPHbig + real G1_lds + real OK_mdT + real OKmidT + real OKhigT + real OK_mdd + real G1_mdd + real G2_mdd + real G1_mds + real OK_hdd + real G1_hdd + real G2_hdd + real OK_hds + real G1_hds + real T1__OK, T2__OK + real T3_xOK, T3__OK, T3_nOK + real ro1_OK, ro2_OK + real dT1_OK, dT2_OK, dT3xOK, dT3_OK + real dT4xOK, dT4_OK, dT4nOK, AngSno + real G2_hds, SphrOK, HISupd + real H1a_OK, H1b_OK, H1__OK + real H23aOK, H23bOK, H23_OK + real H2__OK, H3__OK + real H45_OK, H4__OK, H5__OK + real ViscSn, OK_Liq, OK_Ang, OKxLiq + real dSnMas, dzsnew, rosnew, rosmax, smb_old, smb_new + real zn_old, zn_new + + ! epsi5 : Alpha ev67 single precision + real epsi5 + ! vdiam1 : Small Grains Min.Diam.[.0001m] + real vdiam1 + ! vdiam2 : Spher.Variat.Max Diam. [mm] + real vdiam2 + ! vdiam3 : Min.Diam.|Limit Spher. [mm] + real vdiam3 + ! vdiam4 : Min.Diam.|Viscosity Change + real vdiam4 + ! vsphe1 : Max Sphericity + real vsphe1 + ! vsphe2 : Low T Metamorphism Coeff. + real vsphe2 + ! vsphe3 : Max.Sphericity (history=1) + real vsphe3 + ! vsphe4 : Min.Sphericity=>history=1 + real vsphe4 + ! vtang : Temperature Contribution + real vtang1, vtang2, vtang3, vtang4 + real vtang5, vtang6, vtang7, vtang8 + real vtang9, vtanga, vtangb, vtangc + ! vrang1, vrang2 : Density Contribution + real vrang1, vrang2 + ! vgang : Grad(T) Contribution + real vgang1, vgang2, vgang3, vgang4 + real vgang5, vgang6, vgang7, vgang8 + real vgang9, vganga, vgangb, vgangc + ! vgran6 : Max.Sphericity for Settling + real vgran6 + ! vtelv1 : Threshold | history = 2, 3 + real vtelv1 + ! vvap1 : Vapor Pressure Coefficient + real vvap1 + ! vvap2 : Vapor Pressure Exponent + real vvap2 + ! vgrat1 : Boundary weak/mid grad(T) + real vgrat1 + ! vgrat2 : Boundary mid/strong grad(T) + real vgrat2 + ! vfi : PHI, strong grad(T) + real vfi + ! vvisc : Viscosity Coefficients + real vvisc1, vvisc2, vvisc3, vvisc4 + ! vvisc5, vvisc6, vvisc7 : id., wet Snow + real vvisc5, vvisc6, vvisc7 + ! Wet Snow Density Influence + real rovisc + ! vdz3 : Maximum Layer Densification + real vdz3 + ! OK__ws : New G2 + real OK__ws + ! G1__ws : New G1, from wet Spheric + real G1__ws + ! G2__ws : New G2, from wet Spheric + real G2__ws + ! husi : Constants for New G2 + real husi_0, husi_1, husi_2, husi_3 + ! vtail : Constants for New G2 + real vtail1, vtail2 + ! frac_j : Time Step [Day] + real frac_j + ! vdent1 : Wet Snow Metamorphism + real vdent1 + ! nvdent : Coefficients for Dendricity + integer nvdent1 + integer nvdent2 + + ! +--Snow Properties: IO + ! + ~~~~~~~~~~~~~~~~~~~ +#if(vp) + real G_curr(18), Gcases(18) + common / GSnLOC / Gcases +#endif +#if(wp) + real D__MAX + common / GSnMAX / D__MAX + data D__MAX/4.00/ +#endif + + ! +--DATA + ! + ==== + data vector/.true./ ! Vectorization Switch + data vdent1/0.5e8/ ! Wet Snow Metamorphism !XF tuned for Greenland (2.e8=old value) + data nvdent1/3/ ! nvdent1, nvdent2 : Coefficients for Dendricity + data nvdent2/16/ + data husi_0/20./ ! 10 * 2 + data husi_1/0.23873/ ! (3/4) /pi + data husi_2/4.18880/ ! (4/3) *pi + data husi_3/0.33333/ ! 1/3 + data vtail1/1.28e-08/ ! Wet Metamorphism + data vtail2/4.22e-10/ ! (NON Dendritic / Spheric) + data epsi5/1.0e-5/ + data vdiam1/4.0/ ! Small Grains Min.Diameter + data vdiam2/0.5/ ! Spher.Variat.Max Diam.[mm] + data vdiam3/3.0/ ! Min.Diam.|Limit Spher.[mm] + data vdiam4/2.0/ ! Min.Diam.|Viscosity Change + data vsphe1/1.0/ ! Max Sphericity + data vsphe2/1.0e9/ ! Low T Metamorphism Coeff. + data vsphe3/0.5/ ! Max.Sphericity (history=1) + data vsphe4/0.1/ ! Min.Sphericity=>history=1 + data vgran6/51./ ! Max.Sphericity for Settling + data vtelv1/5.e-1/ ! Threshold | history = 2, 3 + data vvap1/-6.e3/ ! Vapor Pressure Coefficient + data vvap2/0.4/ ! Vapor Pressure Exponent + data vgrat1/0.05/ ! Boundary weak/mid grad(T) + data vgrat2/0.15/ ! Boundary mid/strong grad(T) + data vfi/0.09/ ! PHI, strong grad(T) + ! vvisc : Viscosity Coefficients + data vvisc1/0.70/ + data vvisc2/1.11e5/ + data vvisc3/23.00/ + data vvisc4/0.10/ + ! vvisc5 : id., wet Snow + data vvisc5/1.00/ + data vvisc6/2.00/ + data vvisc7/10.00/ + ! rovisc : Wet Snow Density Influence + data rovisc/0.25/ + ! vdz3 : Maximum Layer Densification + data vdz3/0.30/ + + ! +--DATA (Coefficient Fonction fort Gradient Marbouty) + ! + -------------------------------------------------- + ! vtang : Temperature Contribution + data vtang1/40.0/ + data vtang2/6.0/ + data vtang3/22.0/ + data vtang4/0.7/ + data vtang5/0.3/ + data vtang6/6.0/ + data vtang7/1.0/ + data vtang8/0.8/ + data vtang9/16.0/ + data vtanga/0.2/ + data vtangb/0.2/ + data vtangc/18.0/ + ! vrang : Density Contribution + data vrang1/0.40/ + data vrang2/0.15/ + ! vgang : Grad(T) Contribution + data vgang1/0.70/ + data vgang2/0.25/ + data vgang3/0.40/ + data vgang4/0.50/ + data vgang5/0.10/ + data vgang6/0.15/ + data vgang7/0.10/ + data vgang8/0.55/ + data vgang9/0.65/ + data vganga/0.20/ + data vgangb/0.85/ + data vgangc/0.15/ + + ! +-- 1. Metamorphoses dans les Strates + ! + Metamorphism + ! + ============================== + + dt__SV2 = dt + frac_j = dt__SV2 / 86400. ! Time Step [Day] + + zn4_SV = 0 + + ! +-- 1.1 Initialisation: teneur en eau liquide et gradient de temperature + ! + ------------------ liquid water content and temperature gradient + + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + + ! Dry Density [g/cm3] + ro_dry(ikl, isn) = 1.e-3 * ro__SV(ikl, isn) & + * (1.-eta_SV(ikl, isn)) + ! Liquid Water Content [g/cm2] + etaSno(ikl, isn) = 1.e-1 * dzsnSV(ikl, isn) & + * ro__SV(ikl, isn) & + * eta_SV(ikl, isn) + enddo + enddo + + !!$OMP PARALLEL do default(firstprivate) & + !!$OMP shared (/xSISVAT_I/,/xSISVAT_R/,/SoR0SV/,/SoI0SV/,/Sn_dSV/) + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + isnp = min(isn + 1, isnoSV(ikl)) + + dTsndz = abs((TsisSV(ikl, isnp) - TsisSV(ikl, isn - 1)) * 2.e-2 & + / max(((dzsnSV(ikl, isnp) + dzsnSV(ikl, isn)) & + * (isnp - isn) & + + (dzsnSV(ikl, isn) + dzsnSV(ikl, isn - 1))), epsi)) + ! +... Factor 1.d-2 for Conversion K/m --> K/cm + + ! +-- 1.2 Metamorphose humide + ! + Wet Snow Metamorphism + ! + --------------------- + + Wet_OK = max(zero, sign(unun, eta_SV(ikl, isn) - epsi)) + + ! +-- Vitesse de diminution de la dendricite + ! + Rate of the dendricity decrease + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + sWater = 1.d-1 * ro__SV(ikl, isn) * eta_SV(ikl, isn) & + / max(epsi, ro_dry(ikl, isn)) + ! +... sWater:Water Content [%] + ! + 1.d-1= 1.d2(1->%) * 1.d-3(ro__SV*eta_SV:kg/m3->g/cm3) + + exp1Wa = sWater**nvdent1 + dDENDR = max(exp1Wa / nvdent2, vdent1 * exp(vvap1 / TfSnow)) + + ! +-- 1.2.1 Cas dendritique/dendritic Case + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OK__wd = max(zero, & + sign(unun, -G1snSV(ikl, isn) - epsi)) ! + + DENDRn = -G1snSV(ikl, isn) / G1_dSV ! Normalized Dendricity (+) + SPHERn = G2snSV(ikl, isn) / G1_dSV ! Normalized Sphericity + DENDRn = DENDRn - dDENDR * frac_j ! New Dendricity (+) + SPHERn = SPHERn + dDENDR * frac_j ! New Sphericity + + OK__DE = max(zero, sign(unun, DENDRn - epsi)) ! Dendr. -> Spheric + + ! Dendritic + ! Dendr. -> Spheric + G1__wd = OK__DE * (-DENDRn * G1_dSV) & + + (1.-OK__DE) * min(G1_dSV, SPHERn * G1_dSV) + ! Spheric + ! Spher. -> Size + G2__wd = OK__DE * min(G1_dSV, SPHERn * G1_dSV) & + + (1.-OK__DE) * (ADSdSV - min(SPHERn, vsphe1)) + + ! +-- 1.2.2 Cas non dendritique non completement spherique + ! + Evolution de la Sphericite seulement. + ! + Non dendritic and not completely spheric Case + ! + Evolution of Sphericity only (not size) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OK__ws = max(zero, & + sign(unun, G1_dSV & + - epsi5 & + - G1snSV(ikl, isn))) + + SPHERn = G1snSV(ikl, isn) / G1_dSV + SPHERn = SPHERn + dDENDR * frac_j + G1__ws = min(G1_dSV, SPHERn * G1_dSV) + + ! +-- 1.2.3 Cas non dendritique et spherique / non dendritic and spheric + ! + Evolution de la Taille seulement / Evolution of Size only + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + G2__ws = husi_0 & + * (husi_1 & + * (husi_2 * (G2snSV(ikl, isn) / husi_0)**3 & + + (vtail1 + vtail2 * exp1Wa) * dt__SV2)) & + **husi_3 + + ! +-- 1.3 Metamorposes seches / Dry Metamorphism + ! + -------------------------------------- + + ! +-- 1.3.1 Calcul Metamorphose faible/low Gradient (0.00-0.05 deg/cm) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OKlowT = max(zero, & + sign(unun, vgrat1 & + - dTsndz)) + + facVap = exp(vvap1 / TsisSV(ikl, isn)) + + ! +-- 1.3.1.1 Cas dendritique / dendritic Case + + OK_ldd = max(zero, & + sign(unun, -G1snSV(ikl, isn) & + - epsi)) ! + + DENDRn = -G1snSV(ikl, isn) / G1_dSV + SPHERn = G2snSV(ikl, isn) / G1_dSV + DENDRn = DENDRn - vdent1 * facVap * frac_j + SPHERn = SPHERn + vsphe2 * facVap * frac_j + ! if 1., + ! NO change + ! Dendr. -> Spheric + OK__DE = max(zero, & + sign(unun, DENDRn & + - epsi)) + ! Dendritic + ! Dendr. -> Spheric + G1_ldd = OK__DE * (-DENDRn * G1_dSV) & + + (1.-OK__DE) * min(G1_dSV, SPHERn * G1_dSV) + ! Spheric + ! Spher. -> Size + G2_ldd = OK__DE * min(G1_dSV, SPHERn * G1_dSV) & + + (1.-OK__DE) * (ADSdSV - min(SPHERn, vsphe1)) + + ! +-- 1.3.1.2 Cas non dendritique / non dendritic Case + + SPHERn = G1snSV(ikl, isn) / G1_dSV + DiamGx = G2snSV(ikl, isn) * 0.1 + ! zero if istoSV = 1 + istoOK = min(abs(istoSV(ikl, isn) - & + istdSV(1)), 1) + DiamOK = max(zero, sign(unun, vdiam2 - DiamGx)) + No_Big = istoOK + DiamOK + No_Big = min(No_Big, unun) + + dSPHER = vsphe2 * facVap * frac_j + ! small grains + SPHER0 = SPHERn + dSPHER + ! big grains (history = 2 or 3) + SPHbig = SPHERn + dSPHER & + * exp(min(zero, vdiam3 - G2snSV(ikl, isn))) + ! limited sphericity + SPHbig = min(vsphe3, SPHbig) + SPHERn = No_Big * SPHER0 & + + (1.-No_Big) * SPHbig + + G1_lds = min(G1_dSV, SPHERn * G1_dSV) + + ! +-- 1.3.2 Calcul Metamorphose Gradient Moyen/Moderate (0.05-0.15) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OK_mdT = max(zero, & + sign(unun, vgrat2 & + - dTsndz)) + OKmidT = OK_mdT * (1.-OKlowT) + OKhigT = (1.-OK_mdT) * (1.-OKlowT) + + facVap = vdent1 * exp(vvap1 / TsisSV(ikl, isn)) & + * (1.e2 * dTsndz)**vvap2 + + ! +-- 1.3.2.1 cas dendritique / dendritic case. + + OK_mdd = max(zero, & + sign(unun, -G1snSV(ikl, isn) & + - epsi)) + + DENDRn = -G1snSV(ikl, isn) / G1_dSV + SPHERn = G2snSV(ikl, isn) / G1_dSV + DENDRn = DENDRn - facVap * frac_j + SPHERn = SPHERn - facVap * frac_j + ! if 1., + ! NO change + ! Dendr. -> Spheric + OK__DE = max(zero, & + sign(unun, DENDRn & + - epsi)) + ! Dendritic + ! Dendr. -> Spheric + G1_mdd = OK__DE * (-DENDRn * G1_dSV) & + + (1.-OK__DE) * max(zero, SPHERn * G1_dSV) + ! Spheric + ! Spher. -> Size + G2_mdd = OK__DE * max(zero, SPHERn * G1_dSV) & + + (1.-OK__DE) * (ADSdSV - max(SPHERn, zero)) + + ! +-- 1.3.2.2 Cas non dendritique / non dendritic Case + + SPHERn = G1snSV(ikl, isn) / G1_dSV + SPHERn = SPHERn - facVap * frac_j + G1_mds = max(zero, SPHERn * G1_dSV) + + ! +-- 1.3.3 Calcul Metamorphose fort / high Gradient + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + facVap = vdent1 * exp(vvap1 / TsisSV(ikl, isn)) & + * (1.e2 * dTsndz)**vvap2 + + ! +-- 1.3.3.1 Cas dendritique / dendritic Case + + OK_hdd = max(zero, & + sign(unun, -G1snSV(ikl, isn) & + - epsi)) + + DENDRn = -G1snSV(ikl, isn) / G1_dSV + SPHERn = G2snSV(ikl, isn) / G1_dSV + DENDRn = DENDRn - facVap * frac_j + ! Non dendritic and angular + ! if 1., + ! NO change + ! Dendr. -> Spheric + SPHERn = SPHERn - facVap * frac_j + OK__DE = max(zero, & + sign(unun, DENDRn & + - epsi)) + ! Dendritic + ! Dendr. -> Spheric + G1_hdd = OK__DE * (-DENDRn * G1_dSV) & + + (1.-OK__DE) * max(zero, SPHERn * G1_dSV) + ! Spheric + ! Spher. -> Size + G2_hdd = OK__DE * max(zero, SPHERn * G1_dSV) & + + (1.-OK__DE) * (ADSdSV - max(SPHERn, zero)) + + ! +-- 1.3.3.2 Cas non dendritique non completement anguleux. + ! + non dendritic and spericity gt. 0 + + OK_hds = max(zero, & + sign(unun, G1snSV(ikl, isn) & + - epsi)) + + SPHERn = G1snSV(ikl, isn) / G1_dSV + SPHERn = SPHERn - facVap * frac_j + G1_hds = max(zero, SPHERn * G1_dSV) + + ! +-- 1.3.3.3 Cas non dendritique et anguleux + ! + dendritic and spericity = 0. + + T1__OK = max(zero, sign(unun, TsisSV(ikl, isn) - TfSnow + vtang1)) + T2__OK = max(zero, sign(unun, TsisSV(ikl, isn) - TfSnow + vtang2)) + T3_xOK = max(zero, sign(unun, TsisSV(ikl, isn) - TfSnow + vtang3)) + T3__OK = T3_xOK * (1.-T2__OK) + T3_nOK = (1.-T3_xOK) * (1.-T2__OK) + ro1_OK = max(zero, sign(unun, vrang1 - ro_dry(ikl, isn))) + ro2_OK = max(zero, sign(unun, ro_dry(ikl, isn) - vrang2)) + dT1_OK = max(zero, sign(unun, vgang1 - dTsndz)) + dT2_OK = max(zero, sign(unun, vgang2 - dTsndz)) + dT3xOK = max(zero, sign(unun, vgang3 - dTsndz)) + dT3_OK = dT3xOK * (1.-dT2_OK) + dT4xOK = max(zero, sign(unun, vgang4 - dTsndz)) + dT4_OK = dT4xOK * (1.-dT3_OK) & + * (1.-dT2_OK) + dT4nOK = (1.-dT4xOK) * (1.-dT3_OK) & + * (1.-dT2_OK) + + ! +-- Influence de la Temperature /Temperature Influence + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + AngSno = & + ! 11 + T1__OK & + ! 12 + * (T2__OK * (vtang4 + vtang5 * (TfSnow - TsisSV(ikl, isn)) & + / vtang6) & + ! 13 + + T3__OK * (vtang7 - vtang8 * (TfSnow - vtang2 - TsisSV(ikl, isn)) & + / vtang9) & + ! 14 + + T3_nOK * (vtanga - vtangb * (TfSnow - vtang3 - TsisSV(ikl, isn)) & + / vtangc)) & + * ro1_OK & + * (ro2_OK * (1.-(ro_dry(ikl, isn) - vrang2) & + / (vrang1 - vrang2)) & + + 1.-ro2_OK) & + ! 15 + * (dT1_OK * (dT2_OK * vgang5 * (dTsndz - vgang6) & + / (vgang2 - vgang6) & + ! 16 + + dT3_OK * vgang7 & + ! 17 + + dT4_OK * vgang9 & + ! 18 + + dT4nOK * vgangb) & + + 1.-dT1_OK) & + + ro1_OK & + * dT1_OK * (dT3_OK * vgang8 * (dTsndz - vgang2) & + / (vgang3 - vgang2) & + + dT4_OK * vganga * (dTsndz - vgang3) & + / (vgang4 - vgang3) & + + dT4nOK * vgangc * (dTsndz - vgang4) & + / (vgang1 - vgang4)) + + G2_hds = G2snSV(ikl, isn) + 1.d2 * AngSno * vfi * frac_j + + ! +--New Properties + ! + -------------- + + G1_bak = G1snSV(ikl, isn) + G2_bak = G2snSV(ikl, isn) + + ! 1 + G1snSV(ikl, isn) = Wet_OK * (OK__wd * G1__wd & + ! 2 + + (1.-OK__wd) * OK__ws * G1__ws & + ! 3 + + (1.-OK__wd) * (1.-OK__ws) * G1_bak) & + ! + + (1.-Wet_OK) & + ! 4 + * (OKlowT * (OK_ldd * G1_ldd & + ! 5 + + (1.-OK_ldd) * G1_lds) & + ! 6 + + OKmidT * (OK_mdd * G1_mdd & + ! 7 + + (1.-OK_mdd) * G1_mds) & + ! 8 + + OKhigT * (OK_hdd * G1_hdd & + ! 9 + + (1.-OK_hdd) * OK_hds * G1_hds & + ! 10 + + (1.-OK_hdd) * (1.-OK_hds) * G1_bak)) + + !XF + if(G1snSV(ikl, isn) < 0.1) & + G2_hds = G2snSV(ikl, isn) + 1.d1 * AngSno * vfi * frac_j + !XF + + ! 1 + G2snSV(ikl, isn) = Wet_OK * (OK__wd * G2__wd & + ! 2 + + (1.-OK__wd) * OK__ws * G2_bak & + ! 3 + + (1.-OK__wd) * (1.-OK__ws) * G2__ws) & + ! + + (1.-Wet_OK) & + ! 4 + * (OKlowT * (OK_ldd * G2_ldd & + ! 5 + + (1.-OK_ldd) * G2_bak) & + ! 6 + + OKmidT * (OK_mdd * G2_mdd & + ! 7 + + (1.-OK_mdd) * G2_bak) & + ! 8 + + OKhigT * (OK_hdd * G2_hdd & + ! 9 + + (1.-OK_hdd) * OK_hds * G2_bak & + ! 10 + + (1.-OK_hdd) * (1.-OK_hds) * G2_hds)) +#if(vp) + ! +--Snow Properties: IO Set Up + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + G_curr(1) = Wet_OK * OK__wd + G_curr(2) = Wet_OK * (1.-OK__wd) * OK__ws + G_curr(3) = Wet_OK * (1.-OK__wd) * (1.-OK__ws) + G_curr(4) = (1.-Wet_OK) * OKlowT * OK_ldd + G_curr(5) = (1.-Wet_OK) * OKlowT * (1.-OK_ldd) + G_curr(6) = (1.-Wet_OK) * OKmidT * OK_mdd + G_curr(7) = (1.-Wet_OK) * OKmidT * (1.-OK_mdd) + G_curr(8) = (1.-Wet_OK) * OKhigT * OK_hdd + G_curr(9) = (1.-Wet_OK) * OKhigT * (1.-OK_hdd) * OK_hds + G_curr(10) = (1.-Wet_OK) * OKhigT * (1.-OK_hdd) * (1.-OK_hds) + G_curr(11) = T1__OK * G_curr(10) + G_curr(12) = T2__OK * G_curr(10) + G_curr(13) = T3__OK * G_curr(10) + G_curr(14) = T3_nOK * G_curr(10) + G_curr(15) = ro1_OK * dT1_OK * dT2_OK * G_curr(10) + G_curr(16) = ro1_OK * dT1_OK * dT3_OK * G_curr(10) + G_curr(17) = ro1_OK * dT1_OK * dT4_OK * G_curr(10) + G_curr(18) = ro1_OK * dT1_OK * dT4nOK * G_curr(10) + Gcases(1) = max(Gcases(1), G_curr(1)) + Gcases(2) = max(Gcases(2), G_curr(2)) + Gcases(3) = max(Gcases(3), G_curr(3)) + Gcases(4) = max(Gcases(4), G_curr(4)) + Gcases(5) = max(Gcases(5), G_curr(5)) + Gcases(6) = max(Gcases(6), G_curr(6)) + Gcases(7) = max(Gcases(7), G_curr(7)) + Gcases(8) = max(Gcases(8), G_curr(8)) + Gcases(9) = max(Gcases(9), G_curr(9)) + Gcases(10) = max(Gcases(10), G_curr(10)) + Gcases(11) = max(Gcases(11), G_curr(11)) + Gcases(12) = max(Gcases(12), G_curr(12)) + Gcases(13) = max(Gcases(13), G_curr(13)) + Gcases(14) = max(Gcases(14), G_curr(14)) + Gcases(15) = max(Gcases(15), G_curr(15)) + Gcases(16) = max(Gcases(16), G_curr(16)) + Gcases(17) = max(Gcases(17), G_curr(17)) + Gcases(18) = max(Gcases(18), G_curr(18)) + ! +--Snow Properties: IO + ! + ~~~~~~~~~~~~~~~~~~~ + if(isn <= isnoSV(ikl)) & + write(47, 471) isn, isnoSV(ikl), & + TsisSV(ikl, isn), ro__SV(ikl, isn), eta_SV(ikl, isn), & + G1_bak, G2_bak, istoSV(ikl, isn), & + dTsndz, & + (k, k=1, 18), & + (G_curr(k), k=1, 18), & + (Gcases(k), k=1, 18), & + Wet_OK, OK__wd, G1__wd, G2__wd, & + 1.-OK__wd, OK__ws, G1__ws, 1.-OK__ws, G2__ws, & + 1.-Wet_OK, OKlowT, OK_ldd, G1_ldd, G2_ldd, & + 1.-OK_ldd, G1_lds, & + OKmidT, OK_mdd, G1_mdd, G1_mdd, & + 1.-OK_mdd, G1_mds, & + OKhigT, OK_hdd, G1_hdd, G2_hdd, & + 1.-OK_hdd, OK_hds, G1_hds, & + 1.-OK_hds, G2_hds, & + G1snSV(ikl, isn), & + G2snSV(ikl, isn) +471 format( & + /, ' isn = ', i4, 6x, '(MAX.:', i4, ')', & + /, ' T = ', f8.3, & + /, ' ro = ', f8.3, & + /, ' eta = ', f8.3, & + /, ' G1 = ', f8.3, & + /, ' G2 = ', f8.3, & + /, ' Histor. = ', i4, & + /, ' Grad(T) = ', f8.3, ' ', 18i3, & + /, ' Current Case: ', 18f3.0, & + /, ' Cases performed: ', 18f3.0, & + /, ' ------------------------------------------------------------', & + '-----------+------------------+------------------+', & + /, ' Status ', & + ' | G1 | G2 |', & + /, ' ------------------------------------------------------------', & + '-----------+------------------+------------------+', & + /, ' Wet_OK: ', f8.3, ' OK__wd: ', f8.3, ' ', & + ' | G1__wd: ', f8.3, ' | G2__wd: ', f8.5, ' |', & + /, ' 1.-OK__wd: ', f8.3, ' OK__ws', & + ': ', f8.3, ' | G1__ws: ', f8.3, ' | |', & + /, ' 1.-OK__ws', & + ': ', f8.3, ' | | G2__ws: ', f8.5, ' |', & + /, ' 1.-Wet_OK: ', f8.3, ' OKlowT: ', f8.3, ' OK_ldd: ', f8.3, ' ', & + ' | G1_ldd: ', f8.3, ' | G2_ldd: ', f8.5, ' |', & + /, ' 1.-OK_ldd: ', f8.3, ' ', & + ' | G1_lds: ', f8.3, ' | |', & + /, ' OKmidT: ', f8.3, ' OK_mdd: ', f8.3, ' ', & + ' | G1_mdd: ', f8.3, ' | G2_mdd: ', f8.5, ' |', & + /, ' 1.-OK_mdd: ', f8.3, ' ', & + ' | G1_mds: ', f8.3, ' | |', & + /, ' OKhigT: ', f8.3, ' OK_hdd: ', f8.3, ' ', & + ' | G1_hdd: ', f8.3, ' | G2_hdd: ', f8.5, ' |', & + /, ' 1.-OK_hdd: ', f8.3, ' OK_hds', & + ': ', f8.3, ' | G1_hds: ', f8.3, ' | |', & + /, ' 1.-OK_hds', & + ': ', f8.3, ' | | G2_hds: ', f8.5, ' |', & + /, ' ------------------------------------------------------------', & + '-----------+------------------+------------------+', & + /, ' ', & + ' | ', f8.3, ' | ', f8.5, ' |', & + /, ' ------------------------------------------------------------', & + '-----------+------------------+------------------+') +#endif + enddo + enddo + !!$OMP END PARALLEL DO + + ! +-- 2. Mise a Jour Variables Historiques (Cas non dendritique) + ! + Update of the historical Variables + ! + ======================================================= + + if(vector) then + !XF + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + SphrOK = max(zero, sign(unun, G1snSV(ikl, isn))) + H1a_OK = max(zero, sign(unun, vsphe4 - G1snSV(ikl, isn))) + H1b_OK = 1 - min(1, istoSV(ikl, isn)) + H1__OK = H1a_OK * H1b_OK + H23aOK = max(zero, sign(unun, vsphe4 - G1_dSV & + + G1snSV(ikl, isn))) + H23bOK = max(zero, sign(unun, etaSno(ikl, isn) & + / max(epsi, dzsnSV(ikl, isn)) & + - vtelv1)) + H23_OK = H23aOK * H23bOK + H2__OK = 1 - min(1, istoSV(ikl, isn)) + H3__OK = 1 - min(1, abs(istoSV(ikl, isn) - istdSV(1))) + H45_OK = max(zero, sign(unun, TfSnow - TsisSV(ikl, isn) + epsi)) + H4__OK = 1 - min(1, abs(istoSV(ikl, isn) - istdSV(2))) + H5__OK = 1 - min(1, abs(istoSV(ikl, isn) - istdSV(3))) + + HISupd = & + SphrOK * (H1__OK * istdSV(1) & + + (1.-H1__OK) * H23_OK * (H2__OK * istdSV(2) & + + H3__OK * istdSV(3)) & + + (1.-H1__OK) * (1.-H23_OK) * H45_OK * (H4__OK * istdSV(4) & + + H5__OK * istdSV(5))) + istoSV(ikl, isn) = HISupd + & + (1.-min(unun, HISupd)) * istoSV(ikl, isn) + enddo + enddo + else + + ! +-- 2. Mise a Jour Variables Historiques (Cas non dendritique) + ! + Update of the historical Variables + ! + ======================================================= + + do ikl = 1, klonv + do isn = iiceSV(ikl), isnoSV(ikl) + if(G1snSV(ikl, isn) >= 0.) then + if(G1snSV(ikl, isn) < vsphe4 .and. istoSV(ikl, isn) == 0) then + istoSV(ikl, isn) = istdSV(1) + elseif(G1_dSV - G1snSV(ikl, isn) < vsphe4 .and. & + etaSno(ikl, isn) / dzsnSV(ikl, isn) > vtelv1) then + if(istoSV(ikl, isn) == 0) & + istoSV(ikl, isn) = istdSV(2) + if(istoSV(ikl, isn) == istdSV(1)) & + istoSV(ikl, isn) = istdSV(3) + elseif(TsisSV(ikl, isn) < TfSnow) then + if(istoSV(ikl, isn) == istdSV(2)) & + istoSV(ikl, isn) = istdSV(4) + if(istoSV(ikl, isn) == istdSV(3)) & + istoSV(ikl, isn) = istdSV(5) + endif + endif + enddo + enddo + endif + + ! +-- 3. Tassement mecanique /mechanical Settlement + ! + ========================================== + + do ikl = 1, klonv + SnMass(ikl) = 0. + enddo + !XF + do ikl = 1, klonv + + smb_old = 0. + zn_old = 0 + do isn = 1, isnoSV(ikl) + smb_old = smb_old + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + zn_old = zn_old + dzsnSV(ikl, isn) + enddo + + do isn = isnoSV(ikl), 1, -1 + dSnMas = 100.*dzsnSV(ikl, isn) * ro_dry(ikl, isn) + SnMass(ikl) = SnMass(ikl) + 0.5 * dSnMas + ViscSn = vvisc1 * vvisc2 & + * exp(vvisc3 * ro_dry(ikl, isn) & + + vvisc4 * abs(TfSnow - TsisSV(ikl, isn))) & + * ro_dry(ikl, isn) / rovisc + + ! +-- Changement de Viscosite si Teneur en Eau liquide + ! + Change of the Viscosity if liquid Water Content + ! + ------------------------------------------------ + + OK_Liq = max(zero, sign(unun, etaSno(ikl, isn) - epsi)) + OK_Ang = max(zero, sign(unun, vgran6 - G1snSV(ikl, isn))) & + * (1 - min(1, abs(istoSV(ikl, isn) - istdSV(1)))) +#if(wp) + if(G1snSV(ikl, isn) > 0. .and. G1snSV(ikl, isn) < vsphe4 & + .and. istoSV(ikl, isn) == 0) & + then + write(6, *) ikl, isn, ' G1,G2,hist,OK_Ang ', & + G1snSV(ikl, isn), G2snSV(ikl, isn), istoSV(ikl, isn), OK_Ang + stop "Grains anguleux mal d?finis" + endif +#endif + OKxLiq = max(zero, sign(unun, vtelv1 - etaSno(ikl, isn) & + / max(epsi, dzsnSV(ikl, isn)))) & + * max(0, sign(1, istoSV(ikl, isn) & + - istdSV(1))) + ViscSn = & + ViscSn * (OK_Liq / (vvisc5 + vvisc6 * etaSno(ikl, isn) & + / max(epsi, dzsnSV(ikl, isn))) & + + (1.-OK_Liq)) & + * (OK_Ang * exp(min(ADSdSV, G2snSV(ikl, isn) - vdiam4)) & + + (1.-OK_Ang)) & + * (OKxLiq * vvisc7 & + + (1.-OKxLiq)) + + ! +-- Calcul nouvelle Epaisseur / new Thickness + ! + ----------------------------------------- + + dzsnew = & + dzsnSV(ikl, isn) & + * max(vdz3, & + (unun - dt__SV2 * max(SnMass(ikl) * cos(slopSV(ikl)), unun) & + / max(ViscSn, epsi))) + rosnew = ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + / max(1e-10, dzsnew) + rosmax = 1./((1.-eta_SV(ikl, isn)) / ro_Ice & + + eta_SV(ikl, isn) / ro_Wat) + rosnew = min(rosnew, rosmax) + dzsnew = dzsnSV(ikl, isn) * ro__SV(ikl, isn) & + / max(1e-10, rosnew) + ro__SV(ikl, isn) = rosnew + dzsnSV(ikl, isn) = dzsnew + ro_dry(ikl, isn) = ro__SV(ikl, isn) * (1.-eta_SV(ikl, isn)) * 1.e-3 + ! +... ro_dry: Dry Density (g/cm3) + ! + + SnMass(ikl) = SnMass(ikl) + dSnMas * 0.5 + enddo + + smb_new = 0. + do isn = 1, isnoSV(ikl) + smb_new = smb_new + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + + isn = 1 + if(dzsnSV(ikl, isn) > 0 .and. ro__SV(ikl, isn) > 0) then + dzsnSV(ikl, isn) = dzsnSV(ikl, isn) + 0.9999 * (smb_old - smb_new) & + / ro__SV(ikl, isn) + endif + + zn_new = 0 + do isn = 1, isnoSV(ikl) + zn_new = zn_new + dzsnSV(ikl, isn) + enddo + zn4_SV(ikl) = zn4_SV(ikl) + (zn_new - zn_old) + + enddo + +#if(wp) + ! OUTPUT/Verification (stdout) + ! ============================ + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + if(G1snSV(ikl, isn) > 0. .and. G2snSV(ikl, isn) > D__MAX) then + write(6, 6600) G1snSV(ikl, isn), G2snSV(ikl, isn), ikl, isn +6600 format(/, 'WARNING in _GSn: G1,G2 =', 2f9.3, ' (ikl,isn) =', 2i4) + D__MAX = G2snSV(ikl, isn) + endif + if(G2snSV(ikl, isn) < 0.) then + write(6, 6601) G1snSV(ikl, isn), G2snSV(ikl, isn), ikl, isn +6601 format(/, 'ERROR 1 in _GSn: G1,G2 =', 2f9.3, ' (ikl,isn) =', 2i4) + STOP + endif + if(G1snSV(ikl, isn) > G1_dSV + epsi) then + write(6, 6602) G1snSV(ikl, isn), G2snSV(ikl, isn), ikl, isn +6602 format(/, 'ERROR 2 in _GSn: G1,G2 =', 2f9.3, ' (ikl,isn) =', 2i4) + STOP + endif + if(G1snSV(ikl, isn) < 0. .and. & + G2snSV(ikl, isn) > G1_dSV + epsi) then + write(6, 6603) G1snSV(ikl, isn), G2snSV(ikl, isn), ikl, isn +6603 format(/, 'ERROR 3 in _GSn: G1,G2 =', 2f9.3, ' (ikl,isn) =', 2i4) + STOP + endif + enddo + enddo +#endif + return +end diff --git a/MAR/code_mar/sisvat_ini.f90 b/MAR/code_mar/sisvat_ini.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ef4f401766232271827af4e10b6f82f96ce5092e --- /dev/null +++ b/MAR/code_mar/sisvat_ini.f90 @@ -0,0 +1,331 @@ +#include "MAR_pp.def" +subroutine SISVAT_ini + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_ini Sun 19-04-2021 MAR | + ! | subroutine SISVAT_ini generates non time dependant SISVAT parameters | + ! +------------------------------------------------------------------------+ + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: dt__SV : Time Step [s] | + ! | ^^^^^ dz_dSV : Layer Thickness [m] | + ! | | + ! | OUTPUT: RF__SV : Root Fraction in Layer isl [-] | + ! | ^^^^^^ rocsSV : Soil Contrib. to (ro c)_s exclud.Water [J/kg/K] | + ! | etamSV : Soil Minimum Humidity [m3/m3] | + ! | (based on a prescribed Soil Relative Humidity) | + ! | s1__SV : Factor of eta**( b+2) in Hydraul.Diffusiv. | + ! | s2__SV : Factor of eta**( b+2) in Hydraul.Conduct. | + ! | aKdtSV : KHyd: Piecewise Linear Profile: a * dt [m] | + ! | bKdtSV : KHyd: Piecewise Linear Profile: b * dt [m/s] | + ! | dzsnSV(0): Soil first Layer Thickness [m] | + ! | dzmiSV : Distance between two contiguous levels [m] | + ! | dz78SV : 7/8 (Layer Thickness) [m] | + ! | dz34SV : 3/4 (Layer Thickness) [m] | + ! | dz_8SV : 1/8 (Layer Thickness) [m] | + ! | dzAvSV : 1/8 dz_(i-1) + 3/4 dz_(i) + 1/8 dz_(i+1) [m] | + ! | dtz_SV : dt/dz [s/m] | + ! | OcndSV : Swab Ocean / Soil Ratio [-] | + ! | Implic : Implicit Parameter (0.5: Crank-Nicholson) | + ! | Explic : Explicit Parameter = 1.0 - Implic | + ! | | + ! | # OPTIONS: #ER: Richards Equation is not smoothed | + ! | # ^^^^^^^ #kd: De Ridder Discretization | + ! | # #SH: Hapex-Sahel Values | + ! | | + ! +------------------------------------------------------------------------+ + use mardim + use marphy + use mar_sv + use mar_tv + use mardsv + use mar0sv + use marxsv + use margrd + use marctr + + implicit none + + ! +--Internal Variables + ! + ================== + + integer i, j, k, ivt, ist, kk, ikl, isl, isn, ikh + integer misl_2, nisl_2 + real zDepth + real d__eta, eta__1, eta__2, Khyd_1, Khyd_2 + real RHsMin ! Min.Soil Relative Humidity + real PsiMax ! Max.Soil Water Potential + real a_Khyd, b_Khyd ! Piecewis.Water Conductivity +#if(WR) + real Khyd_x, Khyd_y +#endif + + ! +--DATA + ! + ==== + + data RHsMin/0.001/ ! Min.Soil Relative Humidity + + ! +--Non Time Dependant SISVAT parameters + ! + ==================================== + + ! +--Soil Discretization + ! + ------------------- + + ! +--Numerical Scheme Parameters + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Implic = 0.75 ! 0.5 <==> Crank-Nicholson + Explic = 1.00 - Implic ! + + ! +--Soil/Snow Layers Indices + ! + ^^^^^^^^^^^^^^^^^^^^^^^^ + do isl = -nsol, 0 + islpSV(isl) = isl + 1 + islpSV(isl) = min(islpSV(isl), 0) + islmSV(isl) = isl - 1 + islmSV(isl) = max(-nsol, islmSV(isl)) + enddo + + do isn = 1, nsno + isnpSV(isn) = isn + 1 + isnpSV(isn) = min(isnpSV(isn), nsno) + enddo +#if(kd) + ! +--Soil Layers Thicknesses + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if(nsol > 4) then + do isl = -5, -nsol, -1 + dz_dSV(isl) = 1. + enddo + endif +#endif + + dz_dSV(-4:0) = (/0.72, 0.20, 0.060, 0.019, 0.001/) + + if(nsol /= 4) then + do isl = 0, -nsol, -1 + misl_2 = -mod(isl, 2) + nisl_2 = -isl / 2 + dz_dSV(isl) = (((1 - misl_2) * 0.001 & + + misl_2 * 0.003) * 10**(nisl_2)) * 4. + ! +... dz_dSV(0) = Hapex-Sahel Calibration: 4 mm + + enddo + dz_dSV(0) = 0.001 + dz_dSV(-1) = dz_dSV(-1) - dz_dSV(0) + 0.004 + endif + + zz_dSV = 0. + do isl = -nsol, 0 + dzmiSV(isl) = 0.500 * (dz_dSV(isl) + dz_dSV(islmSV(isl))) + dziiSV(isl) = 0.500 * dz_dSV(isl) / dzmiSV(isl) + dzi_SV(isl) = 0.500 * dz_dSV(islmSV(isl)) / dzmiSV(isl) + dtz_SV(isl) = dt__SV / dz_dSV(isl) + dtz_SV2(isl) = 1./dz_dSV(isl) + dz78SV(isl) = 0.875 * dz_dSV(isl) + dz34SV(isl) = 0.750 * dz_dSV(isl) + dz_8SV(isl) = 0.125 * dz_dSV(isl) + dzAvSV(isl) = 0.125 * dz_dSV(islmSV(isl)) & + + 0.750 * dz_dSV(isl) & + + 0.125 * dz_dSV(islpSV(isl)) +#if(ER) + dz78SV(isl) = dz_dSV(isl) + dz34SV(isl) = dz_dSV(isl) + dz_8SV(isl) = 0. + dzAvSV(isl) = dz_dSV(isl) +#endif + zz_dSV = zz_dSV + dz_dSV(isl) + enddo + do ikl = 1, klonv + dzsnSV(ikl, 0) = dz_dSV(0) + enddo + + ! +--Conversion to a 50 m Swab Ocean Discretization + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OcndSV = 0. + do isl = -nsol, 0 + OcndSV = OcndSV + dz_dSV(isl) + enddo + OcndSV = 50./OcndSV + + ! +--Secondary Vegetation Parameters + ! + ------------------------------- +#if(SH) + ! +--Minimum Stomatal Resistance (Hapex Sahel Data) + ! + (Taylor et al. 1997, J.Hydrol 188-189, p.1047) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ivg = 1, 3 + StodSV(ivg) = 210. ! Millet + enddo + StodSV(4) = 120. ! Sparse Tiger Bush + do ivg = 5, 6 + StodSV(ivg) = 80. ! Dense Tiger Bush + enddo + StodSV(7) = 80. ! Low Trees (Fallow) + StodSV(10) = 80. + ! +--Minimum Stomatal Resistance (Tropical Forest) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + StodSV(8) = 60. ! Medium Trees + StodSV(11) = 60. + StodSV(9) = 40. ! High Trees + StodSV(12) = 40. +#endif + ! +--Root Fraction + ! + ^^^^^^^^^^^^^ + ! + * GENERAL REFERENCE + ! + Jackson et al., 1996: A global analysis of root distributions for + ! + terrestrial biomes. In Oecologia, 108, 389-411. + + ! + * ROOT PROFILE + ! + The cumulative root fraction Y is given by + ! + Y = 1 - beta**d with d the depth (in cm), + ! + beta a coefficient (vegetation dependent). + + ! + * BETA VALUES (for 11 world biomes) + ! + 1 boreal forest 0.943 + ! + 2 crops 0.961 + ! + 3 desert 0.975 + ! + 4 sclerophyllous shrubs 0.964 + ! + 5 temperate coniferous forest 0.976 + ! + 6 temperate deciduous forest 0.966 + ! + 7 temperate grassland 0.943 + ! + 8 tropical deciduous forest 0.961 + ! + 9 tropical evergreen forest 0.962 + ! + 10 tropical grassland savanna 0.972 + ! + 11 tundra 0.914 + + ! + * ADVISED BETA VALUES FOR MAR + ! + (see 'block data SISVAT_dat', variable rbtdSV) + ! + + ! + SVAT veg. type default West Africa + ! + 0 barren soil 0.000 0.000 + ! + 1 crops low 0.961 (2) 0.961 (2) + ! + 2 crops medium 0.961 (2) 0.961 (2) + ! + 3 crops high 0.961 (2) 0.961 (2) + ! + 4 grass low 0.943 (7) 0.943 (7) + ! + 5 grass medium 0.943 (7) 0.964 (4) + ! + 6 grass high 0.943 (7) 0.972 (10) + ! + 7 broadleaf low 0.966 (6) 0.968 (4,10) + ! + 8 broadleaf medium 0.966 (6) 0.962 (8,9) + ! + 9 broadleaf high 0.966 (6) 0.962 (8,9) + ! + 10 needleleaf low 0.976 (5) 0.971 (5,6) + ! + 11 needleleaf medium 0.976 (5) 0.976 (5) + ! + 12 needleleaf high 0.976 (5) 0.976 (5) + + ! + Numbers between brackets refer to Jackson's biomes. For more details + ! + about some choices, see the correspondance between the IGBP and SVAT + ! + vegetation classes (i.e. in NESTOR). + + ! + * WARNING + ! + Most of the roots are located in the first 2 m of soil. The root + ! + fraction per layer depends on the definition of the soil layer + ! + thickness. It will get wrong if a thick layer is defined around 2 m + ! + deep. + + ! write(*,'(/a)') 'ROOT PROFILES (Jackson, 1996) :' + + do ivt = 0, nvgt + zDepth = 0. + do isl = 0, -nsol, -1 + if(ivt /= 0) then + RF__SV(ivt, isl) = rbtdSV(ivt)**zDepth * & + (1.-rbtdSV(ivt)**(dz_dSV(isl) * 100)) + zDepth = zDepth + dz_dSV(isl) * 100 !in cm + else + RF__SV(ivt, isl) = 0. + endif + enddo + ! write(*,'(a,i2,a,i3,a,99f10.5:)') & + ! ' RF__SV(', ivt, ',', -nsol, ':0) =', RF__SV(ivt,:) + enddo + ! write(6,6600) + ! 6600 format(& + ! ' NOTE: If root fraction is not close to 0 around 2 m deep,', & + ! /, ' Then you should redefine the soil layer thicknesses.', & + ! /, ' See the code for more details.') + + ! +--Secondary Soil Parameters + ! + ------------------------------- + + do ist = 0, nsot + rocsSV(ist) = (1.0 - etadSV(ist)) * 1.2E+6 ! Soil Contrib. to (ro c)_s + ! Factor of (eta)**(b+2) in DR97, Eqn.(3.36) + s1__SV(ist) = bCHdSV(ist) & + * psidSV(ist) * Ks_dSV(ist) & + / (etadSV(ist)**(bCHdSV(ist) + 3.)) + ! Factor of (eta)**(2b+3) in DR97, Eqn.(3.35) + s2__SV(ist) = Ks_dSV(ist) & + / (etadSV(ist)**(2.*bCHdSV(ist) + 3.)) + + ! +--Soil Minimum Humidity (from a prescribed minimum relative Humidity) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Psimax = -(log(RHsMin)) / 7.2E-5 ! DR97, Eqn 3.15 Inversion + etamSV(ist) = etadSV(ist) & + * (PsiMax / psidSV(ist))**(-min(10., 1./bCHdSV(ist))) + enddo + etamSV(12) = 0. + + ! +--Piecewise Hydraulic Conductivity Profiles + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ist = 0, nsot + +#if(WR) + write(6, 6000) +6000 format(' Type | etaSat | No | eta__1 | eta__2 |', & + ' Khyd_1 | Khyd_x | Khyd_2 | Khyd_y |' & + /, ' -----+-----------+----+-----------+-----------+', & + '-----------+-----------+-----------+-----------+') +#endif + + d__eta = etadSV(ist) / nkhy + eta__1 = 0. + eta__2 = d__eta + do ikh = 0, nkhy + ! DR97, Eqn.(3.35) + Khyd_1 = s2__SV(ist) & + * (eta__1**(2.*bCHdSV(ist) + 3.)) + Khyd_2 = s2__SV(ist) & + * (eta__2**(2.*bCHdSV(ist) + 3.)) + + a_Khyd = (Khyd_2 - Khyd_1) / d__eta + b_Khyd = Khyd_1 - a_Khyd * eta__1 +#if(WR) + Khyd_x = a_Khyd * eta__1 + b_Khyd + Khyd_y = a_Khyd * eta__2 + b_Khyd +#endif + aKdtSV(ist, ikh) = a_Khyd * dt__SV + bKdtSV(ist, ikh) = b_Khyd * dt__SV + aKdtSV2(ist, ikh) = a_Khyd * 1. + bKdtSV2(ist, ikh) = b_Khyd * 1. + +#if(WR) + write(6, 6001) ist, etadSV(ist), ikh, eta__1, & + eta__2, Khyd_1, Khyd_x, Khyd_2, Khyd_y +#endif +6001 format(i5, ' |', e10.2, ' |', i3, ' |', & + 6(e10.2, ' |')) + + eta__1 = eta__1 + d__eta + eta__2 = eta__2 + d__eta + enddo + enddo + + if(itexpe <= 2) then + do j = 1, my + do i = 1, mx + do k = 1, nvx + do kk = 1, llx + if(TsolTV(i, j, k, kk) <= 273.15) then + Eta_TV(i, j, k, kk) = min(Eta_TV(i, j, k, kk), 0.2 * etadSV(isolTV(i, j))) + else + Eta_TV(i, j, k, kk) = max(Eta_TV(i, j, k, kk), & + min(0.7, 0.4 + (TsolTV(i, j, k, kk) - 273.15) / 100.) * etadSV(isolTV(i, j))) + endif + enddo + enddo + enddo + enddo + endif + + return +end diff --git a/MAR/code_mar/sisvat_qsn.f90 b/MAR/code_mar/sisvat_qsn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..bc83687a5e238553ed458b89eb78a6edbb3355e1 --- /dev/null +++ b/MAR/code_mar/sisvat_qsn.f90 @@ -0,0 +1,856 @@ +#include "MAR_pp.def" +subroutine SISVAT_qSn() + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_qSn 20-11-2022 MAR | + ! | subroutine SISVAT_qSn updates the Snow Water Content | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: isnoSV = total Nb of Ice/Snow Layers | + ! | ^^^^^ | + ! | | + ! | INPUT: TaT_SV : SBL Top Temperature [K] | + ! | ^^^^^ dt__SV : Time Step [s] | + ! | | + ! | INPUT / drr_SV : Rain Intensity [kg/m2/s] | + ! | OUTPUT: dzsnSV : Snow Layer Thickness [m] | + ! | ^^^^^^ eta_SV : Snow Water Content [m3/m3] | + ! | ro__SV : Snow/Soil Volumic Mass [kg/m3] | + ! | TsisSV : Soil/Ice Temperatures (layers -nsol,-nsol+1,..,0)| + ! | & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | | + ! | OUTPUT: SWS_SV : Surficial Water Status | + ! | ^^^^^^ | + ! | EExcsv : Snow Energy in Excess, initial Forcing [J/m2] | + ! | EqSn_d : Snow Energy in Excess, remaining [J/m2] | + ! | EqSn_0 : Snow Energy, before Phase Change [J/m2] | + ! | EqSn_1 : Snow Energy, after Phase Change [J/m2] | + ! | SIsubl : Snow sublimed/deposed Mass [mm w.e.] | + ! | SImelt : Snow Melted Mass [mm w.e.] | + ! | SIrnof : Surficial Water + Run OFF Change [mm w.e.] | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | | + ! | # OPTIONS: #E0: IO for Verification: Energy Budget | + ! | # ^^^^^^^ | + ! | # #su: IO for Verification: Slush Diagnostic | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_qSn.vm | #vm: OUTPUT/Verification: Energy/Water Budget | + ! | | unit 43, subroutine SISVAT_qSn **ONLY** | + ! | # SISVAT_qSn.vu | #vu: OUTPUT/Verification: Slush Parameteriz. | + ! | | unit 44, subroutine SISVAT_qSn **ONLY** | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + + implicit none + +#if(e1) + ! Energy Budget + ! ~~~~~~~~~~~~~ + ! EqSn_d : Energy in Excess, initial + real EqSn_d(klonv) + ! EqSn_0 : Snow Energy, befor Phase Change + real EqSn_0(klonv) + ! EqSn_1 : Snow Energy, after Phase Change .and. Mass Redistr. + real EqSn_1(klonv) +#endif + +#if(vm) + ! EqSn01 : Snow Energy, after Phase Change + real EqSn01(klonv) + ! EqSn02 : Snow Energy, after Phase Change .and. Last Melting + real EqSn02(klonv) +#endif + ! Snow/Ice (Mass) Budget + ! ~~~~~~~~~~~~~~~~~~~~~~ +#if(m1) + ! SIsubl : Snow Deposed Mass + real SIsubl(klonv) + ! SImelt : Snow Melted Mass + real SImelt(klonv) + ! SIrnof : Local Surficial Water + Run OFF + real SIrnof(klonv) +#endif + + ! +--Internal Variables + ! + ================== + integer ikl, isn, flag + ! nh : Non erodible Snow: up.lay.Index + integer nh + ! LayrOK : 1 (0) if In(Above) Snow Pack + integer LayrOK + ! k_face : 1 (0) if Crystal(no) faceted + integer k_face + ! LastOK : 1 ==> 1! Snow Layer + integer LastOK + ! NOLayr : 1 Layer Update + integer NOLayr + ! noSnow : Nb of Layers Updater + integer noSnow(klonv) + ! noSnow : Slush Switch + integer kSlush + ! dTSnow : Temperature[C] + real dTSnow + ! EExdum : Energy in Excess when no Snow + real EExdum(klonv) + ! OKmelt : 1 (0) if(no) Melting + real OKmelt + ! EnMelt : Energy in excess, for Melting + real EnMelt + ! SnHLat : Energy consumed in Melting + real SnHLat + ! AdEnrg, B_Enrg : Additional Energy from Vapor + real AdEnrg, B_Enrg + ! Vaporized Thickness [m] + real dzVap0, dzVap1 + ! Melted Thickness [m] + real dzMelt(klonv) + ! rosDry : Snow volumic Mass if no Water in + real rosDry + ! PorVol : Pore volume + real PorVol + ! PClose : Pore Hole Close OFF Switch + real PClose + ! SGDiam : Snow Grain Diameter + real SGDiam + ! SGDmax : Max. Snow Grain Diameter + real SGDmax + ! rWater : Retained Water [kg/m2] + real rWater + ! drrNEW : New available Water [kg/m2] + real drrNEW + ! rdzNEW : Snow Mass [kg/m2] + real rdzNEW + ! rdzsno : Snow Mass [kg/m2] + real rdzsno + ! EnFrez : Energy Release in Freezing + real EnFrez + ! WaFrez : Water consumed in Melting + real WaFrez + ! RapdOK : 1. ==> Snow melts rapidly + real RapdOK + ! ThinOK : 1. ==> Snow Layer is thin + real ThinOK + ! dzepsi : Minim. Snow Layer Thickness (!) + real dzepsi + ! dz_Min : Minim. Snow Layer Thickness + real dz_Min + ! z_Melt : Last (thin) Layer Melting + real z_Melt + ! rusnew : Surficial Water Thickness [mm] + real rusnew + ! zWater : Max Slush Water Thickness [mm] + real zWater + ! zSlush : Slush Water Thickness [mm] + real zSlush + ! ro_new : New Snow/ice Density [kg/m3] + real ro_new + ! zc, zt : Non erod.Snow Thickness [mm w.e.] + real zc, zt + ! dru : Surficial Water [kg/m2] + real dru + real rusnSV0(klonv), sum1(klonv), sum2(klonv) + real drr1(klonv), drr2(klonv) + + ! +--OUTPUT of SISVAT Trace Statistics (see assignation in PHY_SISVAT) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer isnnew, isinew, isnUpD, isnitr +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + common / SISVAT_EV / iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif +#if(vm) + ! +--Energy and Mass Budget + ! + ~~~~~~~~~~~~~~~~~~~~~~ + ! WqSn_0 : Snow Water+Forcing Initial + real WqSn_0(klonv) + ! WqSn_1 : Snow Water+Forcing, Final + real WqSn_1(klonv) + ! emopen : IO Switch + logical emopen + common / Se_qSn_L / emopen + integer no_err + common / Se_qSn_I / no_err + real hourer, timeer + common / Se_qSn_R / timeer +#endif +#if(vu) + ! +--Slush Diagnostic: IO + ! + ~~~~~~~~~~~~~~~~~~~~ + ! su_opn : IO Switch + logical su_opn + common / SI_qSn_L / su_opn +#endif + + ! +--DATA + ! + ==== + ! dzepsi : Minim. Snow Layer Thickness (!) + data dzepsi/0.0001/ + ! dzepsi = 0.005 : Warning: Too high for Col de Porte: precludes 1st snow (layer) apparition + ! data dz_Min/0.005/ + ! dz_Min : Minim. Snow Layer Thickness + data dz_Min/2.5e-3/ + ! SGDmax : Maxim. Snow Grain Diameter [m] (Rowe et al. 1995, JGR p.16268) + data SGDmax/0.003/ + +#if(e1) + ! +--Energy Budget (IN) + ! + ================== + do ikl = 1, klonv + EqSn_0(ikl) = 0. + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + EqSn_0(ikl) = EqSn_0(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * (Cn_dSV * (TsisSV(ikl, isn) - TfSnow) & + - Lf_H2O * (1.-eta_SV(ikl, isn))) + enddo + enddo +#endif + +#if(vm) + ! +--Water Budget (IN) + ! + ================== + do ikl = 1, klonv + WqSn_0(ikl) = drr_SV(ikl) * dt__SV & + + rusnSV(ikl) + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + WqSn_0(ikl) = WqSn_0(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) + enddo + enddo +#endif + +#if(m1) + ! +--Snow Melt Budget + ! + ================ + do ikl = 1, klonv + SImelt(ikl) = 0. + SIrnof(ikl) = rusnSV(ikl) + RnofSV(ikl) * dt__SV + enddo +#endif + + ! +--Initialization + ! + ============== + + do ikl = 1, klonv + ! noSnow : Nb of Layers Updater + noSnow(ikl) = 0 + ! ispiSV : Pore Hole Close OFF Index + ! (assumed to be the Top of the surimposed Ice Layer) + ispiSV(ikl) = 0 + zn5_SV(ikl) = 0. + rusnSV0(ikl) = 0. + sum1(ikl) = 0 + sum2(ikl) = 0 + do isn = 1, isnoSV(ikl) + sum1(ikl) = sum1(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + drr1(ikl) = drr_SV(ikl) * dt__SV + enddo + + ! +--Melting/Freezing Energy + ! + ======================= + + ! +...REMARK: Snow liquid Water Temperature assumed = TfSnow + ! + ^^^^^^ + do ikl = 1, klonv + EExdum(ikl) = drr_SV(ikl) * C__Wat * (TaT_SV(ikl) - TfSnow) & + * dt__SV + EExcsv(ikl) = EExdum(ikl) * min(1, isnoSV(ikl)) ! Snow exists + EExdum(ikl) = EExdum(ikl) - EExcsv(ikl) ! +#if(e1) + EqSn_d(ikl) = EExcsv(ikl) +#endif + enddo + + ! +--Surficial Water Status + ! + ---------------------- + + do ikl = 1, klonv + SWS_SV(ikl) = max(zero, sign(unun, TfSnow & + - TsisSV(ikl, isnoSV(ikl)))) + enddo + + do ikl = 1, klonv + zt = 0. + do isn = 1, isnoSV(ikl) + zt = zt + dzsnSV(ikl, isn) + enddo + do isn = isnoSV(ikl), 1, -1 + + ! +--Energy, store Previous Content + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + dTSnow = TsisSV(ikl, isn) - TfSnow + EExcsv(ikl) = EExcsv(ikl) & + + ro__SV(ikl, isn) * Cn_dSV * dTSnow & + * dzsnSV(ikl, isn) + TsisSV(ikl, isn) = TfSnow + + ! +--Water, store Previous Content + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + drr_SV(ikl) = drr_SV(ikl) & + + ro__SV(ikl, isn) * eta_SV(ikl, isn) & + * dzsnSV(ikl, isn) & + / dt__SV + ro__SV(ikl, isn) = & + ro__SV(ikl, isn) * (1.-eta_SV(ikl, isn)) + eta_SV(ikl, isn) = 0. + + ! +--Melting if EExcsv > 0 + ! + ====================== + + EnMelt = max(zero, EExcsv(ikl)) + + ! +--Energy Consumption + ! + ^^^^^^^^^^^^^^^^^^ + SnHLat = ro__SV(ikl, isn) * Lf_H2O + dzMelt(ikl) = EnMelt / max(SnHLat, epsi) + noSnow(ikl) = noSnow(ikl) & + + max(zero, sign(unun, dzMelt(ikl) & + ! 1 if full Melt + - dzsnSV(ikl, isn))) & + ! 1 in the Pack + * min(1, max(0, 1 + isnoSV(ikl) - isn)) + dzMelt(ikl) = & + min(dzsnSV(ikl, isn), dzMelt(ikl)) + dzsnSV(ikl, isn) = & + dzsnSV(ikl, isn) - dzMelt(ikl) + zn5_SV(ikl) = zn5_SV(ikl) + dzMelt(ikl) + EExcsv(ikl) = EExcsv(ikl) - dzMelt(ikl) * SnHLat + wem_SV(ikl) = wem_SV(ikl) - dzMelt(ikl) * ro__SV(ikl, isn) + + ! +--Water Production + ! + ^^^^^^^^^^^^^^^^^ + drr_SV(ikl) = drr_SV(ikl) & + + ro__SV(ikl, isn) * dzMelt(ikl) / dt__SV +#if(m1) + SImelt(ikl) = SImelt(ikl) & + + ro__SV(ikl, isn) * dzMelt(ikl) +#endif + OKmelt = max(zero, sign(unun, drr_SV(ikl) - epsi)) + + ! +--Snow History + ! + ^^^^^^^^^^^^ + ! = 1 if faceted + k_face = min(istoSV(ikl, isn), istdSV(1)) & + * max(0, 2 - istoSV(ikl, isn)) + istoSV(ikl, isn) = & + (1.-OKmelt) * istoSV(ikl, isn) & + + OKmelt * ((1 - k_face) * istdSV(2) & + + k_face * istdSV(3)) + + ! +--Freezing if EExcsv < 0 + ! + ====================== + flag = 0 + if(SWS_SV(ikl) == 0 .and. drr_SV(ikl) == 0 .and. isn == isnoSV(ikl) .and. & + ro__SV(ikl, isn) > roCdSV .and. rusnSV(ikl) > 0) flag = 1 + if(flag == 1) then + drr_SV(ikl) = rusnSV(ikl) / dt__SV + dru = rusnSV(ikl) + endif + rdzsno = ro__SV(ikl, isn) * dzsnSV(ikl, isn) + LayrOK = min(1, max(0, isnoSV(ikl) - isn + 1)) + EnFrez = min(zero, EExcsv(ikl)) + WaFrez = -(EnFrez * LayrOK / Lf_H2O) + drrNEW = max(zero, drr_SV(ikl) - WaFrez / dt__SV) + WaFrez = (drr_SV(ikl) - drrNEW) * dt__SV + drr_SV(ikl) = drrNEW + EExcsv(ikl) = EExcsv(ikl) + WaFrez * Lf_H2O + EnFrez = min(zero, EExcsv(ikl)) * LayrOK + rdzNEW = WaFrez + rdzsno + ro__SV(ikl, isn) = rdzNEW / max(epsi, dzsnSV(ikl, isn)) + TsisSV(ikl, isn) = TfSnow & + + EnFrez / (Cn_dSV * max(epsi, rdzNEW)) + EExcsv(ikl) = EExcsv(ikl) - EnFrez + wer_SV(ikl) = WaFrez + wer_SV(ikl) + if(flag == 1) then + rusnSV(ikl) = drr_SV(ikl) * dt__SV + dru = dru - rusnSV(ikl) + drr1(ikl) = drr1(ikl) + dru / dt__SV + RuofSV(ikl, 2) = max(0., RuofSV(ikl, 2) - dru / dt__SV) + drr_SV(ikl) = 0. + endif + + ! +--Snow Water Content + ! + ================== + + ! +--Percolation Velocity + ! + ^^^^^^^^^^^^^^^^^^^^ +#if(PW) + SGDiam = 1.6d-4 & + + 1.1d-13 * (ro__SV(ikl, isn) * ro__SV(ikl, isn) & + * ro__SV(ikl, isn) * ro__SV(ikl, isn)) +#endif + + ! +--Pore Volume [-] + ! + ^^^^^^^^^^^^^^^^^ + rosDry = (1.-eta_SV(ikl, isn)) * ro__SV(ikl, isn) ! + PorVol = 1.-rosDry / ro_Ice ! + PorVol = max(PorVol, zero) ! + + ! +--Water Retention + ! + ^^^^^^^^^^^^^^^^ + rWater = ws0dSV * PorVol * ro_Wat * dzsnSV(ikl, isn) + drrNEW = max(zero, drr_SV(ikl) - rWater / dt__SV) + rWater = (drr_SV(ikl) - drrNEW) * dt__SV + drr_SV(ikl) = drrNEW + rdzNEW = rWater & + + rosDry * dzsnSV(ikl, isn) + eta_SV(ikl, isn) = rWater / max(epsi, rdzNEW) + ro__SV(ikl, isn) = rdzNEW / max(epsi, dzsnSV(ikl, isn)) + + ! +--Pore Hole Close OFF + ! + ^^^^^^^^^^^^^^^^^^^ + PClose = max(zero, & + sign(unun, ro__SV(ikl, isn) & + - roCdSV)) + ! Water under SuPer.Ice contributes to Surficial Water + ispiSV(ikl) = ispiSV(ikl) * (1.-PClose) & + + max(ispiSV(ikl), isn) * Pclose + ! PClose = max(0, min (1, ispiSV(ikl) - isn)) + PClose = 1.-(ro_ice - ro__SV(ikl, isn)) / (ro_ice - roCdSV) + PClose = max(0., min(1., PClose)) + + if(ro__SV(ikl, isn) > 900) then + dzsnSV(ikl, isn) = dzsnSV(ikl, isn) * ro__SV(ikl, isn) / ro_ice + ro__SV(ikl, isn) = ro_ice + PClose = 1 + ! eta_SV(ikl, isn) = 0 + endif + + if(isnoSV(ikl) >= 3 .and. & + ro__SV(ikl, isn) >= roCdSV .and. & + (ro__SV(ikl, 1) * dzsnSV(ikl, 1) + & + ro__SV(ikl, 2) * dzsnSV(ikl, 2)) / & + (dzsnSV(ikl, 1) + dzsnSV(ikl, 2)) < 900) & + PClose = PClose / 3. ! ice lense +#if(EU) + zt = 1. +#endif + if(isn == 1 .and. zt > 15) then + ! > 15 meter of snwow => ice sheet + PClose = 1 + ispiSV(ikl) = max(ispiSV(ikl), 1) + endif + + if(isnoSV(ikl) == 0) PClose = 0. + rusnSV(ikl) = rusnSV(ikl) & + + drr_SV(ikl) * dt__SV * PClose + rusnSV0(ikl) = rusnSV0(ikl) & + + drr_SV(ikl) * dt__SV * PClose + drr_SV(ikl) = drr_SV(ikl) * (1.-PClose) + + enddo + enddo + + ! +--Remove Zero-Thickness Layers + ! + ============================ + +1000 continue + isnitr = 0 + do ikl = 1, klonv + isnUpD = 0 + isinew = 0 + !XF + do isn = 1, min(nsno - 1, isnoSV(ikl)) + isnnew = (unun - max(zero, sign(unun, dzsnSV(ikl, isn) - dzepsi))) & + * max(0, min(1, isnoSV(ikl) + 1 - isn)) + isnUpD = max(isnUpD, isnnew) + isnitr = max(isnitr, isnnew) + ! LowerMost 0-Layer + isinew = isn * isnUpD * max(0, 1 - isinew) & + + isinew ! Index + dzsnSV(ikl, isn) = dzsnSV(ikl, isn + isnnew) + ro__SV(ikl, isn) = ro__SV(ikl, isn + isnnew) + TsisSV(ikl, isn) = TsisSV(ikl, isn + isnnew) + eta_SV(ikl, isn) = eta_SV(ikl, isn + isnnew) + G1snSV(ikl, isn) = G1snSV(ikl, isn + isnnew) + G2snSV(ikl, isn) = G2snSV(ikl, isn + isnnew) + dzsnSV(ikl, isn + isnnew) = (1 - isnnew) * dzsnSV(ikl, isn + isnnew) + ro__SV(ikl, isn + isnnew) = (1 - isnnew) * ro__SV(ikl, isn + isnnew) + eta_SV(ikl, isn + isnnew) = (1 - isnnew) * eta_SV(ikl, isn + isnnew) + G1snSV(ikl, isn + isnnew) = (1 - isnnew) * G1snSV(ikl, isn + isnnew) + G2snSV(ikl, isn + isnnew) = (1 - isnnew) * G2snSV(ikl, isn + isnnew) + enddo + isnoSV(ikl) = isnoSV(ikl) - isnUpD ! Nb of Snow Layer + ! Nb of SuperI Layer + ispiSV(ikl) = ispiSV(ikl) & + ! Update if I=0 + - isnUpD * max(0, min(ispiSV(ikl) - isinew, 1)) + + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(wx) + if(isnUpD > 0 .and. ikl == kSV_v1 .and. lSV_v1 == 3) & + write(6, *) ' MERGE ', isnoSV(ikl), ' Grid ', iSV_v1, jSV_v1, nSV_v1 +#endif + + enddo + if(isnitr > 0) go to 1000 + + ! +--New upper Limit of the non erodible Snow (istoSV .GT. 1) + ! + ======================================== + + do ikl = 1, klonv + nh = 0 + !XF + do isn = isnoSV(ikl), 1, -1 + nh = nh + isn * min(istoSV(ikl, isn) - 1, 1) * max(0, 1 - nh) + enddo + zc = 0. + zt = 0. + !XF + do isn = 1, isnoSV(ikl) + zc = zc + dzsnSV(ikl, isn) * ro__SV(ikl, isn) & + * max(0, min(1, nh + 1 - isn)) + zt = zt + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + zWE_SV(ikl) = zt + zWEcSV(ikl) = min(zWEcSV(ikl), zt) + zWEcSV(ikl) = max(zWEcSV(ikl), zc) + enddo + + ! +--Energy Budget (OUT) + ! + =================== + +#if(vm) + do ikl = 1, klonv + EqSn01(ikl) = -EqSn_0(ikl) & + - EExcsv(ikl) + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + EqSn01(ikl) = EqSn01(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * (Cn_dSV * (TsisSV(ikl, isn) - TfSnow) & + - Lf_H2O * (1.-eta_SV(ikl, isn))) + enddo + enddo +#endif + + ! +--"Negative Heat" from supercooled rain + ! + ------------------------------------ + + do ikl = 1, klonv + EExcsv(ikl) = EExcsv(ikl) + EExdum(ikl) + + ! +--Surficial Water Run OFF + ! + ----------------------- + + rusnew = rusnSV(ikl) * SWf_SV(ikl) + + if(isnoSV(ikl) <= 1) rusnew = 0. + if(ivgtSV(ikl) >= 1) rusnew = 0. + +#if(EU) + rusnew = 0. +#endif +#if(AC) + rusnew = 0. +#endif + RnofSV(ikl) = RnofSV(ikl) + (rusnSV(ikl) - rusnew) / dt__SV + RuofSV(ikl, 2) = RuofSV(ikl, 2) + (rusnSV0(ikl)) / dt__SV + rusnSV(ikl) = rusnew + enddo + + ! +--Percolation down the Continental Ice Pack + ! + ----------------------------------------- + + ! do ikl = 1, klonv + ! drr_SV(ikl) = drr_SV(ikl) + & + ! rusnSV(ikl) * (1 - min(1, ispiSV(ikl))) / dt__SV + ! rusnSV(ikl) = rusnSV(ikl) * min(1, ispiSV(ikl)) + ! end do + + !XF removal of too thin snowlayers if TT> 275.15 + bug if TT>> 273.15 + do ikl = 1, klonv + zt = 0. + do isn = 1, isnoSV(ikl) + zt = zt + dzsnSV(ikl, isn) + enddo + if(zt < 0.005 + (TaT_SV(ikl) - 275.15) / 1000. .and. & + isnoSV(ikl) > 0 .and. & + TaT_SV(ikl) >= 275.15 .and. & + istoSV(ikl, isnoSV(ikl)) > 1) then + do isn = 1, isnoSV(ikl) + drr_SV(ikl) = drr_SV(ikl) & + + dzsnSV(ikl, isn) * ro__SV(ikl, isn) / dt__SV + dzsnSV(ikl, isn) = 0. + enddo + isnoSV(ikl) = 0 + endif + enddo + + ! +--Slush Formation (CAUTION: ADD RunOff Possibility before Activation) + ! + --------------- ^^^^^^^ ^^^ + +#if(vu) + if(.not. su_opn) then + su_opn = .true. + open(unit=44, status='unknown', file='SISVAT_qSn.vu') + rewind 44 + endif + write(44, 440) daHost +440 format('iSupI i dz ro eta', & + ' PorVol zSlush ro_n eta_n', 2x, a18) +#endif + + ! #if(SU) + ! do ikl = 1, klonv + ! do isn = 1, isnoSV(ikl) + ! kSlush = min(1, max(0, isn + 1 - ispiSV(ikl))) ! Slush Switch + ! ! +--Available Additional Pore Volume [-] + ! ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! ! [--] + ! PorVol = 1. - ro__SV(ikl, isn) & + ! * (1. - eta_SV(ikl, isn)) / ro_Ice & + ! - eta_SV(ikl, isn) & + ! * ro__SV(ikl, isn) / ro_Wat + ! PorVol = max(PorVol, zero) + ! ! [mm] OR [kg/m2] + ! ! 0 <=> freezing + ! ! 1 <=> isn=isnoSV + ! zWater = dzsnSV(ikl, isn) * PorVol * 1000. & + ! * (1. - SWS_SV(ikl) & + ! * (1 - min(1, iabs(isn - isnoSV(ikl))))) + ! ! [mm] OR [kg/m2] + ! zSlush = min(rusnSV(ikl), zWater) + ! ro_new = (dzsnSV(ikl, isn) * ro__SV(ikl, isn) & + ! + zSlush) & + ! / max(dzsnSV(ikl, isn), epsi) + ! if(ro_new<ro_Ice + 20) then ! MAX 940kg/m3 + ! ! [mm] OR [kg/m2] + ! rusnSV(ikl) = rusnSV(ikl) - zSlush + ! rusnSV0(ikl) = rusnSV0(ikl) - zSlush + ! RuofSV(ikl, 2) = max(0., RuofSV(ikl, 2) - zSlush / dt__SV) + ! eta_SV(ikl, isn) = (ro_new - ro__SV(ikl, isn) & + ! * (1. - eta_SV(ikl, isn))) & + ! / max (ro_new, epsi) + ! ro__SV(ikl, isn) = ro_new + ! end if + ! end do + ! end do + ! #endif + + ! +--Mass conservation + ! + ================= + do ikl = 1, klonv + RuofSV(ikl, 3) = RuofSV(ikl, 3) + drr_SV(ikl) + drr2(ikl) = drr_SV(ikl) * dt__SV + rusnSV0(ikl) + do isn = 1, isnoSV(ikl) + sum2(ikl) = sum2(ikl) + dzsnSV(ikl, isn) * ro__SV(ikl, isn) + enddo + sum1(ikl) = sum1(ikl) + (drr1(ikl) - drr2(ikl)) + isn = 1 + if(isnoSV(ikl) > 1) then + dzsnSV(ikl, isn) = dzsnSV(ikl, isn) + (sum1(ikl) - sum2(ikl)) / ro__SV(ikl, isn) + endif + enddo + + ! +--Impact of the Sublimation/Deposition on the Surface Mass Balance + ! + ================================================================ + + do ikl = 1, klonv + isn = isnoSV(ikl) + dzVap0 = dt__SV * HLs_sv(ikl) * min(isn, 1) & + / (Lx_H2O(ikl) * max(ro__SV(ikl, isn), epsi)) + NOLayr = min(zero, sign(unun, dzsnSV(ikl, isn) + dzVap0)) + dzVap1 = min(zero, dzsnSV(ikl, isn) + dzVap0) + + ! +--Additional Energy + ! + ----------------- + +#if(VH) + ! Water Vapor Sensible Heat + AdEnrg = dzVap0 * ro__SV(ikl, isnoSV(ikl)) & + * C__Wat * (TsisSV(ikl, isnoSV(ikl)) - TfSnow) +#endif + +#if(aH) + B_Enrg = (Cn_dSV * (TsisSV(ikl, isn) - TfSnow) & + - Lf_H2O * (1.-eta_SV(ikl, isn))) & + / (1.+dzVap0 / max(epsi, dzsnSV(ikl, isn))) + eta_SV(ikl, isn) = & + max(zero, unun + (B_Enrg & + - (TsisSV(ikl, isn) - TfSnow) * Cn_dSV) & + / Lf_H2O) + TsisSV(ikl, isn) = (B_Enrg & + + (1.-eta_SV(ikl, isn)) & + * Lf_H2O) & + / Cn_dSV & + + TfSnow +#endif + +#if(e1) + STOP "PLEASE add Energy (#aH) from deposition/sublimation" +#endif + ! +--Update of the upper Snow layer Thickness + ! + ---------------------------------------- + dzsnSV(ikl, isn) = max(zero, dzsnSV(ikl, isnoSV(ikl)) + dzVap0) + isnoSV(ikl) = isnoSV(ikl) + NOLayr + isn = isnoSV(ikl) + dzsnSV(ikl, isn) = dzsnSV(ikl, isn) + dzVap1 + wee_SV(ikl, 3) = wee_SV(ikl, 3) - ro__SV(ikl, isn) * dzVap0 + enddo + +#if(vm) + ! +--Energy Budget (OUT) + ! + =================== + do ikl = 1, klonv + EqSn02(ikl) = -EqSn_0(ikl) - EExcsv(ikl) + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + EqSn02(ikl) = EqSn01(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * (Cn_dSV * (TsisSV(ikl, isn) - TfSnow) & + - Lf_H2O * (1.-eta_SV(ikl, isn))) + enddo + enddo +#endif + +#if(m1) + ! +--Snow/I Budget + ! + ------------- + do ikl = 1, klonv + SIsubl(ikl) = dt__SV * HLs_sv(ikl) * min(isnoSV(ikl), 1) & + / Lx_H2O(ikl) + SIrnof(ikl) = rusnSV(ikl) + RnofSV(ikl) * dt__SV & + - SIrnof(ikl) + enddo +#endif + + ! +--Anticipated Disappearance of a rapidly Melting too thin Last Snow Layer + ! + ======================================================================= + do ikl = 1, klonv + LastOK = min(1, max(0, iiceSV(ikl) - isnoSV(ikl) + 2) & + * min(1, isnoSV(ikl) - iiceSV(ikl)) & + + min(1, isnoSV(ikl))) + RapdOK = max(zero, sign(unun, dzMelt(ikl) - epsi)) + ThinOK = max(zero, sign(unun, dz_Min - dzsnSV(ikl, 1))) + z_Melt = LastOK * RapdOK * ThinOK + noSnow(ikl) = noSnow(ikl) + z_Melt + z_Melt = z_Melt * dzsnSV(ikl, 1) + dzsnSV(ikl, 1) = dzsnSV(ikl, 1) - z_Melt + EExcsv(ikl) = EExcsv(ikl) - z_Melt * ro__SV(ikl, 1) & + * (1.-eta_SV(ikl, 1)) * Lf_H2O + + ! +--Water Production + ! + ^^^^^^^^^^^^^^^^^ + drr_SV(ikl) = drr_SV(ikl) + ro__SV(ikl, 1) * z_Melt / dt__SV + enddo + + ! +--Update Nb of Layers + ! + =================== +#if(EF) + if(isnoSV(1) > 0) & + write(6, 6005) noSnow(1) +6005 format(i3, ' (noSnow) ') +#endif + do ikl = 1, klonv + isnoSV(ikl) = isnoSV(ikl) * min(1, iabs(isnoSV(ikl) - noSnow(ikl))) + enddo + +#if(e1) + ! Energy Budget (OUT) + ! =================== + do ikl = 1, klonv + EqSn_1(ikl) = 0. + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + EqSn_1(ikl) = EqSn_1(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * (Cn_dSV * (TsisSV(ikl, isn) - TfSnow) & + - Lf_H2O * (1.-eta_SV(ikl, isn))) + enddo + enddo +#endif + +#if(vm) + ! +--Water Budget (OUT) + ! + =================== + do ikl = 1, klonv + WqSn_0(ikl) = WqSn_0(ikl) & + + HLs_sv(ikl) * dt__SV & + * min(isnoSV(ikl), 1) / Lx_H2O(ikl) + WqSn_1(ikl) = drr_SV(ikl) * dt__SV & + + rusnSV(ikl) & + + RnofSV(ikl) * dt__SV + enddo + do isn = nsno, 1, -1 + do ikl = 1, klonv + WqSn_1(ikl) = WqSn_1(ikl) & + + ro__SV(ikl, isn) * dzsnSV(ikl, isn) + enddo + enddo + ! +--OUTPUT Budget + ! + ============= + if(.not. emopen) then + emopen = .true. + open(unit=43, status='unknown', file='SISVAT_qSn.vm') + rewind 43 + write(43, 43) +43 format('subroutine SISVAT_qSn: Local Energy and Water Budgets', & + /, '=====================================================') + endif + do ikl = 1, klonv + if(EqSn01(ikl) > 1.e-3) write(43, 431) dahost, EqSn01(ikl) +431 format(' WARNING (1) in _qSn,', a18, & + ': Energy Unbalance in Phase Change = ', e15.6) + enddo + do ikl = 1, klonv + if(EqSn02(ikl) > 1.e-3) write(43, 432) dahost, EqSn01(ikl) +432 format(' WARNING (2) in _qSn,', a18, & + ': Energy Unbalance in Phase Change = ', e15.6) + enddo + timeer = timeer + dt__SV + hourer = 3600.0 + if(mod(no_err, 11) == 0) then + no_err = 1 + write(43, 435) timeer / hourer +435 format(11('-'), '----------+-', 3('-'), '----------+-', & + 3('-'), '----------+-', 3('-'), '----------+-', & + '----------------+----------------+', & + /, f8.2, 3x, 'EqSn_0(1) | ', 3x, 'EqSn_d(1) | ', & + 3x, 'EqSn_1(1) | ', 3x, 'EExcsv(1) | ', & + 'E_0+E_d-E_1-EE | Water Budget |', & + /, 11('-'), '----------+-', 3('-'), '----------+-', & + 3('-'), '----------+-', 3('-'), '----------+-', & + '----------------+----------------+') + endif + if(abs(EqSn_0(1) + EqSn_d(1) - EqSn_1(1) - EExcsv(1)) > epsi .OR. & + abs(WqSn_1(1) - WqSn_0(1)) > epsi) then + no_err = no_err + 1 + write(43, 436) EqSn_0(1), EqSn_d(1) & + , EqSn_1(1), EExcsv(1) & + , EqSn_0(1) + EqSn_d(1) - EqSn_1(1) - EExcsv(1) & + , WqSn_1(1) - WqSn_0(1) +436 format(8x, f12.0, ' + ', f12.0, ' - ', f12.0, ' - ', f12.3, ' = ', f12.3, & + ' | ', f15.9) + endif +#endif +#if(e1) + do ikl = 1, klonv + EqSn_d(ikl) = EqSn_d(ikl) - EExcsv(ikl) + enddo +#endif + + return +endsubroutine SISVAT_qSn diff --git a/MAR/code_mar/sisvat_qso.f90 b/MAR/code_mar/sisvat_qso.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3a97547a6a315dfbbbbf0976bb7db5986e3a16a7 --- /dev/null +++ b/MAR/code_mar/sisvat_qso.f90 @@ -0,0 +1,862 @@ +#include "MAR_pp.def" +subroutine SISVAT_qSo(Wats_0, Wats_1, Wats_d) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_qSo 14-03-2022 MAR | + ! | subroutine SISVAT_qSo computes the Soil Water Balance | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: isnoSV = total Nb of Ice/Snow Layers | + ! | ^^^^^ isotSV = 0,...,11: Soil Type | + ! | 0: Water, Solid or Liquid | + ! | | + ! | INPUT: rhT_SV : SBL Top Air Density [kg/m3] | + ! | ^^^^^ drr_SV : Rain Intensity [kg/m2/s] | + ! | LSdzsv : Vertical Discretization Factor [-] | + ! | = 1. Soil | + ! | = 1000. Ocean | + ! | dt__SV : Time Step [s] | + ! | | + ! | Lx_H2O : Latent Heat of Vaporization/Sublimation [J/kg] | + ! | HLs_sv : Latent Heat Flux [W/m2] | + ! | Rootsv : Root Water Pump [kg/m2/s] | + ! | | + ! | INPUT / eta_SV : Water Content [m3/m3] | + ! | OUTPUT: Khydsv : Soil Hydraulic Conductivity [m/s] | + ! | ^^^^^^ | + ! | | + ! | OUTPUT: RnofSV : RunOFF Intensity [kg/m2/s] | + ! | ^^^^^^ Wats_0 : Soil Water, before Forcing [mm] | + ! | Wats_1 : Soil Water, after Forcing [mm] | + ! | Wats_d : Soil Water Forcing [mm] | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | z_Bump : (Partly)Bumpy Layers Height [m] | + ! | z0Bump : Bumpy Layers Height [m] | + ! | dzBump : Lowest Bumpy Layer: [m] | + ! | etBump : Bumps Layer Averaged Humidity [m3/m3] | + ! | etaMid : Layer Interface's Humidity [m3/m3] | + ! | eta__f : Layer Humidity (Water Front)[m3/m3] | + ! | Dhyd_f : Soil Hydraulic Diffusivity (Water Front) [m2/s] | + ! | Dhydif : Soil Hydraulic Diffusivity [m2/s] | + ! | WgFlow : Water gravitational Flux [kg/m2/s] | + ! | Wg_MAX : Water MAXIMUM gravitational Flux [kg/m2/s] | + ! | SatRat : Water Saturation Flux [kg/m2/s] | + ! | WExces : Water Saturation Excess Flux [kg/m2/s] | + ! | Dhydtz : Dhydif * dt / dz [m] | + ! | FreeDr : Free Drainage Fraction [-] | + ! | Elem_A : A Diagonal Coefficient | + ! | Elem_C : C Diagonal Coefficient | + ! | Diag_A : A Diagonal | + ! | Diag_B : B Diagonal | + ! | Diag_C : C Diagonal | + ! | Term_D : Independant Term | + ! | Aux__P : P Auxiliary Variable | + ! | Aux__Q : Q Auxiliary Variable | + ! | | + ! | TUNING PARAMETER: | + ! | ^^^^^^^^^^^^^^^^ | + ! | z0soil : Soil Surface averaged Bumps Height [m] | + ! | | + ! | METHOD: NO Skin Surface Humidity | + ! | ^^^^^^ Semi-Implicit Crank Nicholson Scheme | + ! | (Partial) free Drainage, Water Bodies excepted (Lakes, Sea) | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | # #m0: Water Budget Verification | + ! | # #m1: Snow/I Budget Verification | + ! | | + ! | # OPTIONS: #GF: Saturation Front | + ! | # ^^^^^^^ #GH: Saturation Front allows Horton Runoff | + ! | # #GA: Soil Humidity Geometric Average | + ! | # #BP: Parameterization of Terrain Bumps | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_qSo.vw | #vw: OUTPUT/Verif+Detail: H2O Conservation | + ! | | unit 42, subroutine SISVAT_qSo **ONLY** | + ! +------------------------------------------------------------------------+ + + use marphy + use marctr + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + + implicit none + + ! +--OUTPUT + ! + ------ + + ! Water (Mass) Budget + ! ~~~~~~~~~~~~~~~~~~~ + real Wats_0(klonv) ! Soil Water, before forcing + real Wats_1(klonv) ! Soil Water, after forcing + real Wats_d(klonv) ! Soil Water forcing + + ! +--Internal Variables + ! + ================== + + integer isl, jsl, ist, ikl + integer ikm, ikp, ik0, ik1 + ! ist__s, ist__w : Soil/Water Body Identifier + integer ist__s, ist__w +#if(BP) + ! z0soil : Soil Surface Bumps Height [m] + real z0soil + data z0soil/0.020/ + ! z_Bump : (Partly) Bumpy Layers Height [m] + real z_Bump + ! z0Bump : Bumpy Layers Height [m] + real z0Bump + ! dzBump : Lowest Bumpy Layer: + real dzBump + ! etBump : Bumps Layer Averaged Humidity + real etBump(klonv) +#endif + ! etaMid : Layer Interface's Humidity + real etaMid + ! Dhydif : Hydraulic Diffusivity [m2/s] + real Dhydif + ! eta__f : Water Front Soil Water Content + real eta__f + ! Khyd_f : Water Front Hydraulic Conduct. + real Khyd_f + ! Khydav : Hydraulic Conductivity [m/s] + real Khydav + ! WgFlow : Water gravitat. Flux [kg/m2/s] + real WgFlow + ! Wg_MAX : Water MAX.grav. Flux [kg/m2/s] + real Wg_MAX + ! SatRat : Saturation Flux [kg/m2/s] + real SatRat + ! WExces : Saturat. Excess Flux [kg/m2/s] + real WExces + ! SoRnOF, SoRnOF2 : Soil Run OFF + real SoRnOF(klonv), SoRnOF2(klonv) + ! Dhydtz : Dhydif * dt / dz [m] + real Dhydtz(klonv, -nsol:0) + ! Elem_A, Elem_B, Elem_C : Diagonal Coefficients + real Elem_A, Elem_B, Elem_C + ! Diag_A : A Diagonal + real Diag_A(klonv, -nsol:0) + ! Diag_B : B Diagonal + real Diag_B(klonv, -nsol:0) + ! Diag_C : C Diagonal + real Diag_C(klonv, -nsol:0) + ! Term_D : Independant Term + real Term_D(klonv, -nsol:0) + ! Aux__P : P Auxiliary Variable + real Aux__P(klonv, -nsol:0) + ! Aux__Q : Q Auxiliary Variable + real Aux__Q(klonv, -nsol:0) + ! etaaux : Soil Water Content [m3/m3] + real etaaux(klonv, -nsol:-nsol + 1) + ! FreeDr : Free Drainage Fraction (actual) + real FreeDr + ! FreeD0 : Free Drainage Fraction (1=Full) + real FreeD0 + ! aKdtSV3 : Khyd=a*eta+b: a * dt + real aKdtSV3(0:nsot, 0:nkhy) + ! bKdtSV3 : Khyd=a*eta+b: b * dt + real bKdtSV3(0:nsot, 0:nkhy) + real sum1(klonv), sum2(klonv) + +#if(mw) + ! Water (Mass) Budget + ! ~~~~~~~~~~~~~~~~~~~ + ! mwopen : IO Switch + logical mwopen + common / Sm_qSo_L / mwopen + real hourwr, timewr + common / Sm_qSo_R / timewr + real Evapor(klonv) +#endif + + ! +--Internal DATA + ! + ============= + ! FreeD0 : Free Drainage Fraction (1=Full) + data FreeD0/1.000/ + + aKdtSV3 = aKdtSV2 * dt__SV + bKdtSV3 = bKdtSV2 * dt__SV +#if(m0) + ! Water Budget (IN) + ! ================== + do ikl = 1, klonv + ! OLD RunOFF Contrib. + Wats_0(ikl) = 0. + ! Water Surface Forc. + Wats_d(ikl) = drr_SV(ikl) + enddo + isl = -nsol + do ikl = 1, klonv + Wats_0(ikl) = Wats_0(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz78SV(isl) & + + eta_SV(ikl, isl + 1) * dz_8SV(isl)) * LSdzsv(ikl) + enddo + do isl = -nsol + 1, -1 + do ikl = 1, klonv + Wats_0(ikl) = Wats_0(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz34SV(isl) & + + (eta_SV(ikl, isl - 1) & + + eta_SV(ikl, isl + 1)) * dz_8SV(isl)) * LSdzsv(ikl) + enddo + enddo + isl = 0 + do ikl = 1, klonv + Wats_0(ikl) = Wats_0(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz78SV(isl) & + + eta_SV(ikl, isl - 1) * dz_8SV(isl)) * LSdzsv(ikl) + enddo +#else + Wats_0 = 0. + Wats_1 = 0. + Wats_d = 0. +#endif + + ! +--Gravitational Flow + ! + ================== + + ! +... METHOD: Surface Water Flux saturates successively the soil layers + ! + ^^^^^^ from up to below, but is limited by infiltration capacity. + ! + Hydraulic Conductivity again contributes after this step, + ! + not redundantly because of a constant (saturated) profile. + + ! +--Flux Limitor + ! + ^^^^^^^^^^^^^ + isl = 0 + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! 1 => Soil + ist__s = min(ist, 1) + ! 1 => Water Body + ist__w = 1 - ist__s + ! Hydraulic Diffusivity DR97, Eqn.(3.36) + Dhydif = s1__SV(ist) & + * max(epsi, eta_SV(ikl, isl)) & + **(bCHdSV(ist) + 2.) + ! Water Bodies + Dhydif = ist__s * Dhydif & + + ist__w * vK_dSV + ! DR97 Assumption Water Bodies + Khydav = ist__s * Ks_dSV(ist) & + + ist__w * vK_dSV + ! + + ! MAXimum Infiltration Rate + Wg_MAX = ro_Wat * Dhydif & + * (etadSV(ist) - eta_SV(ikl, isl)) & + / (dzAvSV(isl) * LSdzsv(ikl)) & + + ro_Wat * Khydav + + ! +--Surface Horton RunOFF + ! + ^^^^^^^^^^^^^^^^^^^^^ + if(ivgtSV(ikl) >= 0 .and. ivgtSV(ikl) <= 6) then ! crop/grass + Wg_MAX = max(Wg_MAX, 0.10 * drr_SV(ikl)) + endif + + if(ivgtSV(ikl) >= 7 .and. ivgtSV(ikl) <= 12) then ! forest + Wg_MAX = max(Wg_MAX, 0.05 * drr_SV(ikl)) + endif + + if(ivgtSV(ikl) == 13) then ! city + Wg_MAX = max(Wg_MAX, 0.5 * drr_SV(ikl)) + endif + SoRnOF(ikl) = max(zero, drr_SV(ikl) - Wg_MAX) + RuofSV(ikl, 4) = RuofSV(ikl, 4) + SoRnOF(ikl) + drr_SV(ikl) = drr_SV(ikl) - SoRnOF(ikl) + SoRnOF2(ikl) = 0. + enddo +#if(GF) + do isl = 0, -nsol, -1 + do ikl = 1, klonv + ist = isotSV(ikl) ! Soil Type + ist__s = min(ist, 1) ! 1 => Soil + ist__w = 1 - ist__s ! 1 => Water Body + ! +--Water Diffusion + ! + ^^^^^^^^^^^^^^^ + ! Hydraulic Diffusivity DR97, Eqn.(3.36) + Dhydif = s1__SV(ist) & + * max(epsi, eta_SV(ikl, isl)) & + **(bCHdSV(ist) + 2.) + ! Water Bodies + Dhydif = ist__s * Dhydif & + + ist__w * vK_dSV + ! +--Water Conduction (without Horton Runoff) + ! + ^^^^^^^^^^^^^^^^ + Khyd_f = Ks_dSV(ist) + ! +... Uses saturated K ==> Horton Runoff ~0 ! +#if(GH) + ! +--Water Conduction (with Horton Runoff) + ! + ^^^^^^^^^^^^^^^^ + ik0 = nkhy * eta_SV(ikl, isl) & + / etadSV(ist) + eta__f = 1. & + -aKdtSV3(ist, ik0) / (2.*dzAvSV(isl) & + * LSdzsv(ikl)) + eta__f = max(eps_21, eta__f) + eta__f = min(etadSV(ist), & + eta_SV(ikl, isl) + & + (aKdtSV3(ist, ik0) * eta_SV(ikl, isl) & + + bKdtSV3(ist, ik0)) / (dzAvSV(isl) & + * LSdzsv(ikl)) & + / eta__f) + eta__f = .5 * (eta_SV(ikl, isl) & + + eta__f) +#if(gh) + eta__f = eta_SV(ikl, isl) +#endif + ik0 = nkhy * eta__f & + / etadSV(ist) + Khyd_f = & + (aKdtSV3(ist, ik0) * eta__f & + + bKdtSV3(ist, ik0)) / dt__SV +#endif + ! DR97 Assumption Water Bodies + Khydav = ist__s * Khyd_f & + + ist__w * vK_dSV + ! +--Gravitational Flow + ! + ^^^^^^^^^^^^^^^^^^ + ! MAXimum Infiltration Rate + Wg_MAX = & + ro_Wat * Dhydif & + * (etadSV(ist) - eta_SV(ikl, isl)) & + / (dzAvSV(isl) * LSdzsv(ikl)) & + + ro_Wat * Khydav +#if(WR) + write(6, 6001) isl, drr_SV(ikl) * 3.6e3, Wg_MAX * 3.6e3 +6001 format(i3, ' vRain ,Wg_MAX ', 2e12.3, ' mm/hr') +#endif + ! Infiltration Rate + WgFlow = min(Wg_MAX, drr_SV(ikl)) + ! Water Excess => RunOff + WExces = max(zero, drr_SV(ikl) - WgFlow) +#if(WR) + write(6, 6002) WgFlow * 3.6e3, WExces * 3.6e3 +6002 format(3x, ' WgFlow,WExces ', 2e12.3, ' mm/hr') +#endif + SoRnOF(ikl) = SoRnOF(ikl) + WExces + drr_SV(ikl) = WgFlow +#if(WR) + write(6, 6003) SoRnOF(ikl) * 3.6e3, drr_SV(ikl) * 3.6e3 +6003 format(3x, ' SoRnOF,drr_SV ', 2e12.3, ' mm/hr') +#endif + ! Saturation Rate + SatRat = (etadSV(ist) - eta_SV(ikl, isl)) & + * ro_Wat * dzAvSV(isl) & + * LSdzsv(ikl) / dt__SV + SatRat = min(SatRat, drr_SV(ikl)) + ! Water Flux for Below + drr_SV(ikl) = drr_SV(ikl) - SatRat +#if(WR) + write(6, 6004) SatRat * 3.6e3, drr_SV(ikl) * 3.6e3 +6004 format(3x, ' SatRat,drr_SV ', 2e12.3, ' mm/hr') +#endif +#if(WR) + write(6, 6005) eta_SV(ikl, isl) * 1.e3 +#endif + ! Saturation + eta_SV(ikl, isl) = eta_SV(ikl, isl) & + + SatRat * dt__SV & + / (ro_Wat * dzAvSV(isl) & + * LSdzsv(ikl)) +#if(WR) + write(6, 6005) eta_SV(ikl, isl) * 1.e3 +6005 format(3x, ' eta_SV, ', e12.3, ' g/kg') +#endif + enddo + enddo + do ikl = 1, klonv + ! RunOFF Intensity [kg/m2/s] + SoRnOF(ikl) = SoRnOF(ikl) & + + drr_SV(ikl) + ! +!!! Inclure la possibilite de creer une mare sur un bedrock impermeable + drr_SV(ikl) = 0. + enddo +#endif + + ! +--Temperature Correction due to a changed Soil Energy Content + ! + =========================================================== + + ! +!!! Mettre en oeuvre le couplage humidit?-?nergie + + ! +--Full Resolution of the Richard's Equation + ! + ========================================= + + ! +... METHOD: Water content evolution results from water fluxes + ! + ^^^^^^ at the layer boundaries + ! + Conductivity is approximated by a piecewise linear profile. + ! + Semi-Implicit Crank-Nicholson scheme is used. + ! + (Bruen, 1997, Sensitivity of hydrological processes + ! + at the land-atmosphere interface. + ! + Proc. Royal Irish Academy, IGBP symposium + ! + on global change and the Irish Environment. + ! + Publ.: Maynooth) + ! + - - - - - - - - isl+1/2 - - ^ + ! + | + ! + eta_SV(isl) --------------- isl ----- +--dz_dSV(isl) ^ + ! + | | + ! + Dhydtz(isl) etaMid - - - - - - - - isl-1/2 - - v dzmiSV(isl)--+ + ! + | + ! + eta_SV(isl-1) --------------- isl-1 ----- v + + ! +--Transfert Coefficients + ! + ---------------------------- + + do isl = -nsol + 1, 0 + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! 1 => Soil + ist__s = min(ist, 1) + ! 1 => Water Body + ist__w = 1 - ist__s + ! eta at layers interface LSdzsv implicit + etaMid = (dz_dSV(isl) * eta_SV(ikl, isl - 1) & + + dz_dSV(isl - 1) * eta_SV(ikl, isl)) & + / (2.0 * dzmiSV(isl)) +#if(GA) + ! Idem, geometric average (Vauclin&al.1979) + etaMid = sqrt(dz_dSV(isl) * eta_SV(ikl, isl - 1) & + * dz_dSV(isl - 1) * eta_SV(ikl, isl)) & + / (2.0 * dzmiSV(isl)) +#endif + ! Hydraul.Diffusi. DR97, Eqn.(3.36) + Dhydif = s1__SV(ist) & + * (etaMid**(bCHdSV(ist) + 2.)) + Dhydtz(ikl, isl) = Dhydif * dt__SV & + / (dzmiSV(isl) & + * LSdzsv(ikl)) + ! Soil Water bodies + Dhydtz(ikl, isl) = Dhydtz(ikl, isl) * ist__s & + + 0.5 * dzmiSV(isl) * LSdzsv(ikl) * ist__w + + enddo + enddo + isl = -nsol + do ikl = 1, klonv + Dhydtz(ikl, isl) = 0.0 ! + enddo + + ! +--Tridiagonal Elimination: Set Up + ! + ------------------------------- + + ! +--Soil/Snow Interior + ! + ^^^^^^^^^^^^^^^^^^ + + sum1 = 0 + do isl = 0, -nsol, -1 + do ikl = 1, klonv + eta_SV(ikl, isl) = max(epsi, eta_SV(ikl, isl)) + sum1(ikl) = sum1(ikl) + eta_SV(ikl, isl) * dzAvSV(isl) + ! -dt__SV *Rootsv(ikl,isl) + ! /(ro_Wat *LSdzsv(ikl)) + enddo + enddo + + do ikl = 1, klonv + ! rainfall + sum1(ikl) = sum1(ikl) + dt__SV * drr_SV(ikl) / (ro_Wat * LSdzsv(ikl)) + ! subli/evapo from soil + sum1(ikl) = sum1(ikl) + dt__SV * HLs_sv(ikl) * (1 - min(1, isnoSV(ikl))) & + / (Lx_H2O(ikl) * ro_Wat * LSdzsv(ikl)) + ! evapotranspiration + sum1(ikl) = sum1(ikl) - dt__SV * EvT_SV(ikl) / (ro_Wat * LSdzsv(ikl)) + if(isnoSV(ikl) == 0) then + wee_SV(ikl, 4) = wee_SV(ikl, 4) - dt__SV * HLs_sv(ikl) / Lx_H2O(ikl) + endif + enddo + + do isl = -nsol, -nsol + 1 + do ikl = 1, klonv + etaaux(ikl, isl) = eta_SV(ikl, isl) + enddo + enddo + + do isl = -nsol + 1, -1 + do ikl = 1, klonv + ist = isotSV(ikl) + ikm = nkhy * eta_SV(ikl, isl - 1) / etadSV(ist) + ik0 = nkhy * eta_SV(ikl, isl) / etadSV(ist) + ikp = nkhy * eta_SV(ikl, isl + 1) / etadSV(ist) + if(ikm < 0 .or. ik0 < 0 .or. ikp < 0) then + call time_steps + print *, "CRASH1 in sisvat_qso.f on pixel (i,j,n)", & + ii__SV(ikl), jj__SV(ikl), nn__SV(ikl) + print *, "decrease your time step or increase ntphys "// & + "and ntdiff in time_steps.f90" + stop + endif + + Elem_A = Dhydtz(ikl, isl) & + - aKdtSV3(ist, ikm) * dziiSV(isl) * LSdzsv(ikl) + Elem_B = -(Dhydtz(ikl, isl) & + + Dhydtz(ikl, isl + 1) & + - aKdtSV3(ist, ik0) * (dziiSV(isl + 1) & + - dzi_SV(isl)) * LSdzsv(ikl)) + Elem_C = Dhydtz(ikl, isl + 1) & + + aKdtSV3(ist, ikp) * dzi_SV(isl + 1) * LSdzsv(ikl) + Diag_A(ikl, isl) = dz_8SV(isl) * LSdzsv(ikl) & + - Implic * Elem_A + Diag_B(ikl, isl) = dz34SV(isl) * LSdzsv(ikl) & + - Implic * Elem_B + Diag_C(ikl, isl) = dz_8SV(isl) * LSdzsv(ikl) & + - Implic * Elem_C + + Term_D(ikl, isl) = (dz_8SV(isl) * LSdzsv(ikl) & + + Explic * Elem_A) * eta_SV(ikl, isl - 1) & + + (dz34SV(isl) * LSdzsv(ikl) & + + Explic * Elem_B) * eta_SV(ikl, isl) & + + (dz_8SV(isl) * LSdzsv(ikl) & + + Explic * Elem_C) * eta_SV(ikl, isl + 1) & + + (bKdtSV3(ist, ikp) * dzi_SV(isl + 1) & + + bKdtSV3(ist, ik0) * (dziiSV(isl + 1) & + - dzi_SV(isl)) & + - bKdtSV3(ist, ikm) * dziiSV(isl)) & + * LSdzsv(ikl) & + - dt__SV * Rootsv(ikl, isl) / ro_Wat + enddo + enddo + + isl = -nsol + do ikl = 1, klonv + ist = isotSV(ikl) + ! FreeDr = FreeD0 * min(ist,1) + FreeDr = iWaFSV(ikl) * min(ist, 1) + ik0 = nkhy * eta_SV(ikl, isl) / etadSV(ist) + ikp = nkhy * eta_SV(ikl, isl + 1) / etadSV(ist) + + if(ik0 < 0 .or. ikp < 0) then + print *, "CRASH2 in sisvat_qso.f on pixel (i,j,n)", & + ii__SV(ikl), jj__SV(ikl), nn__SV(ikl) + print *, "decrease your time step or increase ntphys "// & + "and ntdiff in time_steps.f" + stop + endif + + Elem_A = 0. + Elem_B = -(Dhydtz(ikl, isl + 1) & + - aKdtSV3(ist, ik0) * (dziiSV(isl + 1) * LSdzsv(ikl) & + - FreeDr)) + Elem_C = Dhydtz(ikl, isl + 1) & + + aKdtSV3(ist, ikp) * dzi_SV(isl + 1) * LSdzsv(ikl) + Diag_A(ikl, isl) = 0. + Diag_B(ikl, isl) = dz78SV(isl) * LSdzsv(ikl) & + - Implic * Elem_B + Diag_C(ikl, isl) = dz_8SV(isl) * LSdzsv(ikl) & + - Implic * Elem_C + + Term_D(ikl, isl) = (dz78SV(isl) * LSdzsv(ikl) & + + Explic * Elem_B) * eta_SV(ikl, isl) & + + (dz_8SV(isl) * LSdzsv(ikl) & + + Explic * Elem_C) * eta_SV(ikl, isl + 1) & + + (bKdtSV3(ist, ikp) * dzi_SV(isl + 1) * LSdzsv(ikl) & + + bKdtSV3(ist, ik0) * (dziiSV(isl + 1) * LSdzsv(ikl) & + - FreeDr)) & + - dt__SV * Rootsv(ikl, isl) / ro_Wat + enddo + + isl = 0 + do ikl = 1, klonv + ist = isotSV(ikl) + ikm = nkhy * eta_SV(ikl, isl - 1) / etadSV(ist) + ik0 = nkhy * eta_SV(ikl, isl) / etadSV(ist) + Elem_A = Dhydtz(ikl, isl) & + - aKdtSV3(ist, ikm) * dziiSV(isl) * LSdzsv(ikl) + Elem_B = -(Dhydtz(ikl, isl) & + + aKdtSV3(ist, ik0) * dzi_SV(isl) * LSdzsv(ikl)) + Elem_C = 0. + Diag_A(ikl, isl) = dz_8SV(isl) * LSdzsv(ikl) & + - Implic * Elem_A + Diag_B(ikl, isl) = dz78SV(isl) * LSdzsv(ikl) & + - Implic * Elem_B + Diag_C(ikl, isl) = 0. + ! + + Term_D(ikl, isl) = (dz_8SV(isl) * LSdzsv(ikl) & + + Explic * Elem_A) * eta_SV(ikl, isl - 1) & + + (dz78SV(isl) * LSdzsv(ikl) & + + Explic * Elem_B) * eta_SV(ikl, isl) & + - (bKdtSV3(ist, ik0) * dzi_SV(isl) & + + bKdtSV3(ist, ikm) * dziiSV(isl)) * LSdzsv(ikl) & + + dt__SV * (HLs_sv(ikl) * 1.*(1 - min(1, isnoSV(ikl))) & + / (ro_Wat * dz_dSV(0) * Lx_H2O(ikl)) & + + drr_SV(ikl) & + - Rootsv(ikl, isl)) / ro_Wat + enddo + + do ikl = 1, klonv + drr_SV(ikl) = 0. ! drr is included in the 1st soil layer + enddo + + ! + + ! + + ! +--Tridiagonal Elimination + ! + ======================= + ! + + ! +--Forward Sweep + ! + ^^^^^^^^^^^^^^ + do ikl = 1, klonv + Aux__P(ikl, -nsol) = Diag_B(ikl, -nsol) + Aux__Q(ikl, -nsol) = -Diag_C(ikl, -nsol) / Aux__P(ikl, -nsol) + enddo + ! + + do isl = -nsol + 1, 0 + do ikl = 1, klonv + Aux__P(ikl, isl) = Diag_A(ikl, isl) * Aux__Q(ikl, isl - 1) & + + Diag_B(ikl, isl) + Aux__Q(ikl, isl) = -Diag_C(ikl, isl) / Aux__P(ikl, isl) + enddo + enddo + ! + + do ikl = 1, klonv + eta_SV(ikl, -nsol) = Term_D(ikl, -nsol) / Aux__P(ikl, -nsol) + enddo + ! + + do isl = -nsol + 1, 0 + do ikl = 1, klonv + eta_SV(ikl, isl) = (Term_D(ikl, isl) & + - Diag_A(ikl, isl) * eta_SV(ikl, isl - 1)) & + / Aux__P(ikl, isl) + enddo + enddo + + ! +--Backward Sweep + ! + ^^^^^^^^^^^^^^ + do isl = -1, -nsol, -1 + do ikl = 1, klonv + eta_SV(ikl, isl) = Aux__Q(ikl, isl) * eta_SV(ikl, isl + 1) & + + eta_SV(ikl, isl) + enddo + enddo + + ! +--Horton RunOFF Intensity + ! + ======================= + do isl = 0, -nsol, -1 + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! OverSaturation Rate + SatRat = (eta_SV(ikl, isl) - etadSV(ist)) & + * ro_Wat * dzAvSV(isl) & + * LSdzsv(ikl) & + / dt__SV + SoRnOF(ikl) = SoRnOF(ikl) + max(zero, SatRat) + SoRnOF2(ikl) = SoRnOF2(ikl) + max(zero, SatRat) + RuofSV(ikl, 5) = RuofSV(ikl, 5) + max(zero, SatRat) + eta_SV(ikl, isl) = max(epsi, eta_SV(ikl, isl)) + eta_SV(ikl, isl) = min(eta_SV(ikl, isl), etadSV(ist)) + enddo + enddo + + ! +--IO, for Verification + ! + ~~~~~~~~~~~~~~~~~~~~ + ! #if(WR) + ! write(6, 6010) + ! 6010 format(/, 1x) + ! #endif + ! do isl = 0, -nsol, -1 + ! do ikl = 1, klonv + ! ist = isotSV(ikl) + ! ikp = nkhy * eta_SV(ikl, isl) / etadSV(ist) + ! Khydsv(ikl, isl) = (aKdtSV3(ist, ikp) * eta_SV(ikl, isl)& + ! + bKdtSV3(ist, ikp)) * 2.0 / dt__SV + ! #if(WR) + ! write(6, 6011) ikl, isl, eta_SV(ikl, isl) * 1.e3, & + ! ikp, aKdtSV3(ist, ikp), bKdtSV3(ist, ikp), & + ! Khydsv(ikl, isl) + ! #endif + ! 6011 format(2i3, f8.1, i3, 3e12.3) + ! end do + ! end do + + ! +--Additional RunOFF Intensity + ! + =========================== + do ikl = 1, klonv + ist = isotSV(ikl) + ik0 = nkhy * etaaux(ikl, -nsol) / etadSV(ist) + ! FreeDr = FreeD0 * min(ist,1) + FreeDr = iWaFSV(ikl) * min(ist, 1) + WExces = (aKdtSV3(ist, ik0) * (etaaux(ikl, -nsol) * Explic & + + eta_SV(ikl, -nsol) * Implic) & + + bKdtSV3(ist, ik0)) & + * FreeDr * ro_Wat / dt__SV + + eta_SV(ikl, -nsol) = eta_SV(ikl, -nsol) - WExces * dt__SV & + / (ro_Wat * dzAvSV(-nsol) * LSdzsv(ikl)) + SoRnOF(ikl) = SoRnOF(ikl) + WExces + SoRnOF2(ikl) = SoRnOF2(ikl) + WExces + RuofSV(ikl, 6) = RuofSV(ikl, 6) + WExces + + ! +--Full Run OFF: Update + ! + ~~~~~~~~~~~~~~~~~~~~ + RnofSV(ikl) = RnofSV(ikl) + SoRnOF(ikl) + enddo + + ! +--Mass conservation + ! + ^^^^^^^^^^^^^^^^^ + sum2 = 0 + do ikl = 1, klonv + do isl = 0, -nsol, -1 + eta_SV(ikl, isl) = max(epsi, eta_SV(ikl, isl)) + sum2(ikl) = sum2(ikl) + eta_SV(ikl, isl) * dzAvSV(isl) + enddo + sum2(ikl) = sum2(ikl) + dt__SV * SoRnOF2(ikl) / (ro_Wat * LSdzsv(ikl)) + enddo + + do ikl = 1, klonv + if(isotSV(ikl) > 0) then + do isl = -nsol + 2, -nsol, -1 + eta_SV(ikl, isl) = eta_SV(ikl, isl) + (sum1(ikl) - sum2(ikl)) & + / (3.*dzAvSV(isl)) + eta_SV(ikl, isl) = max(epsi, eta_SV(ikl, isl)) + enddo + endif + enddo + + ! +--Temperature Correction due to a changed Soil Energy Content + ! + =========================================================== + + ! +!!! Mettre en oeuvre le couplage humidit?-?nergie + + ! +--Bumps/Asperites Treatment + ! + ========================= + + ! +--Average over Bump Depth (z0soil) + ! + -------------------------------- +#if(BP) + z_Bump = 0. + do ikl = 1, klonv + etBump(ikl) = 0. + enddo + do isl = 0, -nsol, -1 + z0Bump = z_Bump + z_Bump = z_Bump + dzAvSV(isl) + if(z_Bump < z0soil) then + do ikl = 1, klonv + etBump(ikl) = etBump(ikl) + dzAvSV(isl) * eta_SV(ikl, isl) + enddo + endif + if(z_Bump > z0soil .and. z0Bump < z0soil) then + do ikl = 1, klonv + etBump(ikl) = etBump(ikl) + (z0soil - z0Bump) * eta_SV(ikl, isl) + etBump(ikl) = etBump(ikl) / z0soil + enddo + endif + enddo + ! +--Correction + ! + ---------- + z_Bump = 0. + do isl = 0, -nsol, -1 + z0Bump = z_Bump + z_Bump = z_Bump + dzAvSV(isl) + if(z_Bump < z0soil) then + do ikl = 1, klonv + eta_SV(ikl, isl) = etBump(ikl) + enddo + endif + if(z_Bump > z0soil .and. z0Bump < z0soil) then + dzBump = z_Bump - z0soil + do ikl = 1, klonv + eta_SV(ikl, isl) = (etBump(ikl) * (dzAvSV(isl) - dzBump) & + + eta_SV(ikl, isl) * dzBump) & + / dzAvSV(isl) + enddo + endif + enddo + ! +--Positive Definite + ! + ================= + do isl = 0, -nsol, -1 + do ikl = 1, klonv + eta_SV(ikl, isl) = max(epsi, eta_SV(ikl, isl)) + enddo + enddo +#endif +#if(m0) + ! +--Water Budget (OUT) + ! + =================== + do ikl = 1, klonv + ! Precipitation is already included + Evaporation + Soil RunOFF Contrib. + Wats_d(ikl) = Wats_d(ikl) & + + drr_SV(ikl) * zero & + + HLs_sv(ikl) & + * (1 - min(isnoSV(ikl), 1)) / Lx_H2O(ikl) & + - SoRnOF(ikl) + Wats_1(ikl) = 0. +#if(mw) + Evapor(ikl) = HLs_sv(ikl) * dt__SV & + * (1 - min(isnoSV(ikl), 1)) / Lx_H2O(ikl) +#endif + enddo + do isl = -nsol, 0 + do ikl = 1, klonv + ! Root Extract. + Wats_d(ikl) = Wats_d(ikl) - Rootsv(ikl, isl) + enddo + enddo + do ikl = 1, klonv + Wats_d(ikl) = Wats_d(ikl) * dt__SV ! + enddo + isl = -nsol + do ikl = 1, klonv + Wats_1(ikl) = Wats_1(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz78SV(isl) & + + eta_SV(ikl, isl + 1) * dz_8SV(isl)) * LSdzsv(ikl) + enddo + do isl = -nsol + 1, -1 + do ikl = 1, klonv + Wats_1(ikl) = Wats_1(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz34SV(isl) & + + (eta_SV(ikl, isl - 1) & + + eta_SV(ikl, isl + 1)) * dz_8SV(isl)) * LSdzsv(ikl) + enddo + enddo + isl = 0 + do ikl = 1, klonv + Wats_1(ikl) = Wats_1(ikl) & + + ro_Wat * (eta_SV(ikl, isl) * dz78SV(isl) & + + eta_SV(ikl, isl - 1) * dz_8SV(isl)) * LSdzsv(ikl) + enddo +#endif +#if(mw) + ! +--Water Budget (IO) + ! + ================== + if(.not. mwopen) then + mwopen = .true. + open(unit=42, status='unknown', file='SISVAT_qSo.vw') + rewind 42 + write(42, 42) +42 format('subroutine SISVAT_qSo: Local Water Budget', & + /, '=========================================') + endif + timewr = timewr + dt__SV + hourwr = 3600.0 + if(mod(timewr, hourwr) < epsi) write(42, 420) timewr / hourwr +420 format(11('-'), '----------+--------------+-', & + 3('-'), '----------+--------------+-', & + '----------------+----------------+', & + /, f8.2, 3x, 'Wats_0(1) | Wats_d(1) | ', & + 3x, 'Wats_1(1) | W_0+W_d-W_1 | ', & + ' Soil Run OFF | Soil Evapor. |', & + /, 11('-'), '----------+--------------+-', & + 3('-'), '----------+--------------+-', & + '----------------+----------------+') + write(42, 421) Wats_0(1), Wats_d(1) & + , Wats_1(1) & + , Wats_0(1) + Wats_d(1) - Wats_1(1) & + , SoRnOF(1), Evapor(1) +421 format(8x, f12.6, ' + ', f12.6, ' - ', f12.6, ' = ', f12.6, ' | ', f12.6, & + ' ', f15.6) +#endif + return +end diff --git a/MAR/code_mar/sisvat_qvg.f90 b/MAR/code_mar/sisvat_qvg.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b3816101bd49d4fd4f1b1e7cde699e28cacf047c --- /dev/null +++ b/MAR/code_mar/sisvat_qvg.f90 @@ -0,0 +1,247 @@ +subroutine SISVAT_qVg + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_qVg 22-09-2001 MAR | + ! | subroutine SISVAT_qVg computes the Canopy Water Balance | + ! | including Root Extraction | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: ivgtSV = 0,...,12: Vegetation Type | + ! | ^^^^^ 0: Water, Solid or Liquid | + ! | | + ! | INPUT: rhT_SV : SBL Top Air Density [kg/m3] | + ! | ^^^^^ QaT_SV : SBL Top Specific Humidity [kg/kg] | + ! | | + ! | TvegSV : Canopy Temperature [K] | + ! | rrCaSV : Canopy Water Content [kg/m2] | + ! | rrMxsv : Canopy Maximum Intercepted Rain [kg/m2] | + ! | rah_sv : Aerodynamic Resistance for Heat [s/m] | + ! | EvT_sv : EvapoTranspiration [kg/m2] | + ! | Sigmsv : Canopy Ventilation Factor [-] | + ! | glf_sv : Green Leaf Fraction of NOT fallen Leaves [-] | + ! | LAIesv : Leaf Area Index (effective / transpiration) [-] | + ! | psi_sv : Soil Water Potential [m] | + ! | Khydsv : Soil Hydraulic Conductivity [m/s] | + ! | | + ! | INPUT / psivSV : Leaf Water Potential [m] | + ! | OUTPUT: | + ! | ^^^^^^ | + ! | | + ! | OUTPUT: Rootsv : Root Water Pump [kg/m2/s] | + ! | ^^^^^^ | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | | + ! | REMARK: Water Extraction by roots calibrated by Evapotranspiration | + ! | ^^^^^^ (computed in the Canopy Energy Balance) | + ! | | + ! | # OPTIONS: #KW: Root Water Flow slowed by Soil Hydraulic Conductivity | + ! | # ^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + + implicit none + + ! +--Internal Variables + ! + ================== + ! ikl, isl : Grid Point, Layer Indices + integer ikl, isl + ! nitmax, nit : Iterations Counter + integer nitmax, nit + ! PlantW : Plant Water + real PlantW(klonv) + ! dPdPsi : Plant Water psi Derivative + real dPdPsi(klonv) + ! psidif : Soil-Canopy Water Pot. Differ. + real psidif + ! Root_W : Root Water Flow + real Root_W + ! RootOK : Roots take Water in Soil Layer + real RootOK + ! d_psiv : Canopy Water Increment + real d_psiv + ! dpvMAX : Canopy Water Increment MAX + real dpvMAX + ! BWater : Imbalance of Canopy Water Budg. + real BWater + ! BW_MAX : MAX Imbal.of Canopy Water Budg. + real BW_MAX + ! BW_MIN : MIN Imbal.of Canopy Water Budg. + real BW_MIN + ! dBwdpv : Derivativ.of Canopy Water Budg. + real dBwdpv + ! Bswich : Newton-Raphson Switch + real Bswich + ! psiv_0 : Canopy Temperature, Previous t + real psiv_0(klonv) + ! EvFrac : Condensat./Transpiration Switch + real EvFrac + ! den_qs, arg_qs, qsatvg : Canopy Saturat. Spec. Humidity + real den_qs, arg_qs, qsatvg + ! EvTran : EvapoTranspiration + real EvTran + ! dEdpsi : Evapotranspiration Derivative + real dEdpsi + ! Fac_Ev, FacEvT : Evapotranspiration Factors + real Fac_Ev, FacEvT + ! denomE : Evapotranspiration Denominator + real denomE + ! F_Stom : Funct. (Leaf Water Potential) + real F_Stom + ! dFdpsi : Derivative of F_Stom + real dFdpsi + ! denomF : Denominator of F_Stom + real denomF + ! F___OK : (psi>psi_c) => F_Stom swich ON + real F___OK + ! R0Stom : Minimum Stomatal Resistance + real R0Stom + ! R_Stom : Stomatal Resistance + real R_Stom + ! dRdpsi : Derivat.Stomatal Resistance + real dRdpsi + ! numerR : Numerat.Stomatal Resistance + real numerR + + ! +--Internal DATA + ! + ============= + ! nitmax : Maximum Iterations Number + data nitmax/5/ + ! dpvMAX : Canopy Water Increment MAX + data dpvMAX/20./ + ! BW_MIN : MIN Imbal. of Surf.Energy Budg. + data BW_MIN/4.e-8/ + + ! +--Newton-Raphson Scheme + ! + ===================== + nit = 0 +101 continue + nit = nit + 1 + BW_MAX = 0. + + ! +--W.Potential of the Previous Time Step + ! + ------------------------------------- + do ikl = 1, klonv + psiv_0(ikl) = psivSV(ikl) + ! +--Extraction of Soil Water through the Plant Roots + ! + ------------------------------------------------ + ! PlantW : Plant Water + PlantW(ikl) = 0. + ! dPdPsi : Idem, Derivat. + dPdPsi(ikl) = 0. + enddo + do isl = -nsol, 0 + do ikl = 1, klonv + ! Soil-Canopy Water + psidif = psivSV(ikl) - (DH_dSV(ivgtSV(ikl)) & + + psi_sv(ikl, isl)) ! Potential Diff. + ! If > 0, Contrib. to Root Water + Root_W = Ro_Wat * RF__SV(ivgtSV(ikl), isl) & + / max(eps_21, PR_dSV(ivgtSV(ikl))) + ! +!!! Pas de prise en compte de la resistance sol/racine dans proto-svat + ! + (DR97, eqn.3.20) + RootOK = max(zero, sign(unun, psidif)) + Rootsv(ikl, isl) = Root_W * max(zero, psidif) ! Root Water + PlantW(ikl) = PlantW(ikl) + Rootsv(ikl, isl) ! Plant Water + dPdPsi(ikl) = dPdPsi(ikl) + RootOK * Root_W ! idem, Derivat. + enddo + enddo + + ! +--Latent Heat Flux + ! + ------------------ + + ! +--Canopy Saturation Specific Humidity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + den_qs = TvegSV(ikl) - 35.8 + arg_qs = 17.27 * (TvegSV(ikl) - 273.16) / den_qs + qsatvg = .0038 * exp(arg_qs) + !XF qsatvg = .0038 * exp(arg_qs) * 0.875 ! A TESTER 04/2019 + + ! +--Canopy Stomatal Resistance + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + R0Stom = min(StodSV(ivgtSV(ikl)) & + / max(epsi, glf_sv(ikl)), StxdSV) ! Min Stomatal R. + denomF = pscdSV - psivSV(ikl) + F___OK = max(zero, sign(unun, denomF)) + denomF = max(epsi, denomF) ! + F_Stom = pscdSV / denomF ! F(Leaf Wat.Pot.) + dFdpsi = -F_Stom / denomF ! + ! + ! DR97, eqn. 3.22 + numerR = R0Stom / max(LAIesv(ikl), R0Stom / StxdSV) ! + R_Stom = numerR * F_Stom ! Can.Stomatal R. + ! + ! DR97, eqn. 3.21 + dRdpsi = R_Stom * dFdpsi ! + + ! +--Evaporation / Evapotranspiration + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + EvFrac = max(zero, sign(unun, QaT_SV(ikl) - qsatvg)) ! Condensation/ + ! Transpiration Switch + EvFrac = EvFrac & + + (1.-EvFrac) * rrCaSV(ikl) / rrMxsv(ikl) + ! idem, Factor + Fac_Ev = rhT_SV(ikl) * Sigmsv(ikl) + denomE = rah_sv(ikl) + R_Stom * Sigmsv(ikl) + FacEvT = Fac_Ev * (1.-EvFrac) / denomE + ! EvapoTranspir. + EvTran = FacEvT * (qsatvg - QaT_SV(ikl)) + ! EvT Derivative + dEdpsi = (EvTran / denomE) * dRdpsi + + ! +--Imbalance of the Canopy Water Budget + ! + --------------------------------------- + + ! Available Water + BWater = (PlantW(ikl) & + ! Transpired Water + - EvTran) * F___OK + ! Newton-Raphson Switch + Bswich = max(zero, & + sign(unun, abs(BWater) & + - BW_MIN)) + + ! +--Derivative of the Canopy Water Budget + ! + --------------------------------------- + + dBwdpv = dPdpsi(ikl) & + - dEdpsi + dBwdpv = sign(unun, dBwdpv) & + * max(eps_21, abs(dBwdpv)) + + ! +--Update Canopy and Surface/Canopy Temperatures + ! + --------------------------------------------- + + d_psiv = BWater / dBwdpv + ! Increment Limitor + d_psiv = sign(unun, d_psiv) & + * min(abs(d_psiv), dpvMAX) + ! Newton-Raphson + psivSV(ikl) = psivSV(ikl) - Bswich * d_psiv + BW_MAX = max(BW_MAX, abs(BWater)) + enddo + + ! +--Update Root Water Fluxes | := Evapotranspiration + ! + ------------------------------------------------ + + do isl = -nsol, 0 + do ikl = 1, klonv + ! Root Water + Rootsv(ikl, isl) = Rootsv(ikl, isl) * EvT_SV(ikl) & + / max(eps_21, PlantW(ikl)) + enddo + enddo + + if(BW_MAX > BW_MIN .and. nit < nitmax) go to 101 + + return +end diff --git a/MAR/code_mar/sisvat_sic.f90 b/MAR/code_mar/sisvat_sic.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c0bdd9b00f081beb2c0c45b1d171a8da5e694a6e --- /dev/null +++ b/MAR/code_mar/sisvat_sic.f90 @@ -0,0 +1,133 @@ +#include "MAR_pp.def" +subroutine SISVAT_SIc(SIvAcr) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_SIc 26-09-2006 MAR | + ! | subroutine SISVAT_SIc treats Sea-Ice and Ocean Latent Heat Exchanges | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: TaT_SV : SBL Top Temperature [K] | + ! | ^^^^^ isnoSV : total Nb of Ice/Snow Layers [-] | + ! | LSmask : Land-Sea Mask [-] | + ! | dsn_SV : Snow Intensity [mm w.e./s] | + ! | | + ! | INPUT / TsisSV : Snow/Ice/Soil-Water Temperature [K] | + ! | OUTPUT: eta_SV : Soil/Snow Water Content [m3/m3] | + ! | ^^^^^^ dzsnSV : Snow Layer Thickness [m] | + ! | | + ! | OUTPUT: HFraSV : Frazil Thickness [m] | + ! | ^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use marxsv + + implicit none + + ! +--INPUT/OUTPUT + ! + ------------ + + real SIvAcr(klonv) ! Sea-Ice Vertical Acretion + + ! +--Local Variables + ! + =============== + + integer ikl, isn + real OCN_OK + real SIceOK + real SIcFrz + real Twat_n + real Crodzw, Lro__I + common / SISVAT_SIc_R / Crodzw, Lro__I + logical SIcINI + common / SISVAT_SIc_L / SIcINI + + real SalIce ! Sea-Ice Salinity + real SalWat ! Sea-Water Salinity + + ! +--DATA + ! + ==== + + data SalIce/10./ ! Sea-Ice Salinity + data SalWat/35./ ! Sea-Water Salinity + ! +... Typical Salinities in Terra Nova Bay + ! + (Bromwich and Kurtz, 1984, JGR, p.3568; + ! + Cavalieri and Martin, 1985, p. 248) + + ! +--Initialisation + ! + ============== + + if(.not. SIcINI) then + SIcINI = .true. + ! [J/m2/K] + Crodzw = C__Wat * ro_Wat * dz_dSV(0) + ! [J/m3] + Lro__I = Lf_H2O * ro_Ice * (1.-1.e-3 * SalIce & + - (SalIce / SalWat) * (1.-1.e-3 * SalWat)) +#if(e1) + Lro__I = Lf_H2O * ro_Ice +#endif + endif + + ! +--Snow Fall cools Sea Water + ! + ========================= + + do ikl = 1, klonv + ! (1 - LSmask(ikl)) : Free Ocean + OCN_OK = (1 - LSmask(ikl)) * max(0, 1 - isnoSV(ikl)) +#if(IA) + ! [K] + ! [J/kg] + ! [J/kg] + ! [kg/m2] + TsisSV(ikl, 0) = TsisSV(ikl, 0) & + - OCN_OK * (Cn_dSV * (TfSnow - TaT_SV(ikl)) & + + Lf_H2O * (1.-eta_SV(ikl, 0))) & + * dsn_SV(ikl) * dt__SV / Crodzw +#endif + + ! +--Sea-Ice Formation + ! + ================= +#if(IA) + ! +*** Hibler (1984), Ocean Heat Flux: 25% of cooling (ANTARCTIC Ocean) + ! + (Hansen and Takahashi Eds) + ! + Geophys. Monogr. 29, M. Ewing Vol. 5, AGU, p. 241 + ! [K] + Twat_n = max(TsisSV(ikl, 0), tfrwat) + ! [m] + SIcFrz = (Twat_n - TsisSV(ikl, 0)) * Crodzw / Lro__I * 0.75 + ! +--Frazil Formation + ! + ----------------- + HFraSV(ikl) = SIcFrz * OCN_OK + ! +--Growth of the Sea-Ice First Ice Floe + ! + ------------------------------------ + ! Ice Cover.Ocean + SIceOK = (1 - LSmask(ikl)) & + * min(1, isnoSV(ikl)) + ! Vertical Acret. + dzsnSV(ikl, 1) = dzsnSV(ikl, 1) & + + SIcFrz * SIceOK +#endif + ! +--Diagnostic of the Surface Mass Balance + ! + -------------------------------------- +#if(m2) + SIvAcr(ikl) = ro_Ice * SIcFrz * (OCN_OK + SIceOK) & + - dt__SV * dsn_SV(ikl) * OCN_OK +#else + SIvAcr(ikl) = 0. +#endif + + ! +--Water Fluxes Update + ! + ------------------- + + RnofSV(ikl) = RnofSV(ikl) & + + dsn_SV(ikl) * OCN_OK + RuofSV(ikl, 1) = RuofSV(ikl, 1) & + + dsn_SV(ikl) * OCN_OK + dsn_SV(ikl) = dsn_SV(ikl) * (1.-OCN_OK) + + enddo + + return +endsubroutine SISVAT_SIc diff --git a/MAR/code_mar/sisvat_sno_albedo.f90 b/MAR/code_mar/sisvat_sno_albedo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..29bd8ec23da87008ccb99c1991f4472478a95de8 --- /dev/null +++ b/MAR/code_mar/sisvat_sno_albedo.f90 @@ -0,0 +1,637 @@ +#include "MAR_pp.def" +subroutine SnOptP + ! +------------------------------------------------------------------------+ + ! | MAR/SISVAT SnOptP 15-04-2021 MAR | + ! | subroutine SnOptP computes the Snow Pack optical Properties | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental Grid Boxes | + ! | X Number of Mosaic Cell per Grid Box | + ! | | + ! | INPUT: isnoSV = total Nb of Ice/Snow Layers | + ! | ^^^^^ ispiSV = 0,...,nsno: Uppermost Superimposed Ice Layer | + ! | | + ! | ivgtSV = 0,...,12: Vegetation Type | + ! | 0: Water, Solid or Liquid | + ! | | + ! | INPUT: G1snSV : Dendricity (<0) or Sphericity (>0) of Snow Layer | + ! | ^^^^^ G2snSV : Sphericity (>0) or Size of Snow Layer | + ! | agsnSV : Snow Age [day] | + ! | ro__SV : Snow/Soil Volumic Mass [kg/m3] | + ! | eta_SV : Water Content [m3/m3] | + ! | rusnSV : Surficial Water Thickness [kg/m2] .OR. [mm] | + ! | SWS_SV : Surficial Water Status | + ! | dzsnSV : Snow Layer Thickness [m] | + ! | | + ! | albssv : Soil Albedo [-] | + ! | zzsnsv : Snow Pack Thickness [m] | + ! | | + ! | OUTPUT: albisv : Snow/Ice/Water/Soil Integrated Albedo [-] | + ! | ^^^^^^ sEX_sv : Verticaly Integrated Extinction Coefficient | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | SnOpSV : Snow Grain optical Size [m] | + ! | EX1_sv : Integrated Snow Extinction (0.3--0.8micr.m) | + ! | EX2_sv : Integrated Snow Extinction (0.8--1.5micr.m) | + ! | EX3_sv : Integrated Snow Extinction (1.5--2.8micr.m) | + ! | | + ! | METHODE: Calcul de la taille optique des grains ? partir de | + ! | ^^^^^^^ -leur type decrit par les deux variables descriptives | + ! | continues sur la plage -99/+99 passees en appel. | + ! | -la taille optique (1/10mm) des etoiles, | + ! | des grains fins et | + ! | des jeunes faces planes | + ! | | + ! | METHOD: Computation of the optical diameter of the grains | + ! | ^^^^^^ described with the CROCUS formalism G1snSV / G2snSV | + ! | | + ! | REFERENCE: Brun et al. 1989, J. Glaciol 35 pp. 333--342 | + ! | ^^^^^^^^^ Brun et al. 1992, J. Glaciol 38 pp. 13-- 22 | + ! | Eric Martin Sept.1996 | + ! | | + ! | # OPTIONS: #AG: Generalisation of Col de Porte Ageing Parameterization | + ! | # ^^^^^^^ #CZ: Albedo Correction (Zenith Angle) | + ! | # #AW: Output of Soil-Ice-Snow Albedo | + ! | | + ! | CAUTION: Vegetation is not taken into account in albedo computations | + ! | ^^^^^^^ Suggestion: 1) Reduce the displacement height and/or LAI | + ! | (when snow) for radiative transfert through vegetation | + ! | 2) Adapt leaf optical parameters | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SnOptP____.va | #va: OUTPUT/Verification: Albedo Parameteriz. | + ! | | unit 46, subroutine SnOptP **ONLY** | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use mar_ge + use margrd + use mar_sv + use mardsv + use marxsv + use marysv +#if(CP) + use marcdp +#endif +#if(AO) + use mar_ao +#endif + + implicit none + + ! +--Internal Variables + ! + ================== + + real coalb1(klonv) ! weighted Coalbedo, Vis. + real coalb2(klonv) ! weighted Coalbedo, nIR 1 + real coalb3(klonv) ! weighted Coalbedo, nIR 2 + real coalbm ! weighted Coalbedo, mean + real sExt_1(klonv) ! Extinction Coeff., Vis. + real sExt_2(klonv) ! Extinction Coeff., nIR 1 + real sExt_3(klonv) ! Extinction Coeff., nIR 2 + real SnOpSV(klonv, nsno) ! Snow Grain optical Size +#if(AG) + real agesno +#endif + + integer i, j, k, m + integer isn, ikl, isn1, jjtime + real sbeta1, sbeta2, sbeta3, sbeta4, sbeta5 + real AgeMax, AlbMin, HSnoSV, HIceSV, doptmx, SignG1, Sph_OK + real dalbed, dalbeS, dalbeW + real bsegal, czemax, csegal + real RoFrez, DiffRo, SignRo, SnowOK, OpSqrt + real albSn1, albIc1, a_SnI1, a_SII1 + real albSn2, albIc2, a_SnI2, a_SII2 + real albSn3, albIc3, a_SnI3, a_SII3 + real albSno, albIce, albSnI, albSII, albWIc, albmax + real doptic, Snow_H, SIce_H, SnownH, SIcenH + real exarg1, exarg2, exarg3, sign_0, sExt_0 + real albedo_old, albCor + real ro_ave, dz_ave, minalb + + ! +--OUTPUT of SISVAT Trace Statistics (see assignation in PHY_SISVAT) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(SR) + integer iSRwri, jSRwri, nSRwri, kSRwri, lSRwri + common / SISVAT_trace / iSRwri, jSRwri, nSRwri, kSRwri, lSRwri +#endif + + ! +--Albedo: IO + ! + ~~~~~~~~~~ + ! IO Switch +#if(va) + logical aw_opn + common / SnOptP_L / aw_opn +#endif + + ! +--Local DATA + ! + ============ + + ! +--For the computation of the solar irradiance extinction in snow + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + data sbeta1/0.0192/, sbeta2/0.4000/, sbeta3/0.1098/ + data sbeta4/1.0000/ + data sbeta5/2.00e1/ + + ! +--Snow Age Maximum (Taiga, e.g. Col de Porte) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + data AgeMax/60.0/ + ! +... AgeMax: Snow Age Maximum [day] + + data AlbMin/0.94/ + ! +... AlbMin: Albedo Minimum / visible (0.3--0.8 micrometers) + + data HSnoSV/0.01/ + ! +... HSnoSV: Snow Thickness through witch + ! + Albedo is interpolated to Ice Albedo + data HIceSV/0.10/ + ! +... HIceSV: Snow/Ice Thickness through witch + ! + Albedo is interpolated to Soil Albedo + data doptmx/2.3e-3/ + ! +... doptmx: Maximum optical Diameter (pi * R**2) [m] + ! + + data czeMAX/0.173648178/ ! 80.deg (Segal et al., 1991 JAS) + data bsegal/4.00/ ! + data albmax/0.99/ ! Albedo max + + ! +--Snow Grain optical Size + ! + ======================= + + do ikl = 1, klonv + do isn = 1, max(1, isnoSV(ikl)) + + G2snSV(ikl, isn) = max(epsi, G2snSV(ikl, isn)) + ! +... Avoid non physical Values + + SignG1 = sign(unun, G1snSV(ikl, isn)) + Sph_OK = max(zero, SignG1) + + SnOpSV(ikl, isn) = 1.e-4 * & + (Sph_OK * (G2snSV(ikl, isn) * G1snSV(ikl, isn) / G1_dSV & + + max(demi * G2snSV(ikl, isn), DFcdSV) & + * (unun - G1snSV(ikl, isn) / G1_dSV)) & + + (1.-Sph_OK) * (-G1snSV(ikl, isn) * DDcdSV / G1_dSV & + + (unun + G1snSV(ikl, isn) / G1_dSV) & + * (G2snSV(ikl, isn) * DScdSV / G1_dSV & + + (unun - G2snSV(ikl, isn) / G1_dSV) & + * DFcdSV))) + SnOpSV(ikl, isn) = max(zero, SnOpSV(ikl, isn)) + enddo + enddo + + ! +--Snow/Ice Albedo + ! + =============== + + ! +--Snow Age (Influence on Albedo) + ! + ------------------------------ + + ! snow age = date !XF 12/07/2019 + + !c #AG jjtime = jhurGE*3600+minuGE*60+jsecGE + !c #AG if (iabs(mod(jjtime,86400)).lt.dt__SV) then + !c #AG do isn=1,nsno + !c #AG do ikl=1,klonv + !c #AG agsnSV(ikl,isn) = agsnSV(ikl,isn) + 1. + !c #AG. + max(zero,DH_dSV(ivgtSV(ikl))-DH_dSV(4)) ! High Vegetation + !C + ! Impurities + !C +... CAUTION: crude parameterization + !C + ^^^^^^^ + !c #AG end do + !c #AG end do + !c #AG end if + + ! +--Uppermost effective Snow Layer + ! + ------------------------------ + + do ikl = 1, klonv + + isn = max(iun, isnoSV(ikl)) + + SignRo = sign(unun, rocdSV - ro__SV(ikl, isn)) + SnowOK = max(zero, SignRo) ! Ice Density Threshold + + OpSqrt = sqrt(SnOpSV(ikl, isn)) + + !CA +--Correction of snow albedo for Antarctica/Greenland + !CA -------------------------------------------------- + albCor = 1. +#if(GL) + albCor = 1.0075 +#endif +#if(AC) + albCor = 1.0075 +#endif + + albSn1 = 0.96 - 1.580 * OpSqrt + albSn1 = max(albSn1, AlbMin) + + albSn1 = max(albSn1, zero) + albSn1 = min(albSn1 * albCor, unun) + + albSn2 = 0.95 - 15.40 * OpSqrt + albSn2 = max(albSn2, zero) + albSn2 = min(albSn2 * albCor, unun) + + doptic = min(SnOpSV(ikl, isn), doptmx) + albSn3 = 346.3 * doptic - 32.31 * OpSqrt + 0.88 + albSn3 = max(albSn3, zero) + albSn3 = min(albSn3 * albCor, unun) + +#if(GL) + ! snow albedo corection if wetsnow + albSn1 = albSn1 * max(0.9,(1.-2.5 * eta_SV(ikl, isn))) + albSn2 = albSn2 * max(0.9,(1.-2.5 * eta_SV(ikl, isn))) + albSn3 = albSn3 * max(0.9,(1.-2.5 * eta_SV(ikl, isn))) +#endif + + albSno = So1dSV * albSn1 & + + So2dSV * albSn2 & + + So3dSV * albSn3 + + !XF + minalb = (aI2dSV + (aI3dSV - aI2dSV) & + * (ro__SV(ikl, isn) - ro_Ice) / (roSdSV - ro_Ice)) + minalb = min(aI3dSV, max(aI2dSV, minalb)) ! pure/firn albedo + + SnowOK = SnowOK * max(zero, sign(unun, albSno - minalb)) + albSn1 = SnowOK * albSn1 + (1.0 - SnowOK) * max(albSno, minalb) + albSn2 = SnowOK * albSn2 + (1.0 - SnowOK) * max(albSno, minalb) + albSn3 = SnowOK * albSn3 + (1.0 - SnowOK) * max(albSno, minalb) + + ! + ro < roSdSV | min al > aI3dSV + ! + roSdSV < ro < rocdSV | aI2dSV < min al < aI3dSV (fct of density) + + ! +--Snow/Ice Pack Thickness + ! + ----------------------- + + isn = max(min(isnoSV(ikl), ispiSV(ikl)), 0) + Snow_H = zzsnsv(ikl, isnoSV(ikl)) - zzsnsv(ikl, isn) + SIce_H = zzsnsv(ikl, isnoSV(ikl)) + SnownH = Snow_H / HSnoSV + SnownH = min(unun, SnownH) + SIcenH = SIce_H / (HIceSV & + + max(zero, Z0mdSV(ivgtSV(ikl)) & + - Z0mdSV(4))) + SIcenH = min(unun, SIcenH) + + ! + The value of SnownH is set to 1 in case of ice lenses above + ! + 1m of dry snow (ro<600kg/m3) for using CROCUS albedo + + ! ro_ave = 0. + ! dz_ave = 0. + ! SnowOK = 1. + ! do isn = isnoSV(ikl),1,-1 + ! ro_ave = ro_ave + ro__SV(ikl,isn) * dzsnSV(ikl,isn) * SnowOK + ! dz_ave = dz_ave + dzsnSV(ikl,isn) * SnowOK + ! SnowOK = max(zero,sign(unun,1.-dz_ave)) + ! end do + + ! ro_ave = ro_ave / max(dz_ave,epsi) + ! SnowOK = max(zero,sign(unun,600.-ro_ave)) + ! SnownH = SnowOK + SnownH * (1. - SnowOK) + + ! +--Integrated Snow/Ice Albedo: Case of Water on Bare Ice + ! + ----------------------------------------------------- + + isn = max(min(isnoSV(ikl), ispiSV(ikl)), 0) + ! + ! 0 <=> freezing + ! 1 <=> isn=isnoSV + albWIc = aI1dSV - (aI1dSV - aI2dSV) & + * exp(-(rusnSV(ikl) & + * (1.-SWS_SV(ikl) & + * (1 - min(1, iabs(isn - isnoSV(ikl))))) & + / ru_dSV)**0.50) + ! albWIc = max(aI1dSV,min(aI2dSV,albWIc+slopSV(ikl)* & + ! min(5.,max(1.,dx/10000.)))) + + SignRo = sign(unun, ro_Ice - 5.-ro__SV(ikl, isn)) ! RoSN<920kg/m3 + SnowOK = max(zero, SignRo) + + albWIc = (1.-SnowOK) * albWIc + SnowOK & + * (aI2dSV + (aI3dSV - aI2dSV) & + * (ro__SV(ikl, isn) - ro_Ice) / (roSdSV - ro_Ice)) + + ! + rocdSV < ro < ro_ice | aI2dSV< al <aI3dSV (fct of density) + ! + ro > ro_ice | aI1dSV< al <aI2dSV (fct of superficial water content + + ! +--Integrated Snow/Ice Albedo + ! + ------------------------------- + + a_SII1 = albWIc + (albSn1 - albWIc) * SnownH + a_SII1 = min(a_SII1, albSn1) + + a_SII2 = albWIc + (albSn2 - albWIc) * SnownH + a_SII2 = min(a_SII2, albSn2) + + a_SII3 = albWIc + (albSn3 - albWIc) * SnownH + a_SII3 = min(a_SII3, albSn3) + + !c #AG agesno = min(agsnSV(ikl,isn) ,AgeMax) + !c #AG a_SII1 = a_SII1 -0.175*agesno/AgeMax + ! +... Impurities: Col de Porte Parameter. + + ! Zenith Angle Correction (Segal et al., 1991, JAS 48, p.1025) + ! ----------------------- (Wiscombe & Warren, dec1980, JAS , p.2723) + ! (Warren, 1982, RG , p. 81) + ! -------------------------------------------- + + dalbed = 0.0 + csegal = max(czemax, coszSV(ikl)) +#if(cz) + dalbeS = ((bsegal + unun) / (unun + 2.0 * bsegal * csegal) & + - unun) * 0.32 & + / bsegal + dalbeS = max(dalbeS, zero) + dalbed = dalbeS * min(1, isnoSV(ikl)) +#endif + + dalbeW = (0.64 - csegal) * 0.0625 ! Warren 1982, RevGeo, fig.12b + ! ! 0.0625 = 5% * 1/0.8, p.81 + ! ! 0.64 = cos(50) + dalbed = dalbeW * min(1, isnoSV(ikl)) + + ! +--Col de Porte Integrated Snow/Ice Albedo + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(cp) + if(ColPrt .and. TotSol > 0.) then + albSII = (((Dr_1SN * a_SII1 + Dr_2SN * a_SII2 + Dr_3SN * a_SII3) & + + dalbed) & + * DirSol & + + (Df_1SN * a_SII1 + Df_2SN * a_SII2 + Df_3SN * a_SII3) & + * DifSol * (1.-cld_SV(ikl)) & + + (Dfc1SN * a_SII1 + Dfc2SN * a_SII2 + Dfc3SN * a_SII3) & + * DifSol * cld_SV(ikl)) & + / TotSol + ! +--Elsewhere Integrated Snow/Ice Albedo + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else +#endif + albSII = So1dSV * a_SII1 & + + So2dSV * a_SII2 & + + So3dSV * a_SII3 +#if(cp) + endif +#endif + + ! +--Integrated Snow/Ice/Soil Albedo + ! + ------------------------------- + + alb1sv(ikl) = albssv(ikl) + (a_SII1 - albssv(ikl)) * SIcenH + alb1sv(ikl) = min(alb1sv(ikl), a_SII1) + + alb2sv(ikl) = albssv(ikl) + (a_SII2 - albssv(ikl)) * SIcenH + alb2sv(ikl) = min(alb2sv(ikl), a_SII2) + + alb3sv(ikl) = albssv(ikl) + (a_SII3 - albssv(ikl)) * SIcenH + alb3sv(ikl) = min(alb3sv(ikl), a_SII3) + + albisv(ikl) = albssv(ikl) + (albSII - albssv(ikl)) * SIcenH + albisv(ikl) = min(albisv(ikl), albSII) + + ! +--Integrated Snow/Ice/Soil Albedo: Clouds Correction! Greuell & all., 1994 + ! + Glob. &t Planet.Change (9):91-114 +#if(cp) + if(.not. ColPrt) then +#endif + alb1sv(ikl) = alb1sv(ikl) + 0.02 * (cld_SV(ikl) - 0.5) * SIcenH & + + dalbed * (1.-cld_SV(ikl)) + alb2sv(ikl) = alb2sv(ikl) + 0.02 * (cld_SV(ikl) - 0.5) * SIcenH & + + dalbed * (1.-cld_SV(ikl)) + alb3sv(ikl) = alb3sv(ikl) + 0.02 * (cld_SV(ikl) - 0.5) * SIcenH & + + dalbed * (1.-cld_SV(ikl)) + albisv(ikl) = albisv(ikl) + 0.02 * (cld_SV(ikl) - 0.5) * SIcenH & + + dalbed * (1.-cld_SV(ikl)) +#if(cp) + endif +#endif + + ! +--Integrated Snow/Ice/Soil Albedo: Minimum snow albedo = aI1dSV + ! + ------------------------------------------------------------- + + albedo_old = albisv(ikl) + albisv(ikl) = max(albisv(ikl), aI1dSV * SIcenH & + + albssv(ikl) * (1.0 - SIcenH)) + ! 33 % + alb1sv(ikl) = alb1sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So1dSV + ! 33 % + alb2sv(ikl) = alb2sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So2dSV + ! 33 % + alb3sv(ikl) = alb3sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So3dSV + + ! +--Integrated Snow/Ice/Soil Albedo: Maximum albedo = 95% + ! + ----------------------------------------------------- + + albedo_old = albisv(ikl) + albisv(ikl) = min(albisv(ikl), 0.95) + ! 33 % + alb1sv(ikl) = alb1sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So1dSV + ! 33 % + alb2sv(ikl) = alb2sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So2dSV + ! 33 % + alb3sv(ikl) = alb3sv(ikl) - 1.0 / 3.0 & + * (albedo_old - albisv(ikl)) / So3dSV + +#if(AO) + ! Sea Ice/snow permanent-interractive prescription from Nemo + ! AO_CK 20/02/2020 + ! No check if coupling update since MAR and NEMO albedo are too different + ! and since MAR albedo is computed on properties that are not in NEMO + ! prescription for each time step with NEMO values + if(LSmask(ikl) == 0 .and. coupling_ao == .true.) then + if(AOmask(ikl) == 0) then + albisv(ikl) = (1.-AOmask(ikl)) * albAOsisv(ikl) & + + (AOmask(ikl) * albisv(ikl)) + alb1sv(ikl) = (1.-AOmask(ikl)) * albAOsisv(ikl) & + + (AOmask(ikl) * alb1sv(ikl)) + alb2sv(ikl) = (1.-AOmask(ikl)) * albAOsisv(ikl) & + + (AOmask(ikl) * alb2sv(ikl)) + alb3sv(ikl) = (1.-AOmask(ikl)) * albAOsisv(ikl) & + + (AOmask(ikl) * alb3sv(ikl)) + endif + endif +#endif + + alb1sv(ikl) = min(max(zero, alb1sv(ikl)), albmax) + alb2sv(ikl) = min(max(zero, alb2sv(ikl)), albmax) + alb3sv(ikl) = min(max(zero, alb3sv(ikl)), albmax) + + enddo + + ! +--Extinction Coefficient: Exponential Factor + ! + ========================================== + + do ikl = 1, klonv + sExt_1(ikl) = 1. + sExt_2(ikl) = 1. + sExt_3(ikl) = 1. + sEX_sv(ikl, nsno + 1) = 1. + + coalb1(ikl) = (1.-alb1sv(ikl)) * So1dSV + coalb2(ikl) = (1.-alb2sv(ikl)) * So2dSV + coalb3(ikl) = (1.-alb3sv(ikl)) * So3dSV + coalbm = coalb1(ikl) + coalb2(ikl) + coalb3(ikl) + coalb1(ikl) = coalb1(ikl) / coalbm + coalb2(ikl) = coalb2(ikl) / coalbm + coalb3(ikl) = coalb3(ikl) / coalbm + enddo + + !XF + + do isn = nsno, 1, -1 + do ikl = 1, klonv + sEX_sv(ikl, isn) = 1.0 + ! !sEX_sv(ikl,isn) = 0.95 ! if MAR is too warm in summer + enddo + enddo + + do ikl = 1, klonv + do isn = max(1, isnoSV(ikl)), 1, -1 + + SignRo = sign(unun, rocdSV - ro__SV(ikl, isn)) + SnowOK = max(zero, SignRo) ! Ice Density Threshold + + RoFrez = 1.e-3 * ro__SV(ikl, isn) * (1.0 - eta_SV(ikl, isn)) + + OpSqrt = sqrt(max(epsi, SnOpSV(ikl, isn))) + exarg1 = SnowOK * 1.e2 * max(sbeta1 * RoFrez / OpSqrt, sbeta2) & + + (1.0 - SnowOK) * sbeta5 + exarg2 = SnowOK * 1.e2 * max(sbeta3 * RoFrez / OpSqrt, sbeta4) & + + (1.0 - SnowOK) * sbeta5 + exarg3 = SnowOK * 1.e2 * sbeta5 & + + (1.0 - SnowOK) * sbeta5 + +#if(cp) + ! +--Col de Porte Snow Extinction Coefficient + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ColPrt .and. TotSol > 0.) then + exarg1 = exarg1 * (Dr_1SN * DirSol & + + Df_1SN * DifSol * (1.-cld_SV(ikl)) & + + Dfc1SN * DifSol * cld_SV(ikl)) & + / (Dr_1SN * TotSol) + exarg2 = exarg2 * (Dr_2SN * DirSol & + + Df_2SN * DifSol * (1.-cld_SV(ikl)) & + + Dfc2SN * DifSol * cld_SV(ikl)) & + / (Dr_2SN * TotSol) + exarg3 = exarg3 * (Dr_3SN * DirSol & + + Df_3SN * DifSol * (1.-cld_SV(ikl)) & + + Dfc3SN * DifSol * cld_SV(ikl)) & + / (Dr_3SN * TotSol) + endif +#endif + + ! +--Integrated Extinction of Solar Irradiance (Normalized Value) + ! + ============================================================ + + sExt_1(ikl) = sExt_1(ikl) & + * exp(min(0.0, -exarg1 * dzsnSV(ikl, isn))) + sign_0 = sign(unun, eps9 - sExt_1(ikl)) + sExt_0 = max(zero, sign_0) * sExt_1(ikl) + sExt_1(ikl) = sExt_1(ikl) - sExt_0 + + sExt_2(ikl) = sExt_2(ikl) & + * exp(min(0.0, -exarg2 * dzsnSV(ikl, isn))) + sign_0 = sign(unun, eps9 - sExt_2(ikl)) + sExt_0 = max(zero, sign_0) * sExt_2(ikl) + sExt_2(ikl) = sExt_2(ikl) - sExt_0 + + sExt_3(ikl) = sExt_3(ikl) & + * exp(min(0.0, -exarg3 * dzsnSV(ikl, isn))) + sign_0 = sign(unun, eps9 - sExt_3(ikl)) + sExt_0 = max(zero, sign_0) * sExt_3(ikl) + sExt_3(ikl) = sExt_3(ikl) - sExt_0 + + sEX_sv(ikl, isn) = coalb1(ikl) * sExt_1(ikl) & + + coalb2(ikl) * sExt_2(ikl) & + + coalb3(ikl) * sExt_3(ikl) + enddo + enddo + + do isn = 0, -nsol, -1 + do ikl = 1, klonv + sEX_sv(ikl, isn) = 0.0 + enddo + enddo + +#if(va) + ! +--Albedo: IO + ! + ========== + if(.not. aw_opn) then + aw_opn = .true. + open(unit=46, status='unknown', file='SnOptP____.va') + rewind(46) + endif + ikl = 1 + write(46, 460) daHost +460 format('---------------------------------+----+', & + '-------+-------+-------+-------+-------+-------+', & + '-------+-------+-------+', & + /, 'Snow/Ice Pack ', a18, ' | |', & + ' z [m] |0.3/0.8|0.8/1.5|1.5/2.8| Full |Opt[mm]|', & + ' G1 | G2 | ro |', & + /, '---------------------------------+----+', & + '-------+-------+-------+-------+-------+-------+', & + '-------+-------+-------+') + ! ______________________________________________________________ + write(46, 461) SIce_H, & + alb1sv(ikl), alb2sv(ikl), alb3sv(ikl), & + albisv(ikl) +461 format('Integrated Snow/Ice/Soil Albedo |', & + 3x, ' |', f6.3, ' |', 4(f6.3, ' |'), 6x, ' |', & + 3(6x, ' |')) + ! ______________________________________________________________ + write(46, 462) ispiSV(ikl), a_SII1, a_SII2, a_SII3, albSII +462 format('Integrated Snow/Ice Albedo |', & + i3, ' |', 6x, ' |', 4(f6.3, ' |'), 6x, ' |', & + 3(6x, ' |')) + ! ______________________________________________________________ + write(46, 463) rusnSV(ikl), albWIc, & + SWS_SV(ikl) +463 format('Integrated Water/Bare Ice Albedo |', & + 3x, ' |', f6.3, 'w|', 3(6x, ' |'), & + f6.3, ' |', f6.3, ' |', & + 3(6x, ' |')) + ! ______________________________________________________________ + write(46, 464) LiceOK, a_SnI1, a_SnI2, a_SnI3, albSnI +464 format('Integrated Snow/Ice Lense Albedo |', & + f4.0, '|', 6x, ' |', 4(f6.3, ' |'), 6x, ' |', & + 3(6x, ' |')) + ! ______________________________________________________________ + write(46, 465) isn1, zzsnsv(ikl, isn1), & + albIc1, albIc2, albIc3, albIce, & + 1.e3 * SnOpSV(ikl, max(iun, isnoSV(ikl) - iun)), & + G1snSV(ikl, max(iun, isnoSV(ikl) - iun)), & + G2snSV(ikl, max(iun, isnoSV(ikl) - iun)), & + ro__SV(ikl, max(iun, isnoSV(ikl) - iun)) & + * (1.-eta_SV(ikl, max(iun, isnoSV(ikl) - iun))) +465 format('Surficial Ice Lense |', & + i3, ' |',(f6.3, 'i|'), 4(f6.3, ' |'), f6.3, ' |', & + 3(f6.1, ' |')) + ! ______________________________________________________________ + write(46, 466) isnoSV(ikl), zzsnsv(ikl, isnoSV(ikl)), & + albSn1, albSn2, albSn3, albSno, & + 1.e3 * SnOpSV(ikl, isnoSV(ikl)), & + G1snSV(ikl, isnoSV(ikl)), & + G2snSV(ikl, isnoSV(ikl)), & + ro__SV(ikl, isnoSV(ikl)) & + * (1.-eta_SV(ikl, isnoSV(ikl))) +466 format('Uppermost Effective Snow Layer |', & + i3, ' |',(f6.3, '*|'), 4(f6.3, ' |'), f6.3, ' |', & + 3(f6.1, ' |')) +#endif + + return +end diff --git a/MAR/code_mar/sisvat_sno_filtering.f90 b/MAR/code_mar/sisvat_sno_filtering.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e1d2a0c98b44a53b2cd38f0e12b919140588c8c9 --- /dev/null +++ b/MAR/code_mar/sisvat_sno_filtering.f90 @@ -0,0 +1,214 @@ +#include "MAR_pp.def" +subroutine sno_filtering() + ! +------------------------------------------------------------------------+ + ! | SISVAT 25-04-2020 MAR | + ! | | + ! | subroutine snow_filtering | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_sv + use mar_sl + use mar_hy + use marssn + use mardsv + use mar_tv + + implicit none + + real weight ! weight for the central pixel + + integer i, j, k, m + integer l, kk, n, nb + real g2_ave, ro_ave, nbr1, nbr2, nbr3, nbr4 + real al_ave, ussave, corr, ww, dz_ave + real ratio(mx, my, mw), g2_new(mx, my, mw), ussnew(mx, my, mw) + integer correction(mx, my, mw) + real(kind=8) sumin, sumou + + logical density_filtering + + density_filtering = .true. + + weight = 4.*max(1., min(10., sqrt(dx / 1000))) +#if(BS) + weight = 12.*max(1., min(10., sqrt(dx / 1000))) +#endif + +!$OMP PARALLEL do & +!$OMP private(i,j,k,l,n,m,ww,nbr1,nbr2,nbr3,ro_ave,g2_ave,al_ave,ussave, & +!$OMP dz_ave,corr,nbr4) & +!$OMP schedule(dynamic) + do j = 7, my - 6 ! only the interesting domain + do i = 7, mx - 6 + + ! ! increase the melt of snowpack when some sub pixels are snow free. + do n = 1, mw + do m = 1, mw + if(n /= m) then + if(nssSNo(i, j, m) == 0 .and. nssSNo(i, j, n) > 1 .and. & + ivegTV(i, j, m) > 0 .and. ivegTV(i, j, n) > 0 .and. & + ifraTV(i, j, m) > 0 .and. ifraTV(i, j, n) > 0 .and. & + tairDY(i, j, mz) > 275.15) then + + tisSNo(i, j, n, nssSNo(i, j, n)) = 273.15 & + + max(0., min(tsrfSL(i, j, m), tairDY(i, j, mz) - 273.15) / 20.) + + tisSNo(i, j, n, nssSNo(i, j, n)) = max(273.15, & + min(tisSNo(i, j, n, nssSNo(i, j, n)), 274.15)) + + endif + endif + enddo + + if(SLsrfl(i, j, n) <= 0) then + nssSNo(i, j, n) = 0 + do k = 1, nsno + dzsSNo(i, j, n, k) = 0. + enddo + endif + enddo + + do n = 1, min(mw, 2) ! sea ice and ice sheet only + + ratio(i, j, n) = 1. + correction(i, j, n) = 0. + !c#BS ussnew(i,j,n) = uss_HY(i,j) + ! only in the accumulation zone + if(nssSNo(i, j, n) > 3 .and. & + ifraTV(i, j, n) > 0 .and. & + ivegTV(i, j, n) <= 0. .and. & + rosSNo(i, j, n, max(1, nssSNo(i, j, n))) < 700. .and. & + dzsSNo(i, j, n, max(1, nssSNo(i, j, n))) > 0.001) then + + nbr1 = 0; nbr2 = 0; nbr3 = 0; nbr4 = 0 + ro_ave = 0; g2_ave = 0; al_ave = 0; dz_ave = 0 + !c#BS ussave=0 + + ! ! only in the accumulation zone + do k = -1, 1; do l = -1, 1 + if(nssSNo(i + k, j + l, n) > 3 .and. & + ifraTV(i + k, j + l, n) > 0 .and. & + ivegTV(i + k, j + l, n) <= 0 .and. & + rosSNo(i + k, j + l, n, max(1, nssSNo(i + k, j + l, n))) < 700. .and. & + dzsSNo(i + k, j + l, n, max(1, nssSNo(i + k, j + l, n))) > 0.001 .and. & + tisSNo(i + k, j + l, n, max(1, nssSNo(i + k, j + l, n))) < 273. .and. & + tisSNo(i + k, j + l, n, max(1, nssSNo(i + k, j + l, n))) > 263.) then + + ww = 1 + if(k == 0 .or. l == 0) ww = 2 + if(k == 0 .and. l == 0) ww = weight + + dz_ave = dz_ave + dzsSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + + ro_ave = ro_ave + rosSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + + al_ave = al_ave + albxSL(i + k, j + l, n) * ww + !c#BS ussave = ussave + uss_HY(i,j) *min(12.,ww) + + nbr1 = nbr1 + 1 + nbr2 = nbr2 + ww + !c#BS nbr4 = nbr4+min(12.,ww) + + if(g1sSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) >= 0) then + g2_ave = g2_ave + g2sSNo(i + k, j + l, n, nssSNo(i + k, j + l, n)) * ww + nbr3 = nbr3 + ww + endif + endif + enddo; + enddo + + al_ave = al_ave / max(1., nbr2) + ro_ave = ro_ave / max(1., nbr2) + dz_ave = dz_ave / max(1., nbr2) + g2_ave = g2_ave / max(1., nbr3) + !c#BS ussave = ussave / max(1.,nbr4) + + if(dz_ave >= dzsSNo(i, j, n, nssSNo(i, j, n))) then + corr = dzsSNo(i, j, n, nssSNo(i, j, n)) / dz_ave + else + corr = dz_ave / dzsSNo(i, j, n, nssSNo(i, j, n)) + endif + + corr = corr * (1.- & + (700.-rosSNo(i, j, n, nssSNo(i, j, n)))**2 / & + (700.-300.))**2 + corr = max(0.1, min(0.9, corr)) + + ro_ave = ro_ave * corr & + + rosSNo(i, j, n, nssSNo(i, j, n)) * (1.-corr) + + ratio(i, j, n) = ro_ave / (rosSNo(i, j, n, nssSNo(i, j, n))) + ratio(i, j, n) = max(0.9, min(1.1, ratio(i, j, n))) ! max 10 % + + corr = ratio(i, j, n) ! backup + + if(tisSNo(i, j, n, nssSNo(i, j, n)) > 273.14 .or. & + tairdy(i, j, mz) > 275.14) then + ratio(i, j, n) = 1 + endif + + g2_new(i, j, n) = g2sSNo(i, j, n, nssSNo(i, j, n)) + + ! ! problem of albedo in the accumulation zone + if(albxSL(i, j, n) < al_ave * 0.99 .and. & + g1sSNo(i, j, n, nssSNo(i, j, n)) > 0 .and. & + albxSL(i, j, n) < 0.72) then + + if(nbr3 > 0) g2_new(i, j, n) = min(g2_new(i, j, n), g2_ave) + ratio(i, j, n) = min(1., corr) + if(nbr1 >= 6) nbr1 = 9 + endif + + ! refreezing of aquifer in winter!! + ! if(tairdy(i, j, mz)<253.15) then + ! tisSNo(i, j, n, 1) = min(tisSNo(i, j, n, 1), 273.145) + ! end if + + if(nbr1 >= 8) then + correction(i, j, n) = 1 + !c#BS ussnew(i,j,n) =ussave + endif + + endif + enddo + enddo + enddo +!$OMP END PARALLEL DO + + !c#BS sumin=0. ; sumou=0. + + do j = 7, my - 6 + do i = 7, mx - 6 + + !c#BS sumin=sumin+uss_hy(i,j) + !c#BS sumou=sumou+ussnew(i,j,1) + + do n = 1, 2 + if(correction(i, j, n) == 1) then + g2sSNo(i, j, n, nssSNo(i, j, n)) = g2_new(i, j, n) + if(density_filtering) then + dzsSNo(i, j, n, nssSNo(i, j, n)) = dzsSNo(i, j, n, nssSNo(i, j, n)) & + / ratio(i, j, n) + rosSNo(i, j, n, nssSNo(i, j, n)) = rosSNo(i, j, n, nssSNo(i, j, n)) & + * ratio(i, j, n) + endif + endif + enddo + enddo + enddo + + !c#BS if(abs(sumin)>epsi.and.abs(sumou)>epsi) then + !c#BS do j = 7,my-6 + !c#BS do i = 7,mx-6 + !c#BS uss_HY(i,j)=ussnew(i,j,1)*sumin/sumou + !c#BS end do + !c#BS end do + !c#BS end if + +endsubroutine sno_filtering diff --git a/MAR/code_mar/sisvat_tso.f90 b/MAR/code_mar/sisvat_tso.f90 new file mode 100644 index 0000000000000000000000000000000000000000..45eb9d9c81f1b2012cf7068285d5756a850c6f9b --- /dev/null +++ b/MAR/code_mar/sisvat_tso.f90 @@ -0,0 +1,759 @@ +#include "MAR_pp.def" +subroutine SISVAT_TSo(ETSo_0, ETSo_1, ETSo_d) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_TSo 16-06-2021 MAR | + ! | subroutine SISVAT_TSo computes the Soil/Snow Energy Balance | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: isotSV = 0,...,11: Soil Type | + ! | ^^^^^ 0: Water, Solid or Liquid | + ! | isnoSV = total Nb of Ice/Snow Layers | + ! | dQa_SV = Limitation of Water Vapor Turbulent Flux | + ! | | + ! | INPUT: sol_SV : Downward Solar Radiation [W/m2] | + ! | ^^^^^ IRd_SV : Surface Downward Longwave Radiation [W/m2] | + ! | za__SV : SBL Top Height [m] | + ! | VV__SV : SBL Top Wind Speed [m/s] | + ! | TaT_SV : SBL Top Temperature [K] | + ! | rhT_SV : SBL Top Air Density [kg/m3] | + ! | QaT_SV : SBL Top Specific Humidity [kg/kg] | + ! | LSdzsv : Vertical Discretization Factor [-] | + ! | = 1. Soil | + ! | = 1000. Ocean | + ! | dzsnSV : Snow Layer Thickness [m] | + ! | ro__SV : Snow/Soil Volumic Mass [kg/m3] | + ! | eta_SV : Soil Water Content [m3/m3] | + ! | dt__SV : Time Step [s] | + ! | | + ! | SoSosv : Absorbed Solar Radiation by Surfac.(Normaliz)[-] | + ! | IRv_sv : Vegetation IR Radiation [W/m2] | + ! | tau_sv : Fraction of Radiation transmitted by Canopy [-] | + ! | Evg_sv : Soil+Vegetation Emissivity [-] | + ! | Eso_sv : Soil+Snow Emissivity [-] | + ! | rah_sv : Aerodynamic Resistance for Heat [s/m] | + ! | Lx_H2O : Latent Heat of Vaporization/Sublimation [J/kg] | + ! | Sigmsv : Canopy Ventilation Factor [-] | + ! | sEX_sv : Verticaly Integrated Extinction Coefficient [-] | + ! | | + ! | INPUT / TsisSV : Soil/Ice Temperatures (layers -nsol,-nsol+1,..,0)| + ! | OUTPUT: & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | ^^^^^^ | + ! | | + ! | OUTPUT: IRs_SV : Soil IR Radiation [W/m2] | + ! | ^^^^^^ HSs_sv : Sensible Heat Flux [W/m2] | + ! | HLs_sv : Latent Heat Flux [W/m2] | + ! | ETSo_0 : Snow/Soil Energy Power, before Forcing [W/m2] | + ! | ETSo_1 : Snow/Soil Energy Power, after Forcing [W/m2] | + ! | ETSo_d : Snow/Soil Energy Power Forcing [W/m2] | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | | + ! | METHOD: NO Skin Surface Temperature | + ! | ^^^^^^ Semi-Implicit Crank Nicholson Scheme | + ! | | + ! | # OPTIONS: #E0: Energy Budget Verification | + ! | # ^^^^^^^ #kd: KDsvat Option:NO Flux Limitor on HL | + ! | # #KD: KDsvat Option:Explicit Formulation of HL | + ! | # #NC: OUTPUT for Stand Alone NetCDF File | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + + implicit none + + ! +--Global Variables + ! + ================ + + ! +--OUTPUT + ! + ------ + ! Soil/Snow Power, before Forcing + real ETSo_0(klonv) + ! Soil/Snow Power, after Forcing + real ETSo_1(klonv) + ! Soil/Snow Power, Forcing + real ETSo_d(klonv) + + ! +--Internal Variables + ! + ================== + + real zt(klonv), ti(klonv), ww + integer ikl, isl, jsl, ist, izt(klonv) + ! ist__s, ist__w : Soil/Water Body Identifier + integer ist__s, ist__w + ! islsgn : Soil/Snow Surfac.Identifier + integer islsgn + ! eps__3 : Arbitrary Low Number + real eps__3 + ! etaMid, psiMid : Layer Interface's Humidity + real etaMid, psiMid + ! mu_eta : Soil thermal Conductivity + real mu_eta + ! mu_exp : arg Soil thermal Conductivity + real mu_exp + ! mu_min : Min Soil thermal Conductivity + real mu_min + ! mu_max : Max Soil thermal Conductivity + real mu_max + ! mu_sno, mu_aux : Snow thermal Conductivity + real mu_sno(klonv), mu_aux + ! mu__dz : mu_(eta,sno) / dz + real mu__dz(klonv, -nsol:nsno + 1) + ! dtC_sv : dt / C + real dtC_sv(klonv, -nsol:nsno) + ! IRs__D : UpwardIR Previous Iter.Contr. + real IRs__D(klonv) + ! dIRsdT : UpwardIR T Derivat. + real dIRsdT(klonv) + ! f_HSHL : Factor common to HS and HL + real f_HSHL(klonv) + ! dRidTs : d(Rib)/d(Ts) + real dRidTs(klonv) + ! HS___D : Sensible Heat Flux Atm.Contr. + real HS___D(klonv) + ! f___HL : + real f___HL(klonv) + ! HL___D : Latent Heat Flux Atm.Contr. + real HL___D(klonv) + ! TSurf0 : Previous Surface Temperature + real TSurf0(klonv), dTSurf + ! qsatsg : Soil Saturat. Spec. Humidity + real qsatsg(klonv) + ! dqs_dT : d(qsatsg)/dTv + real dqs_dT(klonv) + ! Psi : 1st Soil Layer Water Potential + real Psi(klonv) + ! RHuSol : Soil Surface Relative Humidity + real RHuSol(klonv) + ! etaSol : Soil Surface Humidity + real etaSol + ! Elem_A, Elem_C : Diagonal Coefficients + real Elem_A, Elem_C + ! Diag_A : A Diagonal + real Diag_A(klonv, -nsol:nsno) + ! Diag_B : B Diagonal + real Diag_B(klonv, -nsol:nsno) + ! Diag_C : C Diagonal + real Diag_C(klonv, -nsol:nsno) + ! Term_D : Independant Term + real Term_D(klonv, -nsol:nsno) + ! Aux__P : P Auxiliary Variable + real Aux__P(klonv, -nsol:nsno) + ! Aux__Q : Q Auxiliary Variable + real Aux__Q(klonv, -nsol:nsno) + ! Ts_Min, Ts_Max : Temperature Limits + real Ts_Min, Ts_Max + ! Exist0 : Existing Layer Switch + real Exist0 + ! psat_wat, psat_ice, sp, dzVap0 : computation of qsat + real psat_wat, psat_ice, sp, dzVap0 + + ! nt_srf, it_srf, itEuBk : HL Surface Scheme + integer nt_srf, it_srf, itEuBk + ! nt_srf = 10 before + parameter(nt_srf=6) + real agpsrf, xgpsrf, dt_srf, dt_ver + real etaBAK(klonv) + real etaNEW(klonv) + real etEuBk(klonv) + real fac_dt(klonv), faceta(klonv) + real PsiArg(klonv), SHuSol(klonv) +#if(NC) + ! +--OUTPUT for Stand Alone NetCDF File + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Absorbed Solar Radiation + real SOsoKL(klonv) + ! Absorbed IR Radiation + real IRsoKL(klonv) + ! Absorbed Sensible Heat Flux + real HSsoKL(klonv) + ! Absorbed Latent Heat Flux + real HLsoKL(klonv) + ! Evaporation + real HLs_KL(klonv) + ! Transpiration + real HLv_KL(klonv) + common / DumpNC / SOsoKL, IRsoKL, HSsoKL, HLsoKL, HLs_KL, HLv_KL +#endif + + ! +--Internal DATA + ! + ============= + ! eps__3 : Arbitrary Low Number + data eps__3/1.e-3/ + ! mu_exp : Soil Thermal Conductivity + data mu_exp/-0.4343/ + ! mu_min : Min Soil Thermal Conductivity + data mu_min/0.172/ + ! mu_max : Max Soil Thermal Conductivity + data mu_max/2.000/ + ! Ts_Min : Temperature Minimum + data Ts_Min/175./ + ! Ts_Max : Temperature Acceptable Maximum including Snow Melt Energy + data Ts_Max/300./ + + ! +--Heat Conduction Coefficient (zero in the Layers over the highest one) + ! + =========================== + ! + ---------------- isl eta_SV, rho C (isl) + ! + + ! +--Soil ++++++++++++++++ etaMid, mu (isl) + ! + ---- + ! + ---------------- isl-1 eta_SV, rho C (isl-1) + isl = -nsol + do ikl = 1, klonv + mu__dz(ikl, isl) = 0. + ! dt / (dz X rho C) + ! [s / (m.J/m3/K)] + dtC_sv(ikl, isl) = dtz_SV2(isl) * dt__SV & + / ((rocsSV(isotSV(ikl)) & + + rcwdSV * eta_SV(ikl, isl)) & + * LSdzsv(ikl)) + enddo + do isl = -nsol + 1, 0 + do ikl = 1, klonv + ! Soil Type + ist = isotSV(ikl) + ! 1 => Soil + ist__s = min(ist, 1) + ! 1 => Water Body + ist__w = 1 - ist__s + ! eta at layers + ! interface + ! LSdzsv implicit + etaMid = 0.5 * (dz_dSV(isl - 1) * eta_SV(ikl, isl - 1) & + + dz_dSV(isl) * eta_SV(ikl, isl)) & + / dzmiSV(isl) + etaMid = max(etaMid, epsi) + psiMid = psidSV(ist) & + * (etadSV(ist) / etaMid)**bCHdSV(ist) + ! Soil Thermal Conductivity DR97 eq.3.31 + mu_eta = 3.82 * (psiMid)**mu_exp + mu_eta = min(max(mu_eta, mu_min), mu_max) + ! + + ! Water Bodies Correction + mu_eta = ist__s * mu_eta + ist__w * vK_dSV + ! + + mu__dz(ikl, isl) = mu_eta / (dzmiSV(isl) & + * LSdzsv(ikl)) + ! dt / (dz X rho C) + dtC_sv(ikl, isl) = dtz_SV2(isl) * dt__SV & + / ((rocsSV(isotSV(ikl)) & + + rcwdSV * eta_SV(ikl, isl)) & + * LSdzsv(ikl)) + enddo + enddo + + ! +--Soil/Snow Interface + ! + ------------------- + + ! +--Soil Contribution + ! + ^^^^^^^^^^^^^^^^^ + isl = 1 + do ikl = 1, klonv + ist = isotSV(ikl) ! Soil Type + ist__s = min(ist, 1) ! 1 => Soil + ist__w = 1 - ist__s ! 1 => Water Body + psiMid = psidSV(ist) ! Snow => Saturation + mu_eta = 3.82 * (psiMid)**mu_exp ! Soil Thermal + mu_eta = min(max(mu_eta, mu_min), mu_max) ! Conductivity + ! + ! DR97 eq.3.31 + mu_eta = ist__s * mu_eta + ist__w * vK_dSV ! Water Bodies + + ! +--Snow Contribution + ! + ^^^^^^^^^^^^^^^^^ + ! mu_sno : Snow Heat Conductivity Coefficient [Wm/K] + ! (Yen 1981, CRREL Rep., 81-10) + mu_sno(ikl) = CdidSV & + * (ro__SV(ikl, isl) / ro_Wat)**1.88 + mu_sno(ikl) = max(epsi, mu_sno(ikl)) + + ! +--Combined Heat Conductivity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + mu__dz(ikl, isl) = 2./(dzsnSV(ikl, isl) / mu_sno(ikl) + LSdzsv(ikl) * dz_dSV(isl - 1) / mu_eta) + + ! +--Inverted Heat Capacity + ! + ^^^^^^^^^^^^^^^^^^^^^^ + ! dt / (dz X rho C) + dtC_sv(ikl, isl) = dt__SV / max(epsi, dzsnSV(ikl, isl) * ro__SV(ikl, isl) * Cn_dSV) + enddo + + ! +--Snow + ! + ---- + + do ikl = 1, klonv + do isl = 1, min(nsno, isnoSV(ikl) + 1) + ro__SV(ikl, isl) = & + ro__SV(ikl, isl) & + * max(0, min(isnoSV(ikl) - isl + 1, 1)) + enddo + enddo + + do ikl = 1, klonv + do isl = 1, min(nsno, isnoSV(ikl) + 1) + + ! +--Combined Heat Conductivity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + mu_aux = CdidSV & + * (ro__SV(ikl, isl) / ro_Wat)**1.88 + ! Combined Heat Conductivity For upper Layer + mu__dz(ikl, isl) = & + 2.*mu_aux * mu_sno(ikl) & + / max(epsi, dzsnSV(ikl, isl) * mu_sno(ikl) & + + dzsnSV(ikl, isl - 1) * mu_aux) + mu_sno(ikl) = mu_aux + + ! +--Inverted Heat Capacity + ! + ^^^^^^^^^^^^^^^^^^^^^^ + ! dt / (dz X rho C) + dtC_sv(ikl, isl) = dt__SV / max(eps__3, & + dzsnSV(ikl, isl) * ro__SV(ikl, isl) * Cn_dSV) + enddo + enddo + + ! +--Uppermost Effective Layer: NO conduction + ! + ---------------------------------------- + + do ikl = 1, klonv + mu__dz(ikl, isnoSV(ikl) + 1) = 0.0 + enddo + + ! +--Energy Budget (IN) + ! + ================== + do ikl = 1, klonv + ETSo_0(ikl) = 0. + enddo + do isl = -nsol, nsno + do ikl = 1, klonv + Exist0 = isl - isnoSV(ikl) + Exist0 = 1.-max(zero, min(unun, Exist0)) + ETSo_0(ikl) = ETSo_0(ikl) & + + (TsisSV(ikl, isl) - TfSnow) * Exist0 & + / dtC_sv(ikl, isl) + enddo + enddo + + ! +--Tridiagonal Elimination: Set Up + ! + =============================== + + ! +--Soil/Snow Interior + ! + ^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + do isl = -nsol + 1, min(nsno - 1, isnoSV(ikl) + 1) + Elem_A = dtC_sv(ikl, isl) * mu__dz(ikl, isl) + Elem_C = dtC_sv(ikl, isl) * mu__dz(ikl, isl + 1) + Diag_A(ikl, isl) = -Elem_A * Implic + Diag_C(ikl, isl) = -Elem_C * Implic + Diag_B(ikl, isl) = 1.0d+0 - Diag_A(ikl, isl) - Diag_C(ikl, isl) + Term_D(ikl, isl) = Explic * (Elem_A * TsisSV(ikl, isl - 1) & + + Elem_C * TsisSV(ikl, isl + 1)) & + + (1.0d+0 - Explic * (Elem_A + Elem_C)) * TsisSV(ikl, isl) & + + dtC_sv(ikl, isl) * sol_SV(ikl) * SoSosv(ikl) & + * (sEX_sv(ikl, isl + 1) & + - sEX_sv(ikl, isl)) + enddo + enddo + + ! +--Soil lowest Layer + ! + ^^^^^^^^^^^^^^^^^^ + isl = -nsol + do ikl = 1, klonv + Elem_A = 0. + Elem_C = dtC_sv(ikl, isl) * mu__dz(ikl, isl + 1) + Diag_A(ikl, isl) = 0. + Diag_C(ikl, isl) = -Elem_C * Implic + Diag_B(ikl, isl) = 1.0d+0 - Diag_A(ikl, isl) - Diag_C(ikl, isl) + Term_D(ikl, isl) = Explic * Elem_C * TsisSV(ikl, isl + 1) & + + (1.0d+0 - Explic * Elem_C) * TsisSV(ikl, isl) & + + dtC_sv(ikl, isl) * sol_SV(ikl) * SoSosv(ikl) & + * (sEX_sv(ikl, isl + 1) & + - sEX_sv(ikl, isl)) + enddo + + ! +--Snow highest Layer (dummy!) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isl = min(isnoSV(ikl) + 1, nsno) + Elem_A = dtC_sv(ikl, isl) * mu__dz(ikl, isl) + Elem_C = 0. + Diag_A(ikl, isl) = -Elem_A * Implic + Diag_C(ikl, isl) = 0. + Diag_B(ikl, isl) = 1.0d+0 - Diag_A(ikl, isl) + Term_D(ikl, isl) = Explic * Elem_A * TsisSV(ikl, isl - 1) & + + (1.0d+0 - Explic * Elem_A) * TsisSV(ikl, isl) & + + dtC_sv(ikl, isl) * (sol_SV(ikl) * SoSosv(ikl) & + * (sEX_sv(ikl, isl + 1) & + - sEX_sv(ikl, isl))) + enddo + + ! +--Surface: UPwardIR Heat Flux + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isl = isnoSV(ikl) + ! - d(IR)/d(T) + dIRsdT(ikl) = Eso_sv(ikl) * stefan * 4. & + *TsisSV(ikl, isl) & + * TsisSV(ikl, isl) & + * TsisSV(ikl, isl) + IRs__D(ikl) = dIRsdT(ikl) * TsisSV(ikl, isl) * 0.75 +#if(RC) + ! +--Surface: Richardson Number: T Derivative + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + dRidTs(ikl) = -gravit * za__SV(ikl) & + * (1.-Sigmsv(ikl)) & + / (TaT_SV(ikl) * VV__SV(ikl) & + * VV__SV(ikl)) +#endif + ! +--Surface: Turbulent Heat Flux: Factors + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! common factor to HS, HL + f_HSHL(ikl) = rhT_SV(ikl) * (1.-Sigmsv(ikl)) / rah_sv(ikl) + f___HL(ikl) = f_HSHL(ikl) * Lx_H2O(ikl) + + ! +--Surface: Sensible Heat Flux: T Derivative + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + dSdTSV(ikl) = f_HSHL(ikl) * Cp !#- d(HS)/d(T) + ! Richardson Nb. Correct. +#if(RC) + dSdTSV(ikl) = dSdTSV(ikl) & + * (1.0 - (TsisSV(ikl, isl) - TaT_SV(ikl)) & + * dRidTs(ikl) * dFh_sv(ikl) / rah_sv(ikl)) +#endif + HS___D(ikl) = dSdTSV(ikl) * TaT_SV(ikl) + + ! +--Surface: Latent Heat Flux: Saturation Specific Humidity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + sp = (pst_SV(ikl) + ptopSV) * 10. + psat_ice = 6.1070 * exp(6150.*(1./273.16 - 1./tsrf_SV(ikl))) + psat_wat = 6.1078 * exp(5.138 * log(273.16 / tsrf_SV(ikl))) & + * exp(6827.*(1./273.16 - 1./tsrf_SV(ikl))) + + if(tsrf_SV(ikl) <= 273.15) then + qsatsg(ikl) = 0.622 * psat_ice / (sp - 0.378 * psat_ice) + else + qsatsg(ikl) = 0.622 * psat_wat / (sp - 0.378 * psat_wat) + endif + fac_dt(ikl) = f_HSHL(ikl) / (ro_Wat * dz_dSV(0)) + enddo + + ! +--Surface: Latent Heat Flux: Surface Relative Humidity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + xgpsrf = 1.05 + agpsrf = dt__SV * (1.0 - xgpsrf) & + / (1.0 - xgpsrf**nt_srf) + dt_srf = agpsrf + dt_ver = 0. + do ikl = 1, klonv + isl = isnoSV(ikl) + ist = max(0, isotSV(ikl) - 100 * isnoSV(ikl)) ! 0 if H2O + ist__s = min(1, ist) + etaBAK(ikl) = max(epsi, eta_SV(ikl, isl)) + etaNEW(ikl) = etaBAK(ikl) + etEuBk(ikl) = etaNEW(ikl) + enddo + if(ist__s == 1) then ! to reduce computer time + do it_srf = 1, nt_srf + dt_ver = dt_ver + dt_srf + do ikl = 1, klonv + faceta(ikl) = fac_dt(ikl) * dt_srf +#if(VX) + ! Limitation by Atm.Conten NO Limitation of Downw.Flux + faceta(ikl) = faceta(ikl) & + / (1.+faceta(ikl) * dQa_SV(ikl)) + ! *max(0,sign(1.,qsatsg(ikl)-QaT_SV(ikl)))) +#endif + enddo + do itEuBk = 1, 2 + do ikl = 1, klonv + ! 0 if H2O + ist = max(0, isotSV(ikl) - 100 * isnoSV(ikl)) + ! DR97, Eqn 3.34 + Psi(ikl) = & + psidSV(ist) & + * (etadSV(ist) & + / max(etEuBk(ikl), epsi)) & + **bCHdSV(ist) + PsiArg(ikl) = 7.2E-5 * Psi(ikl) + RHuSol(ikl) = exp(-min(argmax, PsiArg(ikl))) + ! DR97, Eqn 3.15 + SHuSol(ikl) = qsatsg(ikl) * RHuSol(ikl) + etEuBk(ikl) = & + (etaNEW(ikl) + faceta(ikl) * (QaT_SV(ikl) & + - SHuSol(ikl) & + * (1.-bCHdSV(ist) & + * PsiArg(ikl)))) & + / (1.+faceta(ikl) * SHuSol(ikl) & + * bCHdSV(ist) & + * PsiArg(ikl) & + / etaNEW(ikl)) + etEuBk(ikl) = etEuBk(ikl) - Rootsv(ikl, 0) & + * dt_srf / (Ro_Wat * dz_dSV(0)) + enddo + enddo + do ikl = 1, klonv + etaNEW(ikl) = max(etEuBk(ikl), epsi) + enddo + dt_srf = dt_srf * xgpsrf + enddo + endif + + ! +--Surface: Latent Heat Flux: Soil/Water Surface Contributions + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isl = isnoSV(ikl) + ! 0 if H2O + ist = max(0, isotSV(ikl) - 100 * isnoSV(ikl)) + ! 1 if no H2O + ist__s = min(1, ist) + ! 1 if H2O + ist__w = 1 - ist__s + ! latent heat flux computation + if(isotSV(ikl) > 1) then + ! to avoid too high flux + etaNEW(ikl) = max(etaNEW(ikl), 0.95 * etaBAK(ikl)) + endif + HL___D(ikl) = (ist__s * ro_Wat * dz_dSV(0) * (etaNEW(ikl) - etaBAK(ikl)) / dt__SV & + + ist__w * f_HSHL(ikl) * (QaT_SV(ikl) - qsatsg(ikl))) * Lx_H2O(ikl) + + dzVap0 = dt__SV * HL___D(ikl) * min(isl, 1) & + / (Lx_H2O(ikl) * max(ro__SV(ikl, isl), epsi)) + + if(isnoSV(ikl) > 0 .and. dzVap0 + dzsnSV(ikl, isl) <= 0) then + ist__s = 0 + do while(dzVap0 + dzsnSV(ikl, isl) <= 0 .and. ist__s <= 10) + ist__s = ist__s + 1 + HL___D(ikl) = HL___D(ikl) * 0.5 + !HL___D(ikl) = HL___D(ikl) *0 ! for MAR-offline + dzVap0 = dt__SV * HL___D(ikl) * min(isl, 1) & + / (Lx_H2O(ikl) * max(ro__SV(ikl, isl), epsi)) + print *, "sisvat_tso.f: HL___D too high on", ii__sv(ikl), jj__sv(ikl), nn__sv(ikl) + enddo + endif + +#if(DL) + RHuSol(ikl) = (QaT_SV(ikl) - HL___D(ikl) / f___HL(ikl)) / qsatsg(ikl) +#endif + + ! +--Surface: Latent Heat Flux: T Derivative + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + dLdTSV(ikl) = 0. + ! - d(HL)/d(T) +#if(DL) + dLdTSV(ikl) = f___HL(ikl) * RHuSol(ikl) * dqs_dT(ikl) + HL___D(ikl) = HL___D(ikl) + dLdTSV(ikl) * TsisSV(ikl, isl) +#endif + enddo + + ! +--Surface: Tridiagonal Matrix Set Up + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isl = isnoSV(ikl) + TSurf0(ikl) = TsisSV(ikl, isl) + Elem_A = dtC_sv(ikl, isl) * mu__dz(ikl, isl) + Elem_C = 0. + Diag_A(ikl, isl) = -Elem_A * Implic + Diag_C(ikl, isl) = 0. + Diag_B(ikl, isl) = 1.0d+0 - Diag_A(ikl, isl) + Diag_B(ikl, isl) = Diag_B(ikl, isl) & + ! Upw. Sol IR + + dtC_sv(ikl, isl) * (dIRsdT(ikl) & + ! HS/Surf.Contr. + + dSdTSV(ikl) & + ! HL/Surf.Contr. + + dLdTSV(ikl)) + Term_D(ikl, isl) = Explic * Elem_A * TsisSV(ikl, isl - 1) & + + (1.0d+0 - Explic * Elem_A) * TsisSV(ikl, isl) + Term_D(ikl, isl) = Term_D(ikl, isl) & + ! Absorbed + + dtC_sv(ikl, isl) * (sol_SV(ikl) * SoSosv(ikl) & + ! Solar + * (sEX_sv(ikl, isl + 1) & + - sEX_sv(ikl, isl)) & + ! Down Atm IR + + tau_sv(ikl) * IRd_SV(ikl) * Eso_sv(ikl) & + ! Down Veg IR + - (1.0 - tau_sv(ikl)) * 0.5 * IRv_sv(ikl) & + ! Upw. Sol IR + + IRs__D(ikl) & + ! HS/Atmo.Contr. + + HS___D(ikl) & + ! HL/Atmo.Contr. + + HL___D(ikl)) + enddo + + ! +--Tridiagonal Elimination + ! + ======================= + + ! +--Forward Sweep + ! + ^^^^^^^^^^^^^^ + do ikl = 1, klonv + Aux__P(ikl, -nsol) = Diag_B(ikl, -nsol) + Aux__Q(ikl, -nsol) = -Diag_C(ikl, -nsol) / Aux__P(ikl, -nsol) + enddo + + do ikl = 1, klonv + do isl = -nsol + 1, min(nsno, isnoSV(ikl) + 1) + Aux__P(ikl, isl) = Diag_A(ikl, isl) * Aux__Q(ikl, isl - 1) & + + Diag_B(ikl, isl) + Aux__Q(ikl, isl) = -Diag_C(ikl, isl) / Aux__P(ikl, isl) + enddo + enddo + + do ikl = 1, klonv + TsisSV(ikl, -nsol) = Term_D(ikl, -nsol) / Aux__P(ikl, -nsol) + enddo + + do ikl = 1, klonv + do isl = -nsol + 1, min(nsno, isnoSV(ikl) + 1) + TsisSV(ikl, isl) = (Term_D(ikl, isl) & + - Diag_A(ikl, isl) * TsisSV(ikl, isl - 1)) & + / Aux__P(ikl, isl) + enddo + enddo + + ! +--Backward Sweep + ! + ^^^^^^^^^^^^^^ + zt = 0.; ti = 0; izt = 1 + do ikl = 1, klonv + do isl = isnoSV(ikl), 1, -1 + zt(ikl) = zt(ikl) + dzsnSV(ikl, isl) + ti(ikl) = ti(ikl) + dzsnSV(ikl, isl) * TsisSV(ikl, isl) + if(zt(ikl) > 5) izt(ikl) = max(izt(ikl), isl) + enddo + ti(ikl) = min(271.15, ti(ikl) / max(0.01, zt(ikl))) + do isl = min(nsno - 1, isnoSV(ikl) + 1), -nsol, -1 + TsisSV(ikl, isl) = Aux__Q(ikl, isl) * TsisSV(ikl, isl + 1) & + + TsisSV(ikl, isl) + if(isl == 0 .and. isnoSV(ikl) == 0) then + + TsisSV(ikl, isl) = min(TaT_SV(ikl) + 30, TsisSV(ikl, isl)) + TsisSV(ikl, isl) = max(TaT_SV(ikl) - 30, TsisSV(ikl, isl)) +#if(EU) + if(ivgtSV(ikl) /= 13) then ! city + TsisSV(ikl, isl) = min(TaT_SV(ikl) + 10., TsisSV(ikl, isl)) + endif + TsisSV(ikl, isl) = max(TaT_SV(ikl) - 15., TsisSV(ikl, isl)) + ! XF 18/11/2018 to avoid ST reaching 70C!! + ! It is an error compensation but does not work over tundra +#endif + endif + if(zt(ikl) > 15 .and. isl <= 0) then ! ice sheet + TsisSV(ikl, isl) = max(223.15, min(ti(ikl), TsisSV(ikl, isl))) + eta_SV(ikl, isl) = epsi + endif + enddo + enddo + + ! +--Temperature Limits (avoids problems in case of no Snow Layers) + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isl = isnoSV(ikl) + dTSurf = TsisSV(ikl, isl) - TSurf0(ikl) + ! 180.0 dgC/hr = 0.05 dgC/s + TsisSV(ikl, isl) = TSurf0(ikl) + sign(1., dTSurf) & + * min(abs(dTSurf), 5.e-2 * dt__SV) + enddo + do ikl = 1, klonv + do isl = min(nsno, isnoSV(ikl) + 1), 1, -1 + TsisSV(ikl, isl) = max(Ts_Min, TsisSV(ikl, isl)) + TsisSV(ikl, isl) = min(Ts_Max, TsisSV(ikl, isl)) + enddo + + if(zt(ikl) > 15 .and. isnoSV(ikl) > 4) then + ww = 3600.*24.*30./dt__SV ! 1 month + do isl = 1, min(izt(ikl), isnoSV(ikl) - 1) + if(TsisSV(ikl, isl + 1) < TsisSV(ikl, isl)) then + TsisSV(ikl, isl) = max(0.999 * TsisSV(ikl, isl), & + min(1.001 * TsisSV(ikl, isl), & + (TsisSV(ikl, isl) * dzsnSV(ikl, isl) * ww & + + TsisSV(ikl, isl + 1) * dzsnSV(ikl, isl + 1)) & + / (dzsnSV(ikl, isl) * ww & + + dzsnSV(ikl, isl + 1)))) + TsisSV(ikl, isl + 1) = min(1.001 * TsisSV(ikl, isl + 1) & + , max(0.999 * TsisSV(ikl, isl + 1), & + (TsisSV(ikl, isl) * dzsnSV(ikl, isl) & + + TsisSV(ikl, isl + 1) * dzsnSV(ikl, isl + 1) * ww) & + / (dzsnSV(ikl, isl) & + + ww * dzsnSV(ikl, isl + 1)))) + + endif + enddo + if(ro__SV(ikl, 1) > 600 .and. TsisSV(ikl, 1) > 273.1) then + TsisSV(ikl, 1) = (TsisSV(ikl, 1) * dzsnSV(ikl, 1) & + + TsisSV(ikl, 2) * dzsnSV(ikl, 2)) / & + (dzsnSV(ikl, 1) + dzsnSV(ikl, 2)) + endif + if(ro__SV(ikl, 2) > 600 .and. TsisSV(ikl, 2) > 273.1) then + TsisSV(ikl, 2) = (TsisSV(ikl, 1) * dzsnSV(ikl, 1) & + + TsisSV(ikl, 2) * dzsnSV(ikl, 2) & + + TsisSV(ikl, 3) * dzsnSV(ikl, 3)) / & + (dzsnSV(ikl, 1) + dzsnSV(ikl, 2) + dzsnSV(ikl, 3)) + endif + endif + enddo + + ! +--Update Surface Fluxes + ! + ======================== + do ikl = 1, klonv + isl = isnoSV(ikl) + IRs_SV(ikl) = IRs__D(ikl) - dIRsdT(ikl) * TsisSV(ikl, isl) + ! Sensible Heat Downward > 0 + HSs_sv(ikl) = HS___D(ikl) - dSdTSV(ikl) * TsisSV(ikl, isl) + ! Latent Heat Downward > 0 + HLs_sv(ikl) = HL___D(ikl) - dLdTSV(ikl) * TsisSV(ikl, isl) +#if(NC) + ! +--OUTPUT for Stand Alone NetCDF File + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! Absorbed Sol. + SOsoKL(ikl) = sol_SV(ikl) * SoSosv(ikl) + ! Up Surf. IR + ! Down Atm IR + ! Down Veg IR + IRsoKL(ikl) = IRs_SV(ikl) & + + tau_sv(ikl) * IRd_SV(ikl) * Eso_sv(ikl) & + - (1.0 - tau_sv(ikl)) * 0.5 * IRv_sv(ikl) + ! HS + HSsoKL(ikl) = HSs_sv(ikl) + ! HL + HLsoKL(ikl) = HLs_sv(ikl) + ! mm w.e./sec + HLs_KL(ikl) = HLs_sv(ikl) / Lv_H2O +#endif + enddo + + ! +--Energy Budget (OUT) + ! + =================== + do ikl = 1, klonv + ! Net Solar + ! Up Surf. IR + ! Down Atm IR + ! Down Veg IR + ! Sensible + ! Latent + ETSo_d(ikl) = (SoSosv(ikl) * sol_SV(ikl) & + + IRs_SV(ikl) & + + tau_sv(ikl) * IRd_SV(ikl) * Eso_sv(ikl) & + - (1.0 - tau_sv(ikl)) * 0.5 * IRv_sv(ikl) & + + HSs_sv(ikl) & + + HLs_sv(ikl)) + ETSo_1(ikl) = 0. + enddo + do isl = -nsol, nsno + do ikl = 1, klonv + Exist0 = isl - isnoSV(ikl) + Exist0 = 1.-max(zero, min(unun, Exist0)) + ETSo_1(ikl) = ETSo_1(ikl) + (TsisSV(ikl, isl) - TfSnow) * Exist0 / dtC_sv(ikl, isl) + enddo + enddo + + return +endsubroutine SISVAT_TSo diff --git a/MAR/code_mar/sisvat_tvg.f90 b/MAR/code_mar/sisvat_tvg.f90 new file mode 100644 index 0000000000000000000000000000000000000000..433f68710863b3b6296857a9e85bfa928968b068 --- /dev/null +++ b/MAR/code_mar/sisvat_tvg.f90 @@ -0,0 +1,378 @@ +#include "MAR_pp.def" +subroutine SISVAT_TVg(ETVg_d) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_TVg 13-09-2003 MAR | + ! | subroutine SISVAT_TVg computes the Canopy Energy Balance | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: ivgtSV = 0,...,12: Vegetation Type | + ! | ^^^^^ 0: Water, Solid or Liquid | + ! | isnoSV = total Nb of Ice/Snow Layers | + ! | | + ! | INPUT: sol_SV : Downward Solar Radiation [W/m2] | + ! | ^^^^^ IRd_SV : Surface Downward Longwave Radiation [W/m2] | + ! | TaT_SV : SBL Top Temperature [K] | + ! | rhT_SV : SBL Top Air Density [kg/m3] | + ! | QaT_SV : SBL Top Specific Humidity [kg/kg] | + ! | psivSV : Leaf Water Potential [m] | + ! | IRs_SV : Soil IR Flux (previous time step) [W/m2] | + ! | dt__SV : Time Step [s] | + ! | | + ! | SoCasv : Absorbed Solar Radiation by Canopy (Normaliz)[-] | + ! | tau_sv : Fraction of Radiation transmitted by Canopy [-] | + ! | Evg_sv : Soil+Vegetation Emissivity [-] | + ! | Eso_sv : Soil+Snow Emissivity [-] | + ! | rah_sv : Aerodynamic Resistance for Heat [s/m] | + ! | Sigmsv : Canopy Ventilation Factor [-] | + ! | LAI_sv : Leaf Area Index [-] | + ! | LAIesv : Leaf Area Index (effective / transpiration) [-] | + ! | glf_sv : Green Leaf Fraction of NOT fallen Leaves [-] | + ! | rrMxsv : Canopy Maximum Intercepted Rain [kg/m2] | + ! | | + ! | INPUT / TvegSV : Canopy Temperature [K] | + ! | OUTPUT: rrCaSV : Canopy Water Content [kg/m2] | + ! | ^^^^^^ | + ! | | + ! | OUTPUT: IRv_sv : Vegetation IR Flux [W/m2] | + ! | ^^^^^^ HSv_sv : Sensible Heat Flux [W/m2] | + ! | HLv_sv : Latent Heat Flux [W/m2] | + ! | Evp_sv : Evaporation [kg/m2] | + ! | EvT_sv : Evapotranspiration [kg/m2] | + ! | ETVg_d : Vegetation Energy Power Forcing [W/m2] | + ! | | + ! | Internal Variables: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | | + ! | METHOD: The Newton-Raphson Scheme is preferable | + ! | ^^^^^^ when computing over a long time step the heat content | + ! | of a medium having a very small or zero heat capacity. | + ! | This is to handle strong non linearities arising | + ! | in conjunction with rapid temperature variations. | + ! | | + ! | # OPTIONS: #NN: Newton-Raphson Increment not added in last Iteration | + ! | # ^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use marxsv + use marysv + + implicit none + + ! +--Global Variables + ! + ================ + + ! +--OUTPUT + ! + ------ + + real ETVg_d(klonv) ! VegetationPower, Forcing +#if(NC) + ! +--OUTPUT for Stand Alone NetCDF File + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! SOsoKL : Absorbed Solar Radiation + real SOsoKL(klonv) + ! IRsoKL : Absorbed IR Radiation + real IRsoKL(klonv) + ! HSsoKL : Absorbed Sensible Heat Flux + real HSsoKL(klonv) + ! HLsoKL : Absorbed Latent Heat Flux + real HLsoKL(klonv) + ! HLs_KL : Evaporation + real HLs_KL(klonv) + ! HLv_KL : Transpiration + real HLv_KL(klonv) + common / DumpNC / SOsoKL, IRsoKL, HSsoKL, HLsoKL, HLs_KL, HLv_KL +#endif + + ! +--Internal Variables + ! + ================== + ! ikl : Grid Point Index + integer ikl + ! nitmax, nit : Iterations Counter + integer nitmax, nit + ! d_Tveg : Canopy Temperat. Increment + real d_Tveg + ! dTvMAX : Canopy Temperat. Increment MAX + real dTvMAX + ! dHvdTv : Derivativ.of Canopy Energ.Budg. + real dHvdTv + ! Hv_Tv0 : Imbalance of Canopy Energ.Budg. + real Hv_Tv0 + ! Hv_MAX : MAX Imbal.of Canopy Energ.Budg. + real Hv_MAX + ! Hv_MIN : MIN Imbal.of Canopy Energ.Budg. + real Hv_MIN + ! Hswich : Newton-Raphson Switch + real Hswich + ! Tveg_0 : Canopy Temperature, Previous t + real Tveg_0(klonv) + ! tau_Ca : Canopy IR Radiation Absorption + real tau_Ca + ! IR_net : InfraRed NET(t) + real IR_net + ! dIRdTv : InfraRed NET(t), Derivative(t) + real dIRdTv(klonv) + ! dHSdTv : Sensible Heat FL. Derivative(t) + real dHSdTv(klonv) + ! dHLdTv : Latent Heat FL. Derivative(t) + real dHLdTv(klonv) +#if(HC) + ! dHCdTv : Heat Storage + real dHCdTv(klonv) +#endif + ! EvFrac : Condensat./Transpirat. Switch + real EvFrac + ! SnoMsk : Canopy Snow Switch + real SnoMsk + ! den_qs, arg_qs, qsatvg : Canopy Saturat. Spec. Humidity + real den_qs, arg_qs, qsatvg + ! dqs_dT : d(qsatvg)/dTv + real dqs_dT + ! FacEvp, FacEvT, Fac_Ev : Evapo(transpi)ration Factor + real FacEvp, FacEvT, Fac_Ev + ! dEvpdT, dEvTdT : Evapo(transpi)ration Derivative + real dEvpdT(klonv), dEvTdT(klonv) + ! F_Stom : Funct. (Leaf Water Potential) + real F_Stom + ! R0Stom : Minimum Stomatal Resistance + real R0Stom + ! R_Stom : Stomatal Resistance + real R_Stom + ! LAI_OK : 1. ==> Leaves exist + real LAI_OK + ! rrCaOK, snCaOK, dEvpOK : Positive Definiteness Correct. + real rrCaOK, snCaOK, dEvpOK + + ! +--Internal DATA + ! + ============= + ! nitmax : Maximum Iterations Number + data nitmax/5/ + ! dTvMAX : Canopy Temperat. Increment MAX + data dTvMAX/5./ + ! Hv_MIN : MIN Imbal. of Surf.Energy Budg. + data Hv_MIN/0.1/ + ! SnoMsk : Canopy Snow Switch (Default) + data SnoMsk/0.0/ + + ! +--Newton-Raphson Scheme + ! + ===================== + nit = 0 +101 continue + nit = nit + 1 + HV_MAX = 0. + ! +--Temperature of the Previous Time Step + ! + ------------------------------------- + do ikl = 1, klonv + Tveg_0(ikl) = TvegSV(ikl) + ! +--IR Radiation Absorption + ! + ----------------------- + ! Canopy Absorption + tau_Ca = 1.-tau_sv(ikl) + ! Downward IR (OUT) + Upward IR (OUT) + IRv_sv(ikl) = -2.0 * Evg_sv(ikl) * stefan & + * TvegSV(ikl) * TvegSV(ikl) & + * TvegSV(ikl) * TvegSV(ikl) + ! Downward IR (OUT) + Upward IR (OUT) + dIRdTv(ikl) = & + -Evg_sv(ikl) * & + 8.*stefan * TvegSV(ikl) * TvegSV(ikl) & + * TvegSV(ikl) + ! Downward IR (IN) - Upward IR (IN) + IR (OUT) + IR_net = tau_Ca * (Evg_sv(ikl) * IRd_SV(ikl) & + - IRs_SV(ikl) & + + IRv_sv(ikl)) + ! +--Sensible Heat Flux + ! + ------------------ + ! Derivative, t(n) + dHSdTv(ikl) = rhT_SV(ikl) * Sigmsv(ikl) * Cp & + / rah_sv(ikl) + ! Value, t(n) + HSv_sv(ikl) = dHSdTv(ikl) & + * (TaT_SV(ikl) - TvegSV(ikl)) + ! +--Latent Heat Flux + ! + ------------------ + + ! +--Canopy Saturation Specific Humidity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + den_qs = TvegSV(ikl) - 35.8 + arg_qs = 17.27 * (TvegSV(ikl) - 273.16) / den_qs + qsatvg = .0038 * exp(arg_qs) + dqs_dT = qsatvg * 4099.2 / (den_qs * den_qs) + + ! +--Canopy Stomatal Resistance + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! Min Stomatal R. + R0Stom = min(StodSV(ivgtSV(ikl)) & + / max(epsi, glf_sv(ikl)), StxdSV) + ! F(Leaf Wat.Pot.) DR97, eqn. 3.22 + F_Stom = pscdSV / max(pscdSV - psivSV(ikl), epsi) + ! Can.Stomatal R. DR97, eqn. 3.21 + R_Stom = (R0Stom / max(LAIesv(ikl), R0Stom / StxdSV)) & + * F_Stom + + ! +--Evaporation / Evapotranspiration + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SnoMsk = max(zero, sign(unun, snCaSV(ikl) - eps_21)) + ! Condensation/ + EvFrac = max(zero, sign(unun, QaT_SV(ikl) - qsatvg)) + ! Transpiration Switch + EvFrac = EvFrac & + + (1.-EvFrac) * ((1 - SnoMsk) * rrCaSV(ikl) & + / rrMxsv(ikl) & + + SnoMsk * min(unun, snCaSV(ikl) & + / rrMxsv(ikl))) + ! Idem, Factor + Fac_Ev = rhT_SV(ikl) * Sigmsv(ikl) + FacEvp = Fac_Ev * EvFrac / rah_sv(ikl) + ! Evaporation + Evp_sv(ikl) = FacEvp * (qsatvg - QaT_SV(ikl)) + ! Evp Derivative + dEvpdT(ikl) = FacEvp * dqs_dT + FacEvt = Fac_Ev * (1.-EvFrac) / (rah_sv(ikl) & + + R_Stom * Sigmsv(ikl)) + ! EvapoTranspir. + EvT_sv(ikl) = FacEvt * (qsatvg - QaT_SV(ikl)) + ! EvT Derivative + dEvTdT(ikl) = FacEvt * dqs_dT + ! Latent Heat (Subli.Contrib.) + HLv_sv(ikl) = -Lv_H2O * (Evp_sv(ikl) + EvT_sv(ikl)) & + - Lf_H2O * Evp_sv(ikl) * SnoMsk + dHLdTv(ikl) = Lv_H2O * (dEvpdT(ikl) + dEvTdT(ikl)) & + + Lf_H2O * dEvpdT(ikl) * SnoMsk +#if(HC) + ! Heat Storage + dHCdTv(ikl) = Cn_dSV * snCaSV(ikl) / dt__SV +#endif + + ! +--Imbalance of the Canopy Energy Budget + ! + --------------------------------------- + ! NO Budget if no Leaves + LAI_OK = max(zero, & + sign(unun, LAI_sv(ikl) - eps_21)) + ! Absorbed Solar + ! NET IR + ! Sensible Heat + ! Latent Heat + Hv_Tv0 = (SoCasv(ikl) * sol_SV(ikl) & + + IR_net & + + HSv_sv(ikl) & + + HLv_sv(ikl) & + ) * LAI_OK + ! Veg.Energ.Bal. + ETVg_d(ikl) = Hv_Tv0 + ! + + Hswich = unun +#if(NN) + ! Newton-Raphson Switch + Hswich = max(zero, & + sign(unun, abs(Hv_Tv0) & + - Hv_MIN)) +#endif + + ! +--Derivative of the Canopy Energy Budget + ! + --------------------------------------- + + dHvdTv = dIRdTv(ikl) * max(eps_21, tau_Ca) & + - dHSdTv(ikl) & + - dHLdTv(ikl) +#if(HC) + dHvdTv = dHvdTv - dHCdTv(ikl) +#endif + + ! +--Update Canopy and Surface/Canopy Temperatures + ! + --------------------------------------------- + + d_Tveg = Hv_Tv0 / dHvdTv + ! Increment Limitor + d_Tveg = sign(unun, d_Tveg) & + * min(abs(d_Tveg), dTvMAX) + ! Newton-Raphson + TvegSV(ikl) = TvegSV(ikl) - Hswich * d_Tveg + Hv_MAX = max(Hv_MAX, abs(Hv_Tv0)) + + ! +--Update Vegetation Fluxes + ! + ------------------------ +#if(NN) + ! Emitted IR + IRv_sv(ikl) = IRv_sv(ikl) - dIRdTv(ikl) * d_Tveg + ! Sensible Heat + HSv_sv(ikl) = HSv_sv(ikl) + dHSdTv(ikl) * d_Tveg + ! Evapotranspir. + Evp_sv(ikl) = Evp_sv(ikl) - dEvpdT(ikl) * d_Tveg + ! Evapotranspir. + EvT_sv(ikl) = EvT_sv(ikl) - dEvTdT(ikl) * d_Tveg + ! Latent Heat + HLv_sv(ikl) = HLv_sv(ikl) + dHLdTv(ikl) * d_Tveg +#endif + ! + + IRv_sv(ikl) = IRv_sv(ikl) * LAI_OK + HSv_sv(ikl) = HSv_sv(ikl) * LAI_OK + Evp_sv(ikl) = Evp_sv(ikl) * LAI_OK + EvT_sv(ikl) = EvT_sv(ikl) * LAI_OK + HLv_sv(ikl) = HLv_sv(ikl) * LAI_OK + enddo + +#if(IX) + if(nit < nitmax) go to 101 +#endif + if(Hv_MAX > Hv_MIN .and. nit < nitmax) go to 101 + + do ikl = 1, klonv + ! Emitted IR + IRv_sv(ikl) = IRv_sv(ikl) & + + dIRdTv(ikl) * (TvegSV(ikl) - Tveg_0(ikl)) + ! Sensible Heat + HSv_sv(ikl) = HSv_sv(ikl) & + - dHSdTv(ikl) * (TvegSV(ikl) - Tveg_0(ikl)) + ! Evaporation + Evp_sv(ikl) = Evp_sv(ikl) & + + dEvpdT(ikl) * (TvegSV(ikl) - Tveg_0(ikl)) + ! Transpiration + EvT_sv(ikl) = EvT_sv(ikl) & + + dEvTdT(ikl) * (TvegSV(ikl) - Tveg_0(ikl)) + ! Latent Heat + HLv_sv(ikl) = HLv_sv(ikl) & + - dHLdTv(ikl) * (TvegSV(ikl) - Tveg_0(ikl)) + + ! +--OUTPUT for Stand Alone NetCDF File + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#if(NC) + HLv_KL(ikl) = HLv_sv(ikl) +#endif + + ! +--Update Canopy Water Content + ! + --------------------------- + + rrCaSV(ikl) = rrCaSV(ikl) - (1.-SnoMsk) * Evp_sv(ikl) * dt__SV + snCaSV(ikl) = snCaSV(ikl) - SnoMsk * Evp_sv(ikl) * dt__SV + + ! +--Correction for Positive Definiteness (see WKarea/EvpVeg/EvpVeg.f) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + rrCaOK = max(rrCaSV(ikl), 0.) + snCaOK = max(snCaSV(ikl), 0.) + dEvpOK = (rrCaOK - rrCaSV(ikl) & + + snCaOK - snCaSV(ikl)) / dt__SV + + ! Evaporation + Evp_sv(ikl) = Evp_sv(ikl) - dEvpOK + ! Latent Heat + HLv_sv(ikl) = HLv_sv(ikl) & + + (1.-SnoMsk) * Lv_H2O * dEvpOK & + + SnoMsk * (Lv_H2O + Lf_H2O) * dEvpOK + + rrCaSV(ikl) = rrCaOK + snCaSV(ikl) = snCaOK + + wee_SV(ikl, 2) = wee_SV(ikl, 2) + dt__SV * EvT_sv(ikl) + wee_SV(ikl, 1) = wee_SV(ikl, 1) + dt__SV * Evp_sv(ikl) + + enddo + + return +endsubroutine SISVAT_TVg diff --git a/MAR/code_mar/sisvat_vgt_albedo.f90 b/MAR/code_mar/sisvat_vgt_albedo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5810b0cfa8e12e048eb9118a87eff50b65cf7d44 --- /dev/null +++ b/MAR/code_mar/sisvat_vgt_albedo.f90 @@ -0,0 +1,424 @@ +#include "MAR_pp.def" +subroutine VgOptP + ! +------------------------------------------------------------------------+ + ! | MAR/SISVAT VgOptP 8-03-2022 MAR | + ! | subroutine VgOptP computes the Canopy optical Properties | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental Grid Boxes | + ! | X Number of Mosaic Cell per Grid Box | + ! | | + ! | INPUT: ivgtSV = 0,...,12: Vegetation Type | + ! | ^^^^^ 0: Water, Solid or Liquid | + ! | | + ! | INPUT: coszSV : Cosine of the Sun Zenithal Distance [-] | + ! | ^^^^^ sol_SV : Surface Downward Solar Radiation [W/m2] | + ! | snCaSV : Canopy Snow Thickness [mm w.e.] | + ! | | + ! | LAI_sv : Leaf Area Index (snow included) [-] | + ! | glf_sv : Green Leaf Fraction of NOT fallen Leaves [-] | + ! | albisv : Snow/Ice/Water/Soil Integrated Albedo [-] | + ! | | + ! | OUTPUT: alb_SV : Surface-Canopy Albedo [-] | + ! | ^^^^^^ SoCasv : Absorbed Solar Radiation by Canopy (Normaliz)[-] | + ! | SoSosv : Absorbed Solar Radiation by Surfac (Normaliz)[-] | + ! | LAIesv : Effective Leaf Area Index for Transpiration [-] | + ! | | + ! | Internal Variables: Normalized Values: | + ! | ^^^^^^^^^^^^^^^^^^ | + ! | u0_Vis : Upward Visible Radiation at Top Canopy [-] | + ! | absg_V : Absorbed Visible Radiation by the Ground [-] | + ! | absv_V : Absorbed Visible Radiation by the Canopy [-] | + ! | u0_nIR : Upward Near IR Radiation at Top Canopy [-] | + ! | absgnI : Absorbed Near IR Radiation by the Ground [-] | + ! | absv_V : Absorbed Near IR Radiation by the Canopy [-] | + ! | | + ! | REFERENCE: De Ridder, 1997, unpublished thesis, chapter 2 (DR97,2) | + ! | ^^^^^^^^^ | + ! | | + ! | ASSUMPTIONS: Leaf Inclination Index chi_l (eqn2.49 DR97) set to zero | + ! | ^^^^^^^^^^^ for all vegetation types | + ! | Radiation Fluxes are normalized | + ! | with respect to incoming solar radiation (=I0+D0) | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use marxsv + use marysv + + implicit none + + ! +--Internal Variables + ! + ================== + + integer ikl, kri + + real exdRad, k_drad, k___sv(klonv) + real e_prad, e1pRad + real zv_fac, zv1fac, deadLF + real T_Rad0, A_Rad0, A0__sv(klonv) + real r0_Rad, t0_Rad, nu_Rad + real Tr_Rad, Re_Rad, r__Rad, t__Rad, t1_Rad + real arggam, gamma, gamasv(klonv), gammaL + real denSig, Sig__c, Sigcsv(klonv) + real DDifH1, DDifC1, C1__sv(klonv) + real DDifH2, DDifC2, C2__sv(klonv) + real denS_s, denS_a, den_c1, DDif_L + real u0_Vis, absg_V, absv_V + real u0_nIR, absgnI, absvnI + real argexg, argexk, criLAI(klonv) + real residu, d_DDif, dDDifs, dDDifa + + ! +--Internal DATA + ! + ============= + + integer nvgt + parameter(nvgt=13) + real reVisL(0:nvgt) ! Reflectivity / Visible / Live Leaves + real renIRL(0:nvgt) ! Reflectivity / Near IR / Live Leaves + real trVisL(0:nvgt) ! Transmitivity / Visible / Live Leaves + real trnIRL(0:nvgt) ! Transmitivity / Near IR / Live Leaves + real reVisD(0:nvgt) ! Reflectivity / Visible / Dead Leaves + real renIRD(0:nvgt) ! Reflectivity / Near IR / Dead Leaves + real trVisD(0:nvgt) ! Transmitivity / Visible / Dead Leaves + real trnIRD(0:nvgt) ! Transmitivity / Near IR / Dead Leaves + + real reVisS ! Reflectivity / Visible / Canopy Snow + real renIRS ! Reflectivity / Near IR / Canopy Snow + real trVisS ! Transmitivity / Visible / Canopy Snow + real trnIRS ! Transmitivity / Near IR / Canopy Snow + + real snCaMx ! Canopy Snow Thickness for having Snow + ! ! Snow Reflectivity and Transmitivity + real CriStR ! Critical Radiation Stomatal Resistance + real alb_SV_old + + integer ivg + + DATA(reVisL(ivg), renIRL(ivg), trVisL(ivg), trnIRL(ivg), & + reVisD(ivg), renIRD(ivg), trVisD(ivg), trnIRD(ivg), ivg=0, nvgt) & + ! 0 NO VEGETATION + / 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 1 CROPS LOW + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 2 CROPS MEDIUM + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 3 CROPS HIGH + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 4 GRASS LOW + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 5 GRASS MEDIUM + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 6 GRASS HIGH + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38, & + ! 7 BROADL LOW + 0.10, 0.45, 0.05, 0.25, 0.16, 0.39, 0.01, 0.01, & + ! 8 BROADL MEDIUM + 0.10, 0.45, 0.05, 0.25, 0.16, 0.39, 0.01, 0.01, & + ! 9 BROADL HIGH + 0.10, 0.45, 0.05, 0.25, 0.16, 0.39, 0.01, 0.01, & + ! 10 NEEDLE LOW + 0.07, 0.35, 0.05, 0.10, 0.10, 0.39, 0.01, 0.01, & + ! 11 NEEDLE MEDIUM + 0.07, 0.35, 0.05, 0.10, 0.10, 0.39, 0.01, 0.01, & + ! 12 NEEDLE HIGH + 0.07, 0.35, 0.05, 0.10, 0.10, 0.39, 0.01, 0.01, & + ! 13 City + 0.11, 0.58, 0.07, 0.25, 0.36, 0.58, 0.22, 0.38 / + + DATA & + reVisS, renIRS, trVisS, trnIRS & + /0.85, 0.85, 0.00, 0.00/! + ! + REMARK: Possible Refinement by taking actual Surface Snow Reflectivities + ! + ^^^^^^ + + DATA snCaMx/0.5/ + + DATA CriStR/25./ + + ! +--General Parameters, Solar Radiation Absorption + ! + ============================================== + + do ikl = 1, klonv + +#if(sv) + if(ifraSV(ikl) > 0) then +#endif + + ! absorbed irradiance fraction + k_dRad = 0.5 / max(coszSV(ikl), epsi) + ! exponential argument, + ! V/nIR radiation partitioning, + ! DR97, 2, eqn (2.53) & (2.54) + e_pRad = 2.5 * coszSV(ikl) + ! exponential, Irradi. Absorpt. + exdRad = exp(-k_dRad * LAI_sv(ikl)) + ! exponential, V/nIR Rad. Part. + e1pRad = 1.-exp(-e_pRad) + + ! Vegetation Type + ivg = ivgtSV(ikl) + ! Contribution of Snow to Leaf Reflectivity and Transmissiv. + zv_fac = min(snCaSV(ikl) / snCaMx & + , unun) + zv1fac = 1.-zv_fac + ! Dead Leaf Fraction + deadLF = 1.-glf_sv(ikl) + + ! +--Visible Part of the Solar Radiation Spectrum (V, 0.4--0.7mi.m) + ! + ================================================================ + + A_Rad0 = 0.25 + 0.697 * e1pRad ! Absorbed Vis. Radiation + T_Rad0 = 1.-A_Rad0 ! Transmitted Vis Radiation + + ! +--Reflectivity, Transmissivity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Re_Rad = glf_sv(ikl) * ReVisL(ivg) & + + deadLF * ReVisD(ivg) + Tr_Rad = glf_sv(ikl) * TrVisL(ivg) & + + deadLF * TrVisD(ivg) + + ! +--Adaptation to Snow + ! + ^^^^^^^^^^^^^^^^^^ + Re_Rad = zv1fac * Re_Rad + zv_fac * reVisS + Tr_Rad = zv1fac * Tr_Rad + zv_fac * trVisS + + ! +--Scattering /DR97, 2, eqn (2.26) and (2.27) ! Diffuse Radiation: + ! + ^^^^^^^^^^ ! ^^^^^^^^^^^^^^^^^^ + r__Rad = (2.*Re_Rad + Tr_Rad) / 3. ! Upw. Scatter.Fract. + t__Rad = (Re_Rad + 2.*Tr_Rad) / 3. ! Downw.Scatter.Fract. + + t1_Rad = 1.-t__Rad ! + arggam = t1_Rad * t1_Rad - r__Rad * r__Rad ! + arggam = max(arggam, zero) ! + gamma = sqrt(arggam) ! eqn (2.39) + gammaL = min(gamma * LAI_sv(ikl), 40.0) ! + DDifH1 = exp(gammaL) ! Downw.Diffus.Solut.1 + DDifH2 = exp(-gammaL) ! Downw.Diffus.Solut.2 + ! + REMARK: These 2 contributions are zero in case of 0 Reflectivity + ! + ^^^^^^ + + ! +--Scattering /DR97, 2, eqn (2.19) and (2.20) ! Direct Radiation: + ! + ^^^^^^^^^^ ! ^^^^^^^^^^^^^^^^^^ + ! Upw. Scatter.Fract. + r0_Rad = 0.5 * ((Re_Rad + Tr_Rad) * k_dRad & + + (Re_Rad - Tr_Rad) / 3.) ! + t0_Rad = 0.5 * ((Re_Rad + Tr_Rad) * k_dRad & + ! Downw.Scatter.Fract. + - (Re_Rad - Tr_Rad) / 3.) + ! nu coeff., eqn 2.43 + nu_Rad = t1_Rad - r__Rad * albisv(ikl) + ! eqn (2.43) Denomin. + !(Constant for DDifH1) + den_c1 = gamma * (DDifH1 + DDifH2) & + + nu_Rad * (DDifH1 - DDifH2) + + ! eqn (2.40) Denomin. + denSig = gamma * gamma - k_dRad * k_dRad + denS_s = sign(unun, denSig) + denS_a = abs(denSig) + denSig = max(epsi, denS_a) * denS_s + ! sigma_c, eqn (2.40) + Sig__c = (r__Rad * r0_Rad & + + t0_Rad * (k_dRad + t1_Rad)) / denSig + + DDifC1 = ((gamma - nu_Rad) * (T_Rad0 - Sig__c * A_Rad0) * DDifH2 & + + ((k_dRad - nu_Rad) * Sig__c & + + t0_Rad + r__Rad * albisv(ikl)) * A_Rad0 * exdRad) & + / max(den_c1, epsi) + DDifC2 = T_Rad0 - DDifC1 - Sig__c * A_Rad0 + + ! +--Visible Diffuse Fluxes + ! + ^^^^^^^^^^^^^^^^^^^^^^ + ! DOWNward, Canopy Basis + DDif_L = DDifC1 * DDifH1 + DDifC2 * DDifH2 & + + Sig__c * A_Rad0 * exdRad + ! UPward Canopy Top + u0_Vis = ((gamma + t1_Rad) * DDifC1 & + - (gamma - t1_Rad) * DDifC2 & + - ((k_dRad - t1_Rad) * Sig__c & + + t0_Rad) * A_Rad0) & + / max(r__Rad, epsi) + ! ERROR + u0_Vis = min(0.99, max(epsi, u0_Vis)) + ! Ground Absorption + absg_V = (1.-albisv(ikl)) * (A_Rad0 * exdRad & + + DDif_L) ! + ! Veget. Absorption + absv_V = (1.-u0_Vis) - absg_V + + ! +--Parameters for Computing Effective LAI for Transpiration + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + gamasv(ikl) = gamma + C1__sv(ikl) = DDifC1 + C2__sv(ikl) = DDifC2 + Sigcsv(ikl) = Sig__c + k___sv(ikl) = k_dRad + A0__sv(ikl) = A_Rad0 + + ! +--Near-IR Part of the Solar Radiation Spectrum (nIR, 0.7--2.8mi.m) + ! + ================================================================ + + A_Rad0 = 0.80 + 0.185 * e1pRad ! Absorbed nIR. Radiation + T_Rad0 = 1.-A_Rad0 ! Transmitted nIR Radiation + + ! +--Reflectivity, Transmissivity + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Re_Rad = glf_sv(ikl) * RenIRL(ivg) & + + deadLF * RenIRD(ivg) + Tr_Rad = glf_sv(ikl) * TrnIRL(ivg) & + + deadLF * TrnIRD(ivg) + + ! +--Adaptation to Snow + ! + ^^^^^^^^^^^^^^^^^^ + Re_Rad = zv1fac * Re_Rad + zv_fac * renIRS + Tr_Rad = zv1fac * Tr_Rad + zv_fac * trnIRS + + ! +--Scattering /DR97, 2, eqn (2.26) and (2.27) ! Diffuse Radiation: + ! + ^^^^^^^^^^ ! ^^^^^^^^^^^^^^^^^^ + ! Upw. Scatter.Fract. + r__Rad = (2.*Re_Rad + Tr_Rad) / 3. + ! Downw.Scatter.Fract. + t__Rad = (Re_Rad + 2.*Tr_Rad) / 3. + + t1_Rad = 1.-t__Rad + arggam = t1_Rad * t1_Rad - r__Rad * r__Rad + arggam = max(arggam, zero) + ! eqn (2.39) + gamma = sqrt(arggam) + ! Downw.Diffus.Solut.1 + DDifH1 = exp(gamma * LAI_sv(ikl)) + ! Downw.Diffus.Solut.2 + DDifH2 = exp(-gamma * LAI_sv(ikl)) + ! + REMARK: These 2 contributions are zero in case of 0 Reflectivity + ! + ^^^^^^ + + ! +--Scattering /DR97, 2, eqn (2.19) and (2.20) ! Direct Radiation: + ! + ^^^^^^^^^^ ! ^^^^^^^^^^^^^^^^^^ + ! Upw. Scatter.Fract. + r0_Rad = 0.5 * ((Re_Rad + Tr_Rad) * k_dRad & + + (Re_Rad - Tr_Rad) / 3.) ! + ! Downw.Scatter.Fract. + t0_Rad = 0.5 * ((Re_Rad + Tr_Rad) * k_dRad & + - (Re_Rad - Tr_Rad) / 3.) ! + + ! nu coeff., eqn 2.43 + nu_Rad = t1_Rad - r__Rad * albisv(ikl) + ! eqn (2.43) Denomin. (Constant for DDifH1) + den_c1 = gamma * (DDifH1 + DDifH2) & + + nu_Rad * (DDifH1 - DDifH2) + + ! eqn (2.40) Denomin. + denSig = gamma * gamma - k_dRad * k_dRad + denS_s = sign(unun, denSig) + denS_a = abs(denSig) + denSig = max(epsi, denS_a) * denS_s + ! sigma_c, eqn (2.40) + Sig__c = (r__Rad * r0_Rad & + + t0_Rad * (k_dRad + t1_Rad)) / denSig + + DDifC1 = ((gamma - nu_Rad) * (T_Rad0 - Sig__c * A_Rad0) * DDifH2 & + + ((k_dRad - nu_Rad) * Sig__c & + + t0_Rad + r__Rad * albisv(ikl)) * A_Rad0 * exdRad) & + / max(den_c1, epsi) + DDifC2 = T_Rad0 - DDifC1 - Sig__c * A_Rad0 + + ! +--Near IR Diffuse Fluxes + ! + ^^^^^^^^^^^^^^^^^^^^^^ + ! DOWNward, Canopy Basis + DDif_L = DDifC1 * DDifH1 + DDifC2 * DDifH2 & + + Sig__c * A_Rad0 * exdRad + ! UPward Canopy Top + u0_nIR = ((gamma + t1_Rad) * DDifC1 & + - (gamma - t1_Rad) * DDifC2 & + - ((k_dRad - t1_Rad) * Sig__c & + + t0_Rad) * A_Rad0) & + / max(r__Rad, epsi) + ! ERROR + u0_nIR = min(0.99, max(epsi, u0_nIR)) + ! Ground Absorption + absgnI = (1.-albisv(ikl)) * (A_Rad0 * exdRad & + + DDif_L) + ! Veget. Absorption + absvnI = (1.-u0_nIR) - absgnI + + ! +--Surface-Canopy Albedo and Normalized Solar Radiation Absorption + ! + =============================================================== + + alb_SV_old = (u0_Vis + u0_nIR) * 0.5d0 + alb_SV(ikl) = (u0_Vis + u0_nIR) * 0.5d0 + + !XF if vegetation albedo too low + ! if(alb_SV_old<0.3.and.alb_SV_old>0.01& + ! .and.ivgtSV(ikl)>0)then + ! alb_SV(ikl) = alb_SV_old + (0.3 - alb_SV_old) / 5. + ! u0_nIR = u0_nIR * alb_SV(ikl) / alb_SV_old + ! u0_Vis = u0_Vis * alb_SV(ikl) / alb_SV_old + ! absvnI = (1. - u0_nIR) - absgnI + ! absv_V = (1. - u0_Vis) - absg_V + ! else + ! alb_SV(ikl) = (u0_Vis + u0_nIR) * 0.5d0 + ! end if + + if(ivgtSV(ikl) == 13) then ! city + alb_SV(ikl) = min(0.1, alb_SV(ikl)) + endif + !XF + SoCasv(ikl) = (absv_V + absvnI) * 0.5d0 + SoSosv(ikl) = (absg_V + absgnI) * 0.5d0 + +#if(sv) + endif +#endif + + enddo + + ! +--Effective LAI for Transpiration + ! + =============================== + + do ikl = 1, klonv + criLAI(ikl) = 2. ! LAI for which D0_Vis > 20W/m2 + ! + ! DR97, 2, eqn (2.57) + enddo + + do kri = 1, 10 + do ikl = 1, klonv + +#if(sv) + if(ifraSV(ikl) > 0) then +#endif + argexg = min(criLAI(ikl) * gamasv(ikl), argmax) + argexk = min(criLAI(ikl) * k___sv(ikl), argmax) + residu = C1__sv(ikl) * exp(argexg) & + + C2__sv(ikl) * exp(-argexg) & + + A0__sv(ikl) * gamasv(ikl) * exp(-argexk) & + - CriStR / max(sol_SV(ikl), epsi) + + d_DDif = C1__sv(ikl) * gamasv(ikl) * exp(argexg) & + - C2__sv(ikl) * gamasv(ikl) * exp(-argexg) & + - A0__sv(ikl) * k___sv(ikl) * exp(-argexk) + dDDifs = sign(unun, d_DDif) + dDDifa = abs(d_DDif) + d_DDif = max(epsi, dDDifa) * dDDifs + + criLAI(ikl) = criLAI(ikl) - residu / d_DDif + criLAI(ikl) = max(criLAI(ikl), zero) + criLAI(ikl) = min(criLAI(ikl), LAI_sv(ikl)) +#if(sv) + endif +#endif + + enddo + enddo + + do ikl = 1, klonv + LAIesv(ikl) = criLAI(ikl) + (exp(-k___sv(ikl) * criLAI(ikl)) & + - exp(-k___sv(ikl) * LAI_sv(ikl))) & + / k___sv(ikl) + enddo + + return +endsubroutine VgOptP diff --git a/MAR/code_mar/sisvat_weq.f90 b/MAR/code_mar/sisvat_weq.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6a9a2e6debcaa0cb6faa348f1a2eb0010166e361 --- /dev/null +++ b/MAR/code_mar/sisvat_weq.f90 @@ -0,0 +1,89 @@ +#include "MAR_pp.def" +subroutine SISVAT_wEq(labWEq, istart) + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_wEq 22-09-2001 MAR | + ! | subroutine SISVAT_wEq computes the Snow/Ice Water Equivalent | + ! | | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_wEq.ve | #ve: OUTPUT/Verification: Snow/Ice Water Eqv. | + ! | | unit 45, subroutine SISVAT_wEq **ONLY** | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use marxsv + + implicit none + + character * 6 labWEq + integer istart + + logical logWEq + common / SISVAT_wEq_L / logWEq + + ! +--Local Variables + ! + ================ + + integer ikl, isn + real SnoWEQ, IceWEQ + + ! +--Switch Initialization + ! + ===================== + + if(.not. logWEq) then + logWEq = .true. + open(unit=45, status='unknown', file='SISVAT_wEq.ve') + rewind 45 + endif + + ! +--Snow Water Equivalent + ! + ===================== + + ikl = 1 + if(isnoSV(ikl) > iiceSV(ikl)) then + + SnoWEQ = 0. + do isn = iiceSV(ikl) + 1, isnoSV(ikl) + SnoWEQ = SnoWEQ + ro__SV(ikl, isn) * dzsnSV(ikl, isn) + enddo + + endif + + ! +--Ice Water Equivalent + ! + ===================== + + if(iiceSV(1) > 0) then + + IceWEQ = 0. + do isn = 1, iiceSV(ikl) + IceWEQ = IceWEQ + ro__SV(ikl, isn) * dzsnSV(ikl, isn) + enddo + + endif + + ! +--OUTPUT + ! + ====== + + if(istart == 1) then + write(45, 45) dahost, i___SV(lwriSV(1)), j___SV(lwriSV(1)), & + n___SV(lwriSV(1)) +45 format(a18, 10('-'), 'Pt.', 3i4, 60('-')) + endif + + write(45, 450) labWEq, IceWEQ, iiceSV(ikl), SnoWEQ & + , IceWEQ + SnoWEQ, isnoSV(ikl) & + , drr_SV(ikl) * dt__SV & + , dsn_SV(ikl) * dt__SV & + , BufsSV(ikl) +450 format(a6, 3x, ' I+S =', f11.4, '(', i2, ') +', f11.4, ' =', & + f11.4, '(', i2, ')', & + ' drr =', f7.4, & + ' dsn =', f7.4, & + ' Buf =', f7.4) + + return +endsubroutine SISVAT_wEq diff --git a/MAR/code_mar/sisvat_zag.f90 b/MAR/code_mar/sisvat_zag.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b09fdca068ac73c9c36eb24851b2cd85cc0a9cdf --- /dev/null +++ b/MAR/code_mar/sisvat_zag.f90 @@ -0,0 +1,254 @@ +#include "MAR_pp.def" +subroutine SISVAT_zAg(isagra, isagrb, WEagra & + , dzagra, dzagrb, T_agra, T_agrb & + , roagra, roagrb, etagra, etagrb & + , G1agra, G1agrb, G2agra, G2agrb & + , agagra, agagrb, Agreg1) + ! +------------------------------------------------------------------------+ + ! | MAR SURFACE Sat 30-Apr-2004 MAR | + ! | subroutine SISVAT_zAg aggregates two contiguous snow layers | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT: isagrb : 2nd Layer History | + ! | ^^^^^ | + ! | | + ! | INPUT: dzagrb : 2nd Layer Thickness | + ! | ^^^^^ T_agrb : 2nd Layer Temperature | + ! | roagrb : 2nd Layer Density | + ! | etagrb : 2nd Layer Water Content | + ! | G1agrb : 2nd Layer Dendricity/Spher. | + ! | G2agrb : 2nd Layer Sphericity/Size | + ! | agagrb : 2nd Age | + ! | Agreg1 : 1. when Agregation constrained | + ! | | + ! | INPUT / isagra : 1st Layer History | + ! | OUTPUT: | + ! | ^^^^^^ | + ! | | + ! | INPUT / dzagra : 1st Layer Thickness | + ! | OUTPUT: T_agra : 1st Layer Temperature | + ! | ^^^^^^ roagra : 1st Layer Density | + ! | etagra : 1st Layer Water Content | + ! | G1agra : 1st Layer Dendricity/Spher. | + ! | G2agra : 1st Layer Sphericity/Size | + ! | agagra : 1st Age | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardSV + use mar0SV + use marxsv + + implicit none + + ! +--INPUT + ! + ----- + + integer isagrb(klonv) ! 2nd Layer History + real dzagrb(klonv) ! 2nd Layer Thickness + real T_agrb(klonv) ! 2nd Layer Temperature + real roagrb(klonv) ! 2nd Layer Density + real etagrb(klonv) ! 2nd Layer Water Content + real G1agrb(klonv) ! 2nd Layer Dendricity/Spher. + real G2agrb(klonv) ! 2nd Layer Sphericity/Size + real agagrb(klonv) ! 2nd Layer Age + + ! +--INPUT/OUTPUT + ! + ------------ + + integer isagra(klonv) ! 1st Layer History + real WEagra(klonv) ! 1st Layer Height [mm w.e.] + real Agreg1(klonv) ! 1. ===> Agregates + real dzagra(klonv) ! 1st Layer Thickness + real T_agra(klonv) ! 1st Layer Temperature + real roagra(klonv) ! 1st Layer Density + real etagra(klonv) ! 1st Layer Water Content + real G1agra(klonv) ! 1st Layer Dendricity/Spher. + real G2agra(klonv) ! 1st Layer Sphericity/Size + real agagra(klonv) ! 1st Layer Age + + ! +--Internal Variables + ! + ================== + + integer ikl + integer nh ! Averaged Snow History + integer nh__OK ! 1=>Conserve Snow History + real rh ! + real dz ! Thickness + real dzro_1 ! Thickness X Density, Lay.1 + real dzro_2 ! Thickness X Density, Lay.2 + real dzro ! Thickness X Density, Aver. + real ro ! Averaged Density + real wn ! Averaged Water Content + real tn ! Averaged Temperature + real ag ! Averaged Snow Age + real SameOK ! 1. => Same Type of Grains + real G1same ! Averaged G1, same Grains + real G2same ! Averaged G2, same Grains + real typ__1 ! 1. => Lay1 Type: Dendritic + real zroNEW ! dz X ro, if fresh Snow + real G1_NEW ! G1, if fresh Snow + real G2_NEW ! G2, if fresh Snow + real zroOLD ! dz X ro, if old Snow + real G1_OLD ! G1, if old Snow + real G2_OLD ! G2, if old Snow + real SizNEW ! Size, if fresh Snow + real SphNEW ! Spheric.,if fresh Snow + real SizOLD ! Size, if old Snow + real SphOLD ! Spheric.,if old Snow + real Siz_av ! Averaged Grain Size + real Sph_av ! Averaged Grain Spher. + real Den_av ! Averaged Grain Dendr. + real DendOK ! 1. => Average is Dendr. + real G1diff ! Averaged G1, diff. Grains + real G2diff ! Averaged G2, diff. Grains + real G1 ! Averaged G1 + real G2 ! Averaged G2 + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + common / SISVAT_EV / iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif + + ! +--Mean Properties + ! + ================= + + ! +-- 1 Densite, Contenu en Eau, Temperature / + ! + Density, Water Content, Temperature + ! + ------------------------------------ + + do ikl = 1, klonv + dz = dzagra(ikl) + dzagrb(ikl) + dzro_1 = roagra(ikl) * dzagra(ikl) + dzro_2 = roagrb(ikl) * dzagrb(ikl) + dzro = dzro_1 + dzro_2 + ro = dzro & + / max(epsi, dz) + wn = (dzro_1 * etagra(ikl) + dzro_2 * etagrb(ikl)) & + / max(epsi, dzro) + tn = (dzro_1 * T_agra(ikl) + dzro_2 * T_agrb(ikl)) & + / max(epsi, dzro) + ag = (dzro_1 * agagra(ikl) + dzro_2 * agagrb(ikl)) & + / max(epsi, dzro) + + rh = max(zero, sign(unun, zWEcSV(ikl) & + - 0.5 * WEagra(ikl))) + nh__OK = rh + nh = max(isagra(ikl), isagrb(ikl)) +#if(HB) + nh = nh * nh__OK & + + (1 - nh__OK) * min(isagra(ikl), isagrb(ikl)) +#endif + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ikl == kSV_v1 .and. lSV_v1 == 3) then + write(6, 5995) zWEcSV(ikl), WEagra(ikl) & + , isagra(ikl), isagrb(ikl) & + , nh__OK, nh +5995 format(' WE2,WEa =', 2f9.1, ' nha,b =', 2i2, ' nh__OK,nh =', 2i2) + endif +#endif + + ! +-- 2 Nouveaux Types de Grains / new Grain Types + ! + ------------------------------------------- + + ! +-- 2.1. Meme Type de Neige / same Grain Type + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SameOK = max(zero, & + sign(unun, G1agra(ikl) * G1agrb(ikl) - eps_21)) + G1same = (dzro_1 * G1agra(ikl) + dzro_2 * G1agrb(ikl)) & + / max(epsi, dzro) + G2same = (dzro_1 * G2agra(ikl) + dzro_2 * G2agrb(ikl)) & + / max(epsi, dzro) + + ! +-- 2.2. Types differents / differents Types + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + typ__1 = max(zero, sign(unun, epsi - G1agra(ikl))) ! =1.=> Dendritic + ! ro of Dendr.Lay. + zroNEW = typ__1 * dzro_1 & + + (1.-typ__1) * dzro_2 + ! G1 of Dendr.Lay. + G1_NEW = typ__1 * G1agra(ikl) & + + (1.-typ__1) * G1agrb(ikl) + ! G2 of Dendr.Lay. + G2_NEW = typ__1 * G2agra(ikl) & + + (1.-typ__1) * G2agrb(ikl) + ! ro of Spher.Lay. + zroOLD = (1.-typ__1) * dzro_1 & + + typ__1 * dzro_2 + ! G1 of Spher.Lay. + G1_OLD = (1.-typ__1) * G1agra(ikl) & + + typ__1 * G1agrb(ikl) + ! G2 of Spher.Lay. + G2_OLD = (1.-typ__1) * G2agra(ikl) & + + typ__1 * G2agrb(ikl) + ! Size Dendr.Lay. + SizNEW = -G1_NEW * DDcdSV / G1_dSV & + + (1.+G1_NEW / G1_dSV) & + * (G2_NEW * DScdSV / G1_dSV & + + (1.-G2_NEW / G1_dSV) * DFcdSV) + ! Spher.Dendr.Lay. + SphNEW = G2_NEW / G1_dSV + ! Size Spher.Lay. + SizOLD = G2_OLD + ! Spher.Spher.Lay. + SphOLD = G1_OLD / G1_dSV + ! Averaged Size + Siz_av = (zroNEW * SizNEW + zroOLD * SizOLD) & + / max(epsi, dzro) + ! Averaged Sphericity + Sph_av = (zroNEW * SphNEW + zroOLD * SphOLD) & + / max(epsi, dzro) + Den_av = (Siz_av - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) & + / (DDcdSV - (Sph_av * DScdSV & + + (1.-Sph_av) * DFcdSV)) + DendOK = max(zero, & + ! Small Grains Contr. + sign(unun, Sph_av * DScdSV & + ! Faceted Grains Contr. + + (1.-Sph_av) * DFcdSV & + - Siz_av))! + ! +... REMARQUE: le type moyen (dendritique ou non) depend + ! + ^^^^^^^^ de la comparaison avec le diametre optique + ! + d'une neige recente de dendricite nulle + ! +... REMARK: the mean type (dendritic or not) depends + ! + ^^^^^^ on the comparaison with the optical diameter + ! + of a recent snow having zero dendricity + + G1diff = (-DendOK * Den_av & + + (1.-DendOK) * Sph_av) * G1_dSV + G2diff = DendOK * Sph_av * G1_dSV & + + (1.-DendOK) * Siz_av + G1 = SameOK * G1same & + + (1.-SameOK) * G1diff + G2 = SameOK * G2same & + + (1.-SameOK) * G2diff + + ! +--Assignation to new Properties + ! + ============================= + + isagra(ikl) = Agreg1(ikl) * nh + (1.-Agreg1(ikl)) * isagra(ikl) + dzagra(ikl) = Agreg1(ikl) * dz + (1.-Agreg1(ikl)) * dzagra(ikl) + T_agra(ikl) = Agreg1(ikl) * tn + (1.-Agreg1(ikl)) * T_agra(ikl) + roagra(ikl) = Agreg1(ikl) * ro + (1.-Agreg1(ikl)) * roagra(ikl) + etagra(ikl) = Agreg1(ikl) * wn + (1.-Agreg1(ikl)) * etagra(ikl) + G1agra(ikl) = Agreg1(ikl) * G1 + (1.-Agreg1(ikl)) * G1agra(ikl) + G2agra(ikl) = Agreg1(ikl) * G2 + (1.-Agreg1(ikl)) * G2agra(ikl) + agagra(ikl) = Agreg1(ikl) * ag + (1.-Agreg1(ikl)) * agagra(ikl) + + enddo + + return +endsubroutine SISVAT_zAg diff --git a/MAR/code_mar/sisvat_zcr.f90 b/MAR/code_mar/sisvat_zcr.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2b36c382287092dd1a137cb7997c7d2bc5b0d223 --- /dev/null +++ b/MAR/code_mar/sisvat_zcr.f90 @@ -0,0 +1,180 @@ +subroutine SISVAT_zCr + ! + + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_zCr 12-12-2002 MAR | + ! | subroutine SISVAT_zCr determines criteria for Layers Agregation | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT / isnoSV = total Nb of Ice/Snow Layers | + ! | OUTPUT: iiceSV = total Nb of Ice Layers | + ! | ^^^^^^ ispiSV = 0,...,nsno: Uppermost Superimposed Ice Layer | + ! | istoSV = 0,...,5 : Snow History (see istdSV data) | + ! | | + ! | INPUT / ro__SV : Soil/Snow Volumic Mass [kg/m3] | + ! | OUTPUT: & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | ^^^^^^ G1snSV : Dendricity (<0) or Sphericity (>0) of Snow Layer | + ! | G2snSV : Sphericity (>0) or Size of Snow Layer | + ! | agsnSV : Snow Age [day] | + ! | | + ! | OUTPUT: LIndsv : Relative Index of a contiguous Layer to agregate | + ! | ^^^^^^ | + ! +------------------------------------------------------------------------+ + ! + + use marphy + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + ! + + implicit none + ! + + ! +--Internal Variables + ! + ================== + ! + + integer ikl, isn, is0, is1 + integer isno_1 ! Switch: ! Snow Layer over Ice + real Dtyp_0, Dtyp_1 ! Snow Grains Difference Measure + real DenSph ! 1. when contiguous spheric + ! + ! and dendritic Grains + real DendOK ! 1. when dendritic Grains + real dTypMx ! Grain Type Differ. + real dTypSp ! Sphericity Weight + real dTypRo ! Density Weight + real dTypDi ! Grain Diam.Weight + real dTypHi ! History Weight + + ! +--DATA + ! + ==== + + data dTypMx/200.0/ ! Grain Type Weight + data dTypSp/0.5/ ! Sphericity Weight + data dTypRo/0.5/ ! Density Weight + data dTypDi/10.0/ ! Grain Diam.Weight + data dTypHi/100.0/ ! History Weight + + ! +--Agregation Criteria + ! + =================== + ! + + do ikl = 1, klonv + i_thin(ikl) = min(i_thin(ikl), isnoSV(ikl)) + isn = max(1, i_thin(ikl)) + ! + + ! + + ! +--Comparison with the downward Layer + ! + ---------------------------------- + ! + + ! Downward Layer Index + is0 = max(1, i_thin(ikl) - 1) + ! isn/is1 Dendricity/Sphericity Switch + DenSph = max(zero, & + sign(unun, & + epsi - G1snSV(ikl, isn) & + * G1snSV(ikl, is0))) + ! Dendricity Switch + DendOK = max(zero, & + sign(unun, & + epsi - G1snSV(ikl, isn))) + ! + + Dtyp_0 = & + DenSph * dTypMx & + + (1.-DenSph) & + ! Dendricity Contribution + * DendOK * ((abs(G1snSV(ikl, isn) - G1snSV(ikl, is0)) & + ! Sphericity Contribution + + abs(G2snSV(ikl, isn) - G2snSV(ikl, is0))) * dTypSp & + ! Density Contribution + + abs(ro__SV(ikl, isn) - ro__SV(ikl, is0)) * dTypRo) & + + (1.-DenSph) & + ! Sphericity Contribution + * (1.-DendOK) * ((abs(G1snSV(ikl, isn) - G1snSV(ikl, is0)) & + ! Size Contribution + + abs(G2snSV(ikl, isn) - G2snSV(ikl, is0))) * dTypDi & + ! Density Contribution + + abs(ro__SV(ikl, isn) - ro__SV(ikl, is0)) * dTypRo) + Dtyp_0 = & + min(dTypMx, & + Dtyp_0 & + ! History Contribution + + abs(istoSV(ikl, isn) - istoSV(ikl, is0)) * dTypHi) & + !"Same Layer"Score + + (1 - abs(isn - is0)) * 1.e+6 & + !"Ice /Snow Interface" Score + + max(0, 1 - abs(iiceSV(ikl) & + - is0)) * 1.e+6 + ! + + ! + + ! +--Comparison with the upward Layer + ! + ---------------------------------- + ! + + ! Upward Layer Index + is1 = min(i_thin(ikl) + 1, & + max(1, isnoSV(ikl))) + ! isn/is1 Dendricity/Sphericity Switch + DenSph = max(zero, & + sign(unun, & + epsi - G1snSV(ikl, isn) & + * G1snSV(ikl, is1))) + ! Dendricity Switch + DendOK = max(zero, & + sign(unun, & + epsi - G1snSV(ikl, isn))) + ! + + Dtyp_1 = & + DenSph * dTypMx & + + (1.-DenSph) & + ! Dendricity Contribution + * DendOK * ((abs(G1snSV(ikl, isn) & + - G1snSV(ikl, is1)) & + ! Sphericity Contribution + + abs(G2snSV(ikl, isn) - G2snSV(ikl, is1))) * dTypSp & + ! Density Contribution + + abs(ro__SV(ikl, isn) - ro__SV(ikl, is1)) * dTypRo) & + + (1.-DenSph) & + ! Sphericity Contribution + * (1.-DendOK) * ((abs(G1snSV(ikl, isn) & + - G1snSV(ikl, is1)) & + ! Size Contribution + + abs(G2snSV(ikl, isn) - G2snSV(ikl, is1))) * dTypDi & + ! Density Contribution + + abs(ro__SV(ikl, isn) - ro__SV(ikl, is1)) * dTypRo) + Dtyp_1 = & + min(dTypMx, & + Dtyp_1 & + ! History Contribution + + abs(istoSV(ikl, isn) & + - istoSV(ikl, is1)) * dTypHi) & + !"Same Layer"Score + + (1 - abs(isn - is1)) * 1.e+6 & + !"Ice /Snow Interface" Score + + max(0, 1 - abs(iiceSV(ikl) & + - isn)) * 1.e+6 + ! + + ! + + ! +--Index of the Layer to agregate + ! + ============================== + ! + + LIndsv(ikl) = sign(unun, Dtyp_0 & + - Dtyp_1) + ! Switch = 1 + isno_1 = (1 - min(abs(isnoSV(ikl) & + ! if isno = iice +1 + - iiceSV(ikl) - 1), 1)) & + ! Switch = 1 + * (1 - min(abs(isnoSV(ikl) & + ! if isno = i_ithin + - i_thin(ikl)), 1)) + ! Contiguous Layer is + LIndsv(ikl) = (1 - isno_1) * LIndsv(ikl) & + ! downward for top L. + - isno_1 + i_thin(ikl) = max(1, i_thin(ikl)) + enddo + ! + + return +endsubroutine SISVAT_zCr diff --git a/MAR/code_mar/sisvat_zsn.f90 b/MAR/code_mar/sisvat_zsn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..75637363cd05f5104ff7a0ef9c69bc5bc0cf3a46 --- /dev/null +++ b/MAR/code_mar/sisvat_zsn.f90 @@ -0,0 +1,971 @@ +#include "MAR_pp.def" +subroutine SISVAT_zSn + ! +------------------------------------------------------------------------+ + ! | MAR SISVAT_zSn 02-10-2021 MAR | + ! | subroutine SISVAT_zSn manages the Snow Pack vertical Discretization | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | PARAMETERS: klonv: Total Number of columns = | + ! | ^^^^^^^^^^ = Total Number of continental grid boxes | + ! | X Number of Mosaic Cell per grid box | + ! | | + ! | INPUT / NLaysv = New Snow Layer Switch | + ! | OUTPUT: isnoSV = total Nb of Ice/Snow Layers | + ! | ^^^^^^ ispiSV = 0,...,nsno: Uppermost Superimposed Ice Layer | + ! | iiceSV = total Nb of Ice Layers | + ! | istoSV = 0,...,5 : Snow History (see istdSV data) | + ! | | + ! | INPUT / TsisSV : Soil/Ice Temperatures (layers -nsol,-nsol+1,..,0)| + ! | OUTPUT: & Snow Temperatures (layers 1,2,...,nsno) [K] | + ! | ^^^^^^ ro__SV : Soil/Snow Volumic Mass [kg/m3] | + ! | eta_SV : Soil/Snow Water Content [m3/m3] | + ! | dzsnSV : Snow Layer Thickness [m] | + ! | G1snSV : Dendricity (<0) or Sphericity (>0) of Snow Layer | + ! | G2snSV : Sphericity (>0) or Size of Snow Layer | + ! | agsnSV : Snow Age [day] | + ! | | + ! | METHOD: 1) Agregate the thinest Snow Layer | + ! | ^^^^^^ if a new Snow Layer has been precipitated (NLaysv = 1) | + ! | 2) Divide a too thick Snow Layer except | + ! | if the maximum Number of Layer is reached | + ! | in this case forces NLay_s = 1 | + ! | 3) Agregate the thinest Snow Layer | + ! | in order to divide a too thick Snow Layer | + ! | at next Time Step when NLay_s = 1 | + ! | | + ! | Preprocessing Option: SISVAT IO (not always a standard preprocess.) | + ! | ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ | + ! | FILE | CONTENT | + ! | ~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + ! | # SISVAT_zSn.vz | #vz: OUTPUT/Verification: Snow Layers Agrega. | + ! | | unit 41, subroutine SISVAT_zSn **ONLY** | + ! | # SISVAT_GSn.vp | #vp: OUTPUT/Verification: Snow Properties | + ! | | unit 47, subroutines SISVAT_zSn, _GSn | + ! +------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use mar0sv + use marxsv + use marysv + + implicit none + + ! +--Internal Variables + ! + ================== + + integer ikl, isn, i + ! NLay_s : Split Snow Layer Switch + integer NLay_s(klonv) + ! isagr1 : 1st Layer History + integer isagr1(klonv) + ! isagr2 : 2nd Layer History + integer isagr2(klonv) + ! LstLay : 0 -> isnoSV = 1 + integer LstLay + ! isno_n : Snow Normal.Profile + integer isno_n + ! iice_n : Ice Normal.Profile + integer iice_n + ! iiceOK : Ice Switch + integer iiceOK + ! icemix : 0 -> Agregated Snow+Ice=Snow 1 -> Ice + integer icemix + ! isn1 : 1st layer to stagger + integer isn1(klonv) + ! staggr : stagger Switch + real staggr + ! WEagre : Snow Water Equivalent Thickness + real WEagre(klonv) + ! dzthin : Thickness of the thinest layer + real dzthin(klonv) + ! OKthin : Swich ON a new thinest layer + real OKthin + ! dz_dif : difference from ideal discret. + real dz_dif + ! thickL : Thick Layer Indicator + real thickL + ! OK_ICE : Swich ON uppermost Ice Layer + real OK_ICE + + ! Agrege : 1. when Agregation constrained + real Agrege(klonv) + ! dzepsi : Min Single Snw Layer Thickness + real dzepsi + ! dzxmin : Min Acceptable Layer Thickness + real dzxmin + ! dz_min : Min Layer Thickness + real dz_min + ! dz_max : Max Layer Thickness + real dz_max + ! dzagr1 : 1st Layer Thickness + real dzagr1(klonv) + ! dzagr2 : 2nd Layer Thickness + real dzagr2(klonv) + ! T_agr1 : 1st Layer Temperature + real T_agr1(klonv) + ! T_agr2 : 2nd Layer Temperature + real T_agr2(klonv) + ! roagr1 : 1st Layer Density + real roagr1(klonv) + ! roagr2 : 2nd Layer Density + real roagr2(klonv) + ! etagr1 : 1st Layer Water Content + real etagr1(klonv) + ! etagr2 : 2nd Layer Water Content + real etagr2(klonv) + ! G1agr1 : 1st Layer Dendricity/Spher. + real G1agr1(klonv) + ! G1agr2 : 2nd Layer Dendricity/Spher. + real G1agr2(klonv) + ! G2agr1 : 1st Layer Sphericity/Size + real G2agr1(klonv) + ! G2agr2 : 2nd Layer Sphericity/Size + real G2agr2(klonv) + ! agagr1 : 1st Layer Age + real agagr1(klonv) + ! agagr2 : 2nd Layer Age + real agagr2(klonv) + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + common / SISVAT_EV / iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + ! IO Switch + logical as_opn + common / SI_zSn_L / as_opn + ! Snow Reference Discretization + real dz_ref(nsno) + real dzwdif(nsno) +#endif + +#if(vp) + ! +--Snow Properties Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! IO Switch + logical VP_opn + common / SI_GSn_L / VP_opn +#endif + + ! +--DATA + ! + ==== + + data icemix/0/ ! 0 ====> Agregated Snow+Ice=Snow + data dzepsi/0.0020/ ! Min single Layer Thickness + data dzxmin/0.0025/ ! Min accept.Layer Thickness +#if(EU) + data dz_min/0.0050/ ! Min Local Layer Thickness < SMn +#endif + data dz_min/0.0040/ ! Min Local Layer Thickness < SMn + data dz_max/0.0300/ ! Min Gener. Layer Thickness + ! + CAUTION: dz_max > dz_min*2 is required ! Otherwise re-agregation is + ! + ! activated after splitting + +#if(vz) + ! +--Layers Agregation: IO + ! + ===================== + if(.not. as_opn) then + as_opn = .true. + open(unit=41, status='unknown', file='SISVAT_zSn.vz') + rewind 41 + endif +#endif + +#if(vp) + ! +--Snow Properties: IO + ! + ===================== + if(.not. VP_opn) then + VP_opn = .true. + open(unit=47, status='unknown', file='SISVAT_GSn.vp') + rewind 47 + endif +#endif + + ! +--Constrains Agregation of too thin Layers + ! + ======================================== + + ! +--Search the thinest non-zero Layer + ! + --------------------------------- + + do ikl = 1, klonv + + if(isnoSV(ikl) <= 2) dz_min = max(0.0050, dz_min) + + dzepsi = 0.0015 + if(ro__SV(ikl, isnoSV(ikl)) > 920) dzepsi = 0.0020 + + dzthin(ikl) = 0. ! Arbitrary unrealistic + enddo ! Layer Thickness + !XF + do ikl = 1, klonv + ! no agregation of 3 first snowlayers + ! XF 04/07/2019 + do isn = 1, isnoSV(ikl) - 3 + isno_n = isnoSV(ikl) - isn + 1 ! Snow Normal.Profile + iice_n = iiceSV(ikl) - isn ! Ice Normal.Profile + iiceOK = min(1, max(0, iice_n + 1)) ! Ice Switch +#if(vz) + ! Theoretical Profile + dz_ref(isn) = & + dz_min * ((1 - iiceOK) * isno_n * isno_n & + + iiceOK * 2**iice_n) & + / max(1, isnoSV(ikl)) +#endif + ! Actual Profile + dz_dif = max(zero, & + ! Theoretical Profile + dz_min * ((1 - iiceOK) * isno_n * isno_n & + + iiceOK * 2.**iice_n) & + ! Actual Profile + - dzsnSV(ikl, isn)) +#if(vz) + dzwdif(isn) = dz_dif +#endif + OKthin = max(zero, & + ! 1.=> New thinest Lay. + sign(unun, dz_dif - dzthin(ikl))) & + ! 1 => .le. isnoSV => isn is in the Snow Pack + * max(0, min(1, isnoSV(ikl) - isn + 1)) & + * min(unun, max(zero, & + ! combination G1 with same sign => OK + sign(unun, G1snSV(ikl, isn) & + * G1snSV(ikl, max(1, isn - 1)))) & + ! G1>0 => OK + + max(zero, sign(unun, G1snSV(ikl, isn))) & + ! dz too small => OK + + max(zero, sign(unun, dzxmin - dzsnSV(ikl, isn)))) + ! Update thinest Lay. Index + i_thin(ikl) = (1.-OKthin) * i_thin(ikl) + OKthin * isn + dzthin(ikl) = (1.-OKthin) * dzthin(ikl) + OKthin * dz_dif + enddo + enddo + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 4150) daHost, n___SV(lwriSV(1)) & + , i_thin(1), dzsnSV(1, i_thin(1)) +4150 format(/, '-', a18, i5, ' ', 70('-'), & + /, ' Thinest ', i3, ':', f9.3) +#endif + + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + OKthin = max(zero, & + ! ON if dz < dz_min and dz > 0 + sign(unun, dz_min - dzsnSV(ikl, isn))) & + * max(zero, sign(unun, dzsnSV(ikl, isn) - epsi)) & + ! Multiple Snow Layers + * min(1, max(0, & + ! Switch = 1 if isno > iice + 1 + min(1, isnoSV(ikl) - iiceSV(ikl) - 1)) & + + int(max(zero, & + ! Minimum accepted for 1 Snow Layer over Ice + sign(unun, dzepsi - dzsnSV(ikl, isn)))) & + ! ON if dz > 0 + * int(max(zero, sign(unun, dzsnSV(ikl, isn) - epsi))) & + ! Switch = 1 if isno = iice + 1 + * (1 - min(abs(isnoSV(ikl) - iiceSV(ikl) - 1), 1)) & + ! Ice Switch + + max(0, min(1, iiceSV(ikl) + 1 - isn))) & + * min(unun, & + ! combination G1>0 + G1<0 + max(zero, & + sign(unun, G1snSV(ikl, isn) * G1snSV(ikl, max(1, isn - 1)))) & + + max(zero, sign(unun, G1snSV(ikl, isn))) & + + max(zero, sign(unun, dzxmin - dzsnSV(ikl, isn)))) + ! Update thinest Layer Index + i_thin(ikl) = (1.-OKthin) * i_thin(ikl) + OKthin * isn + enddo + enddo + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 4151) i_thin(1), dzsnSV(1, i_thin(1)) & + , isnoSV(1), dzsnSV(1, isnoSV(1)) +4151 format(' Thinest ', i3, ':', f9.3, ' Max =', i3, f12.3) +#endif + +#if(vp) + ! +--Snow Properties Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + write(47, 470)(G1snSV(1, isn), isn=1, isnoSV(1)) +470 format('Before _zCr1: G1 = ', 10f8.1,(/, 19x, 10f8.1)) + write(47, 472)(G2snSV(1, isn), isn=1, isnoSV(1)) +472 format(' G2 = ', 10f8.1,(/, 19x, 10f8.1)) +#endif + + ! +--Index of the contiguous Layer to agregate + ! + ----------------------------------------- + ! + ********* + call SISVAT_zCr + ! + ********* + + ! +--Assign the 2 Layers to agregate + ! + ------------------------------- + do ikl = 1, klonv + isn = i_thin(ikl) + if(LIndsv(ikl) > 0) isn = min(nsno - 1, isn) ! cXF + isagr1(ikl) = istoSV(ikl, isn) + isagr2(ikl) = istoSV(ikl, isn + LIndsv(ikl)) + dzagr1(ikl) = dzsnSV(ikl, isn) + dzagr2(ikl) = dzsnSV(ikl, isn + LIndsv(ikl)) + T_agr1(ikl) = TsisSV(ikl, isn) + T_agr2(ikl) = TsisSV(ikl, isn + LIndsv(ikl)) + roagr1(ikl) = ro__SV(ikl, isn) + roagr2(ikl) = ro__SV(ikl, isn + LIndsv(ikl)) + etagr1(ikl) = eta_SV(ikl, isn) + etagr2(ikl) = eta_SV(ikl, isn + LIndsv(ikl)) + G1agr1(ikl) = G1snSV(ikl, isn) + G1agr2(ikl) = G1snSV(ikl, isn + LIndsv(ikl)) + G2agr1(ikl) = G2snSV(ikl, isn) + G2agr2(ikl) = G2snSV(ikl, isn + LIndsv(ikl)) + agagr1(ikl) = agsnSV(ikl, isn) + agagr2(ikl) = agsnSV(ikl, isn + LIndsv(ikl)) + ! 0 if single Layer + LstLay = min(1, max(0, isnoSV(ikl) - 1)) + ! decrement isnoSV if downmost Layer < 1.e-21 m + isnoSV(ikl) = isnoSV(ikl) & + - (1 - LstLay) * max(zero, & + sign(unun, eps_21 - dzsnSV(ikl, 1))) + isnoSV(ikl) = max(0, isnoSV(ikl)) + Agrege(ikl) = max(zero, & + ! No Agregation if too thick Layer + sign(unun, dz_min - dzagr1(ikl))) & + ! if a single Layer + * LstLay & + ! if Agregation with a Layer above the Pack + * min(max(0, isnoSV(ikl) + 1 - i_thin(ikl) - LIndsv(ikl)), 1) + WEagre(ikl) = 0. + enddo + + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + WEagre(ikl) = WEagre(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * min(1, max(0, i_thin(ikl) + 1 - isn)) + enddo + enddo + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 410) +410 format(/, ' Agregation of too THIN Layers') + write(41, 411)(100.*dz_ref(isn), isn=1, nsno) + write(41, 412)(100.*dzwdif(isn), isn=1, nsno) + write(41, 413)(100.*dzsnSV(1, isn), isn=1, nsno) + write(41, 414)(isn, isn=1, nsno) +411 format(' dz_ref [cm]:', 10f8.2, /,(' ', 10f8.2)) +412 format(' dz_dif [cm]:', 10f8.2, /,(' ', 10f8.2)) +413 format(' dzsnSV [cm]:', 10f8.2, /,(' ', 10f8.2)) +414 format(' ', 10(i5, 3x), /,(' ', 10(i5, 3x))) + write(41, 4111) isnoSV(1) + write(41, 4112) i_thin(1) + write(41, 4113) LIndsv(1) + write(41, 4114) Agrege(1) + write(41, 4115) 1.e2 * dzagr1(1) + write(41, 4116) 1.e2 * dzagr2(1) +4111 format(' isnoSV :', i8) +4112 format(' i_thin :', i8) +4113 format(' LIndsv :', i8) +4114 format(' Agrege :', f8.2) +4115 format(' dzagr1 :', f8.2) +4116 format(' dzagr2 :', f8.2) +#endif + +#if(vp) + ! +--Snow Properties Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + write(47, 471)(G1snSV(1, isn), isn=1, isnoSV(1)) +471 format('Before _zAg1: G1 = ', 10f8.1,(/, 19x, 10f8.1)) + write(47, 472)(G2snSV(1, isn), isn=1, isnoSV(1)) +#endif + + ! +--Agregates + ! + --------- + ! + ********** + call SISVAT_zAg(isagr1, isagr2, WEagre & + , dzagr1, dzagr2, T_agr1, T_agr2 & + , roagr1, roagr2, etagr1, etagr2 & + , G1agr1, G1agr2, G2agr1, G2agr2 & + , agagr1, agagr2, Agrege) + ! + ********** + + ! +--Rearranges the Layers + ! + --------------------- + + ! +--New (agregated) Snow layer + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isn = i_thin(ikl) + isn = min(isn, isn + LIndsv(ikl)) + isnoSV(ikl) = max(0., isnoSV(ikl) - Agrege(ikl)) + iiceSV(ikl) = iiceSV(ikl) & + - max(0, sign(1, iiceSV(ikl) - isn + icemix)) & + * Agrege(ikl) & + * max(0, sign(1, iiceSV(ikl) - 1)) + istoSV(ikl, isn) = (1.-Agrege(ikl)) * istoSV(ikl, isn) & + + Agrege(ikl) * isagr1(ikl) + dzsnSV(ikl, isn) = (1.-Agrege(ikl)) * dzsnSV(ikl, isn) & + + Agrege(ikl) * dzagr1(ikl) + TsisSV(ikl, isn) = (1.-Agrege(ikl)) * TsisSV(ikl, isn) & + + Agrege(ikl) * T_agr1(ikl) + ro__SV(ikl, isn) = (1.-Agrege(ikl)) * ro__SV(ikl, isn) & + + Agrege(ikl) * roagr1(ikl) + eta_SV(ikl, isn) = (1.-Agrege(ikl)) * eta_SV(ikl, isn) & + + Agrege(ikl) * etagr1(ikl) + G1snSV(ikl, isn) = (1.-Agrege(ikl)) * G1snSV(ikl, isn) & + + Agrege(ikl) * G1agr1(ikl) + G2snSV(ikl, isn) = (1.-Agrege(ikl)) * G2snSV(ikl, isn) & + + Agrege(ikl) * G2agr1(ikl) + agsnSV(ikl, isn) = (1.-Agrege(ikl)) * agsnSV(ikl, isn) & + + Agrege(ikl) * agagr1(ikl) + enddo + + ! +--Above + ! + ^^^^^ + do ikl = 1, klonv + isn1(ikl) = max(i_thin(ikl), i_thin(ikl) + LIndsv(ikl)) + enddo + do i = 1, nsno - 1 + do ikl = 1, klonv + staggr = min(1, max(0, i + 1 - isn1(ikl))) + istoSV(ikl, i) = (1.-staggr) * istoSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * istoSV(ikl, i) & + + Agrege(ikl) * istoSV(ikl, i + 1)) + dzsnSV(ikl, i) = (1.-staggr) * dzsnSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * dzsnSV(ikl, i) & + + Agrege(ikl) * dzsnSV(ikl, i + 1)) + TsisSV(ikl, i) = (1.-staggr) * TsisSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * TsisSV(ikl, i) & + + Agrege(ikl) * TsisSV(ikl, i + 1)) + ro__SV(ikl, i) = (1.-staggr) * ro__SV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * ro__SV(ikl, i) & + + Agrege(ikl) * ro__SV(ikl, i + 1)) + eta_SV(ikl, i) = (1.-staggr) * eta_SV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * eta_SV(ikl, i) & + + Agrege(ikl) * eta_SV(ikl, i + 1)) + G1snSV(ikl, i) = (1.-staggr) * G1snSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * G1snSV(ikl, i) & + + Agrege(ikl) * G1snSV(ikl, i + 1)) + G2snSV(ikl, i) = (1.-staggr) * G2snSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * G2snSV(ikl, i) & + + Agrege(ikl) * G2snSV(ikl, i + 1)) + agsnSV(ikl, i) = (1.-staggr) * agsnSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * agsnSV(ikl, i) & + + Agrege(ikl) * agsnSV(ikl, i + 1)) + enddo + enddo + + do ikl = 1, klonv + isn = min(isnoSV(ikl) + 1, nsno) + istoSV(ikl, isn) = (1.-Agrege(ikl)) * istoSV(ikl, isn) + dzsnSV(ikl, isn) = (1.-Agrege(ikl)) * dzsnSV(ikl, isn) + TsisSV(ikl, isn) = (1.-Agrege(ikl)) * TsisSV(ikl, isn) + ro__SV(ikl, isn) = (1.-Agrege(ikl)) * ro__SV(ikl, isn) + eta_SV(ikl, isn) = (1.-Agrege(ikl)) * eta_SV(ikl, isn) + G1snSV(ikl, isn) = (1.-Agrege(ikl)) * G1snSV(ikl, isn) + G2snSV(ikl, isn) = (1.-Agrege(ikl)) * G2snSV(ikl, isn) + agsnSV(ikl, isn) = (1.-Agrege(ikl)) * agsnSV(ikl, isn) + enddo + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ikl == kSV_v1 .and. lSV_v1 == 3) then + write(6, 5991) i_thin(ikl) +5991 format(/, 'First Agregation / Layer', i3, & + /, ' i', 11x, 'T', 9x, 'rho', 10x, 'dz', 11x, 'H') + write(6, 5995)(isn, TsisSV(ikl, isn), ro__SV(ikl, isn) & + , dzsnSV(ikl, isn), istoSV(ikl, isn), & + isn=isnoSV(ikl), 1, -1) +5995 format(i3, 3f12.3, i12) + endif +#endif + + ! +--Constrains Splitting of too thick Layers + ! + ======================================== + + ! +--Search the thickest non-zero Layer + ! + ---------------------------------- + + do ikl = 1, klonv + ! Arbitrary unrealistic + dzthin(ikl) = 0. + enddo + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + ! Snow Normal.Profile + isno_n = isnoSV(ikl) - isn + 1 + ! Ice Normal.Profile + iice_n = iiceSV(ikl) - isn + ! Ice Switch + iiceOK = min(1, max(0, iice_n + 1)) + ! Actual Profile + dz_dif = (dzsnSV(ikl, isn) & + ! Theoretical Profile + - dz_max * ((1 - iiceOK) * isno_n * isno_n & + + iiceOK * 2.**iice_n)) & + / max(dzsnSV(ikl, isn), epsi) + OKthin = max(zero, & + sign(unun, & + ! 1.=>New thickest Lay. + dz_dif - dzthin(ikl))) & + ! 1 =>.le. isnoSV + * max(0, & + min(1, & + isnoSV(ikl) - isn + 1)) + ! Update thickest Lay. Index + i_thin(ikl) = (1.-OKthin) * i_thin(ikl) & + + OKthin * isn + dzthin(ikl) = (1.-OKthin) * dzthin(ikl) & + + OKthin * dz_dif + enddo + + isn = 1 + if(isnoSV(ikl) > 1 .and. dzsnSV(ikl, isn) > 5) then + ! layer > 5m + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + isn = 2 + if(isnoSV(ikl) > 2 .and. dzsnSV(ikl, isn) > 5) then + ! layer > 5m + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + isn = max(1, isnoSV(ikl) - 3) + ! surface layer > 30cm ! XF 04/07/2019 + if(dzsnSV(ikl, isn) > 0.30) then + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + isn = max(1, isnoSV(ikl) - 2) + ! surface layer > 10cm ! XF 04/07/2019 + if(dzsnSV(ikl, isn) > 0.10) then + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + isn = max(1, isnoSV(ikl) - 1) + ! surface layer > 5cm ! XF 04/07/2019 + if(dzsnSV(ikl, isn) > 0.05) then + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + isn = max(1, isnoSV(ikl)) + ! surface layer > 2cm ! XF 04/07/2019 + if(dzsnSV(ikl, isn) > 0.02) then + i_thin(ikl) = isn + dzthin(ikl) = dzsnSV(ikl, isn) + endif + + enddo + + do ikl = 1, klonv + ! 1. => a too thick Layer exists + ThickL = max(zero, & + sign(unun, dzthin(ikl) & + - epsi)) & + ! No spliting allowed if isno > nsno - 1 + * max(0, 1 - max(0, isnoSV(ikl) & + - nsno + 1)) + ! 1. => effective split + Agrege(ikl) = ThickL & + * max(0, 1 - max(0, NLaysv(ikl) & + + isnoSV(ikl) & + - nsno + 1)) + ! Agregation to allow Splitting at next Time Step + NLay_s(ikl) = ThickL & + * max(0, 1 - max(0, NLaysv(ikl) & + + isnoSV(ikl) & + - nsno)) & + - Agrege(ikl) + ! Agregation effective + NLay_s(ikl) = max(0, NLay_s(ikl)) + enddo + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 4152) i_thin(1), dzthin(1), ThickL +4152 format(/, ' Thickest', i3, ':', f9.3, ' Split =', f4.0) +#endif + + ! +--Rearranges the Layers + ! + --------------------- + + do isn = nsno, 2, -1 + do ikl = 1, klonv + if(Agrege(ikl) > 0. .and. i_thin(ikl) < isnoSV(ikl)) then + staggr = min(1, max(0, isn - i_thin(ikl) - 1)) & + * min(1, max(0, isnoSV(ikl) - isn + 2)) + istoSV(ikl, isn) = staggr * istoSV(ikl, isn - 1) & + + (1.-staggr) * istoSV(ikl, isn) + dzsnSV(ikl, isn) = staggr * dzsnSV(ikl, isn - 1) & + + (1.-staggr) * dzsnSV(ikl, isn) + TsisSV(ikl, isn) = staggr * TsisSV(ikl, isn - 1) & + + (1.-staggr) * TsisSV(ikl, isn) + ro__SV(ikl, isn) = staggr * ro__SV(ikl, isn - 1) & + + (1.-staggr) * ro__SV(ikl, isn) + eta_SV(ikl, isn) = staggr * eta_SV(ikl, isn - 1) & + + (1.-staggr) * eta_SV(ikl, isn) + G1snSV(ikl, isn) = staggr * G1snSV(ikl, isn - 1) & + + (1.-staggr) * G1snSV(ikl, isn) + G2snSV(ikl, isn) = staggr * G2snSV(ikl, isn - 1) & + + (1.-staggr) * G2snSV(ikl, isn) + agsnSV(ikl, isn) = staggr * agsnSV(ikl, isn - 1) & + + (1.-staggr) * agsnSV(ikl, isn) + endif + enddo + enddo + + do ikl = 1, klonv + isn = i_thin(ikl) + dzsnSV(ikl, isn) = 0.5 * Agrege(ikl) * dzsnSV(ikl, isn) & + + (1.-Agrege(ikl)) * dzsnSV(ikl, isn) + + isn = min(i_thin(ikl) + 1, nsno) + istoSV(ikl, isn) = Agrege(ikl) * istoSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * istoSV(ikl, isn) + dzsnSV(ikl, isn) = Agrege(ikl) * dzsnSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * dzsnSV(ikl, isn) + TsisSV(ikl, isn) = Agrege(ikl) * TsisSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * TsisSV(ikl, isn) + ro__SV(ikl, isn) = Agrege(ikl) * ro__SV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * ro__SV(ikl, isn) + eta_SV(ikl, isn) = Agrege(ikl) * eta_SV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * eta_SV(ikl, isn) + G1snSV(ikl, isn) = Agrege(ikl) * G1snSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * G1snSV(ikl, isn) + G2snSV(ikl, isn) = Agrege(ikl) * G2snSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * G2snSV(ikl, isn) + agsnSV(ikl, isn) = Agrege(ikl) * agsnSV(ikl, isn - 1) & + + (1.-Agrege(ikl)) * agsnSV(ikl, isn) + isnoSV(ikl) = min(Agrege(ikl) + isnoSV(ikl), real(nsno)) + iiceSV(ikl) = iiceSV(ikl) & + + Agrege(ikl) * max(0, sign(1, iiceSV(ikl) & + - isn + icemix)) & + * max(0, sign(1, iiceSV(ikl) & + - 1)) + enddo + + ! +--Constrains Agregation in case of too much Layers + ! + ================================================= + + ! +--Search the thinest non-zero Layer + ! + ----------------------------------- + +#if(La) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(6, *) ' ' + write(6, *) 'Agregation 2' + write(6, 6000) NLaysv(1) +6000 format(i3, 6x, & + 'dzsnSV dz_min dz_dif ', & + 'OKthin dzthin i_thin') +#endif + + do ikl = 1, klonv + ! Arbitrary unrealistic Layer Thickness + dzthin(ikl) = 0. + enddo + do ikl = 1, klonv + ! no agregation of 3 first snowlayers ! XF 04/07/2019 + do isn = 1, isnoSV(ikl) - 3 + ! Snow Normal.Profile + isno_n = isnoSV(ikl) - isn + 1 + ! Ice Normal.Profile + iice_n = iiceSV(ikl) - isn + ! Ice Switch + iiceOK = min(1, max(0, iice_n + 1)) +#if(vz) + ! Theoretical Profile + dz_ref(isn) = & + dz_min * ((1 - iiceOK) * isno_n * isno_n & + + iiceOK * 2**iice_n) & + / max(1, isnoSV(ikl)) +#endif + ! Actual Profile + dz_dif = dz_min & + - dzsnSV(ikl, isn) & + ! Theoretical Profile + / max(epsi,((1 - iiceOK) * isno_n * isno_n & + + iiceOK * 2.**iice_n)) +#if(vz) + dzwdif(isn) = dz_dif +#endif + OKthin = max(zero, & + sign(unun, & + ! 1.=> New thinest Lay. + dz_dif - dzthin(ikl))) & + ! 1 => .le. isnoSV + * max(0, & + min(1, & + isnoSV(ikl) - isn + 1)) + ! Update thinest Lay. Index + i_thin(ikl) = (1.-OKthin) * i_thin(ikl) & + + OKthin * isn + dzthin(ikl) = (1.-OKthin) * dzthin(ikl) & + + OKthin * dz_dif + +#if(La) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + if(isn <= isnoSV(1) .and. ikl == 1) & + write(6, 6001) isn, dzsnSV(ikl, isn), dz_min * isno_n * isno_n, dz_dif & + , OKthin, dzthin(ikl), i_thin(ikl) +6001 format(i3, 5f12.6, i9) +#endif + enddo + enddo + +#if(La) + write(6, *) ' ' +#endif + +#if(vz) + write(41, 4153) i_thin(1), dzsnSV(1, i_thin(1)) +4153 format(/, ' Thinest ', i3, ':', f9.3) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 4151) i_thin(1), dzsnSV(1, i_thin(1)) & + , isnoSV(1), dzsnSV(1, isnoSV(1)) +#endif + +#if(vp) + ! +--Snow Properties Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + write(47, 473)(G1snSV(1, isn), isn=1, isnoSV(1)) +473 format('Before _zCr2: G1 = ', 10f8.1,(/, 19x, 10f8.1)) + write(47, 472)(G2snSV(1, isn), isn=1, isnoSV(1)) +#endif + + ! +--Index of the contiguous Layer to agregate + ! + ----------------------------------------- + + ! + ********* + call SISVAT_zCr + ! + ********* + + ! +--Assign the 2 Layers to agregate + ! + ------------------------------- + + do ikl = 1, klonv + isn = i_thin(ikl) + if(LIndsv(ikl) > 0) isn = min(isn, nsno - 1) !cXF + isagr1(ikl) = istoSV(ikl, isn) + isagr2(ikl) = istoSV(ikl, isn + LIndsv(ikl)) + dzagr1(ikl) = dzsnSV(ikl, isn) + dzagr2(ikl) = dzsnSV(ikl, isn + LIndsv(ikl)) + T_agr1(ikl) = TsisSV(ikl, isn) + T_agr2(ikl) = TsisSV(ikl, isn + LIndsv(ikl)) + roagr1(ikl) = ro__SV(ikl, isn) + roagr2(ikl) = ro__SV(ikl, isn + LIndsv(ikl)) + etagr1(ikl) = eta_SV(ikl, isn) + etagr2(ikl) = eta_SV(ikl, isn + LIndsv(ikl)) + G1agr1(ikl) = G1snSV(ikl, isn) + G1agr2(ikl) = G1snSV(ikl, isn + LIndsv(ikl)) + G2agr1(ikl) = G2snSV(ikl, isn) + G2agr2(ikl) = G2snSV(ikl, isn + LIndsv(ikl)) + agagr1(ikl) = agsnSV(ikl, isn) + agagr2(ikl) = agsnSV(ikl, isn + LIndsv(ikl)) + LstLay = min(1, max(0, isnoSV(ikl) - 1)) + Agrege(ikl) = min(1, & + max(0, & + NLaysv(ikl) + isnoSV(ikl) - nsno & + + NLay_s(ikl)) & + * LstLay) + + if(isnoSV(ikl) > 3) then + ! surface layers> 2-5-10 ! XF 04/07/2019 + if(dzsnSV(ikl, max(1, isnoSV(ikl) - 0)) > 0.02 .or. & + dzsnSV(ikl, max(1, isnoSV(ikl) - 1)) > 0.05 .or. & + dzsnSV(ikl, max(1, isnoSV(ikl) - 2)) > 0.10 .or. & + dzsnSV(ikl, max(1, isnoSV(ikl) - 3)) > 0.30 .or. & + dzsnSV(ikl, 1) > 5. .or. dzsnSV(ikl, 2) > 5.) then + Agrege(ikl) = min(1, & + ! nsno-1 layers ma + max(0, NLaysv(ikl) + isnoSV(ikl) + 1 - nsno & + + NLay_s(ikl)) * LstLay) + endif + endif + + isnoSV(ikl) = isnoSV(ikl) & + - (1 - LstLay) * max(zero, & + sign(unun, eps_21 & + - dzsnSV(ikl, 1))) + isnoSV(ikl) = max(0, isnoSV(ikl)) + + WEagre(ikl) = 0. + enddo + + do isn = 1, nsno + do ikl = 1, klonv + WEagre(ikl) = WEagre(ikl) + ro__SV(ikl, isn) * dzsnSV(ikl, isn) & + * min(1, max(0, i_thin(ikl) + 1 - isn)) + enddo + enddo + +#if(vz) + ! +--Layers Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~ + write(41, 4120) +4120 format(' Agregation of too MUCH Layers') + write(41, 411)(100.*dz_ref(isn), isn=1, nsno) + write(41, 412)(100.*dzwdif(isn), isn=1, nsno) + write(41, 413)(100.*dzsnSV(1, isn), isn=1, nsno) + write(41, 414)(isn, isn=1, nsno) + write(41, 4111) isnoSV(1) + write(41, 4112) i_thin(1) + write(41, 4113) LIndsv(1) + write(41, 4114) Agrege(1) +#endif + +#if(vp) + ! +--Snow Properties Agregation: IO + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + write(47, 474)(G1snSV(1, isn), isn=1, isnoSV(1)) +474 format('Before _zAg2: G1 = ', 10f8.1,(/, 19x, 10f8.1)) + write(47, 472)(G2snSV(1, isn), isn=1, isnoSV(1)) +#endif + + ! +--Agregates + ! + --------- + + ! + *************** + call SISVAT_zAg & + (isagr1, isagr2, WEagre & + , dzagr1, dzagr2, T_agr1, T_agr2 & + , roagr1, roagr2, etagr1, etagr2 & + , G1agr1, G1agr2, G2agr1, G2agr2 & + , agagr1, agagr2, Agrege & + ) + ! + *************** + + ! +--Rearranges the Layers + ! + --------------------- + + ! +--New (agregated) Snow layer + ! + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + do ikl = 1, klonv + isn = i_thin(ikl) + isn = min(isn, isn + LIndsv(ikl)) + isnoSV(ikl) = max(0., isnoSV(ikl) - Agrege(ikl)) + iiceSV(ikl) = iiceSV(ikl) & + - max(0, sign(1, iiceSV(ikl) - isn + icemix)) & + * Agrege(ikl) & + * max(0, sign(1, iiceSV(ikl) - 1)) + istoSV(ikl, isn) = (1.-Agrege(ikl)) * istoSV(ikl, isn) & + + Agrege(ikl) * isagr1(ikl) + dzsnSV(ikl, isn) = (1.-Agrege(ikl)) * dzsnSV(ikl, isn) & + + Agrege(ikl) * dzagr1(ikl) + TsisSV(ikl, isn) = (1.-Agrege(ikl)) * TsisSV(ikl, isn) & + + Agrege(ikl) * T_agr1(ikl) + ro__SV(ikl, isn) = (1.-Agrege(ikl)) * ro__SV(ikl, isn) & + + Agrege(ikl) * roagr1(ikl) + eta_SV(ikl, isn) = (1.-Agrege(ikl)) * eta_SV(ikl, isn) & + + Agrege(ikl) * etagr1(ikl) + G1snSV(ikl, isn) = (1.-Agrege(ikl)) * G1snSV(ikl, isn) & + + Agrege(ikl) * G1agr1(ikl) + G2snSV(ikl, isn) = (1.-Agrege(ikl)) * G2snSV(ikl, isn) & + + Agrege(ikl) * G2agr1(ikl) + agsnSV(ikl, isn) = (1.-Agrege(ikl)) * agsnSV(ikl, isn) & + + Agrege(ikl) * agagr1(ikl) + enddo + + ! +--Above + ! + ^^^^^ + do ikl = 1, klonv + isn1(ikl) = max(i_thin(ikl), i_thin(ikl) + LIndsv(ikl)) + enddo + do i = 1, nsno - 1 + do ikl = 1, klonv + staggr = min(1, max(0, i + 1 - isn1(ikl))) + istoSV(ikl, i) = (1.-staggr) * istoSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * istoSV(ikl, i) & + + Agrege(ikl) * istoSV(ikl, i + 1)) + dzsnSV(ikl, i) = (1.-staggr) * dzsnSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * dzsnSV(ikl, i) & + + Agrege(ikl) * dzsnSV(ikl, i + 1)) + TsisSV(ikl, i) = (1.-staggr) * TsisSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * TsisSV(ikl, i) & + + Agrege(ikl) * TsisSV(ikl, i + 1)) + ro__SV(ikl, i) = (1.-staggr) * ro__SV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * ro__SV(ikl, i) & + + Agrege(ikl) * ro__SV(ikl, i + 1)) + eta_SV(ikl, i) = (1.-staggr) * eta_SV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * eta_SV(ikl, i) & + + Agrege(ikl) * eta_SV(ikl, i + 1)) + G1snSV(ikl, i) = (1.-staggr) * G1snSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * G1snSV(ikl, i) & + + Agrege(ikl) * G1snSV(ikl, i + 1)) + G2snSV(ikl, i) = (1.-staggr) * G2snSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * G2snSV(ikl, i) & + + Agrege(ikl) * G2snSV(ikl, i + 1)) + agsnSV(ikl, i) = (1.-staggr) * agsnSV(ikl, i) & + + staggr * ((1.-Agrege(ikl)) * agsnSV(ikl, i) & + + Agrege(ikl) * agsnSV(ikl, i + 1)) + enddo + enddo + + do ikl = 1, klonv + isn = min(isnoSV(ikl) + 1, nsno) + istoSV(ikl, isn) = (1.-Agrege(ikl)) * istoSV(ikl, isn) + dzsnSV(ikl, isn) = (1.-Agrege(ikl)) * dzsnSV(ikl, isn) + TsisSV(ikl, isn) = (1.-Agrege(ikl)) * TsisSV(ikl, isn) + ro__SV(ikl, isn) = (1.-Agrege(ikl)) * ro__SV(ikl, isn) + eta_SV(ikl, isn) = (1.-Agrege(ikl)) * eta_SV(ikl, isn) + G1snSV(ikl, isn) = (1.-Agrege(ikl)) * G1snSV(ikl, isn) + G2snSV(ikl, isn) = (1.-Agrege(ikl)) * G2snSV(ikl, isn) + agsnSV(ikl, isn) = (1.-Agrege(ikl)) * agsnSV(ikl, isn) + enddo + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(kSV_v1 > 0 .and. lSV_v1 == 3) then + write(6, 5992) i_thin(kSV_v1) +5992 format(/, 'Secnd Agregation / Layer', i3, & + /, ' i', 11x, 'T', 9x, 'rho', 10x, 'dz', 11x, 'H') + write(6, 5995)(isn, TsisSV(kSV_v1, isn), ro__SV(kSV_v1, isn) & + , dzsnSV(kSV_v1, isn), istoSV(kSV_v1, isn), & + isn=isnoSV(kSV_v1), 1, -1) + endif +#endif + +#if(vp) + write(47, 475)(G1snSV(1, isn), isn=1, isnoSV(1)) +475 format('At End _zSn : G1 = ', 10f8.1,(/, 19x, 10f8.1)) + write(47, 472)(G2snSV(1, isn), isn=1, isnoSV(1)) +#endif + + ! +--Search new Ice/Snow Interface + ! + ============================= + do ikl = 1, klonv + iiceSV(ikl) = 0 + enddo + do ikl = 1, klonv + do isn = 1, isnoSV(ikl) + OK_ICE = max(zero, sign(unun, ro__SV(ikl, isn) - ro_ice + 20.)) & + * max(zero, sign(unun, dzsnSV(ikl, isn) - epsi)) + iiceSV(ikl) = (1.-OK_ICE) * iiceSV(ikl) + OK_ICE * isn + enddo + enddo + + return +end diff --git a/MAR/code_mar/sisvatesbl.f90 b/MAR/code_mar/sisvatesbl.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3337a8df094a50c7c453e9b87e35418c124fafdd --- /dev/null +++ b/MAR/code_mar/sisvatesbl.f90 @@ -0,0 +1,750 @@ +#include "MAR_pp.def" +subroutine SISVATeSBL + !--------------------------------------------------------------------------+ + ! MAR SISVATeSBL Tue 12-JUL-2019 MAR | + ! subroutine SISVATeSBL generates Surface Boundary Layers Properties | + ! (and computes usthSV since 24-sep 2018) | + !--------------------------------------------------------------------------+ + ! | + ! PARAMETERS: klonv: Total Number of columns | + ! ^^^^^^^^^^ = Total Number of continental grid boxes | + ! X Number of Mosaic Cell per grid box | + ! | + ! INPUT: za__SV : Surface Boundary Layer (SBL) Height [m] | + ! ^^^^^ VV__SV :(SBL Top) Wind Velocity [m/s] | + ! TaT_SV : SBL Top Temperature [K] | + ! ExnrSV : Exner Potential [-] | + ! qsnoSV : SBL Mean Snow Content [kg/kg] | + ! uqs_SV : Specific Humidity Turbulent Flux [m/s] | + ! usthSV : Threshd. friction velocity for snow erosion[m/s] | + ! Z0m_SV : Momentum Roughness Length [m] | + ! Z0h_SV : Heat Roughness Length [m] | + ! Tsrfsv : Surface Temperature [K] | + ! sqrCm0 : Contribution of Z0m to Neutral Drag Coefficient | + ! sqrCh0 : Contribution of Z0h to Neutral Drag Coefficient | + ! | + ! INPUT / LMO_SV : Monin-Obukhov Scale [m] | + ! OUTPUT: us__SV : Friction Velocity [m/s] | + ! ^^^^^^ uts_SV : Temperature Turbulent Flux [K.m/s] | + ! uss_SV : Blowing Snow Turbulent Flux [m/s] | + ! | + ! OUTPUT: hSalSV : Saltating Layer Height [m] | + ! ^^^^^^ qSalSV : Saltating Snow Concentration [kg/kg] | + ! ram_sv : Aerodynamic Resistance for Momentum [s/m] | + ! rah_sv : Aerodynamic Resistance for Heat [s/m] | + ! | + ! # OPTIONS: #BS: Blowing Snow turbulent Fluxes are computed | + ! # ^^^^^^^ #ss: Additional Output | + ! | + !--------------------------------------------------------------------------+ + + use marphy + use mar_sv + use mardsv + use marxsv + use marysv + + implicit none + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 + common / SISVAT_EV / iSV_v1, jSV_v1, nSV_v1, kSV_v1, lSV_v1 +#endif + + ! V, dT(a-s) Time Moving Averages + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + integer ntaver, nt + parameter(ntaver=4) + real V__mem(klonv, ntaver) + real VVmmem(klonv) + common / SVeSBLmem / V__mem, VVmmem + real T__mem(klonv, ntaver) + real dTmmem(klonv) + common / STeSBLmem / T__mem, dTmmem + + !$OMP threadprivate(/SVeSBLmem/,/STeSBLmem/) + +#if(AM) + ! u*, u*T*, u*s* Time Moving Averages + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + real u__mem(klonv, ntaver) + common / S_eSBLmem / u__mem +#endif +#if(AT) + real uT_mem(klonv, ntaver) + common uT_mem +#endif +#if(AS) + real us_mem(klonv, ntaver) + common us_mem +#endif + + ! Internal Variables + ! ================== + integer ikl, icount, isn + real VVaSBL(klonv), VVa_OK ! VVaSBL, VVa_OK : effective SBL wind speed + real dTa_Ts(klonv) ! dTa_Ts : effective SBL Temperature diff. + real Theta0 ! Theta0 : Potential Reference Temperature + real LMOmom(klonv) ! LMOmom : Monin-Obukhov Scale Momentum + real LMOsgn ! LMOsgn : Monin-Obukhov Scale Sign + real LMOabs ! LMOabs : Monin-Obukhov Scale Abs.Value + real uustar, thstar, qqstar, ssstar, thstarv, thstars, thstara + real zetam, zetah, zeta_S, zeta_A, zeta0m, zeta0h + real psim_s, xpsimi, psim_i, psim_z + real psis_s, psis_z, psis_0 + real psih_s, xpsihi, psih_i, psih_z + real psim_0, psih_0 + real CDm(klonv) ! CDm : Drag Coefficient, Momentum + real CDs(klonv), rCDs(klonv) ! CDs, rCDs : Drag Coefficient, Blown ** + real CDh(klonv) ! CDh : Drag Coefficient, Scalar + real dustar, u0star, uTstar, usstar + real sss__F, sss__N, usuth0 + real zetMAX + real coef_m, coef_h, stab_s + real Richar(klonv) ! Richar : Richardson Number +#if(wr) + real W_pLMO ! W_pLMO : Pseudo Obukhov Length (WRITE) + real W_psim ! W_psim : Pseudo psim(z) (WRITE) +#endif +#if(w1) + real W_NUs1 ! W_NUs1 : Contrib to U* numerat.1(WRITE) + real W_NUs2 ! W_NUs2 : Contrib to U* numerat.2(WRITE) + real W_NUs3 ! W_NUs3 : Contrib to U* numerat.3(WRITE) + real W_DUs1 ! W_DUs1 : Contrib to U* denomin.1(WRITE) + real W_DUs2 ! W_DUs2 : Contrib to U* denomin.2(WRITE) +#endif + real fac_Ri, vuzvun, Kz_vun + character * 3 qsalt_param ! qsalt_param : Switch for saltation flux param. + character * 3 usth_param ! usth_param : Switch for u*t param + +#if(AE) + integer nit, iit + real dusuth, signus + real sss__K, sss__G + real us_127, us_227, us_327, us_427, us_527 + real SblPom + ! rCd10n : Square root of drag coefficient + real rCd10n + ! DendOK : Dendricity Switch + real DendOK + ! SaltOK : Saltation Switch + real SaltOK + ! MeltOK : Saltation Switch (Melting Snow) + real MeltOK + ! SnowOK : Pack Top Switch + real SnowOK + ! SaltM1, SaltM2, SaltMo, SaltMx : Saltation Parameters + real SaltM1, SaltM2, SaltMo, SaltMx + ! ShearX, ShearS : Arg. Max Shear Stress + real ShearX, ShearS + ! Por_BS : Snow Porosity + real Por_BS + ! Salt_us : New thresh.friction velocity u*t + real Salt_us + ! Fac_Mo, ArguSi, FacRho : Numerical factors for u*t + real Fac_Mo, ArguSi, FacRho + ! SaltSI : Snow Drift Index ! + real SaltSI(klonv, 0:nsno) + ! MIN_Mo : Minimum Mobility Fresh Fallen * + real MIN_Mo +#endif + + ! Internal DATA + ! ============= + + ! Theta0 : Potential Reference Temperature + data Theta0/288.0/ +#if(ZX) + ! zetMAX : Strong Stability Limit + data zetMAX/1.e6/ +#endif +#if(zx) + ! zetMAX : Strong Stability Limit (Mahalov et al. 2004, GRL 31 2004GL021055) + data zetMAX/1.e0/ +#endif + ! zetMAX : Strong Stability Limit + data zetMAX/4.28/ + ! coef_m : Stabil.Funct.for Moment.: unstab.coef. + ! (King et al. 1996, JGR 101(7) p.19121) + data coef_m/20./ + ! coef_h : Stabil.Funct.for Heat: unstab.coef. + data coef_h/15./ +#if(AE) + ! Lower Boundary Height Parameter for Suspension + ! Pommeroy, Gray and Landine 1993, J. Hydrology, 144(8) p.169 + ! SblPom : us(is0,uth) recursivity: Nb Iterations + data SblPom/1.27/ + ! nit : saltation part. conc. from Pomeroy and Gray + data nit/5/ + ! qsalt_param : u*t from Gallee et al. 2001 + ! data qsalt_param/"bin"/ ! saltation part. conc. from Bintanja 2001 (p + data qsalt_param/"pom"/ + ! data usth_param/"lis"/ ! u*t from Liston et al. 2007 + data usth_param/"gal"/ + data SaltMx/-5.83e-2/ + ! +--Computation of threshold friction velocity for snow erosion + ! + =========================================================== + rCd10n = 1./26.5 ! Vt / u*t = 26.5 + ! Budd et al. 1965, Antarct. Res. Series Fig.13 + ! ratio developped during assumed neutral conditions + ! +--Snow Properties + ! + ~~~~~~~~~~~~~~~ + ! do isn = 1, nsno + do ikl = 1, klonv + isn = isnoSV(ikl) + DendOK = max(zero, sign(unun, epsi - G1snSV(ikl, isn))) + SaltOK = min(1, max(istdSV(2) - istoSV(ikl, isn), 0)) + MeltOK = (unun & + - max(zero, sign(unun, TfSnow - epsi & + - TsisSV(ikl, isn)))) & + * min(unun, DendOK & + + (1.-DendOK) & + ! 1.0 for 1mm + * sign(unun, G2snSV(ikl, isn) - 1.0)) + ! Snow Switch + SnowOK = min(1, max(isnoSV(ikl) + 1 - isn, 0)) + G1snSV(ikl, isn) = SnowOK * G1snSV(ikl, isn) & + + (1.-SnowOK) * min(G1snSV(ikl, isn), G1_dSV) + G2snSV(ikl, isn) = SnowOK * G2snSV(ikl, isn) & + + (1.-SnowOK) * min(G2snSV(ikl, isn), G1_dSV) + SaltOK = min(unun, SaltOK + MeltOK) * SnowOK + ! +--Mobility Index (Guyomarc'h & Merindol 1997, Ann.Glaciol.) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SaltM1 = -0.750e-2 * G1snSV(ikl, isn) & + - 0.500e-2 * G2snSV(ikl, isn) + 0.500e00 !dendritic case + ! + CAUTION: Guyomarc'h & Merindol Dendricity Sign is + + ! + ^^^^^^^^ MAR Dendricity Sign is - + SaltM2 = -0.833d-2 * G1snSV(ikl, isn) & + - 0.583d-2 * G2snSV(ikl, isn) + 0.833d00 !non-dendritic case + ! SaltMo = (DendOK * SaltM1 + (1.-DendOK) * SaltM2 ) + SaltMo = 0.625 !SaltMo pour d=s=0.5 + + ! weighting SaltMo with surface snow density (Vionnet et al. 2012) + ! FacRho = 1.25 - 0.0042 * ro__SV(ikl,isn) + ! SaltMo = 0.34 * SaltMo + 0.66 * FacRho !needed for polar snow + MIN_Mo = 0. + ! SaltMo = max(SaltMo,MIN_Mo) + ! SaltMo = SaltOK * SaltMo + (1.-SaltOK) * min(SaltMo,SaltMx) +#if(TUNE) + SaltMo = SaltOK * SaltMo - (1.-SaltOK) * 0.9500 +#endif + SaltMo = max(SaltMo, epsi - unun) + ! +--Influence of Density on Threshold Shear Stress + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Por_BS = 1.-300./ro_Ice + ! SheaBS = Arg(sqrt(shear = max shear stress in snow)): + ! shear = 3.420d00 * exp(-(Por_BS +Por_BS) /(unun -Por_BS)) + ! SheaBS : see de Montmollin (1978), + ! These Univ. Sci. Medic. Grenoble, Fig. 1 p. 124 + ShearS = Por_BS / (1.-Por_BS) + + ! +--Snow Drift Index (Guyomarc'h & Merindol 1997, Ann.Glaciol.) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ArguSi = -0.085 * us__SV(ikl) / rCd10n + !V=u*/sqrt(CD) eqs 2 to 4 Gallee et al. 2001 + SaltSI(ikl, isn) = -2.868 * exp(ArguSi) + 1 + SaltMo + ! +--Threshold Friction Velocity + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ro__SV(ikl, isn) > 300.) then + Por_BS = 1.000 - ro__SV(ikl, isn) / ro_Ice + else + Por_BS = 1.000 - 300./ro_Ice + endif + ShearX = Por_BS / max(epsi, 1.-Por_BS) + ! + Gallee et al., 2001 eq 5, p5 + Fac_Mo = exp(-ShearX + ShearS) + if(usth_param == "gal") then + Salt_us = (log(2.868) - log(1 + SaltMo)) * rCd10n / 0.085 + ! Salt_us : Extension of Guyomarc'h & Merindol 1998 with + ! de Montmollin (1978). Gallee et al. 2001 + Salt_us = Salt_us * Fac_Mo + endif + if(usth_param == "lis") then !Liston et al. 2007 + if(ro__SV(ikl, isn) > 300.) then + Salt_us = 0.005 * exp(0.013 * ro__SV(ikl, isn)) + else + Salt_us = 0.01 * exp(0.003 * ro__SV(ikl, isn)) + endif + endif + SnowOK = 1 - min(1, iabs(isn - isnoSV(ikl))) !Switch new vs old snow + usthSV(ikl) = SnowOK * (Salt_us) + (1.-SnowOK) * usthSV(ikl) + enddo + ! end do +#endif + + ! Effective SBL variables + ! ======================= + + do ikl = 1, klonv + VVaSBL(ikl) = VV__SV(ikl) + VVaSBL(ikl) = VVmmem(ikl) + dTa_Ts(ikl) = TaT_SV(ikl) - Tsrfsv(ikl) + dTa_Ts(ikl) = dTmmem(ikl) + enddo + + ! Convergence Criterion + ! ===================== + + icount = 0 + +1 continue + icount = icount + 1 + dustar = 0. + + do ikl = 1, klonv + + u0star = us__SV(ikl) + +#if(AM) + ! u*, u*T*, u*s* Time Moving Averages + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + u0star = 0.0 +#if(AT) + uTstar = 0.0 +#endif +#if(AS) + usstar = 0.0 +#endif + do nt = 1, ntaver + u0star = u0star + u__mem(ikl, nt) +#if(AT) + uTstar = uTstar + uT_mem(ikl, nt) +#endif +#if(AS) + usstar = usstar + us_mem(ikl, nt) +#endif + enddo + u0star = u0star / ntaver + us__SV(ikl) = u0star +#if(AT) + uts_SV(ikl) = uTstar / ntaver +#endif +#if(AS) + uss_SV(ikl) = usstar / ntaver +#endif +#endif + + ! Turbulent Scales from previous Time Step + ! ---------------------------------------- + + u0star = max(epsi, u0star) ! Friction Velocity u* + uustar = u0star * u0star ! Friction Velocity^2 uu* + thstar = uts_SV(ikl) / u0star ! Temperature theta* + qqstar = uqs_SV(ikl) / u0star ! Specific Humidity qq* + ssstar = uss_SV(ikl) / u0star ! Blown Snow ss* + + ! Monin-Obukhov Stability Parameter for Momentum + ! ---------------------------------------------- + + ! Pseudo Virtual Temperature Turbulent Scale thetav* + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + thstarv = thstar + Theta0 * (0.608 * qqstar) & + / (1.+0.608 * QaT_SV(ikl) - qsnoSV(ikl)) + thstars = sign(unun, thstarv) + thstara = abs(thstarv) + thstarv = max(epsi, thstara) * thstars + + ! Pseudo Obukhov Length Scale (Gall?e et al., 2001 BLM 99, (A2) p.17) + ! Full Obukhov Length Scale (when Blowing * is ##NOT## switched ON) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + LMO_SV(ikl) = Theta0 * max(epsi, uustar) & + / (vonkar * gravit * thstarv) +#if(wr) + W_pLMO = LMO_SV(ikl) +#endif + + zetah = za__SV(ikl) / LMO_SV(ikl) + zetam = min(zetMAX, zetah)! Strong Stability Limit + ! !(Mahalov et al. 2004 + ! ! GRL 31 2004GL021055) + LMOmom(ikl) = za__SV(ikl) / (max(epsi, abs(zetam)) & + * sign(unun, zetam)) + zeta0m = Z0m_SV(ikl) / LMOmom(ikl) + zeta0h = Z0h_SV(ikl) / LMO_SV(ikl) + + ! Momentum Pseudo Stability Function (Gall?e et al. 2001, BLM 99, (11) p. 7) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + stab_s = max(zero, sign(unun, zetam)) + + psim_s = -A_Turb * zetam + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zetam))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psim_z = stab_s * psim_s + (1.-stab_s) * psim_i +#if(wr) + W_psim = psim_z +#endif + + psim_s = -A_Turb * zeta0m + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zeta0m))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psim_0 = stab_s * psim_s + (1.-stab_s) * psim_i + +#if(AE) + ! Virtual Temperature Turbulent Scale thetav* (ss* impact included ) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ needed for new ss*) + thstarv = thstar + Theta0 * (0.608 * qqstar & + - ssstar & + ) & + / (1.+0.608 * QaT_SV(ikl) - qsnoSV(ikl)) + thstars = sign(unun, thstarv) + thstara = abs(thstarv) + thstarv = max(epsi, thstara) * thstars + ! Full Obukhov Length Scale (Gallee et al. 2001, BLM 99, (A1) p.16) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + LMO_SV(ikl) = Theta0 * us__SV(ikl) * us__SV(ikl) & + / (vonkar * gravit * thstarv) + zetah = za__SV(ikl) / LMO_SV(ikl) + ! Strong Stability Limit (Mahalov et al. 2004 GRL 31 2004GL021055) + zetam = min(zetMAX, zetah) + LMOmom(ikl) = za__SV(ikl) / (max(epsi, abs(zetam)) & + * sign(unun, zetam)) + zeta0m = Z0m_SV(ikl) / LMOmom(ikl) + ! Snow Erosion Stability Function (Gall?e et al. 2001, BLM 99, (11) p. 7) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + stab_s = max(zero, sign(unun, zetam)) + psis_s = -AsTurb * zetam + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zetam))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psis_z = stab_s * psis_s + (1.-stab_s) * psim_i + psis_s = -AsTurb * zeta0m + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zeta0m))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psis_0 = stab_s * psis_s + (1.-stab_s) * psim_i + ! Square Roots of the Drag Coefficient for Snow Erosion Turbulent Flux + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + rCDmSV(ikl) = vonkar / (sqrCm0(ikl) - psim_z + psim_0) +#endif + +#if(ss) + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6600) Z0m_SV(ikl), psim_z & + , LMO_SV(ikl), uustar & + , sqrCm0(ikl), psim_0 & + , LMOmom(ikl), thstarv +6600 format(/, ' ** SISVATeSBL *0 ' & + , ' Z0m_SV = ', e12.4, ' psim_z = ', e12.4 & + , ' LMO_SV = ', e12.4, ' uustar = ', e12.4 & + , /, ' ' & + , ' sqrCm0 = ', e12.4, ' psim_0 = ', e12.4 & + , ' LMOmom = ', e12.4, ' thstarv = ', e12.4) +#endif + + ! Momentum Turbulent Scale u* + ! --------------------------------------- + + ! Momentum Turbulent Scale u* in case of NO Blow. Snow + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + VVa_OK = max(0.000001, VVaSBL(ikl)) + sss__N = vonkar * VVa_OK + sss__F = (sqrCm0(ikl) - psim_z + psim_0) + usuth0 = sss__N / sss__F ! u* if NO Blow. Snow + +#if(AE) + ! Momentum Turbulent Scale u* in case of Blow. Snow + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + sss__G = 0.27417 * gravit + ! ______________ _____ + ! Newton-Raphson (! Iteration, BEGIN) + ! ~~~~~~~~~~~~~~ ~~~~~ + do iit = 1, nit + sss__K = gravit * r_Turb * A_Turb * za__SV(ikl) & + * rCDmSV(ikl) * rCDmSV(ikl) & + / (1.+0.608 * QaT_SV(ikl) - qsnoSV(ikl)) + us_127 = exp(SblPom * log(us__SV(ikl))) + us_227 = us_127 * us__SV(ikl) + us_327 = us_227 * us__SV(ikl) + us_427 = us_327 * us__SV(ikl) + us_527 = us_427 * us__SV(ikl) + us__SV(ikl) = us__SV(ikl) & + - (us_527 * sss__F / sss__N & + - us_427 & + - us_227 * qsnoSV(ikl) * sss__K & + + (us__SV(ikl) * us__SV(ikl) - usthSV(ikl) * usthSV(ikl)) / sss__G) & + / (us_427 * 5.27 * sss__F / sss__N & + - us_327 * 4.27 & + - us_127 * 2.27 * qsnoSV(ikl) * sss__K & + + us__SV(ikl) * 2.0 / sss__G) + us__SV(ikl) = min(us__SV(ikl), usuth0) + us__SV(ikl) = max(us__SV(ikl), epsi) + rCDmSV(ikl) = us__SV(ikl) / VVa_OK + sss__F = vonkar / rCDmSV(ikl) + enddo + us__SV(ikl) = usuth0 !desactivate feedback between BS and u* + ! ______________ ___ + ! Newton-Raphson (! Iteration, END ) + ! ~~~~~~~~~~~~~~ ~~~ + us_127 = exp(SblPom * log(us__SV(ikl))) + us_227 = us_127 * us__SV(ikl) + ! Momentum Turbulent Scale u*: 0-Limit in case of no Blow. Snow + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + dusuth = us__SV(ikl) - usthSV(ikl) + signus = max(sign(unun, dusuth), zero) +#endif + us__SV(ikl) = usuth0 +#if(AE) + us__SV(ikl) = us__SV(ikl) * (1.-signus) + ! Blowing Snow Turbulent Scale ss* + ! --------------------------------------- + hSalSV(ikl) = 8.436e-2 * us__SV(ikl)**SblPom + if(qsalt_param == "pom") then + qSalSV(ikl) = (us__SV(ikl)**2 - usthSV(ikl)**2) * signus & + / (hSalSV(ikl) * gravit * us__SV(ikl) * 4.2) + endif + if(qsalt_param == "bin") then + qSalSV(ikl) = (us__SV(ikl) * us__SV(ikl) & + - usthSV(ikl) * usthSV(ikl)) * signus & + * 0.535 / (hSalSV(ikl) * gravit) + endif + ssstar = rCDmSV(ikl) * (qsnoSV(ikl) - qSalSV(ikl)) & + * r_Turb !Bintanja 2000, BLM + ! r_Turb compensates for an overestim. of the blown snow part. fall velocity + uss_SV(ikl) = min(zero, us__SV(ikl) * ssstar) +#endif +#if(BS) + uss_SV(ikl) = max(-0.0001, uss_SV(ikl)) +#endif + +#if(ss) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ii__SV(ikl) == iwr_SV .and. jj__SV(ikl) == jwr_SV .and. & + nn__SV(ikl) == nwr_SV) & + write(6, 6610) usuth0, us__SV(ikl) & + , qsnoSV(ikl), uss_SV(ikl) & + , usthSV(ikl), LMO_SV(ikl) & + , qSalSV(ikl), VVa_OK +6610 format(/, ' ** SISVATeSBL *1 ' & + , ' u*(nBS) = ', e12.4, ' u*(_BS) = ', e12.4 & + , ' Qs = ', e12.4, ' u*Qs* = ', e12.4 & + , /, ' ' & + , ' u*(_th) = ', e12.4, ' LMO = ', e12.4 & + , ' QSalt = ', e12.4, ' VVa = ', e12.4) +#endif + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ikl == kSV_v1 .and. lSV_v1 > 0 & + .and. lSV_v1 <= 2) & + write(6, 6000) daHost, icount, & + us__SV(ikl), 1.e3 * hSalSV(ikl), & + 1.e3 * Z0m_SV(ikl), & + 1.e3 * qsnoSV(ikl), 1.e3 * qSalSV(ikl) & + , usthSV(ikl), us__SV(ikl) - usthSV(ikl), & + 1.e3 * ssstar, 1.e3 * us__SV(ikl) * ssstar +6000 format(a18, i3, 6x, 'u* [m/s] =', f6.3, ' hSalt[mm]=', e9.3, & + ' Z0m [mm] =', f9.3, ' q [g/kg] =', f9.3, & + /, 91x, ' qSa [g/kg] =', f9.3, & + /, 27x, 'ut*[m/s]=', e9.3, ' u*-ut* =', e9.3, & + ' s* [g/kg] =', f9.3, ' us* [mm/s] =', f9.3) +#endif + +#if(AE) + ! Virtual Temperature Turbulent Scale thetav* (ss* impact included) + ! -------------------------------------------------------------------- + thstarv = thstar + Theta0 * (0.608 * qqstar & + - ssstar & + ) & + / (1.+0.608 * QaT_SV(ikl) - qsnoSV(ikl)) + thstars = sign(unun, thstarv) + thstara = abs(thstarv) + thstarv = max(epsi, thstara) * thstars + ! Full Obukhov Length Scale (Gall?e et al., 2001, BLM 99, (A1) p.16) + ! -------------------------------------------------------------------- + LMO_SV(ikl) = Theta0 * us__SV(ikl) * us__SV(ikl) & + / (vonkar * gravit * thstarv) + zetah = za__SV(ikl) / LMO_SV(ikl) + ! Strong Stability Limit (Mahalov et al. 2004 GRL 31 2004GL021055) + zetam = min(zetMAX, zetah) + LMOmom(ikl) = za__SV(ikl) / (max(epsi, abs(zetam)) & + * sign(unun, zetam)) + zeta0m = Z0m_SV(ikl) / LMOmom(ikl) + zeta0h = Z0h_SV(ikl) / LMO_SV(ikl) +#endif + +#if(wx) + ! OUTPUT in SISVAT at specified i,j,k,n (see assignation in PHY_SISVAT) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(ikl == kSV_v1 .and. lSV_v1 > 0 & + .and. lSV_v1 <= 2) & + write(6, 6001) LMO_SV(ikl), zetah +#endif +6001 format(18x, 9x, 'LMO [m]=', f9.1, ' zetah[-] =', f9.3) + + ! Turbulent Scales + ! ---------------- + + ! Momentum Stability Function (Gall?e et al., 2001, BLM 99, (11) p. 7) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + stab_s = max(zero, sign(unun, zetam)) + + psim_s = -A_Turb * zetam + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zetam))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psim_z = stab_s * psim_s + (1.-stab_s) * psim_i + + psim_s = -A_Turb * zeta0m + xpsimi = sqrt(sqrt(unun - coef_m * min(zero, zeta0m))) + psim_i = 2.*log(demi * (unun + xpsimi)) & + + log(demi * (unun + xpsimi * xpsimi)) & + - 2.*atan(xpsimi) + demi * pi + psim_0 = stab_s * psim_s + (1.-stab_s) * psim_i + + ! Heat Stability Function (Gall?e et al., 2001, BLM 99, (11) p. 7) + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + stab_s = max(zero, sign(unun, zetah)) + + psih_s = -AhTurb * zetah + xpsihi = sqrt(sqrt(unun - coef_h * min(zero, zetah))) + psih_i = 2.*log(demi * (unun + xpsihi)) + psih_z = stab_s * psih_s + (1.-stab_s) * psih_i + + psih_s = -AhTurb * zeta0h + xpsihi = sqrt(sqrt(unun - coef_h * min(zero, zeta0h))) + psih_i = 2.*log(demi * (unun + xpsihi)) + psih_0 = stab_s * psih_s + (1.-stab_s) * psih_i + + ! Square Roots of the Drag Coefficients + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + rCDhSV(ikl) = vonkar * (ExnrSV(ikl) / pcap) & + / (sqrCh0(ikl) - psih_z + psih_0) + rCDmSV(ikl) = vonkar / (sqrCm0(ikl) - psim_z + psim_0) + + ! Drag Coefficients + ! ~~~~~~~~~~~~~~~~~ + CDh(ikl) = rCDmSV(ikl) * rCDhSV(ikl) + CDm(ikl) = rCDmSV(ikl) * rCDmSV(ikl) + + ! real Temperature Turbulent Scale theta* + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + thstar = rCDhSV(ikl) * dTa_Ts(ikl) & + * (pcap / ExnrSV(ikl)) + uts_SV(ikl) = us__SV(ikl) * thstar + + ! Convergence Criterion + ! ===================== + + dustar = max(dustar, abs(us__SV(ikl) - u0star)) + +#if(AM) + ! u*, u*T*, u*s* Time Moving Averages + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + do nt = 1, ntaver - 1 + u__mem(ikl, nt) = u__mem(ikl, nt + 1) +#if(AT) + uT_mem(ikl, nt) = uT_mem(ikl, nt + 1) +#endif +#if(AS) + us_mem(ikl, nt) = us_mem(ikl, nt + 1) +#endif + enddo + u__mem(ikl, ntaver) = us__SV(ikl) +#if(AT) + uT_mem(ikl, ntaver) = uts_SV(ikl) +#endif +#if(AS) + us_mem(ikl, ntaver) = uss_SV(ikl) +#endif +#endif + +#if(wr) + ! OUTPUT for Verification (general) + ! ~~~~~~~~~~~~~~~~~~~~~~~ + if(icount == 1) then + write(6, 6004) +6004 format(122('-')) + if(mod(VVaSBL(ikl), 4.) < 0.1) then + write(6, 6003) +6003 format(' V Ta-Ts Z0 It' & + , ' du* u* sss__F CD Qss Qs* ' & + , ' PseudOL Full-OL zetam zetah psim_z psih_z') + write(6, 6004) + endif + endif + write(6, 6002) VVaSBL(ikl), dTa_Ts(ikl), Z0m_SV(ikl), icount & + , dustar, us__SV(ikl), sss__F & + , CDm(ikl), qSalSV(ikl), ssstar & + , W_pLMO, LMO_SV(ikl) & + , zetam, zetah, W_psim, psih_z +6002 format(2f6.1, f8.4, i3, f9.6, f6.3, f9.3, 3f9.6, 2f8.2, 2f8.4, 2f8.2) +#endif + +#if(w1) + ! OUTPUT for Verification (u*_AE) + ! ~~~~~~~~~~~~~~~~~~~~~~~ + if(icount == 1) then + write(6, 6014) +6014 format(100('-')) + if(mod(VVaSBL(ikl), 4.) < 0.1) then + write(6, 6013) +6013 format(' V Ta-Ts Z0 It' & + , ' du* u* sss__F W_NUs1 W_NUs2 W_NUs3 ' & + , ' W_DUs1 W_DUs2 ') + write(6, 6014) + endif + endif + write(6, 6012) VVaSBL(ikl), dTa_Ts(ikl), Z0m_SV(ikl), icount & + , dustar, us__SV(ikl), sss__F & + , W_NUs1, W_NUs2, W_NUs3 & + , W_DUs1, W_DUs2 +6012 format(2f6.1, f8.4, i3, f9.6, f6.3, f9.3, 3f9.3, 2f12.3) +#endif + + enddo + +#if(IX) + if(icount < 3) go to 1 +#endif + ! if (dustar.gt.0.0001.and.icount.lt. 6) go to 1 + +#if(AM) + do ikl = 1, klonv + u0star = 0.0 +#if(AT) + uTstar = 0.0 +#endif +#if(AS) + usstar = 0.0 +#endif + do nt = 1, ntaver + u0star = u0star + u__mem(ikl, nt) +#if(AT) + uTstar = uTstar + uT_mem(ikl, nt) +#endif +#if(AS) + usstar = usstar + us_mem(ikl, nt) +#endif + enddo + us__SV(ikl) = u0star / ntaver +#if(AT) + uts_SV(ikl) = uTstar / ntaver +#endif +#if(AS) + uss_SV(ikl) = usstar / ntaver +#endif + enddo +#endif + + ! Aerodynamic Resistances + ! ----------------------- + + do ikl = 1, klonv + ram_sv(ikl) = 1./(CDm(ikl) * max(VVaSBL(ikl), epsi)) + rah_sv(ikl) = 1./(CDh(ikl) * max(VVaSBL(ikl), epsi)) + enddo + + return +endsubroutine SISVATeSBL diff --git a/MAR/code_mar/sspray.f90 b/MAR/code_mar/sspray.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a18607be71ec43c5144837d4c8a6a8b511932466 --- /dev/null +++ b/MAR/code_mar/sspray.f90 @@ -0,0 +1,163 @@ +#include "MAR_pp.def" +subroutine sspray + ! +--------------------------------------------------------------------------+ + ! | Sat 29-Jul-2009 | + ! | | + ! | subroutine sspray computes contribution of Sea Spray | + ! | ^^^^^^ to Sensible & Latent Heat Flux | + ! | | + ! | Reference A_03 Andreas, 2003, Preprints. | + ! | 12th Conference on Interactions of the Sea & Atmosphere | + ! | Long Beach, CA, American Meteorological Society | + ! | http://ams.confex.com/ams/pdfpapers/77949.pdf | + ! | | + ! | AD02 Andreas & Decosmo, 2002, BLM 103, 303-333 | + ! | The signature of sea spray | + ! | in the HEXOS turbulent heat flux data | + ! | | + ! | AE01 Andreas & Emanuel, 2001, JAS 58, 3741-3751 | + ! | Effects of Sea Spray on Tropical Cyclone Intensity | + ! | | + ! | A_95 Andreas, 1995, JAS 52(7) , 852-862 | + ! | The Temperature of Evaporating Sea Spray Droplets | + ! | | + ! | A_90 Andreas, 1990, Tellus 42B, 481-497 | + ! | Time Constants for the Evolution of Sea Spray Droplets | + ! | | + ! | | + ! +--------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_sl + use mar_wk +#if(iso) + use mariso, only: wiso, niso, qvDY_iso, qiHY_iso +#endif + + implicit none + + ! +--Internal Constants and Variables + ! + ================================= + ! alphaC : A_03 (3) + real, parameter :: alphaC = 0.0185 + ! Uf_Spr = .1 = 1/tau_f where tau_f = 10 sec (A_90 fig9) + real, parameter :: Uf_Spr = 0.1 + ! t50_eq : (A_90 fig9) + real, parameter :: t50_eq = 0.2000e+3 + ! f50_eq : 0.3125e-4 = 50.e-6 m * 0.5 / 0.8 ; * 0.5 when RH = 0.8 (A_90, p490) + real, parameter :: f50_eq = 0.3125e-4 + integer i, j, k, m + real ustar2, alo10g, A13wav, tf_Spr + real Ta_wet, r50_eq, r50__t, r50n_t, QS_Spr, qq_Spr, QL_Spr + real :: qq_spr_mass +#if(iso) + real :: qq_spr_iso(niso) + ! rh : diagnostic + real :: rh, fac, fac1, fac2, fac3 +#endif + + ! +--Wave Height + ! + =========== + + do j = 1, my + do i = 1, mx + ! AD02 ( 4) + A13wav = 0.015 * ssvSL(i, j, mz) +#if(A3) + ustar2 = SLuusl(i, j, 1) * SLuusl(i, j, 1) + alo10g = log(10.*gravit / alphaC) + ! A_03 (13) + A13wav = 0.015 * (ustar2 / vonkar) * (2.*ustar2 - SLuusl(i, j, 1) * (2.*alo10g + 8.)) & + + (alo10g * alo10g + 2.*alo10g + 4.) +#endif + A13wav = min(20., A13wav) + + ! +--Sea Spray Residence Time + ! + ======================== + ! A_03 (12) + tf_Spr = A13wav / Uf_Spr + + ! +--Sea Spray Sensible Heat Flux Correction + ! + ======================================= + ! A_95 + Ta_wet = tairDY(i, j, mz) - (Lv_H2O / cp) * (qvswDY(i, j, mz) - qvDY(i, j, mz)) + Ta_wet = max(tfrwat, Ta_wet) + ! AE01 ( 7) + QS_Spr = 4.187e6 * (tsrfSL(i, j, 1) - Ta_wet) & + ! A_03 (14a) + * 1.65e-6 * SLuusl(i, j, 1) * SLuusl(i, j, 1) * SLuusl(i, j, 1) + + ! +--Sea Spray Latent Heat Flux Correction + ! + ===================================== + + ! A_90 p490 + r50_eq = f50_eq * min(1., qvDY(i, j, mz) / qvswDY(i, j, mz)) + r50__t = r50_eq + (50.e-6 - r50_eq) * exp(-tf_Spr / t50_eq) + r50n_t = r50__t / 50.e-6 + ! A_03 (11) + qq_Spr = 1000.00 * (1.-r50n_t * r50n_t * r50n_t) * 2.65e-8 * SLuusl(i, j, 1)**2.61 + ! A_03 (11) + QL_Spr = -Lv_H2O * qq_Spr + + ! +--Update + ! + ====== +#if(X) + ! +--Increment + ! + ~~~~~~~~~ + pktaDY(i, j, mz) = pktaDY(i, j, mz) + maskSL(i, j) * SLsrfl(i, j, 1) & + * (QS_Spr + QL_Spr) * dt_Loc / (1.e3 * pstDYn(i, j) * dsigm1(mz) * grvinv) & + / (pkDY(i, j, mz) * cp) +#endif + WKxy1(i, j) = maskSL(i, j) * SLsrfl(i, j, 1) & + * (QS_Spr + QL_Spr) * dt_Loc / (1.e3 * pstDYn(i, j) * dsigm1(mz) * grvinv) & + / (pkDY(i, j, mz) * cp) ! + + ! +--Increment (after limiting the fluxes) + ! + ~~~~~~~~~ + WKxy2(i, j) = & + ! LOWER + max(0.0, sign(1., pktaDY(i, j, mz) - pktaDY(i, j, mzz))) & + * max(0.0, sign(1., pktaDY(i, j, mzz) - pktaDY(i, j, mz) - WKxy1(i, j))) & + * max(WKxy1(i, j), pktaDY(i, j, mzz) - pktaDY(i, j, mz)) & + ! UPPER + + max(0.0, sign(1., pktaDY(i, j, mz) - pktaDY(i, j, mzz) + WKxy1(i, j))) & + * max(0.0, sign(1., pktaDY(i, j, mzz) - pktaDY(i, j, mz))) & + * min(WKxy1(i, j), pktaDY(i, j, mzz) - pktaDY(i, j, mz)) & + ! OTHER + + max(0.0, sign(1., pktaDY(i, j, mz) - pktaDY(i, j, mzz) + WKxy1(i, j)) & + * sign(1., pktaDY(i, j, mz) - pktaDY(i, j, mzz))) & + * WKxy1(i, j) + + ! max: 10°C/h + WKxy2(i, j) = sign(1., WKxy2(i, j)) * min(10.*dt / 3600., abs(WKxy2(i, j))) + pktaDY(i, j, mz) = pktaDY(i, j, mz) + WKxy2(i, j) + + qq_Spr = qq_Spr * WKxy2(i, j) / (sign(1.0, WKxy1(i, j)) * max(eps9, abs(WKxy1(i, j)))) + qq_spr_mass = maskSL(i, j) * SLsrfl(i, j, 1) * qq_Spr * dt_Loc / (1.e3 * pstDYn(i, j) * dsigm1(mz) * grvinv) + +#if(iso) + ! todo : check if vectorized by the compiler, check performance + call iso_surf_ocean(pstDYn(i, j), tsrfSL(i, j, 1), qvDY(i, j, mz), ssvSL(i, j, mz), qvDY_iso(:, i, j, mz), & + qq_spr_mass, qq_spr_iso) + do wiso = 1, niso + qvDY_iso(wiso, i, j, mz) = qvDY_iso(wiso, i, j, mz) + qq_spr_iso(wiso) + enddo + ! **reminder**, water update (here qvDY) must be **after** isotope factionation computation +#endif + qvDY(i, j, mz) = qvDY(i, j, mz) + qq_spr_mass + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + enddo + enddo + + return +end diff --git a/MAR/code_mar/stereosouth.f90 b/MAR/code_mar/stereosouth.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f97ee414f809d709668e3bb5d1b618d378fd4e02 --- /dev/null +++ b/MAR/code_mar/stereosouth.f90 @@ -0,0 +1,229 @@ +subroutine StereoSouth(E, N, GEddxx, lon, lat, GElat0) + ! +----------------------------------------------------------------------+ + ! | Compute the lon, lat from Polar Stereographic Projection | + ! | Written by Cecile Agosta 23-12-21 | + ! | EPSG Polar Stereographic transformation Variant B | + ! | (http://www.epsg.org/guides/docs/G7-2.pdf) | + ! | Equivalent to EPSG 3031 (WGS-84 ellipsoid) for SH | + ! | Equivalent to EPSG 3413 (WGS-84 ellipsoid) for NH | + ! +----------------------------------------------------------------------+ + ! | | + ! | INPUT : E : Stereo coordinate on the East (X, km) | + ! | ^^^^^^^ N : Stereo coordinate on the North (Y, km) | + ! | GEddxx : Longitude of X axis (=GEddxx, 90 = East, clockwise)| + ! | [lat true = 71] | + ! | | + ! | OUTPUT : lon : longitude (deg) | + ! | ^^^^^^^ lat : latitude (deg) | + ! | | + ! +----------------------------------------------------------------------+ + + use mardim + + implicit none + + ! +-- General Variables + ! + ----------------- + real, INTENT(in) :: E, N, GEddxx + real, INTENT(out) :: lon, lat + + ! +-- Local Variables + ! + --------------- + real ddista + + ! +-- Constants + ! + --------- + real aa, ex, pi, degrad, latF, FE, FN, tF, mF, k0, t, rho, khi, lon0 + real trulat, GElat0 + + ! aa : aa (km) = demi grand axe + aa = 6378.1370 + ! ex : excentricity WGS-84 : 0.081 819 190 842 622 0.081 819 190 842 621 + ex = 0.081819190842621 + + if(sign(1., GElat0) <= 0) then + ! trulat : Latitude of standard parallel, 71S for ESPG 3031 + trulat = -71. + else + ! trulat : Latitude of standard parallel, 70N for EPSG 3413 + trulat = 70. + endif + + pi = 4.*atan(1.) + degrad = pi / 180. + + latF = trulat * degrad + lon0 = (GEddxx - 90.) * degrad + + ! FE : False Easting + FE = 0. + ! FN : False Northing + FN = 0. + + ! +- Polar Stereographic Projection + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if(sign(1., GElat0) <= 0) then + tF = tan(pi / 4 + latF / 2) / & + ((1 + ex * sin(latF)) / (1 - ex * sin(latF)))**(ex / 2) + else + tF = tan(pi / 4 - latF / 2) * & + ((1 + ex * sin(latF)) / (1 - ex * sin(latF)))**(ex / 2) + endif + + mF = cos(latF) / (1 - ex**2 * sin(latF)**2)**0.5 + k0 = mF * ((1 + ex)**(1 + ex) * (1 - ex)**(1 - ex))**0.5 / (2 * tF) + + rho = ((E - FE)**2 + (N - FN)**2)**0.5 + t = rho * ((1 + ex)**(1 + ex) * (1 - ex)**(1 - ex))**0.5 / (2 * aa * k0) + + if(sign(1., GElat0) <= 0) then + khi = 2 * atan(t) - pi / 2 + else + khi = pi / 2 - 2 * atan(t) + endif + + lat = khi & + + (ex**2 / 2 + 5 * ex**4 / 24 + ex**6 / 12 + 13 * ex**8 / 360) & + * sin(2 * khi) & + + (7 * ex**4 / 48 + 29 * ex**6 / 240 + 811 * ex**8 / 11520) & + * sin(4 * khi) & + + (7 * ex**6 / 120 + 81 * ex**8 / 1120) & + * sin(6 * khi) & + + (4279 * ex**8 / 161280) & + * sin(8 * khi) + + if(E - FE == 0. .and. N - FN == 0) then + lon = lon0 + pi / 2. + else if(E - FE == 0. .and. N - FN >= 0) then + if(sign(1., GElat0) <= 0) then + lon = lon0 + else + lon = lon0 - pi + endif + else if(E - FE == 0. .and. N - FN <= 0) then + if(sign(1., GElat0) <= 0) then + lon = lon0 - pi + else + lon = lon0 + endif + else + + if(sign(1., GElat0) <= 0) then + lon = lon0 + atan2(E - FE, N - FN) + else + lon = lon0 + atan2(E - FE, FN - N) + endif + + endif + + lat = lat / degrad + lon = lon / degrad + if(lon > 180.) then + lon = lon - 360. + else if(lon < -180.) then + lon = lon + 360. + endif + + return +endsubroutine StereoSouth + +subroutine StereoSouth_inverse(lon, lat, lonE, E, N) + ! +----------------------------------------------------------------------+ + ! | Compute Polar Stereographic Projection from lon,lat coordinates | + ! | Written by Cecile Agosta 02-02-21 | + ! | EPSG Polar Stereographic transformation Variant B | + ! | (http://www.epsg.org/guides/docs/G7-2.pdf) | + ! | Equivalent to EPSG 3031 (WGS-84 ellipsoid) for SH | + ! | Equivalent to EPSG 3413 (WGS-84 ellipsoid) for NH | + ! +----------------------------------------------------------------------+ + ! | | + ! | INPUT : lon : Longitude (deg) | + ! | ^^^^^^^ lat : Latitude (deg) | + ! | lon0 : Longitude of X axis (90 = East, clockwise) | + ! | [lat true = 71 S/71N] | + ! | | + ! | OUTPUT : E : Stereo coordinate on the East (X, km) | + ! | ^^^^^^^^ N : Stereo coordinate on the North (Y, km) | + ! | | + ! +----------------------------------------------------------------------+ + + use mardim + + implicit none + + ! +-- General Variables + ! + ----------------- + real, intent(in) :: lon, lat, lonE + real, intent(out) :: E, N + + ! +-- Local Variables + ! + --------------- + real costru, ddista + + ! +-- Constants + ! + --------- + real aa, ex, pi, degrad, latF, FE, FN, tF, mF, k0, t, rho, lonrad, latrad + real lon0, trulat, GElat0 + + GElat0 = lat + ! aa : aa (km) = demi grand axe + aa = 6378.1370 + ! ex : excentricity WGS-84 : 0.081 819 190 842 622 0.081 819 190 842 621 + ex = 0.081819190842621 + + if(sign(1., GElat0) <= 0) then + ! trulat : Latitude of standard parallel, 71S for ESPG 3031 + trulat = -71. + else + ! trulat : Latitude of standard parallel, 70N for EPSG 3413 + trulat = 70. + endif + + pi = 4.*atan(1.) + degrad = pi / 180. + + latF = trulat * degrad + lon0 = (lonE - 90.) * degrad + lonrad = lon * degrad + latrad = lat * degrad + + ! FE : False Easting + FE = 0. + ! FN : False Northing + FN = 0. + + ! + + ! +- Polar Stereographic Projection + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! + + if(sign(1., GElat0) <= 0) then + tF = tan(pi / 4 + latF / 2) / & + ((1 + ex * sin(latF)) / (1 - ex * sin(latF)))**(ex / 2) + else + tF = tan(pi / 4 - latF / 2) * & + ((1 + ex * sin(latF)) / (1 - ex * sin(latF)))**(ex / 2) + endif + + mF = cos(latF) / (1 - ex**2 * sin(latF)**2)**0.5 + k0 = mF * ((1 + ex)**(1 + ex) * (1 - ex)**(1 - ex))**0.5 / (2 * tF) + + if(sign(1., GElat0) <= 0) then + t = tan(pi / 4 + latrad / 2) / & + ((1 + ex * sin(latrad)) / (1 - ex * sin(latrad)))**(ex / 2) + else + t = tan(pi / 4 - latrad / 2) * & + ((1 + ex * sin(latrad)) / (1 - ex * sin(latrad)))**(ex / 2) + endif + + rho = 2 * aa * k0 * t / ((1 + ex)**(1 + ex) * (1 - ex)**(1 - ex))**0.5 + + E = FE + rho * sin(lonrad - lon0) + + if(sign(1., GElat0) <= 0) then + N = FN + rho * cos(lonrad - lon0) + else + N = FN - rho * cos(lonrad - lon0) + endif + + return +endsubroutine StereoSouth_inverse diff --git a/MAR/code_mar/svasav.f90 b/MAR/code_mar/svasav.f90 new file mode 100644 index 0000000000000000000000000000000000000000..12ef75d577191b37e1edab072b22da284ab3ecbe --- /dev/null +++ b/MAR/code_mar/svasav.f90 @@ -0,0 +1,620 @@ +#include "MAR_pp.def" +subroutine svasav(ordr) + ! +------------------------------------------------------------------------+ + ! | MAR OUTPUT 12-07-2019 MAR | + ! | subroutine svasav is used to save the main SVAT Variables | + ! | | + ! | # OPTIONS: #OA: Ocean Albedo is prescribed | + ! | # ^^^^^^^^ | + ! +------------------------------------------------------------------------+ + use marctr + use mardim + use margrd + use mar_ge + use mar_lb + use mar_sl + use mar_sv + use mar_tv + use mar_vb + use marssn + use mardsv + use mar_bs + use mar_ib +#if(iso) + use mariso, only: iso_init_type, rosSNo_iso, wasSNo_iso, SWaSNo_iso, & + snohSN_iso, eta_TV_iso, wiso, niso +#endif + + implicit none + + ! +--Global Variables + ! + ================ + character(len=4) ordr + + ! +--Local Variables + ! + ================ + integer i, j, k, m + character(len=6) vartyp + integer n1, n2, iteSVA, iyrSVA, mmaSVA, jdaSVA, jhuSVA, n + integer i50, j50, iim, jjm, msc + integer(kind=8) itexpe2 + logical :: iniWRI + data iniWRI/.true./ + real mskSNo2(mx, my) + real wes_IB(mx, my, mw), weetIB(mx, my, mw) + + ! +--READ + ! + ==== + if(ordr == 'read') then +404 continue ! problem of itexpe + ! +--Open File + ! + --------- + open(unit=11, status='old', form='unformatted', file='MARsvt.DAT') + ! +--Read DATA + ! + --------- + read(11) iteSVA + read(11) iyrSVA, mmaSVA, jdaSVA, jhuSVA + if(itexpe == 0) then + if(iteSVA /= itexpe .or. & + iyrSVA /= iyr0GE .or. & + mmaSVA /= mma0GE .or. & + jdaSVA /= jda0GE .or. & + jhuSVA /= jhu0GE) then + write(6, 600) itexpe, iyrSVA, mmaSVA, jdaSVA, jhuSVA, & + iyr0GE, mma0GE, jda0GE, jhu0GE +600 format(' ++ERROR++ MARsvt improperly specified ', & + /, ' iyr mma jda jhu', & + /, i6, 4i7, ' Old', /, 6x, 4i7, ' Current') + endif + else + if(iteSVA /= itexpe .or. & + iyrSVA /= iyrrGE .or. & + mmaSVA /= mmarGE .or. & + jdaSVA /= jdarGE .or. & + jhuSVA /= jhurGE) then + write(6, 600) itexpe, iyrSVA, mmaSVA, jdaSVA, jhuSVA, iyrrGE, mmarGE, jdarGE, jhurGE + endif + if(mmaSVA /= mmarGE .or. jdaSVA /= jdarGE .or. jhuSVA /= jhurGE) then + write(6, *) + write(6, 400) jdarGE, mmarGE, iyrrGE, jhurGE +400 format(' MARrun time : ', i2, '/', i2, '/', i4, ' ', i2, ':00') + write(6, 401) jdaSVA, mmaSVA, iyrSVA, jhuSVA +401 format(' MARsim time : ', i2, '/', i2, '/', i4, ' ', i2, ':00') + write(6, *) + itexpe2 = itexpe + do n = -300, 300, 1 + itexpe = real(itexpe2) / dt * (dt + n) + call timgeo() + if(iyrrGE == iyrSVA .and. mmarGE == mmaSVA .and. & + jdaSVA == jdarGE .and. jhuSVA == jhurGE) then + write(6, 402) nint(dt + n) +402 format(' Previous time step:', i4) + write(6, 403) nint(dt) +403 format(' Current time step:', i4) + write(6, *) "Reinitialization of itexpe..." + write(6, *) + close(11) + goto 404 + endif + enddo + stop + endif + endif + ! IOi_TV : IO i Index + read(11) IOi_TV + ! IOj_TV : IO j Index + read(11) IOj_TV + ! isolTV : Soil Type Index + read(11) isolTV + ! iWaFTV : =0 ==> no Water Flux =1 ==> free Drainage + read(11) iWaFTV + ! AlbSTV : Dry Soil Albedo + read(11) AlbSTV + ! ivegTV : Vegetation Type Index + read(11) ivegTV + ! ifraTV : Vegetation Class Coverage + read(11) ifraTV + ! alaiTV : Leaf Area Index [-] + read(11) alaiTV + ! glf_TV : Green Leaf Fraction [-] + read(11) glf_TV + ! TsolTV : Soil Temperature [K] + read(11) TsolTV + ! eta_TV : Soil Moisture [m3/m3] + read(11) eta_TV + + ! +--If Simulation start, then initialize further + ! + -------------------------------------------- + if(itexpe == 0) then + do j = 1, my + do i = 1, mx + if(isolSL(i, j) == 1) then + ifraTV(i, j, 1) = 100 + ivegTV(i, j, 1) = 0 + isolTV(i, j) = 0 +#if(OA) + AlbSTV(i, j) = 0.15 +#endif + endif + if(isolSL(i, j) == 5) then + tsrfSL(i, j, 1) = 0.0d+0 + do n = 1, nvx + tsrfSL(i, j, 1) = tsrfSL(i, j, 1) + TsolTV(i, j, n, 1) * ifraTV(i, j, n) + enddo + tsrfSL(i, j, 1) = tsrfSL(i, j, 1) * 1.0d-2 + albsSL(i, j) = AlbSTV(i, j) + alb0SL(i, j) = albsSL(i, j) + albeSL(i, j) = albsSL(i, j) + if(tsrfSL(i, j, 1) < 200.) then + write(6, 6000) i, j +6000 format(' WARNING: undefined Surface Temperature (i j) = (', 2i4, ')') + endif + endif + ! +--Set of SISVAT Variables + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + if(VSISVAT) then + if(isolSL(i, j) <= 2) then + ifraTV(i, j, 1) = 100 + ivegTV(i, j, 1) = 0 + isolTV(i, j) = 0 + if(reaVAR .and. reaLBC) then + do n = 1, nvx + TvegTV(i, j, n) = sst_LB(i, j) + do k = 1, llx + TsolTV(i, j, n, k) = sst_LB(i, j) + eta_TV(i, j, n, k) = 1. + enddo + enddo + else + do n = 1, nvx + TvegTV(i, j, n) = SST_SL + do k = 1, llx + TsolTV(i, j, n, k) = SST_SL + eta_TV(i, j, n, k) = 1. + enddo + enddo + endif + else + if(.not. reaLBC) then + do n = 1, nvx + TvegTV(i, j, n) = SST_SL + enddo + else + do n = 1, nvx + TvegTV(i, j, n) = TairSL(i, j) + enddo + endif + endif + endif + do n = 1, max(mw, nvx) + n1 = min(n, mw) + n2 = min(n, nvx) + tsrfSL(i, j, n1) = TsolTV(i, j, n2, 1) + enddo + enddo + enddo +#if(iso) + ! isotopic initialization of soil + call mariso_init_tv(iso_init_type, eta_TV, eta_TV_iso) +#endif + + if(iniWRI) then + n = 123 + i50 = min(mx, 66) + j50 = min(my, 66) + vartyp = 'isolTV' + write(4, 4001) vartyp, n,((isolTV(i, j), i=1, i50), j=j50, 1, -1) +4001 format(/, ' --- svasav --- ', a6, ' ---', i4, ' ---', /,(66i2)) +4002 format(/, ' --- svasav --- ', a6, ' ---', i4, ' ---', /,(66f6.2)) + vartyp = 'iWaFTV' + write(4, 4001) vartyp, n,((iWaFTV(i, j), i=1, i50), j=j50, 1, -1) + do n = 1, nvx + vartyp = 'ifraTV' + write(4, 4002) vartyp, n,((ifraTV(i, j, n), i=1, i50), j=j50, 1, -1) + vartyp = 'ivegTV' + write(4, 4001) vartyp, n,((ivegTV(i, j, n), i=1, i50), j=j50, 1, -1) + enddo + iniWRI = .false. + endif + endif + + ! +--If SISVAT is set up + ! + ~~~~~~~~~~~~~~~~~~~ + if(VSISVAT .and. .not. reaVAR) then + do j = 1, my + do i = 1, mx + sst_LB(i, j) = SST_SL + sst1LB(i, j) = SST_SL + sst2LB(i, j) = SST_SL + enddo + enddo + endif + + ! +--If Simulation start, then set to zero + ! + ------------------------------------- + if(itexpe == 0) then + do msc = 1, nvx + do jjm = 1, jmx + do iim = 1, imx + CaSnTV(iim, jjm, msc) = 0.0 + CaWaTV(iim, jjm, msc) = 0.0 + WEq_SN(iim, jjm, msc) = 0.0 + enddo + enddo + enddo + do msc = 1, nsx + do jjm = 1, jmx + do iim = 1, imx + snohSN(iim, jjm, msc) = 0.0 +#if(iso) + do wiso = 1, niso + snohSN_iso(wiso, iim, jjm, msc) = 0.0 + enddo +#endif + enddo + enddo + enddo + endif + + ! +--If Simulation restart, then read further + ! + ---------------------------------------- + if(itexpe /= 0 .and. reaVAR) then + ! CaSnTV : Canopy Intercepted Snow Content[kg/m2] + read(11) CaSnTV + ! CaWaTV : Canopy Intercepted Water Content [kg/m2] + read(11) CaWaTV + ! psivTV : Vegetation Hydraulic Potential [m] + read(11) psivTV + ! psigTV : Ground Hydraulic Potential [m] + read(11) psigTV + ! TvegTV : Skin Vegetation Temperature [K] + read(11) TvegTV + ! TgrdTV : Skin Soil Temperature [K] + read(11) TgrdTV + do msc = 1, nvx + do jjm = 1, jmx + do iim = 1, imx + if(CaWaTV(iim, jjm, msc) <= 1.d-20) then + CaWaTV(iim, jjm, msc) = 0.d+00 + endif + enddo + enddo + enddo + ! Total evapTV : Evapotranspiration [mm w.e.] + read(11) evapTV + ! draiTV : Drainage Flow [mm/s] + read(11) draiTV + ! runoTV : Integrated Drainage Flow [mm] + read(11) runoTV + + ! +--Snow Pack Characteristics + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + if(mw /= 5) then + ! mskSNo2 : Snow/Ice Type Index [-] + read(11) mskSNo2 + do i = 1, mx + do j = 1, my + mskSNo(i, j, 1) = mskSNo2(i, j) + enddo + enddo + else + ! mskSNo : Snow/Ice Type Index [-] + read(11) mskSNo + endif + ! nssSNo : Nb Snow and Ice Layers + read(11) nssSNo + ! issSNo : Nb Superimposed Ice Layers + read(11) issSNo + ! nisSNo : Nb Ice Layers + read(11) nisSNo + ! nhsSNo : Snow History [-] + read(11) nhsSNo + ! dzsSNo : Snow Layers Thickness [m] + read(11) dzsSNo + ! rosSNo : Snow Volumic Mass [kg/m3] + read(11) rosSNo + ! wasSNo : Snow Water Content [kg/kg] + read(11) wasSNo + ! tisSNo : Snow Temperature [K] + read(11) tisSNo + ! g1sSNo : Snow Dendricity / Sphericity [-] + read(11) g1sSNo + ! g2sSNo : Snow Sphericity / Size [-] [0.0001 m] + read(11) g2sSNo + ! agsSNo : Snow Age [day] + read(11) agsSNo + do n = 1, nsno + do k = 1, nsx + do j = 1, my + do i = 1, mx + if(agsSNo(i, j, k, n) <= 1000 .and. dzsSNo(i, j, k, n) > 0) then + agsSNo(i, j, k, n) = real(jdarGE + njyrGE(mmarGE)) / 365.+iyrrGE + endif + enddo + enddo + enddo + enddo + ! snohSN : Snow Buffer Layer [kg/m2], [mm] + read(11) snohSN + ! BrosSN : Snow Buffer Layer Density [kg/m3] + read(11) BrosSN + ! BG1sSN : Snow Buffer Layer Dendri/Spher. [-] + read(11) BG1sSN + ! BG2sSN : Snow Buffer Layer Spheri/Size [-] [0.0001 m] + read(11) BG2sSN + ! SWaSNo : Snow Surficial Water [m] + read(11) SWaSNo + ! zWE0SN : Initial Snow Thickn.[mm w.e.] + read(11) zWE0SN + ! zWE_SN : Current Snow Thickn.[mm w.e.] + read(11) zWE_SN + ! zWEcSN : Non-erodible Snow Thickn.[mm w.e.] + read(11) zWEcSN + ! SaltSN : u*_th [m/s] + read(11) SaltSN + ! SLussl : u*_s* [kg/kg.m/s] + read(11) SLussl + ! blowSN : NEW MAX Erosion [kg/m2] + read(11) blowSN + ! WEq_SN : Added Snow Amount [m w.e.] + read(11) WEq_SN + ! SLn_z0 : Z0_momentum (instantaneous) [m] + read(11) SLn_z0 + ! SLn_r0 : Z0_scalar (instantaneous) [m] + read(11) SLn_r0 +#if(BS) + ! SLn_b0 : Z0_erosion (instantaneous) [m] + read(11) SLn_b0 +#endif +#if(ZA) + ! ua_0BS : Wind, x-component (t-dt) [m/s] + read(11) ua_0BS + ! va_0BS : Wind, y-component (t-dt) [m/s] + read(11) va_0BS + ! VVs_BS : (wind, Sastrugi) Relevance [m/s] + read(11) VVs_BS + ! RRs_BS : (wind, Sastrugi) Counter [-] + read(11) RRs_BS + ! DDs_BS : (wind, Sastrugi) Angle [dg] + read(11) DDs_BS + ! Z0SaBS : Z0(Sastrugi Height) [m] + read(11) Z0SaBS +#endif + read(11) wes_IB ! Snow/ice Sublimation [mm w.e.] + read(11) weetIB ! Evapotranspiration [mm w.e.] + wee_IB(:, :, :, 3) = wes_IB(:, :, :) + wee_IB(:, :, :, 1) = weetIB(:, :, :) + read(11) wem_IB ! Snow/ice M < ng [mm w.e.] + read(11) wer_IB ! Snow/ice Refreezing [mm w.e.] + read(11) wei0IB ! Bottom Snow/ice added [mm w.e.] + read(11) weu_IB ! Run-off [mm w.e.] + read(11) zn0IB ! Initial Snow Height [m] + read(11) mb0IB ! Initial Mass Balance [mmWE] + if(mw == 5) then + read(11) gradTM !*CL* Local temp. gradient [C/m] + read(11) gradQM !*CL* Local hum. gradient [g/kg/m] + endif +#if(iso) + ! read isotopic composition of water in the soil + open(unit=12, status='old', form='unformatted', file='MARsvt_iso.DAT') + ! rosSNo_iso : Snow Volumic Mass [kg/m3] + read(12) rosSNo_iso + ! wasSNo_iso: Soil humidity content (=> in the snow cover ) [kg/kg] + read(12) wasSNo_iso + ! SWaSNo_iso: Surficial Water Mass [kg/m2] + read(12) SWaSNo_iso + ! snohSN_iso : Snow Buffer Layer Thickness [mmWE] + read(12) snohSN_iso + ! eta_TV_iso : Soil Moisture Content [m3/m3] + read(12) eta_TV_iso + close(unit=12) +#endif + else if(itexpe == 0) then + do j = 1, my + do i = 1, mx + evapTV(i, j) = 0.0 +#if(ZA) + VVs_BS(i, j) = 10.0 + RRs_BS(i, j) = 1.0 + DDs_BS(i, j) = 0.0 +#endif + enddo + enddo + endif + + close(unit=11) + + ! +--SVAT Prescribed Evolutive VBC (Vegetation Boundary Condition) + ! + (i.e., Green Leaf Fraction) + ! + ------------------------------------------------------------- + tim1VB = ou2sGE(iyrSVA, mmaSVA, jdaSVA, jhuSVA, 0, 0) + tim2VB = tim1VB + do n = 1, nvx + do j = 1, my + do i = 1, mx +#if(LN) + LAI1VB(i, j, n) = alaiTV(i, j, n) + LAI2VB(i, j, n) = alaiTV(i, j, n) +#endif + glf1VB(i, j, n) = glf_TV(i, j, n) + glf2VB(i, j, n) = glf_TV(i, j, n) + enddo + enddo + enddo +#if(GL) + ! MAR-GRISLI coupling + call ice_sheet_model_coupling +#endif + endif + + ! +--write + ! + ===== + if(ordr == 'writ') then + open(unit=11, status='unknown', form='unformatted', file='MARsvt.DAT') + write(11) itexpe + write(11) iyrrGE, mmarGE, jdarGE, jhurGE + ! IOi_TV : IO i Index + write(11) IOi_TV + ! IOj_TV : IO j Index + write(11) IOj_TV + ! isolTV : Soil Type Index + write(11) isolTV + ! iWaFTV : =0 ==> no Water Flux =1 ==> free Drainage + write(11) iWaFTV + ! AlbSTV : Dry Soil Albedo + write(11) AlbSTV + ! ivegTV : Vegetation Type Index + write(11) ivegTV + ! ifraTV : Vegetation Class Coverage + write(11) ifraTV + ! alaiTV : Leaf Area Index [-] + write(11) alaiTV + ! glf_TV : Green Leaf Fraction [-] + write(11) glf_TV + ! TsolTV : Soil Temperature [K] + write(11) TsolTV + ! eta_TV : Soil Moisture [m3/m3] + write(11) eta_TV + ! CaSnTV : Canopy Intercepted Snow Content[m w.e.] + write(11) CaSnTV + ! CaWaTV : Canopy Intercepted Water Content [kg/m2] + write(11) CaWaTV + ! psivTV : Vegetation Hydraulic Potential [m] + write(11) psivTV + ! psigTV : Ground Hydraulic Potential [m] + write(11) psigTV + ! TvegTV : Skin Vegetation Temperature [K] + write(11) TvegTV + ! TgrdTV : Skin Soil Temperature [K] + write(11) TgrdTV + ! evapTV : Total Evapotranspiration [mm w.e.] + write(11) evapTV + ! draiTV : Drainage Flow [mm/s] + write(11) draiTV + ! runoTV : Integrated Drainage Flow [mm] + write(11) runoTV + do i = 1, mx + do j = 1, my + mskSNo2(i, j) = mskSNo(i, j, 1) + enddo + enddo + ! +--Snow Pack Characteristics + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~ + if(mw /= 5) then + ! mskSNo2 : Snow/Ice Type Index [-] + write(11) mskSNo2 + else + ! mskSNo : Snow/Ice Type Index [-] + write(11) mskSNo + endif + ! nssSNo : Nb Snow and Ice Layers + write(11) nssSNo + ! issSNo : Nb Superimposed Ice Layers + write(11) issSNo + ! nisSNo : Nb Ice Layers + write(11) nisSNo + ! nhsSNo : Snow History [-] + write(11) nhsSNo + ! dzsSNo : Snow Layers Thickness [m] + write(11) dzsSNo + ! rosSNo : Snow Volumic Mass [kg/m3] + write(11) rosSNo + ! wasSNo : Snow Water Content [m3/m3] + write(11) wasSNo + ! tisSNo : Snow Temperature [K] + write(11) tisSNo + ! g1sSNo : Snow Dendricity / Sphericity [-] + write(11) g1sSNo + ! g2sSNo : Snow Sphericity / Size [-] [0.0001 m] + write(11) g2sSNo + ! agsSNo : Snow Age [day] + write(11) agsSNo + ! snohSN : Snow Buffer Layer [kg/m2], [mm] + write(11) snohSN + ! BrosSN : Snow Buffer Layer Density [kg/m3] + write(11) BrosSN + ! BG1sSN : Snow Buffer Layer Dendri/Spher. [-] + write(11) BG1sSN + ! BG2sSN : Snow Buffer Layer Spheri/Size [-] [0.0001 m] + write(11) BG2sSN + ! SWaSNo : Snow Surficial Water [m] + write(11) SWaSNo + ! zWE0SN : Initial Snow Thickness [mm w.e.] + write(11) zWE0SN + ! zWE_SN : Current Snow Thickness [mm w.e.] + write(11) zWE_SN + ! zWEcSN : Non-erodible Snow Thickness [mm w.e.] + write(11) zWEcSN + ! SaltSN : u*_th [m/s] + write(11) SaltSN + ! SLussl : u*_s* [kg/kg.m/s] + write(11) SLussl + ! blowSN : NEW MAX Erosion [kg/m2] + write(11) blowSN + ! WEq_SN : Added Snow Amount [m w.e.] + write(11) WEq_SN + ! SLn_z0 : Z0_momentum (instantaneous) [m] + write(11) SLn_z0 + ! SLn_r0 : Z0_scalar (instantaneous) [m] + write(11) SLn_r0 +#if(BS) + ! SLn_b0 : Z0_erosion (instantaneous) [m] + write(11) SLn_b0 +#endif +#if(ZA) + ! ua_0BS : Wind, x-component (t-dt) [m/s] + write(11) ua_0BS + ! va_0BS : Wind, y-component (t-dt) [m/s] + write(11) va_0BS + ! VVs_BS : (wind, Sastrugi) Relevance [m/s] + write(11) VVs_BS + ! RRs_BS : (wind, Sastrugi) Counter [-] + write(11) RRs_BS + ! DDs_BS : (wind, Sastrugi) Angle [dg] + write(11) DDs_BS + ! Z0SaBS : Z0 (Sastrugi Height) [m] + write(11) Z0SaBS +#endif + ! wes_IB : Snow/ice Sublimation [mm w.e.] + write(11) wes_IB + ! wee_IB : Evapotranspiration [mm w.e.] + write(11) weetIB + wes_IB(:, :, :) = wee_IB(:, :, :, 3) + weetIB(:, :, :) = wee_IB(:, :, :, 1) + ! wem_IB : Snow/ice M < ng [mm w.e.] + write(11) wem_IB + ! wer_IB : Snow/ice Refreezing [mm w.e.] + write(11) wer_IB + ! wei0IB : Bottom Snow/ice added [mm w.e.] + write(11) wei0IB + ! weu_IB : Run-off [mm w.e.] + write(11) weu_IB + ! zn0IB : Initial Snow Height [m] + write(11) zn0IB + ! mb0IB : Initial Mass Balance [mmWE] + write(11) mb0IB + if(mw == 5) then + ! gradTM :*CL* Local temp. gradient [C/m] + write(11) gradTM + ! gradQM :*CL* Local hum. gradient [g/kg/m] + write(11) gradQM + endif + close(unit=11) +#if(iso) + ! write isotopic composition of water in the soil + open(unit=11, status='unknown', form='unformatted', file='MARsvt_iso.DAT') + ! rosSNo_iso : Snow Volumic Mass [kg/m3] + write(11) rosSNo_iso + ! wasSNo_iso: Soil humidity content (=> in the snow cover ) [kg/kg] + write(11) wasSNo_iso + ! SWaSNo_iso: Surficial Water Mass [kg/m2] + write(11) SWaSNo_iso + ! snohSN_iso : Snow Buffer Layer Thickness [mmWE] + write(11) snohSN_iso + ! eta_TV_iso : Soil Moisture Content [m3/m3] + write(11) eta_TV_iso + close(unit=11) +#endif + endif + return +endsubroutine svasav diff --git a/MAR/code_mar/timcor.f90 b/MAR/code_mar/timcor.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c65145e8015387203ce8a5c4a5a664b4b6ace100 --- /dev/null +++ b/MAR/code_mar/timcor.f90 @@ -0,0 +1,50 @@ +subroutine TIMcor(i, j) + ! +------------------------------------------------------------------------+ + ! | MAR TIME 30-11-2000 MAR | + ! | subroutine TIMcor computes Corrected Local Times | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ jhurGE : Universal Time (Hour UT) | + ! | itizGE(i,j): Time Zone of Grid Point (i,j) | + ! | jhlrGE(i,j): Local Time at Grid Point (i,j) (Hour LT) | + ! | mmarGE : Month | + ! | jdarGE : Day | + ! | | + ! | OUTPUT: mmplus : Month (corrected) | + ! | ^^^^^^^ jdplus : Day (corrected) | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_ge + + implicit none + + integer, intent(in) :: i + integer, intent(in) :: j + + ! +--Corrected Time Base + ! + =================== + + jdplus = jdarGE + if(jhurGE + itizGE(i, j) < jhlrGE(i, j)) jdplus = jdarGE - 1 + if(jhurGE + itizGE(i, j) > jhlrGE(i, j)) jdplus = jdarGE + 1 + if(jdplus == 0) then + mmplus = mmarGE - 1 + 12 + mmplus = mod(mmplus, 12) + jdplus = njmoGE(mmplus) + else + if(jdplus > njmoGE(mmarGE)) then + mmplus = mmarGE + 1 + jdplus = 1 + else + mmplus = mmarGE + endif + endif + + return +endsubroutine TIMcor diff --git a/MAR/code_mar/timcur.f90 b/MAR/code_mar/timcur.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1f4af99031373f70c3f8d095f3ade8751627bf7b --- /dev/null +++ b/MAR/code_mar/timcur.f90 @@ -0,0 +1,36 @@ +subroutine timcur + ! +------------------------------------------------------------------------+ + ! | MAR TIME 18-09-2001 MAR | + ! | subroutine timcur computes MAR Time | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ itexpe: Experiment Iteration Counter | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ jdaMAR: Nb of Days Since Run Beginning (i.e. itexpe = 0) | + ! | jhaMAR: Nb of Hours | + ! | jmmMAR: Nb of Minutes | + ! | jssMAR: Nb of Seconds | + ! | jhaRUN: Nb of Hours Since Run Beginning | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + + implicit none + + ! +--MAR Time + ! + ======== + jssMAR = itexpe * idt + jmmMAR = jssMAR / 60 + jhaRUN = jmmMAR / 60 + jdaMAR = jhaRUN / 24 + jhaMAR = jhaRUN - jdaMAR * 24 + jmmMAR = jmmMAR - (jdaMAR * 24 + jhaMAR) * 60 + jssMAR = jssMAR - ((jdaMAR * 24 + jhaMAR) * 60 + jmmMAR) * 60 + return +endsubroutine timcur diff --git a/MAR/code_mar/time_steps.f90 b/MAR/code_mar/time_steps.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c7b5b20c30598ef76763dbabf7bd071622f4861f --- /dev/null +++ b/MAR/code_mar/time_steps.f90 @@ -0,0 +1,152 @@ +#include "MAR_pp.def" +subroutine time_steps + ! +------------------------------------------------------------------------+ + ! | MAR time_steps 02-03-2022 MAR | + ! +------------------------------------------------------------------------+ + + use mardim + use mar_ge + use margrd + use marphy + use marctr + use mar_sv + use marssn + use mar_ib + + implicit none + + character(8) :: date_mar + character(10) :: time_mar + + real dt_base, new_dt + + new_dt = dt + + if(mod(int(real(3600.*24./OutdyIB) / dt), 1) /= 0) dt = dt - 5 + + if(dt > 300) new_dt = 300 + if(dx <= 35000 .and. dt > 240) new_dt = 240 + if(dx <= 30000 .and. dt > 200) new_dt = 200 + if(dx <= 25000 .and. dt > 180) new_dt = 180 + if(dx <= 20000 .and. dt > 150) new_dt = 150 + if(dx <= 15000 .and. dt > 120) new_dt = 120 + if(dx <= 10000 .and. dt > 90) new_dt = 90 + if(dx <= 5000 .and. dt > 60) new_dt = 60 + if(dx <= 2500 .and. dt > 30) new_dt = 30 + + if(dt > 240 .and. dt < 300) new_dt = 240 + if(dt > 200 .and. dt < 240) new_dt = 200 + if(dt > 180 .and. dt < 200) new_dt = 180 + if(dt > 150 .and. dt < 180) new_dt = 150 + if(dt > 120 .and. dt < 150) new_dt = 120 + if(dt > 100 .and. dt < 120) new_dt = 100 + if(dt > 90 .and. dt < 100) new_dt = 90 + if(dt > 80 .and. dt < 90) new_dt = 80 + if(dt > 75 .and. dt < 80) new_dt = 75 + if(dt > 60 .and. dt < 75) new_dt = 60 + if(dt > 50 .and. dt < 60) new_dt = 50 + if(dt > 45 .and. dt < 50) new_dt = 45 + if(dt > 40 .and. dt < 45) new_dt = 40 + if(dt > 30 .and. dt < 40) new_dt = 30 + if(dt > 25 .and. dt < 30) new_dt = 25 + if(dt > 20 .and. dt < 25) new_dt = 20 + if(dt > 15 .and. dt < 20) new_dt = 15 + if(dt > 10 .and. dt < 15) new_dt = 10 + if(dt > 8 .and. dt < 10) new_dt = 8 + if(dt > 5 .and. dt < 8) new_dt = 5 + if(dt > 2 .and. dt < 5) new_dt = 2 + if(dt < 2) stop + + if(dt /= new_dt) then + + write(6, *) + write(6, 800) nint(dt), nint(new_dt) + write(6, *) +800 format(" ERROR: The time step is too high!! ", i3, "s ->", i3, "s") + + itexpe = nint(real(itexpe) * dt / new_dt) + nboucl = nint(real(nboucl) * dt / new_dt) + jtRadi2 = nint(real(jtRadi2) * dt / new_dt) + + dt = new_dt + idt = dt + jdt = (dt - idt) * 100. + dtfast = dt / (ntFast + 1) + + call timgeo() + + endif + + ! ----------------------------------------------------------------- + + dt_base = 60. + if(dt > 60) dt_base = min(dt / 2., dt_base) + + ! ----------------------------------------------------------------- + + jtRadi2 = min(int(real(3600.*24./OutdyIB) / dt), jtRadi2) + + ! ! characteristic time of radCEP (3600s) + jtRadi2 = max(900 / int(dt), jtRadi2) ! 15 min + jtRadi2 = min(3 * 3600 / int(dt), jtRadi2) ! 3h + + if(600./real(jtRadi2) /= 600 / jtRadi2) & + jtRadi2 = max(900 / int(dt), jtRadi2) + + if(900./real(jtRadi2) /= 900 / jtRadi2) & + jtRadi2 = max(1200 / int(dt), jtRadi2) + + if(1200./real(jtRadi2) /= 1200 / jtRadi2) & + jtRadi2 = max(1800 / int(dt), jtRadi2) + + if(1800./real(jtRadi2) /= 1800 / jtRadi2) & + jtRadi2 = max(3600 / int(dt), jtRadi2) + + jtRadi = jtRadi2 + + ! ----------------------------------------------------------------- + + ! ! characteristic time of sisvat (60s) + ntPhys = nint(dt / dt_base) + !c#BS ntPhys = max(2,ntPhys) + + ! ! characteristic time of Hydmic (60s) + ntHyd = nint(dt / dt_base) + !c#BS ntHyd = max(2,ntHyd) + + ! ! subgrid scale steps (turbulence and convection) (60s) + ntDiff = nint(dt / dt_base) + if(OutdyIB > 4) ntDiff = max(2, ntDiff) +#if(BS) + ntDiff = max(2, ntDiff) +#endif + + ntPhys = min(3, max(1, ntPhys)) + ntHyd = min(3, max(1, ntHyd)) + ntDiff = min(2, max(1, ntDiff)) + + dtPhys = dt / real(ntPhys) + dtHyd = dt / real(ntHyd) + dtDiff = dt / real(ntDiff) + + dtRadi = max(600., min(7200., dt * jtRadi)); jtRadi = real(dtRadi) / dt + + ! ----------------------------------------------------------------- + + call date_and_time(DATE=date_mar) + call date_and_time(TIME=time_mar) + + write(6, 400) jdarGE, mmarGE, iyrrGE, jhurGE, minuGE, jsecGE + +400 format(' MAR time : ', i2, '/', i2, '/', i4, ' ', i2, ':', i2, ':', i2) + + write(6, *) "Real time : "//date_mar(5:6)//"/" & + //date_mar(7:8)//"/"//date_mar(1:4)//" "//time_mar(1:2) & + //":"//time_mar(3:4)//":"//time_mar(5:6) + + write(6, 401) dt, dtHyd, dtDiff, dtRadi, nt_Mix +401 format(' Step time : dt=', f5.1, ", dtHyd=", f5.1, & + ", dtDiff=", f5.1, ", dtRadi=", f6.0, ' s', & + ", nt_Mix=", i2) + +endsubroutine time_steps diff --git a/MAR/code_mar/timgeo.f90 b/MAR/code_mar/timgeo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..deca8fcf11366a20224abea3addb67428bb66113 --- /dev/null +++ b/MAR/code_mar/timgeo.f90 @@ -0,0 +1,92 @@ +subroutine timgeo + ! +------------------------------------------------------------------------+ + ! | MAR TIME 1-11-2001 MAR | + ! | subroutine timgeo computes Current Universal and Local Times | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ itexpe: Experiment Iteration Counter | + ! | itizGE(mx,my): Time Zone | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ iyrrGE : year | + ! | mmarGE : Month | + ! | jdarGE : Day | + ! | jhurGE : Universal Time (Hour UT) | + ! | jhlrGE(mx,my): Local Time (Hour LT) | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_ge + + implicit none + + ! +--Local Variables + ! + ================ + integer i, j, k, m + !XF + integer njmo, leap + integer(kind=8) jdarGE8, jhurGE8, minuGE8, jsecGE8 + !XF + + ! +--Universal Time + ! + ============== + iyrrGE = iyr0GE + mmarGE = mma0GE + jdarGE8 = jda0GE + jhurGE8 = jhu0GE + minuGE8 = 0 + jsecGE8 = itexpe * idt +240 continue + if(jsecGE8 < 60) go to 241 + jsecGE8 = jsecGE8 - 60 + minuGE8 = minuGE8 + 1 + go to 240 +241 continue + if(minuGE8 < 60) go to 242 + minuGE8 = minuGE8 - 60 + jhurGE8 = jhurGE8 + 1 + go to 241 +242 continue + if(jhurGE8 < 24) go to 243 + jhurGE8 = jhurGE8 - 24 + jdarGE8 = jdarGE8 + 1 + go to 242 +243 continue + !XF + leap = 1 + if(mod(iyrrGE, 100) == 0 .and. mod(iyrrGE, 400) /= 0) leap = 0 + !XF + + njmo = njmoGE(mmarGE) & + + njmbGE(mmarGE) * max(0, 1 - mod(iyrrGE, 4)) & + * leap + + if(jdarGE8 <= njmo) go to 244 + jdarGE8 = jdarGE8 - njmo + mmarGE = mmarGE + 1 + if(mmarGE <= 12) go to 243 + mmarGE = mmarGE - 12 + iyrrGE = iyrrGE + 1 + go to 243 +244 continue + + ! +--Local Time + ! + ============== + do j = 1, my + do i = 1, mx + jhlrGE(i, j) = jhurGE8 + itizGE(i, j) + if(jhlrGE(i, j) >= 24) jhlrGE(i, j) = jhlrGE(i, j) - 24 + if(jhlrGE(i, j) < 0) jhlrGE(i, j) = jhlrGE(i, j) + 24 + enddo + enddo + jdarGE = jdarGE8 + jhurGE = jhurGE8 + minuGE = minuGE8 + jsecGE = jsecGE8 + return +endsubroutine timgeo diff --git a/MAR/code_mar/tlat.f90 b/MAR/code_mar/tlat.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5a9c2f9131990dd943b75b56f2be007cd371532e --- /dev/null +++ b/MAR/code_mar/tlat.f90 @@ -0,0 +1,60 @@ +subroutine tlat(tlat_a, tlat_b, tlat_c, tlat_d, tlat_p, tlat_q, nx, n, tlat_x) + ! + + ! +------------------------------------------------------------------------+ + ! | MAR DYNAMICS FILTER 20-09-2001 MAR | + ! | subroutine tlat uses the Gaussian Elimination Algorithm | + ! | (e.g. Pielke (1984), pp.302--303) | + ! | (needed to solve the implicit scheme developped for filtering) | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: tlat_a,tlat_b,tlat_c: tri-diagional matrix coefficients | + ! | ^^^^^ tlat_d : tri-diagional matrix independent term | + ! | tlat_p,tlat_q : working variables | + ! | n : dimension of the variables | + ! | ix : switch | + ! | tlat_x : variable to solve | + ! | | + ! | OUTPUT: tlat_x | + ! | ^^^^^^ | + ! +------------------------------------------------------------------------+ + ! + + implicit none + ! + + integer nx, n + real tlat_a(nx), tlat_b(nx), tlat_c(nx), tlat_d(nx) + real tlat_x(nx), tlat_p(nx), tlat_q(nx) + ! + + integer k, l + integer ix + ! + + data ix/0/ + ! + + ! + + ! +--Forward Sweep + ! + ============== + ! + + if(ix /= 1) then + tlat_p(1) = tlat_b(1) + tlat_q(1) = -tlat_c(1) / tlat_p(1) + do k = 2, n + tlat_p(k) = tlat_a(k) * tlat_q(k - 1) + tlat_b(k) + tlat_q(k) = -tlat_c(k) / tlat_p(k) + enddo + endif + ! + + tlat_x(1) = tlat_d(1) / tlat_p(1) + do k = 2, n + tlat_x(k) = (tlat_d(k) - tlat_a(k) * tlat_x(k - 1)) / tlat_p(k) + enddo + ! + + ! + + ! +--Backward Sweep + ! + ============== + ! + + do l = 2, n + k = n - l + 1 + tlat_x(k) = tlat_q(k) * tlat_x(k + 1) + tlat_x(k) + enddo + ! + + return +endsubroutine tlat diff --git a/MAR/code_mar/trackwater_mod.f90 b/MAR/code_mar/trackwater_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6237a518a35c402a3c3d2179b52fb04e7a60dc04 --- /dev/null +++ b/MAR/code_mar/trackwater_mod.f90 @@ -0,0 +1,130 @@ +! trackwater, Cécile Agosta, July 2022 +! track changes in water vapor (water budget) +module trackwater + ! track_water : activation of trackwater in mar + logical, parameter :: track_water = .false. + ! track turabl : activation of trackwater in turabl, to distangle surface sublimation from mixing + logical, parameter :: track_water_turabl = .false. + ! track dynadv : activation of trackwater in dynadv_lfb_2p, to distangle horizontal from vertical advection + logical, parameter :: track_water_dynadv = .false. + ! ntwater : effective number of tracked water component + integer, save :: ntwater + ! water vapor + ! =========== + ! tracked components indexes + integer, save :: j_dynadv ! dynadv : LFB horizontal advection + integer, save :: j_turhor ! turhor : Horizontal diffusion + integer, save :: j_turabl ! turabl : Boundary Layer Turbulence + integer, save :: j_sspray ! sspray : Sea Spray + integer, save :: j_hydgen ! hydgen : Microphysics + integer, save :: j_lbcnud ! lbcnud : Lateral Boundary Condition + integer, save :: j_cvagen ! cvagen : Convection + ! index for turabl + integer, save :: j_turabl_mix ! turabl_mix : Mixing with other layers without surface sublimation + integer, save :: j_turabl_sbl ! turabl_sbl : Mixing of surface sublimation + ! index for dynadv_lfb_2p + integer, save :: j_dynadv_hor ! dynadv_hor : Horizontal advection + integer, save :: j_dynadv_ver ! dynadv_ver : Vertical advection + integer, save :: j_dynadv_sav ! dynadv_sav : Mass conservation operations + ! tracked components names + character(len = 3), allocatable, save :: name_water(:) + ! delta_qv : cumulative change in water vapor components (kg/kg) + real, allocatable, save :: delta_qv(:, :, :, :) + ! qvDY_save : Save state before routine call (kg/kg) + real, allocatable :: qvDY_save(:, :, :) + ! for out_nc outputs (kg/kg) + ! ========================== + real, allocatable, save :: delta_qv_NCsave(:, :, :, :) + ! ddelta_water = delta_qv - delta_qv_save (kg/kg) + real, allocatable :: ddelta_water(:, :, :) + ! for outice outputs + ! ================== + real, allocatable, save :: dqvIB(:, :, :, :) ! dqvIB : delta_qv in (g / kg) hour-1 + real, allocatable, save :: delta_qv_IBsave(:, :, :, :) ! delta_qv_IBsave : delta_qv from previous time save (kg / kg) + ! temporary variables + integer jtw ! iteration for tracked water changes + real :: delta_qv_tmp ! temporary variable in turabl + real, allocatable :: dqp1_h(:, :, :) ! temporary variable in dynadv_lfb_2p + real, allocatable :: dqp1_v(:, :, :) ! temporary variable in dynadv_lfb_2p + real, allocatable :: dqm1_h(:, :, :) ! temporary variable in dynadv_lfb_2p + real, allocatable :: dqm1_v(:, :, :) ! temporary variable in dynadv_lfb_2p + +contains + + subroutine trackwater_init() + use mardim, only : mx, my, mz + use mar_ib, only : ml + implicit none + ! ntwater : effective number of tracked water component + ! set up indexes + ntwater = 0 + ntwater = ntwater + 1 + j_dynadv = ntwater + ntwater = ntwater + 1 + j_turhor = ntwater + ntwater = ntwater + 1 + j_turabl = ntwater + ntwater = ntwater + 1 + j_sspray = ntwater + ntwater = ntwater + 1 + j_hydgen = ntwater + ntwater = ntwater + 1 + j_lbcnud = ntwater + ntwater = ntwater + 1 + j_cvagen = ntwater + if (track_water_turabl) then + ntwater = ntwater + 1 + j_turabl_mix = ntwater + ntwater = ntwater + 1 + j_turabl_sbl = ntwater + end if + if (track_water_dynadv) then + ntwater = ntwater + 1 + j_dynadv_hor = ntwater + ntwater = ntwater + 1 + j_dynadv_ver = ntwater + ntwater = ntwater + 1 + j_dynadv_sav = ntwater + end if + allocate(name_water(ntwater)) + ! set water names + name_water(j_dynadv) = 'adv' + name_water(j_turhor) = 'dif' + name_water(j_turabl) = 'tur' + name_water(j_sspray) = 'spr' + name_water(j_hydgen) = 'hyd' + name_water(j_lbcnud) = 'lbc' + name_water(j_cvagen) = 'cva' + if (track_water_turabl) then + name_water(j_turabl_mix) = 'mix' + name_water(j_turabl_sbl) = 'sbl' + end if + if (track_water_dynadv) then + name_water(j_dynadv_hor) = 'hor' + name_water(j_dynadv_ver) = 'ver' + name_water(j_dynadv_sav) = 'sav' + end if + + ! allocates + allocate(qvDY_save(mx, my, mz)) + allocate(delta_qv(mx, my, mz, ntwater)) + allocate(delta_qv_NCsave(mx, my, mz, ntwater)) + allocate(ddelta_water(mx, my, mz)) + allocate(dqvIB(mx, my, ml, ntwater)) + allocate(delta_qv_IBsave(mx, my, mz, ntwater)) + ! initial values + qvDY_save = 0. + delta_qv = 0. + delta_qv_NCsave = 0. + ddelta_water = 0. + dqvIB = 0. + delta_qv_IBsave = 0. + ! temporary variables + delta_qv_tmp = 0. + if (track_water_dynadv) then + allocate(dqp1_h(mx, my, mz), dqp1_v(mx, my, mz)) + allocate(dqm1_h(mx, my, mz), dqm1_v(mx, my, mz)) + end if + endsubroutine trackwater_init + +endmodule trackwater diff --git a/MAR/code_mar/trackwind_mod.f90 b/MAR/code_mar/trackwind_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9433c0f87b51790dd775b3d553ec53bb1aea24bd --- /dev/null +++ b/MAR/code_mar/trackwind_mod.f90 @@ -0,0 +1,146 @@ +! trackwind, Cécile Agosta, July 2022 +! track changes in winds (momentum budget) +! +module trackwind + implicit none + ! track_wind : activation of trackwind + logical, parameter :: track_wind = .false. + ! ntrackwind : number of routines changing winds tracked + integer, parameter :: ntrackwind = 6 ! ntrackwind : number of tracked routines + ! momentum : horizontal wind + ! ========================== + ! delta_u, delta_v : cumulative change in wind components + real, allocatable, save :: delta_u(:, :, :, :) ! (mx, my, mz, ntrackwind) + real, allocatable, save :: delta_v(:, :, :, :) ! (mx, my, mz, ntrackwind) + ! uairDY_save, vairDY_save : Save state before routine call + real, allocatable :: uairDY_save(:, :, :) + real, allocatable :: vairDY_save(:, :, :) + ! define tracked routines + integer itw ! iteration for tracked wind chances + character(len = 6), parameter :: name_wind(ntrackwind) = (/ 'dgz', 'fil', 'cor', 'dif', 'tur', 'lbc' /) + ! index in the array + integer, parameter :: i_dyndgz = 1 ! dyndgz : Horizontal Pressure Gradient Force + integer, parameter :: i_dynfil = 2 ! dynfil : Horizontal filtering + integer, parameter :: i_coriol = 3 ! coriol : Coriolis + integer, parameter :: i_turhor = 4 ! turhor : Horizontal diffusion + integer, parameter :: i_turabl = 5 ! turabl : Boundary Layer Turbulence + integer, parameter :: i_lbcnud = 6 ! lbcnud : Lateral Boundary Condition + ! for out_nc outputs + real, allocatable, save :: delta_u_NCsave(:, :, :, :) ! (mx, my, mz, ntrackwind) + real, allocatable, save :: delta_v_NCsave(:, :, :, :) ! (mx, my, mz, ntrackwind) + ! ddelta_var = delta_var - delta_var_save + real, allocatable :: ddelta_var(:, :, :) + ! for outice outputs + real, allocatable, save :: duIB(:, :, :, :) ! duIB : delta_u in m s-1 h-1 + real, allocatable, save :: dvIB(:, :, :, :) ! dvIB : delta_v in m s-1 h-1 + real, allocatable, save :: delta_u_IBsave(:, :, :, :) ! delta_u_IBsave : delta_u from previous time save + real, allocatable, save :: delta_v_IBsave(:, :, :, :) ! delta_v_IBsave : delta_v from previous time save + ! track dyndgz + ! track_dgz : activation of trackwind in dyndgz + logical, parameter :: track_dgz = .false. + ! ntrackdgz : number of contribution to dgz tracked + integer, parameter :: ntrackdgz = 2 ! ntrackdgz : number of tracked contribution in dyndgz + ! delta_u_dgz, delta_v_dgz : cumulative change in wind components + real, allocatable, save :: delta_u_dgz(:, :, :, :) + real, allocatable, save :: delta_v_dgz(:, :, :, :) + character(len = 6), parameter :: name_dgz(ntrackdgz) = (/ 'adv', 'pgf' /) + ! index in the array + integer, parameter :: i_dgzadv = 1 ! dgzadv : Advection contribution to Horizontal PGF + integer, parameter :: i_dgzpgf = 2 ! dgzpgf : Horizontal PGF + ! for out_nc outputs + real, allocatable, save :: delta_u_dgz_NCsave(:, :, :, :) + real, allocatable, save :: delta_v_dgz_NCsave(:, :, :, :) + ! for outice outputs + real, allocatable, save :: dudgzIB(:, :, :, :) ! dudgzIB : delta_u_dgz in m s-1 h-1 + real, allocatable, save :: dvdgzIB(:, :, :, :) ! dvdgzIB : delta_v_dgz in m s-1 h-1 + real, allocatable, save :: delta_u_dgz_IBsave(:, :, :, :) ! delta_u_dgz_IBsave : delta_u_dgz from previous time save + real, allocatable, save :: delta_v_dgz_IBsave(:, :, :, :) ! delta_v_dgz_IBsave : delta_v_dgz from previous time save + ! temporary variables + real :: dudt_t + real, allocatable :: dudt_tm1(:, :, :, :) + real :: c1a_t(ntrackdgz) + real, allocatable :: c1a_tm1(:, :, :, :) + real, allocatable :: c1a_tm2(:, :, :, :) + + ! ! momentum : vertical wind psig + ! ! ============================= + ! real :: psigDY_save(mx, my, mz) ! Save state before routine call + ! ! dyndps : Mass Continuity + ! real, save :: dp_dyndps(mx, my, mz) + ! ! dynfil : Filtering + ! real, save :: dp_dynfil(mx, my, mz) + ! ! water : qv + ! real :: qvDY_save(mx, my, mz) ! Save state before routine call + ! real, save :: dq_dynadv(mx, my, mz) ! Advection + ! real, save :: dq_turhor(mx, my, mz) ! Horizontal diffusion + ! real, save :: dq_turabl(mx, my, mz) ! Turbulence + ! real, save :: dq_sspray(mx, my, mz) ! Sea spray + ! real, save :: dq_hydgen(mx, my, mz) ! Microphysics + ! real, save :: dq_lbcnud(mx, my, mz) ! Lateral boundaries + ! real, save :: dq_cvagen(mx, my, mz) ! Convection + +contains + + subroutine trackwind_init() + use mardim, only : mx, my, mz + use mar_ib, only : ml + implicit none + ! allocates + allocate(uairDY_save(mx, my, mz)) + allocate(vairDY_save(mx, my, mz)) + allocate(delta_u(mx, my, mz, ntrackwind)) + allocate(delta_v(mx, my, mz, ntrackwind)) + allocate(delta_u_NCsave(mx, my, mz, ntrackwind)) + allocate(delta_v_NCsave(mx, my, mz, ntrackwind)) + allocate(ddelta_var(mx, my, mz)) + allocate(duIB(mx, my, ml, ntrackwind)) + allocate(dvIB(mx, my, ml, ntrackwind)) + allocate(delta_u_IBsave(mx, my, mz, ntrackwind)) + allocate(delta_v_IBsave(mx, my, mz, ntrackwind)) + ! initial values + uairDY_save = 0. + vairDY_save = 0. + delta_u = 0. + delta_v = 0. + delta_u_NCsave = 0. + delta_v_NCsave = 0. + ddelta_var = 0. + duIB = 0. + dvIB = 0. + delta_u_IBsave = 0. + delta_v_IBsave = 0. + end subroutine trackwind_init + + subroutine trackdgz_init() + use mardim, only : mx, my, mz + use mar_ib, only : ml + implicit none + ! allocates + allocate(delta_u_dgz(mx, my, mz, ntrackdgz)) + allocate(delta_v_dgz(mx, my, mz, ntrackdgz)) + allocate(delta_u_dgz_NCsave(mx, my, mz, ntrackdgz)) + allocate(delta_v_dgz_NCsave(mx, my, mz, ntrackdgz)) + allocate(dudgzIB(mx, my, ml, ntrackdgz)) + allocate(dvdgzIB(mx, my, ml, ntrackdgz)) + allocate(delta_u_dgz_IBsave(mx, my, mz, ntrackdgz)) + allocate(delta_v_dgz_IBsave(mx, my, mz, ntrackdgz)) + allocate(dudt_tm1(mx, my, mz, ntrackdgz)) + allocate(c1a_tm1(mx, my, mz, ntrackdgz)) + allocate(c1a_tm2(mx, my, mz, ntrackdgz)) + ! initial values + delta_u_dgz = 0. + delta_v_dgz = 0. + delta_u_dgz_NCsave = 0. + delta_v_dgz_NCsave = 0. + dudgzIB = 0. + dvdgzIB = 0. + delta_u_dgz_IBsave = 0. + delta_v_dgz_IBsave = 0. + dudt_t = 0. + dudt_tm1 = 0. + c1a_t = 0. + c1a_tm1 = 0. + c1a_tm2 = 0. + end subroutine trackdgz_init + +end module trackwind diff --git a/MAR/code_mar/turabl.f90 b/MAR/code_mar/turabl.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3cf67c5f0aa325b5ca85152f79da314ca4b2e444 --- /dev/null +++ b/MAR/code_mar/turabl.f90 @@ -0,0 +1,1338 @@ +#include "MAR_pp.def" +subroutine TURabl + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (ABL) 10-05-2021 MAR | + ! | subroutine TURabl includes the Contribution of Vertical Turbulence | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ micphy : Cloud Microphysics Switch | + ! | dt_Loc : Vertical Diffusion Time Step [s] | + ! | | + ! | TUkvm(mx,my,mz): Vertical Turbulent Coeffic.(momentum) [m2/s] | + ! | TUkvh(mx,my,mz): Vertical Turbulent Coeffic.(heat) [m2/s] | + ! | SLuus(mx,my) : Friction Velocity [m/s] | + ! | SLuts(mx,my) : Surface Layer Heat Turbulent Flux [mK/s] | + ! | SLuqs(mx,my) : Surface Layer Moisture Turbulent Flux [m/s] | + ! | qvapSL ! cCA#if(iso) warning, input ! + ! | uss_HY(mx,my) : Surface Layer Blowing* Turbulent Flux [m/s] | + ! | | + ! | INPUT / OUTPUT: The Vertical Turbulent Fluxes are included for: | + ! | ^^^^^^^^^^^^^^ | + ! | 1) The Horizontal x-Wind Component uairDY(mx,my,mz) [m/s] | + ! | 2) The Horizontal y-Wind Component vairDY(mx,my,mz) [m/s] | + ! | | + ! | 3) The Potential Temperature pktaDY(mx,my,mzz) | + ! | 4) The Air Specific Humidity qvDY(mx,my,mz) [kg/kg] | + ! | | + ! | 5) The Ice Crystals Concentration qiHY(mx,my,mz) [kg/kg] | + ! | 6) The Ice Crystals Number ccniHY(mx,my,mz) [Nb/m3] | + ! | 7) The Cloud Droplets Concentration qwHY(mx,my,mz) [kg/kg] | + ! | 8) The Snow Flakes Concentration qsHY(mx,my,mz) [kg/kg] | + ! | 9) The Rain Drops Concentration qrHY(mx,my,mz) [kg/kg] | + ! | | + ! | 10) The Tracer Concentration qxTC(mx,my,mz,ntrac) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_tu + use mar_hy + use mar_sl + use mar_wk + use marmagic + use trackwater, only: track_water_turabl, jtw, & + delta_qv, j_turabl_mix, j_turabl_sbl, delta_qv_tmp +#if(NH) + use mar_nh +#endif +#if(TC) + use mar_tc +#endif +#if(EW) + use mar_ew +#endif +#if(iso) + !cCA todo : add qiHY, qsHY, qwHY, qrHY + use mariso, only: wiso, niso, qvDY_iso, & + negligible, Rdefault, qvapSL_iso, SLuqs_iso +#endif + + implicit none + +#if(iso) + ! Riso : isotopic ratio + real :: Riso(niso, mx, my, mz) + real :: Riso_uqstar + real :: Riso_qvap + real, save :: WKxyz4_iso(niso, mx, my, mz) + real, save :: WKxyz7_iso(niso, mx, my, mz) + real, save :: varin_iso(mx, my, mz) + real, save :: varout_iso(mx, my, mz) +#endif + + logical Q_Impl + common / TURabl_lo / Q_Impl + + integer lous, lotu + common / TURabl_IN / lous, lotu + + real alpha, beta, ab + common / TURabl_re / alpha, beta, ab + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer i1_tua, i2_tua, j1_tua, j2_tua, k1_tua, k2_tua, n, km, kp + real uustar, ssvu(mx, my), ssvv(mx, my) + real utstar, uqstar, qvap + real waterb, ussno, dd_sno + real ratio_rfsf, ratio_temp, ratio_prec + + ! +--Parameters + ! + ========== + + if(iterun == 0) then + + ! +--Parameters for the Inclusion of the Friction Velocity u* + ! + -------------------------------------------------------- + + lous = 1 + lous = 1 + ! +... lous =1 : SLuus is used + ! + lous =0 : SLuus**2 is (partly) replaced by K du / dz + ! + CAUTION : do NOT USE lous =0 EXCEPT WHEN VERIFYING THE EKMAN SPIRAL + + ! +--Parameters for the Numerical Scheme of Vertical Turbulent Transport + ! + ------------------------------------------------------------------- + + Q_Impl = .false. + Q_Impl = .true. + Q_Impl = .false. +#if(TC) + if(Q_Impl) stop ' #~�@�! BAD Vertical Diffusion of gaseous tracers' +#endif + endif + + ! +------------------------------------------------------------------------- + + ! +--INITIALIZATION + ! + ============== + + if(itexpe == 0) then + do j = 1, my + do i = 1, mx + ssvSL(i, j, mz) = max(sqrt(uairDY(i, j, mz) * uairDY(i, j, mz) & + + vairDY(i, j, mz) * vairDY(i, j, mz)), epsi) + do n = 1, mw + cdmSL(i, j, n) = 0.04 + cdhSL(i, j, n) = 0.04 + SLuusl(i, j, n) = cdmSL(i, j, n) * ssvSL(i, j, mz) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + duusSL(i, j) = 0. + dutsSL(i, j) = 0. + enddo + enddo + endif + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Horizontal Momentum + ! + ========================================= + + ! +--Implicit Surface Scheme + ! + ----------------------- + + !$OMP PARALLEL do private(i,j,k,i1_tua,i2_tua,j1_tua,j2_tua, & + !$OMP k1_tua,k2_tua,n,km,kp,alpha,beta,ab, & + !$OMP ratio_rfsf,ratio_temp,ratio_prec, & + !$OMP uustar,utstar,uqstar,qvap,waterb,ussno,dd_sno) + do j = jp11, my1 + + alpha = 0.25 ! + beta = 1.00 - alpha ! Impliciteness + ab = alpha / beta ! + + do i = ip11, mx1 + Kv__SL(i, j) = 0. + aeCdSL(i, j) = 0. + enddo + + do n = 1, mw + do i = ip11, mx1 + ! aerodynamic conductance + aeCdSL(i, j) = aeCdSL(i, j) + cdmSL(i, j, n) * SLuusl(i, j, n) & + * Slsrfl(i, j, n) + enddo + enddo + do i = ip11, mx1 + ! Kv Contrib. in SL + Kv__SL(i, j) = & + -gravit * aeCdSL(i, j) * beta & + * rolvDY(i, j, mz) / (pstDY(i, j) * dsigm1(mz)) + enddo + + ! +--Tridiagonal Matrix Coefficients : u and v + ! + ----------------------------------------- + + do i = ip11, mx1 + ssvu(i, j) = uairDY(i, j, mz) / ssvSL(i, j, mz) + ssvv(i, j) = vairDY(i, j, mz) / ssvSL(i, j, mz) + enddo + + ! +--Diagonal A + ! + ~~~~~~~~~~ + do i = ip11, mx1 + WKxyz1(i, j, mz) = Kv__SL(i, j) + enddo + + do k = mmz1, 1, -1 + kp = kp1(k) + do i = ip11, mx1 + WKxyz1(i, j, k) = -gravi2 * beta * romiDY(i, j, k) * & + TUkvm(i, j, k) * rolvDY(i, j, k) / & + (pstDY2(i, j) * dsigm1(k) * dsig_1(k)) + enddo + + ! +--Diagonal C + ! + ~~~~~~~~~~ + do i = ip11, mx1 + WKxyz3(i, j, kp) = WKxyz1(i, j, k) * dsigm1(k) / dsigm1(kp) & + * (rolvDY(i, j, kp) / rolvDY(i, j, k)) + enddo + + enddo + + ! +--A, B, C + ! + ~~~~~~~ + do k = 1, mmz1 + do i = ip11, mx1 + WKxyz1(i, j, k) = WKxyz1(i, j, k) * dt_Loc + WKxyz3(i, j, k) = WKxyz3(i, j, k) * dt_Loc + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + enddo + + ! +--Vertical B.C. + ! + ~~~~~~~~~~~~~ + do i = ip11, mx1 + WKxyz3(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 - WKxyz1(i, j, 1) + + WKxyz1(i, j, mz) = WKxyz1(i, j, mz) * dt_Loc + WKxyz3(i, j, mz) = WKxyz3(i, j, mz) * dt_Loc + WKxyz2(i, j, mz) = 1.0 - WKxyz3(i, j, mz) - WKxyz1(i, j, mz) + enddo + + ! +--Second Member of the Tridiagonal System - u + ! + ------------------------------------------- + + kp = kp1(1) + do i = ip11, mx1 + WKxyz4(i, j, 1) = WKxyz1(i, j, 1) & + * ab * (uairDY(i, j, 1) - uairDY(i, j, kp)) + enddo + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (uairDY(i, j, k) - uairDY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (uairDY(i, j, km) - uairDY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + + uustar = SLuus(i, j) * SLuus(i, j) + + ! +--Implicit Surface Scheme + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + ! explicit + uustar = 0.1 * duusSL(i, j) + + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * uairDY(i, j, mz) & + - WKxyz3(i, j, mz) * ab * (uairDY(i, j, mmz1) - uairDY(i, j, mz)) & + - lous * alpha * gravit * romiDY(i, j, mz) * dt_Loc & + * uustar * ssvu(i, j) / (pstDY(i, j) * dsigm1(mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - u + ! + -------------------------------- + + k1_tua = 1 + do k = k1_tua, mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + uairDY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--Second Member of the Tridiagonal System - v + ! + ------------------------------------------- + + kp = kp1(1) + do i = ip11, mx1 + WKxyz4(i, j, 1) = WKxyz1(i, j, 1) & + * ab * (vairDY(i, j, 1) - vairDY(i, j, kp)) + enddo + + do k = kp1(1), mmz1 + km = km1(k) + kp = kp1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (vairDY(i, j, k) - vairDY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (vairDY(i, j, km) - vairDY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + uustar = SLuus(i, j) * SLuus(i, j) + ! +--Implicit Surface Scheme + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + uustar = 0.1 * duusSL(i, j) ! explicit + duusSL(i, j) = 0.9 * duusSL(i, j) ! + + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * vairDY(i, j, mz) & + - WKxyz3(i, j, mz) * ab * (vairDY(i, j, mmz1) - vairDY(i, j, mz)) & + - lous * alpha * gravit * romiDY(i, j, mz) * dt_Loc & + * uustar * ssvv(i, j) / (pstDY(i, j) * dsigm1(mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - v + ! + -------------------------------- + + k1_tua = 1 + do k = k1_tua, mz + ! do j= jp11,my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + vairDY(i, j, k) + enddo + ! end do + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do i = ip11, mx1 + uustar = aeCdSL(i, j) * ((alpha * WKxy1(i, j) + beta * uairDY(i, j, mz)) * ssvu(i, j) & + + (alpha * vairDY(i, j, mz) + beta * WKxyz7(i, j, mz)) * ssvv(i, j)) + duusSL(i, j) = duusSL(i, j) + SLuus(i, j) * SLuus(i, j) - uustar + enddo + + do k = 1, mz + do i = ip11, mx1 + vairDY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Heat and Water Vapor + ! + ========================================== + + ! +--Implicit Surface Scheme + ! + ----------------------- + + ! do j=jp11,my1 + do i = ip11, mx1 + Kv__SL(i, j) = 0. + aeCdSL(i, j) = 0. + enddo + ! end do + + do n = 1, mw + do i = ip11, mx1 + ! aerodynamic conductance + aeCdSL(i, j) = aeCdSL(i, j) + cdhSL(i, j, n) * SLuusl(i, j, n) & + * Slsrfl(i, j, n) + enddo + enddo + + do i = ip11, mx1 + ! Kv Contrib. above SL + ! + Kv__SL(i,j) = & + ! + -gravi2*romiDY(i,j,mz) * TUkvh(i,j,mz) *beta & + ! + *rolvDY(i,j,mz)/(pstDY2(i,j)* dsigm1(mz)*dsig_1(mz)) + ! Kv Contrib. in SL + Kv__SL(i, j) = & + -gravit * aeCdSL(i, j) * beta & + * rolvDY(i, j, mz) / (pstDY(i, j) * dsigm1(mz)) + enddo + + ! +--Tridiag. Matrix Coeff. : pktaDY, qvDY + ! + --------------------------------------- + + ! +--Diagonal A + ! + ~~~~~~~~~~ + k = mz + do i = ip11, mx1 + WKxyz1(i, j, k) = Kv__SL(i, j) + enddo + + do k = mmz1, 1, -1 + do i = ip11, mx1 + ! TUkvh : Vertical Turbulent Coeffic. (heat) [m2/s] + ! WKxyz1 = - g^2 rho^2 * TUkvh / dp^2 [dp/dz = rho g => rho g / dp = 1/dz] + ! WKxyz1 in [m2 s-1] * [m-2] -> multiplied by dt hereafter + WKxyz1(i, j, k) = -gravi2 * beta * & + romiDY(i, j, k) * TUkvh(i, j, k) * rolvDY(i, j, k) / & + (pstDY2(i, j) * dsigm1(k) * dsig_1(k)) + enddo + enddo + + ! +--Diagonal C + ! + ~~~~~~~~~~ + do k = mz, 1, -1 + kp = kp1(k) + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz3(i, j, kp) = WKxyz1(i, j, k) * dsigm1(k) / dsigm1(kp) & + / rolvDY(i, j, k) * rolvDY(i, j, kp) + enddo + ! end do + enddo + + ! +--A, B, C + ! + ~~~~~~~ + do k = 1, mz + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = WKxyz1(i, j, k) * dt_Loc + WKxyz3(i, j, k) = WKxyz3(i, j, k) * dt_Loc + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + ! end do + enddo + + ! +--Vertical B.C. + ! + ~~~~~~~~~~~~~ + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz3(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 - WKxyz1(i, j, 1) + enddo + ! end do + + ! +--SBC of the Tridiagonal System - pktaDY + ! + -------------------------------------- + + ! do j=jp11,my1 + do i = ip11, mx1 + utstar = SLuts(i, j) + + ! +--Implicit Surface Scheme + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + ! explicit + utstar = 0.1 * dutsSL(i, j) + ! set := 0 + dutsSL(i, j) = 0.9 * dutsSL(i, j) + ! + ! partly explicit + WKxyz4(i, j, mz) = WKxyz1(i, j, mz) & + * (ab * pktaDY(i, j, mz) - pktaSL(i, j) / beta) & + - WKxyz3(i, j, mz) * ab * (pktaDY(i, j, mmz1) - pktaDY(i, j, mz)) & + ! u*T* all explicit + - gravit * dt_Loc * rolvDY(i, j, mz) & + * utstar / (pcap * pstDY(i, j) * dsigm1(mz)) + enddo + ! end do + + ! +--Second Member of the Tridiagonal System - pktaDY + ! + ------------------------------------------------ + + do k = kp1(1), mmz1 + km = km1(k) + kp = kp1(k) + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (pktaDY(i, j, k) - pktaDY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (pktaDY(i, j, km) - pktaDY(i, j, k)) + enddo + ! end do + enddo + + ! +--UBC of the Tridiagonal System - pktaDY + ! + ------------------------------------------------ + + kp = kp1(1) + do i = ip11, mx1 + WKxyz4(i, j, 1) = & + WKxyz1(i, j, 1) * ab * (pktaDY(i, j, 1) - pktaDY(i, j, kp)) + enddo + + ! +--Tridiagonal Matrix Inversion - pktaDY + ! + ------------------------------------- + + k1_tua = 1 + do k = k1_tua, mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + pktaDY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do i = ip11, mx1 + utstar = aeCdSL(i, j) * (alpha * pktaDY(i, j, mz) + beta * WKxyz7(i, j, mz) & + - pktaDY(i, j, mzz)) & + * pcap + dutsSL(i, j) = dutsSL(i, j) + SLuts(i, j) - utstar + enddo + + do k = 1, mz + do i = ip11, mx1 + pktaDY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Moisture + ! + ============================== + + ! +--Tridiag. Matrix Coeff. : qvDY + ! + ----------------------------- + + ! +--Diagonal A + ! + ~~~~~~~~~~ + k = mz + do i = ip11, mx1 + Kv__SL(i, j) = 0. + WKxyz1(i, j, k) = Kv__SL(i, j) + ! +--Diagonal B + ! + ~~~~~~~~~~ + WKxyz2(i, j, k) = 1.00 - WKxyz3(i, j, k) + enddo + + ! +--UBC of the Tridiagonal System - qvDY + ! + ------------------------------------ +#if(iso) + ! todo : check if Riso is more pertinent that qiso + ! initialize isotopic ratios + do k = 1, mz + do i = ip11, mx1 + if(qvDY(i, j, k) > negligible) then + do wiso = 1, niso + Riso(wiso, i, j, k) = qvDY_iso(wiso, i, j, k) / qvDY(i, j, k) + enddo + else + do wiso = 1, niso + Riso(wiso, i, j, k) = Rdefault(wiso) + enddo + endif + enddo + enddo +#endif + + kp = kp1(1) + do i = ip11, mx1 + WKxyz4(i, j, 1) = WKxyz1(i, j, 1) * ab * (qvDY(i, j, 1) - qvDY(i, j, kp)) + if(track_water_turabl) then + ! Compute the contribution of qv only, without surface sublimation + WTxyz4(i, j, 1) = WKxyz4(i, j, 1) + end if +#if(iso) + do wiso = 1, niso + WKxyz4_iso(wiso, i, j, 1) = WKxyz1(i, j, 1) * ab * (Riso(wiso, i, j, 1) - Riso(wiso, i, j, kp)) + enddo +#endif + enddo + + ! +--Second Member of the Tridiagonal System - qvDY + ! + ---------------------------------------------- + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz1(i, j, k) * ab * (qvDY(i, j, k) - qvDY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (qvDY(i, j, km) - qvDY(i, j, k)) + if(track_water_turabl) then + ! Compute the contribution of qv only, without surface sublimation + WTxyz4(i, j, k) = WKxyz4(i, j, k) + end if +#if(iso) + do wiso = 1, niso + WKxyz4_iso(wiso, i, j, k) = WKxyz1(i, j, k) * ab & + * (Riso(wiso, i, j, k) - Riso(wiso, i, j, kp)) & + - WKxyz3(i, j, k) * ab * (Riso(wiso, i, j, km) - Riso(wiso, i, j, k)) + enddo +#endif + enddo + ! end do + enddo + + ! +--SBC of the Tridiagonal System - qvDY + ! + ------------------------------------ + + ! do j=jp11,my1 + do i = ip11, mx1 + + ! commented because not used + !cCAiso ! +--Implicit Surface Scheme + !cCAiso ! + ~~~~~~~~~~~~~~~~~~~~~~~ + !cCAiso qvap = qvDY(i, j, mz) - SLuqs(i, j) / aeCdSL(i, j) + !cCAiso + !cCAiso ! uqstar is replaced by aeCdSL*(qvDY-qvapSL), set := 0 + !cCAiso uqstar = 0. ! explicit + + ! +--Explicit Surface Scheme + ! + ~~~~~~~~~~~~~~~~~~~~~~~ + qvap = qvapSL(i, j) + ! uqstar = SLuqs is the Moisture Turbulent Flux + ! uqstar * rhAir * dt__SV -> evaporation flux, in kg m-2 (= kg kg-1 m s-1 kg m-3 s) + ! uqstar * rhAir * dt__SV * g / dp -> g/dp = rho/dz + uqstar = SLuqs(i, j) + + ! partly explicit + WKxyz4(i, j, mz) = WKxyz1(i, j, mz) * (ab * qvDY(i, j, mz) - qvap / beta) & + - WKxyz3(i, j, mz) * ab * (qvDY(i, j, mmz1) - qvDY(i, j, mz)) & + ! u*q* all explicit + - gravit * dt_Loc * rolvDY(i, j, mz) * uqstar / (pstDY(i, j) * dsigm1(mz)) + if(track_water_turabl) then + ! Compute the contribution of qv only, without surface sublimation + WTxyz4(i, j, mz) = WKxyz1(i, j, mz) * (ab * qvDY(i, j, mz) - qvap / beta) & + - WKxyz3(i, j, mz) * ab * (qvDY(i, j, mmz1) - qvDY(i, j, mz)) + end if +#if(iso) + do wiso = 1, niso + if(qvap > negligible) then + Riso_qvap = qvapSL_iso(wiso, i, j) / qvap + else + Riso_qvap = Rdefault(wiso) + endif + if(uqstar > negligible) then + Riso_uqstar = SLuqs_iso(wiso, i, j) / uqstar + else + Riso_uqstar = Rdefault(wiso) + endif + WKxyz4_iso(wiso, i, j, mz) = WKxyz1(i, j, mz) * (ab * Riso(wiso, i, j, mz) - Riso_qvap / beta) & + - WKxyz3(i, j, mz) * ab * (Riso(wiso, i, j, mmz1) - Riso(wiso, i, j, mz)) & + ! u*q* all explicit g dt rho uq* / dp | dt rho uq* = [kg m-2] | dt rho uq* g / dp = [kg m-2] / [rho dz] + ! convertion of uqstar into qsurf in kg/kg + ! - gravit * dt_Loc * rolvDY(i, j, mz) * uqstar / (pstDY(i, j) * dsigm1(mz)) + - Riso_uqstar + enddo +#endif + enddo + ! end do + + ! +--Tridiagonal Matrix Inversion - qvDY + ! + ----------------------------------- + + k1_tua = 1 + do k = k1_tua, mz + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qvDY(i, j, k) + if(track_water_turabl) then + ! Compute the contribution of qv only, without surface sublimation + WTxyz4(i, j, k) = WTxyz4(i, j, k) + qvDY(i, j, k) + end if +#if(iso) + do wiso = 1, niso + WKxyz4_iso(wiso, i, j, k) = WKxyz4_iso(wiso, i, j, k) + Riso(wiso, i, j, k) + enddo +#endif + enddo + ! end do + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + if(track_water_turabl) then + ! Compute the contribution of qv only, without surface sublimation + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WTxyz4, WTxyz7) + end if +#if(iso) + do wiso = 1, niso + do i = 1, mx + varin_iso(i, j, :) = WKxyz4_iso(wiso, i, j, :) + enddo + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, varin_iso, varout_iso) + do i = 1, mx + WKxyz7_iso(wiso, i, j, :) = varout_iso(i, j, :) + enddo + enddo +#endif + do k = 1, mz + ! do j=jp11,my1 + do i = ip11, mx1 + if(track_water_turabl) then + ! delta_qv_mix = delta_qv without sublimation + delta_qv(i, j, k, j_turabl_mix) = delta_qv(i, j, k, j_turabl_mix) + WTxyz7(i, j, k) - qvDY(i, j, k) + ! delta_qv_tot = WKxyz7(i, j, k) - qvDY(i, j, k) + ! subl = delta_qv_tot - delta_qv_mix + delta_qv(i, j, k, j_turabl_sbl) = delta_qv(i, j, k, j_turabl_sbl) + WKxyz7(i, j, k) - WTxyz7(i, j, k) + end if +#if(iso) + do wiso = 1, niso + qvDY_iso(wiso, i, j, k) = WKxyz7_iso(wiso, i, j, k) * qvDY(i, j, k) + enddo +#endif + qvDY(i, j, k) = WKxyz7(i, j, k) + enddo + ! end do + enddo + +#if(TC) + ! +--Vertical Diffusion of gazeous Tracers + ! + ===================================== + if(dt_ODE == dtDiff) then + ! +--Second Member of the Tridiagonal System - qxTC + ! + ---------------------------------------------- + ! CAUTION: defines nterr as the Nb of terregenous aerosols (usually 0 .OR. 1) + do n = nterr + 1, ntrac + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qxTC(i, j, 1, n) + enddo + enddo + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qxTC(i, j, k, n) - qxTC(i, j, kp, n)) & + - WKxyz3(i, j, k) * ab * (qxTC(i, j, km, n) - qxTC(i, j, k, n)) + enddo + enddo + enddo + if(.not. BloMod) then + do j = jp11, my1 + do i = ip11, mx1 + uqTC(i, j, n) = -cdhSL(i, j, 1) * SLuusl(i, j, 1) & + * (qsTC(i, j, n) - qxTC(i, j, mz, n)) + enddo + enddo + endif + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, mz) = WKxyz1(i, j, mz) & + * (ab * qxTC(i, j, mz, n) - qsTC(i, j, n) / beta) & + - WKxyz3(i, j, mz) * ab * (qxTC(i, j, mmz1, n) - qxTC(i, j, mz, n)) & + + (gravit * dt_Loc & + * rolvDY(i, j, mz) / (pstDY(i, j) * (sigmid(mz) - 1.0d+0))) & + * uqTC(i, j, n) + enddo + enddo + ! +--Tridiagonal Matrix Inversion - qxTC + ! + ----------------------------------- + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qxTC(i, j, k, n) + enddo + enddo + enddo + k1_tua = 1 + k2_tua = mz + ! + ************ + call MARgz_2mx1y1(k1_tua, k2_tua) + ! + ************ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qxTC(i, j, k, n) = WKxyz7(i, j, k) + enddo + enddo + enddo + enddo + endif +#endif + +#if(EW) + ! +--Atmospheric Water Budget + ! + ======================== + do j = jp11, my1 + do i = ip11, mx1 + wat0EW(i, j) = 0.0 + do k = 1, mz + wat0EW(i, j) = wat0EW(i, j) & + + (qvDY(i, j, k) & + + qwHY(i, j, k) + qrHY(i, j, k) & + + qiHY(i, j, k) + qsHY(i, j, k)) * dsigm1(k) + enddo + wat0EW(i, j) = wat0EW(i, j) * pstDY(i, j) * grvinv + enddo + enddo +#endif + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Hydrometeors and non gazeous Tracers + ! + ========================================================== + + ! +--Parameters for the Numerical Scheme of Vertical Turbulent Transport + ! + ------------------------------------------------------------------- + + ! alpha : Expliciteness = 0 (positive definite) + alpha = 0.00 + ! beta : Impliciteness + beta = 1.00 - alpha + ab = alpha / beta + !cCA todo : add qiHY, qsHY, qwHY, qrHY + ! +--Tridiagonal Matrix Coefficients: qiHY, ccniHY, qwHY, qrHY + ! + (Turbulent Diffusion Coefficient X 3: Bintanja, 2000, BLM) --+ + ! + ----------------------------------------------------------- V + + ! +--Diagonal A + ! + ~~~~~~~~~~ + do k = mz, 1, -1 + kp = kp1(k) + + do i = ip11, mx1 + WKxyz8(i, j, k) = TUkvh(i, j, k) * r_Turb + enddo + + do i = ip11, mx1 + WKxyz1(i, j, k) = -gravi2 * beta * romiDY(i, j, k) * WKxyz8(i, j, k) & + * rolvDY(i, j, k) / (pstDY2(i, j) * dsigm1(k) * dsig_1(k)) + enddo + + ! +--Diagonal C + ! + ~~~~~~~~~~ + do i = ip11, mx1 + WKxyz3(i, j, kp) = WKxyz1(i, j, k) * dsigm1(k) / dsigm1(kp) & + / rolvDY(i, j, k) * rolvDY(i, j, kp) + enddo + + enddo + + ! +--A, B, C + ! + ~~~~~~~ + do k = 1, mz + do i = ip11, mx1 + WKxyz1(i, j, k) = WKxyz1(i, j, k) * dt_Loc + WKxyz3(i, j, k) = WKxyz3(i, j, k) * dt_Loc + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + enddo + + ! +--Vertical B.C. + ! + ~~~~~~~~~~~~~ + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz3(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 - WKxyz1(i, j, 1) + enddo + ! end do + + ! +------------------------------------------------------------------------- + + ! +--BEGIN Cloud Microphysics (qiHY, ccniHY, qwHY, qrHY) + ! + =================================================== + + if(micphy) then + ! +--Vertical Diffusion of Ice Crystals + ! + ================================== + + ! +--Second Member of the Tridiagonal System - qiHY + ! + ---------------------------------------------- + + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qiHY(i, j, 1) + enddo + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qiHY(i, j, k) - qiHY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (qiHY(i, j, km) - qiHY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * (qiHY(i, j, mz) - zero) & + - WKxyz3(i, j, mz) * ab * (qiHY(i, j, mmz1) - qiHY(i, j, mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - qiHY + ! + ----------------------------------- + + do k = kp1(1), mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qiHY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--Second Member of the Tridiagonal System - ccniHY + ! + ------------------------------------------------ + + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = ccniHY(i, j, 1) + enddo + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (ccniHY(i, j, k) - ccniHY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (ccniHY(i, j, km) - ccniHY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * (ccniHY(i, j, mz) - zero) & + - WKxyz3(i, j, mz) * ab * (ccniHY(i, j, mmz1) - ccniHY(i, j, mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - ccniHY + ! + ------------------------------------- + + do k = kp1(1), mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + ccniHY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + ccniHY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--Precipitation + ! + ------------- + + do i = ip11, mx1 + dd_sno = dt_Loc * rolvDY(i, j, mz) & + * WKxyz8(i, j, mz) * qiHY(i, j, mz) & + / (gplvDY(i, j, mz) * grvinv - sh(i, j)) + crysHY(i, j) = crysHY(i, j) + dd_sno + snohSL(i, j) = snohSL(i, j) + dd_sno + enddo + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Cloud Droplets + ! + ==================================== + + ! +--Second Member of the Tridiagonal System - qwHY + ! + ---------------------------------------------- + + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qwHY(i, j, 1) + enddo + + do k = kp1(1), mmz1 + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qwHY(i, j, k) - qwHY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (qwHY(i, j, km) - qwHY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * (qwHY(i, j, mz) - zero) & + - WKxyz3(i, j, mz) * ab * (qwHY(i, j, mmz1) - qwHY(i, j, mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - qwHY + ! + ----------------------------------- + + do k = kp1(1), mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qwHY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--Precipitation + ! + ------------- + do i = ip11, mx1 + ratio_temp = (tairDY(i, j, mz - 1) + tairDY(i, j, mz - 2) & + + tairDY(i, j, mz - 3) + tairDY(i, j, mz - 4)) / 4. + + ratio_prec = dt_Loc * rolvDY(i, j, mz) & + * WKxyz8(i, j, mz) * qwHY(i, j, mz) & + / (gplvDY(i, j, mz) * grvinv - sh(i, j)) + + ratio_rfsf = max(0., min(1.,(ratio_temp - rain_snow_limit) / 2.)) + + rainHY(i, j) = rainHY(i, j) + ratio_prec * ratio_rfsf + snowHY(i, j) = snowHY(i, j) + ratio_prec * (1.-ratio_rfsf) + enddo + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of Rain Drops + ! + ================================ + + ! +--Second Member of the Tridiagonal System - qrHY + ! + ---------------------------------------------- + + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qrHY(i, j, 1) + enddo + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qrHY(i, j, k) - qrHY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (qrHY(i, j, km) - qrHY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) * ab * (qrHY(i, j, mz) - zero) & + - WKxyz3(i, j, mz) * ab * (qrHY(i, j, mmz1) - qrHY(i, j, mz)) + enddo + + ! +--Tridiagonal Matrix Inversion - qrHY + ! + ----------------------------------- + + do k = kp1(1), mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qrHY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + qrHY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--Precipitation + ! + ------------- + + do i = ip11, mx1 + ratio_temp = (tairDY(i, j, mz - 1) + tairDY(i, j, mz - 2) & + + tairDY(i, j, mz - 3) + tairDY(i, j, mz - 4)) / 4. + ratio_prec = dt_Loc * rolvDY(i, j, mz) & + * WKxyz8(i, j, mz) * qrHY(i, j, mz) & + / (gplvDY(i, j, mz) * grvinv - sh(i, j)) + + ratio_rfsf = max(0., min(1.,(ratio_temp - rain_snow_limit) / 2.)) + + rainHY(i, j) = rainHY(i, j) + ratio_prec * ratio_rfsf + snowHY(i, j) = snowHY(i, j) + ratio_prec * (1.-ratio_rfsf) + enddo + + ! +--END Cloud Microphysics (qiHY, ccniHY, qwHY, qrHY) + ! + =================================================== + + endif + + ! +------------------------------------------------------------------------- + + ! +--Vertical Diffusion of (Terrigeneous) Hydrometeors and Tracers + ! + ============================================================= + + ! +--Tridiagonal Matrix Coefficients: Modifications for qsHY, qxTC + ! + ------------------------------------------------------------- + + ! +--Diagonal A + ! + ~~~~~~~~~~ + k = mz + do i = ip11, mx1 + WKxyz1(i, j, k) = 0. + enddo + + ! +--A, B, C + ! + ~~~~~~~ + k = mz + do i = ip11, mx1 + WKxyz1(i, j, k) = WKxyz1(i, j, k) * dt_Loc + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + + ! +------------------------------------------------------------------------- + + ! +--BEGIN Cloud Microphysics (qsHY) + ! + =============================== + + if(micphy) then + + ! +--Vertical Diffusion of Snow Flakes + ! + ================================= + + ! +--Second Member of the Tridiagonal System - qsHY + ! + ---------------------------------------------- + + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qsHY(i, j, 1) + enddo + + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qsHY(i, j, k) - qsHY(i, j, kp)) & + - WKxyz3(i, j, k) * ab * (qsHY(i, j, km) - qsHY(i, j, k)) + enddo + enddo + + do i = ip11, mx1 + ussno = uss_HY(i, j) + WKxyz4(i, j, mz) = & + WKxyz1(i, j, mz) & + * (ab * qsHY(i, j, mz) - qsrfHY(i, j) / beta) & + - WKxyz3(i, j, mz) * ab * (qsHY(i, j, mmz1) - qsHY(i, j, mz)) & + + (gravit * dt_Loc * rolvDY(i, j, mz) & + / (pstDY(i, j) * (sigmid(mz) - 1.0))) & + * ussno + enddo + + ! +--Tridiagonal Matrix Inversion - qsHY + ! + ----------------------------------- + + do k = kp1(1), mz + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qsHY(i, j, k) + enddo + enddo + + k1_tua = 1 + k2_tua = mz + + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mz + do i = ip11, mx1 + qsHY(i, j, k) = WKxyz7(i, j, k) + enddo + enddo + + ! +--END Cloud Microphysics (qsHY) + ! + =============================== + + endif + + ! +------------------------------------------------------------------------- + +#if(TC) + ! +--Vertical Diffusion of non gazeous Tracers + ! + ========================================= + if(dt_ODE == dtDiff .and. nterr > 0) then + ! +--Second Member of the Tridiagonal System - qxTC + ! + ---------------------------------------------- + do n = 1, nterr + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = qxTC(i, j, 1, n) + enddo + enddo + do k = kp1(1), mmz1 + kp = kp1(k) + km = km1(k) + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (qxTC(i, j, k, n) - qxTC(i, j, kp, n)) & + - WKxyz3(i, j, k) * ab * (qxTC(i, j, km, n) - qxTC(i, j, k, n)) + enddo + enddo + enddo + if(.not. BloMod) then + do j = jp11, my1 + do i = ip11, mx1 + uqTC(i, j, n) = -cdhSL(i, j, 1) * SLuusl(i, j, 1) & + * (qsTC(i, j, n) - qxTC(i, j, mz, n)) + enddo + enddo + endif + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, mz) = WKxyz1(i, j, mz) & + * (ab * qxTC(i, j, mz, n) - qsTC(i, j, n) / beta) & + - WKxyz3(i, j, mz) * ab * (qxTC(i, j, mmz1, n) - qxTC(i, j, mz, n)) & + + (gravit * dt_Loc & + * rolvDY(i, j, mz) / (pstDY(i, j) * (sigmid(mz) - 1.0d+0))) & + * uqTC(i, j, n) + enddo + enddo + ! +--Tridiagonal Matrix Inversion - qxTC + ! + ----------------------------------- + do k = kp1(1), mz + do j = jp11, my1 + do i = ip11, mx1 + WKxyz4(i, j, k) = WKxyz4(i, j, k) + qxTC(i, j, k, n) + enddo + enddo + enddo + k1_tua = 1 + k2_tua = mz + ! + ************ + call MARgz_2mx1y1_mp(k1_tua, k2_tua, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qxTC(i, j, k, n) = WKxyz7(i, j, k) + enddo + enddo + enddo + enddo + endif +#endif + +#if(EW) + ! +--Atmospheric Water Budget + ! + ======================== + do i = ip11, mx1 + do j = jp11, my1 + wat1EW(i, j) = 0.00 + do k = 1, mz + wat1EW(i, j) = wat1EW(i, j) & + + (qvDY(i, j, k) & + + qwHY(i, j, k) + qrHY(i, j, k) & + + qiHY(i, j, k) + qsHY(i, j, k)) * dsigm1(k) + enddo + wat1EW(i, j) = wat1EW(i, j) * pstDY(i, j) * grvinv + watfEW(i, j) = -(uss_HY(i, j) + SLuqs(i, j)) & + * dt_Loc * rolvDY(i, j, mz) + enddo + enddo + ! +--Atmospheric Water Budget: Output + ! + ================================ + ! + + waterb = wat1EW(imez, jmez) & + - wat0EW(imez, jmez) - watfEW(imez, jmez) + write(6, 606) jdaMAR, jhaMAR, jmmMAR, & + 1.d3 * wat0EW(imez, jmez), 1.d3 * wat1EW(imez, jmez), & + 1.d3 * watfEW(imez, jmez), & + 1.d3 * waterb +606 format(3i3, ' Before vDif: ', 12x, ' W0 = ', f9.6, & + /, 9x, ' After vDif: ', 12x, ' W1 = ', f9.6, & + ' W Flux =', f9.6, & + ' Div(W) =', e9.3) +#endif + + ! +--Work Arrays Reset + ! + ================= + + do k = 1, mz + ! do j=jp11,my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = 0.00 + WKxyz2(i, j, k) = 0.00 + WKxyz3(i, j, k) = 0.00 + WKxyz4(i, j, k) = 0.00 + WKxyz5(i, j, k) = 0.00 + WKxyz6(i, j, k) = 0.00 + WKxyz7(i, j, k) = 0.00 + enddo + ! end do + enddo + + ! do j=jp11,my1 + do i = ip11, mx1 + WKxy1(i, j) = 0.00 + enddo + enddo + !$OMP END PARALLEL DO + + return +endsubroutine TURabl diff --git a/MAR/code_mar/turhor_dyn.f90 b/MAR/code_mar/turhor_dyn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..171c88abfc68fa4ebcd92e0b921cc5339e71012c --- /dev/null +++ b/MAR/code_mar/turhor_dyn.f90 @@ -0,0 +1,697 @@ +#include "MAR_pp.def" +subroutine turhor_dyn(dtHDif) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE HORIZONTAL Sat 08-09-2017 MAR | + ! | subroutine turhor_dyn computes Horizontal Diffusion | + ! | and Correction Terms | + ! | using an Explicit Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: dt_Loc: Time Step between two CaLLs of Horiz. Diffusion Routine | + ! | ^^^^^ dtHDif: Time Step between two run of Horiz. Diffusion Scheme | + ! | (dt_Loc = n X dtHDif, n = 1,2,...) | + ! | micphy: Cloud Microphysical Scheme Switch | + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ TUkhx(mx,my,mz): Horizontal Diffusion Coefficient (x-Direction) | + ! | TUkhy(mx,my,mz): Horizontal Diffusion Coefficient (y-Direction) | + ! | | + ! | INPUT / OUTPUT | + ! | ^^^^^^^^^^^^^^ | + ! | The Horizontal Diffusion and Correction Terms are included for : | + ! | 1) The Horizontal x-Wind Component uairDY(mx,my,mz) [m/s] | + ! | 2) The Horizontal y-Wind Component vairDY(mx,my,mz) [m/s] | + ! | | + ! | #NH 3) The Vertical z-Wind Component wairNH(mx,my,mz) [m/s] | + ! | | + ! | 4) The Potential Temperature pktaDY(mx,my,mzz) | + ! | 5) The Air Specific Humidity qvDY(mx,my,mz) [kg/kg] | + ! | | + ! | #HY 6) The Ice Crystals Concentration qiHY(mx,my,mz) [kg/kg] | + ! | 7) The Ice Crystals Number ccniHY(mx,my,mz) [Nb/m3] | + ! | 8) The Cloud Droplets Concentration qwHY(mx,my,mz) [kg/kg] | + ! | 9) The Snow Flakes Concentration qsHY(mx,my,mz) [kg/kg] | + ! | 10) The Rain Drops Concentration qrHY(mx,my,mz) [kg/kg] | + ! | | + ! | #TC 11) The Tracer Concentration qxTC(mx,my,mz,ntrac) | + ! | | + ! | REMARK: | + ! | ^^^^^^^ | + ! | !. `Standard' Horizontal Diffusion is performed on Sigma Surfaces | + ! | !. Smagorinski Relation (see Tag et al. 1979, JAM 18, 1429--1441) | + ! | !. CAUTION: Horizontal Diffusion is switched on with turhor = .true. | + ! | | + ! +------------------------------------------------------------------------+ + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_tu + use mar_fi + use mar_hy + use mar_wk +#if(TC) + use mar_tc +#endif +#if(NH) + use mar_nh +#endif +#if(iso) + use mariso, only: niso, wiso, qvDY_iso, Rdefault, negligible +#endif + + implicit none + +#if(iso) + logical :: is_iso + real :: WKxyz1_iso(niso, mx, my, mz) + real :: WKxyz5_iso(niso, mx, my, mz) +#endif + + real dtHDif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer nntrac, ntDifH, iter, n_kq, ivar, itrac + real akhsta, akhloc, cflakh, dx2inv, gdx2 + real facxx, facxy, facyy, alph2, beta2, akhm2, alph22, beta22 + + real vartop(mx, my), varbot(mx, my) + + ! +--DATA + ! + ==== + + data nntrac/0/ +#if(TC) + nntrac = ntrac +#endif + + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 +#if(iso) + ! initialize working variable for isotopes + do wiso = 1, niso + WKxyz1_iso(wiso, i, j, k) = 0. + WKxyz5_iso(wiso, i, j, k) = 0. + enddo +#endif + enddo + enddo + enddo + +#if(iso) + is_iso = .false. +#endif + + ! +--Update of Local Variables and + ! + Mesh Averaged Horizontal Diffusion Coefficient akhm + ! + ============================================================= + + akhsta = 0.0 + do k = 1, mz + + do i = ip11, mx1 + do j = jp11, my1 + WKxyz1(i, j, k) = FIkhmn + 0.25 * (TUkhx(i, j, k) + TUkhx(im1(i), j, k)) + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + WKxyz1(i, j, k) = WKxyz1(i, j, k) + 0.25 * (TUkhy(i, j, k) + TUkhy(i, jm1(j), k)) + akhsta = max(WKxyz1(i, j, k), akhsta) + enddo + enddo + + enddo + + ! +--Local Time step + ! + =============== + + cflakh = dt_Loc * akhsta / dx / dx + ntDifH = 3 * cflakh + ntDifH = max(iun, ntDifH) + dtHDif = dt_Loc / ntDifH + + ! +--Update of Local Coefficients + ! + ============================ + + dx2inv = 1.0 / dx / dx + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = dx2inv / pstDY(i, j) + WKxy4(i, j) = 1.0 / (pstDY(i, j) * pstDY(i, j)) + enddo + enddo + + do i = 1, mx1 + do j = 1, my + WKxy1(i, j) = 0.5 * (pstDY(i, j) + pstDY(ip1(i), j)) + enddo + enddo + + if(mmy > 1) then + do j = 1, my1 + do i = 1, mx + WKxy2(i, j) = 0.5 * (pstDY(i, j) + pstDY(i, jp1(j))) + enddo + enddo + endif + + gdx2 = 0.5 * gravit / dx + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz3(i, j, k) = gdx2 / (pstDY(i, j) * dsig_2(k)) + enddo + enddo + enddo + + do j = 1, my + do i = 1, mx + WKxy4(i, j) = 0.0 + enddo + enddo + + ! +--Global Variables Loop + ! + ===================== + + n_kq = 5 ! Nombre de variables à diffuser: u,v,(w),T,q + + !$OMP PARALLEL DO private (i,j,k) firstprivate(iter,ivar) + do k = 1, mz + do iter = 1, ntDifH + do ivar = 1, n_kq +#if(TC) + if(ivar > 10) go to 341 +#endif + + go to(331, 332, 333, 334, 335, 336, 337, 338, 339, 340) ivar + + ! +--u Wind Speed Component + ! + ---------------------- + +331 continue + + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = uairDY(i, j, k) + enddo + enddo + + go to 330 + + ! +--v Wind Speed Component + ! + ---------------------- + +332 continue + + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = vairDY(i, j, k) + enddo + enddo + + go to 330 + +333 continue + ! +--w Wind Speed Component (Non Hydrostatic Option) + ! + ----------------------------------------------- +#if(NH) + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = wairNH(i, j, k) + enddo + enddo + enddo + do j = 1, my + do i = 1, mx + vartop(i, j) = wairNH(i, j, 1) + varbot(i, j) = wairNH(i, j, mz) + enddo + enddo +#endif + go to 330 + + ! +--Potential Temperature + ! + --------------------- + +334 continue + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = pktaDY(i, j, k) + enddo + enddo + ! end do + + go to 330 + + ! +--Specific Humidity + ! + ----------------- + +335 continue +#if(iso) + is_iso = .true. +#endif + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qvDY(i, j, k) +#if(iso) + ! turbulent advection of isotopic ratio + if(qvDY(i, j, k) > negligible) then + do wiso = 1, niso + WKxyz1_iso(wiso, i, j, k) = qvDY_iso(wiso, i, j, k) / qvDY(i, j, k) + enddo + else + WKxyz1_iso(wiso, i, j, k) = Rdefault(wiso) + endif +#endif + enddo + enddo + ! end do + + go to 330 + + ! +--Cloud Droplets Concentration + ! + ---------------------------- + +336 continue + + if(micphy) then + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qwHY(i, j, k) + enddo + enddo + ! end do + + endif + + go to 330 + + ! +--Ice Crystals Concentration + ! + -------------------------- + +337 continue + + if(micphy) then + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qiHY(i, j, k) + enddo + enddo + ! end do + endif + + go to 330 + + ! +--Rain Drops Concentration + ! + ------------------------ + +338 continue + + if(micphy) then + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qrHY(i, j, k) + enddo + enddo + ! end do + endif + + go to 330 + + ! +--Snow Flakes Concentration + ! + ------------------------- + +339 continue + + if(micphy) then + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qsHY(i, j, k) + enddo + enddo + ! end do + + endif + + go to 330 + + ! +--Ice Crystals Number + ! + ------------------- + +340 continue + + if(micphy) then + + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = ccniHY(i, j, k) + enddo + enddo + ! end do + + endif + + go to 330 + +#if(TC) + ! +--Tracers + ! + ------- + +341 continue + itrac = ivar - 10 + do k = 1, mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = qxTC(i, j, k, itrac) + enddo + enddo + enddo + do j = 1, my + do i = 1, mx + vartop(i, j) = qxTC(i, j, 1, itrac) + varbot(i, j) = qsTC(i, j, itrac) + enddo + enddo +#endif + go to 330 + +330 continue + + ! +--Boundary Conditions + ! + =================== + ! do k=1,mz + do j = 1, my + WKxyz1(1, j, k) = WKxyz1(ip11, j, k) + WKxyz1(mx, j, k) = WKxyz1(mx1, j, k) +#if(iso) + if(is_iso) then + do wiso = 1, niso + WKxyz1_iso(wiso, 1, j, k) = WKxyz1_iso(wiso, ip11, j, k) + WKxyz1_iso(wiso, mx, j, k) = WKxyz1_iso(wiso, mx1, j, k) + enddo + endif +#endif + enddo + ! end do + + if(mmy > 1) then + ! do k=1,mz + do i = 1, mx + WKxyz1(i, 1, k) = WKxyz1(i, jp11, k) + WKxyz1(i, my, k) = WKxyz1(i, my1, k) +#if(iso) + if(is_iso) then + do wiso = 1, niso + WKxyz1_iso(wiso, i, 1, k) = WKxyz1_iso(wiso, i, jp11, k) + WKxyz1_iso(wiso, i, my, k) = WKxyz1_iso(wiso, i, my1, k) + enddo + endif +#endif + enddo + ! end do + endif + + ! +--Lateral Diffusion of non Vectorial Model Variables (c #DF ON) + ! + Lateral Diffusion of all Model Variables (c #DF OFF) + ! + (proportional to the gradient, terms in sigma surfaces) + ! + ============================================================== + + ! +--Diffusion in the x Direction on Sigma Surfaces + ! + ---------------------------------------------- + + do i = ip11, mx1 + do j = 1, my + WKxyz5(i, j, k) = WKxy3(i, j) * & + (WKxy1(i, j) * TUkhx(i, j, k) & + * (WKxyz1(ip1(i), j, k) - WKxyz1(i, j, k)) & + - WKxy1(im1(i), j) * TUkhx(im1(i), j, k) & + * (WKxyz1(i, j, k) - WKxyz1(im1(i), j, k))) +#if(iso) + if(is_iso) then + do wiso = 1, niso + WKxyz5_iso(wiso, i, j, k) = WKxy3(i, j) * & + (WKxy1(i, j) * TUkhx(i, j, k) & + * (WKxyz1_iso(wiso, ip1(i), j, k) - WKxyz1_iso(wiso, i, j, k)) & + - WKxy1(im1(i), j) * TUkhx(im1(i), j, k) & + * (WKxyz1_iso(wiso, i, j, k) - WKxyz1_iso(wiso, im1(i), j, k))) + enddo + endif +#endif + enddo + enddo + !XF end do + + ! +--Diffusion in the y Direction on Sigma Surfaces + ! + ---------------------------------------------- + + if(mmy > 2) then + !XF do k=1,mz + do j = jp11, my1 + do i = 1, mx + WKxyz5(i, j, k) = WKxyz5(i, j, k) + WKxy3(i, j) * & + (WKxy2(i, j) * TUkhy(i, j, k) & + * (WKxyz1(i, jp1(j), k) - WKxyz1(i, j, k)) & + - WKxy2(i, jm1(j)) * TUkhy(i, jm1(j), k) & + * (WKxyz1(i, j, k) - WKxyz1(i, jm1(j), k))) +#if(iso) + if(is_iso) then + do wiso = 1, niso + WKxyz5_iso(wiso, i, j, k) = WKxyz5_iso(wiso, i, j, k) + WKxy3(i, j) * & + (WKxy2(i, j) * TUkhy(i, j, k) & + * (WKxyz1_iso(wiso, i, jp1(j), k) - WKxyz1_iso(wiso, i, j, k)) & + - WKxy2(i, jm1(j)) * TUkhy(i, jm1(j), k) & + * (WKxyz1_iso(wiso, i, j, k) - WKxyz1_iso(wiso, i, jm1(j), k))) + enddo + endif +#endif + enddo + enddo + !XF end do + endif + + ! +--Update of the Global Variables + ! + ============================== +#if(TC) + if(ivar > 10) go to 411 +#endif + + go to(401, 402, 403, 404, 405, 406, 407, 408, 409, 410) ivar + + ! +--u Wind Speed Component + ! + ---------------------- + +401 continue + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + uairDY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + go to 400 + + ! +--v Wind Speed Component + ! + ---------------------- + +402 continue + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + vairDY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + go to 400 + +403 continue + ! +--w Wind Speed Component (Non Hydrostatic Option) + ! + ----------------------------------------------- +#if(NH) + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + wairNH(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + enddo +#endif + go to 400 + + ! +--Potential Temperature + ! + --------------------- + +404 continue + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + pktaDY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + go to 400 + + ! +-- Specific Humidity + ! + ----------------- + +405 continue + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + qvDY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif +#if(iso) + ! restoration of mass from turbulent diffusion of isotopic ratio + do wiso = 1, niso + qvDY_iso(wiso, i, j, k) = (WKxyz1_iso(wiso, i, j, k) + WKxyz5_iso(wiso, i, j, k) * dtHDif) & + * qvDY(i, j, k) + enddo +#endif + enddo + enddo +#if(iso) + is_iso = .false. +#endif + ! end do + go to 400 + + ! +--Cloud Droplets Concentration + ! + ---------------------------- + +406 continue + if(micphy) then + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + qwHY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + endif + go to 400 + + ! +--Ice Crystals Concentration + ! + -------------------------- + +407 continue + if(micphy) then + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + qiHY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + endif + go to 400 + + ! +--Rain Drops Concentration + ! + ------------------------ + +408 continue + if(micphy) then + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + qrHY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + endif + go to 400 + + ! +--Snow Flakes Concentration + ! + ------------------------- + +409 continue + if(micphy) then + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + qsHY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + endif + go to 400 + + ! +--Ice Crystals Number + ! + ------------------- + +410 continue + if(micphy) then + ! do k=1,mz + do j = jp11, my1 + do i = ip11, mx1 + ccniHY(i, j, k) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + ! end do + endif + go to 400 + + ! +--Tracers + ! + ------- +411 continue +#if(TC) + itrac = ivar - 10 + do k = 1, mz + do j = jp11, my1 + do i = ip11, mx1 + qxTC(i, j, k, itrac) = WKxyz1(i, j, k) + WKxyz5(i, j, k) * dtHDif + enddo + enddo + enddo +#endif +400 continue + enddo ! ivar = 1, n_kq + enddo ! iter = 1, ntDifH + ! +--Work Arrays Reset + ! + ================= + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.00 + WKxyz2(i, j, k) = 0.00 + WKxyz3(i, j, k) = 0.00 + WKxyz4(i, j, k) = 0.00 + WKxyz5(i, j, k) = 0.00 + enddo + enddo + enddo ! k = 1, mz + !$OMP END PARALLEL DO + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.00 + WKxy2(i, j) = 0.00 + WKxy3(i, j) = 0.00 + WKxy4(i, j) = 0.00 + enddo + enddo + + return +endsubroutine turhor_dyn diff --git a/MAR/code_mar/turhor_kh.f90 b/MAR/code_mar/turhor_kh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8e71cce8efdf18dfc8daffcd71789c49bbaca860 --- /dev/null +++ b/MAR/code_mar/turhor_kh.f90 @@ -0,0 +1,240 @@ +#include "MAR_pp.def" +subroutine turhor_kh + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE HORIZONTAL 08-04-2021 MAR | + ! | subroutine turhor_kh computes the Horizontal Diffusion Coefficient | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT (via common block) | + ! | ^^^^^ uairDY(i,j,k): Horizontal Wind Speed (x-Direction) (m/s) | + ! | vairDY(i,j,k): Horizontal Wind Speed (y-Direction) (m/s) | + ! | | + ! | OUTPUT (via common block) | + ! | ^^^^^^ TUkhx(i,j,k): Horizont.Diff.Coefficient (i+1/2,j,k) (m2/s) | + ! | TUkhy(i,j,k): Horizont.Diff.Coefficient (i,j+1/2,k) (m2/s) | + ! | | + ! | REFER.: Tag et al., JAM 18, 1429--1441, 1979 | + ! | ^^^^^^^ | + ! +------------------------------------------------------------------------+ + use marphy + use mardim + use margrd + use mar_dy + use mar_tu + use mar_wk + + implicit none + + integer i, j, k, m + + ! +--Reset of the Horizontal Diffusion Coefficient + ! + ============================================= + + ! +--2D Model Version + ! + ================ + + if(mmy == 1) then + + do k = 1, mz + do j = 1, my + do i = 1, mx + TUkhx(i, j, k) = 0.0 + TUkhy(i, j, k) = 0.0 + enddo + enddo + enddo + + j = 1 + do k = 1, mz + do i = 1, mx + WKxza(i, k) = uairDY(ip1(i), j, k) - uairDY(i, j, k) + WKxzb(i, k) = vairDY(ip1(i), j, k) - vairDY(i, j, k) + enddo + enddo + + do k = 1, mz + do i = 1, mx + TUkhx(i, j, k) = TUkhff * dxy3(i, j) & + * (sqrt(0.5 * (WKxzb(i, k) * WKxzb(i, k)) & + + WKxza(i, k) * WKxza(i, k))) + WKxza(i, k) = 0.0 + WKxzb(i, k) = 0.0 + enddo + TUkhx(mx, j, k) = 0.0 + enddo + + ! +--Upper Absorbing Layer + ! + --------------------- + + if(TUkhmx > 0.0) then + do k = 1, mzabso + do j = 1, my + do i = 1, mx + TUkhx(i, j, k) = TUkhx(i, j, k) + TUspon(k) + enddo + enddo + enddo + endif + + ! +--3D Model Version + ! + ================ + + else + + !$OMP PARALLEL do private(i,j,k) + do k = 1, mz + + do j = 1, my + do i = 1, mx + TUkhx(i, j, k) = 0.0 + TUkhy(i, j, k) = 0.0 + enddo + enddo + + ! +--x Direction + ! + ----------- + + do i = 1, mx + do j = jp11, my1 + WKxyz1(i, j, k) = & + vairDY(ip1(i), j, k) - vairDY(i, j, k) + WKxyz3(i, j, k) = & + uairDY(ip1(i), j, k) - uairDY(i, j, k) + enddo + enddo + + do j = jp11, my1 + do i = 1, mx + WKxyz2(i, j, k) = & + uairDY(i, jp1(j), k) - uairDY(i, jm1(j), k) + WKxyz4(i, j, k) = & + vairDY(i, jp1(j), k) - vairDY(i, jm1(j), k) + WKxyz5(i, j, k) = & + vairDY(i, jp1(j), k) + WKxyz6(i, j, k) = & + vairDY(i, jm1(j), k) + enddo + enddo + + do i = 1, mx + do j = jp11, my1 + TUkhx(i, j, k) = TUkhff * dxy3(i, j) * (sqrt( & + 0.5 * ((WKxyz1(i, j, k) & + + 0.5 * (WKxyz2(i, j, k)))**2) & + + (WKxyz3(i, j, k))**2 & + + (0.25 * (WKxyz4(i, j, k) & + + WKxyz5(ip1(i), j, k) & + - WKxyz6(ip1(i), j, k)))**2)) + + ! The 3 previous Loops Stand for the following non-vectorized Loop: + ! TUkhx(i,j,k) = TUkhff * dxy3(i, j) *(sqrt( & + ! 0.5*((vairDY(ip1(i), j ,k)-vairDY(i, j ,k) & + ! + 0.5* (uairDY(i ,jp1(j),k)-uairDY(i,jm1(j),k)))**2) & + ! + (uairDY(ip1(i), j ,k)-uairDY(i, j ,k)) **2 & + ! +(0.25*(vairDY(i ,jp1(j),k)-vairDY(i,jm1(j),k) & + ! +vairDY(ip1(i),jp1(j),k) & + ! -vairDY(ip1(i),jm1(j),k)))**2)) + enddo + enddo + + ! +--y Direction + ! + ----------- + + do j = 1, my + do i = ip11, mx1 + WKxyz1(i, j, k) = & + vairDY(i, jp1(j), k) - vairDY(i, j, k) + WKxyz3(i, j, k) = & + uairDY(i, jp1(j), k) - uairDY(i, j, k) + enddo + enddo + + do i = ip11, mx1 + do j = 1, my + WKxyz2(i, j, k) = & + uairDY(ip1(i), j, k) - uairDY(im1(i), j, k) + WKxyz4(i, j, k) = & + vairDY(ip1(i), j, k) - vairDY(im1(i), j, k) + WKxyz5(i, j, k) = & + vairDY(ip1(i), j, k) + WKxyz6(i, j, k) = & + vairDY(im1(i), j, k) + enddo + enddo + + do j = 1, my + do i = ip11, mx1 + TUkhy(i, j, k) = TUkhff * dxy3(i, j) * (sqrt( & + 0.5 * ((WKxyz1(i, j, k) & + + 0.5 * (WKxyz2(i, j, k)))**2) & + + (WKxyz3(i, j, k))**2 & + + (0.25 * (WKxyz4(i, j, k) & + + WKxyz5(i, jp1(j), k) & + - WKxyz6(i, jp1(j), k)))**2)) + + ! The 3 previous Loops Stand for the following non-vectorized Loop: + ! TUkhy(i,j,k) = TUkhff * dxy3(i, j) *(sqrt( & + ! 0.5*((vairDY( i ,jp1(j),k)-vairDY( i ,j,k) & + ! + 0.5* (uairDY(ip1(i), j ,k)-uairDY(im1(i),j,k)))**2) & + ! + (uairDY( i ,jp1(j),k)-uairDY( i ,j,k)) **2 & + ! +(0.25*(vairDY(ip1(i), j ,k)-vairDY(im1(i),j,k) & + ! +vairDY(ip1(i),jp1(j),k) & + ! -vairDY(im1(i),jp1(j),k)))**2)) + enddo + enddo + + do i = 1, mx + do j = jp11, my1 + WKxyz1(i, j, k) = 0. + WKxyz2(i, j, k) = 0. + WKxyz3(i, j, k) = 0. + WKxyz4(i, j, k) = 0. + WKxyz5(i, j, k) = 0. + WKxyz6(i, j, k) = 0. + enddo + enddo + + ! +--Upper Absorbing Layer + ! + --------------------- + + if(k <= mzabso .and. TUkhmx > 0.0) then + + do j = 1, my + do i = 1, mx + TUkhx(i, j, k) = TUkhx(i, j, k) + TUspon(k) + TUkhy(i, j, k) = TUkhy(i, j, k) + TUspon(k) + enddo + enddo + endif + enddo + !$OMP END PARALLEL DO + + endif + +#if(OB) + ! +--Lateral Boundary Values + ! + ----------------------- + if(mmx > 1) then + do k = 1, mz + do j = 1, my + TUkhx(1, j, k) = 0.0 + TUkhx(mx, j, k) = 0.0 + TUkhy(1, j, k) = 0.0 + TUkhy(mx, j, k) = 0.0 + enddo + enddo + endif + if(mmy > 1) then + do k = 1, mz + do i = 1, mx + TUkhx(i, 1, k) = 0.0 + TUkhx(i, my, k) = 0.0 + TUkhy(i, 1, k) = 0.0 + TUkhy(i, my, k) = 0.0 + enddo + enddo + endif +#endif + return +end diff --git a/MAR/code_mar/turtke_advh.f90 b/MAR/code_mar/turtke_advh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6da0aa86f51ccf960458397d81dd67ac827d09a3 --- /dev/null +++ b/MAR/code_mar/turtke_advh.f90 @@ -0,0 +1,122 @@ +subroutine turtke_advh(dt_dif) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (TKE) 15-04-2021 MAR | + ! | subroutine turtke_advh includes TKE Horizontal Advection Contribution| + ! | solved by a 1st Order Accurate in Space Upstream Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT : dt_dif: Local Time Step (s) | + ! | ^^^^^^^^^^^^^^ | + ! | | + ! | INPUT / OUTPUT: The Vertical Turbulent Fluxes are included for: | + ! | ^^^^^^^^^^^^^^ | + ! | a) Turbulent Kinetic Energy ect_TE(mx,my,mz) [m2/s2] | + ! | b) Turbulent Kinetic Energy Dissipation eps_TE(mx,my,mz) [m2/s3] | + ! | | + ! | REMARK : The Advected Variables Lateral Boundary Conditions | + ! | ^^^^^^^^ are Fixed Implicitely | + ! | 1) inflow => no change | + ! | 2) outflow => advected Value | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_dy + use mar_te + use mar_wk + + implicit none + + ! +--Global Variables + ! + ================ + real dt_dif + + ! +--Local Variables + ! + ================ + integer i, j, k, m + real dti, dtxe(mx, my), dtye(mx, my), tran + + ! +--Parameters + ! + ========== + dti = 1.0 / dt_dif + do j = 1, my + do i = 1, mx + dtxe(i, j) = dt_dif / dx3(i, j) + dtye(i, j) = dt_dif / dy3(i, j) + enddo + enddo + + ! +--Courant Number + ! + ============== + !$OMP PARALLEL do private (i,j,k,tran) + do k = 1, mmz1 + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = -max(zero, demi * (uairDY(i, j, k) + uairDY(i, j, kp1(k)))) & + * dtxe(i, j) + WKxyz2(i, j, k) = -min(zero, demi * (uairDY(i, j, k) + uairDY(i, j, kp1(k)))) & + * dtxe(i, j) + WKxyz3(i, j, k) = -max(zero, demi * (vairDY(i, j, k) + vairDY(i, j, kp1(k)))) & + * dtye(i, j) + WKxyz4(i, j, k) = -min(zero, demi * (vairDY(i, j, k) + vairDY(i, j, kp1(k)))) & + * dtye(i, j) + ! +...Velocities V are computed in the layers (i.e. at k+1/2) + ! + Interpolation based on V=0 at the Surface (very approximative) + + enddo + enddo + ! end do + + ! +--Advection (x-Direction) + ! + ======================= + ! do k=1,mmz1 + do i = ip11, mx1 + do j = jp11, my1 + tran = WKxyz1(i, j, k) * (ect_TE(i, j, k) - ect_TE(im1(i), j, k)) & + + WKxyz2(i, j, k) * (ect_TE(ip1(i), j, k) - ect_TE(i, j, k)) + tranTE(i, j, k) = tranTE(i, j, k) + tran * dti + ect_TE(i, j, k) = ect_TE(i, j, k) + tran + eps_TE(i, j, k) = eps_TE(i, j, k) & + + WKxyz1(i, j, k) * (eps_TE(i, j, k) - eps_TE(im1(i), j, k)) & + + WKxyz2(i, j, k) * (eps_TE(ip1(i), j, k) - eps_TE(i, j, k)) + enddo + enddo + ! end do + + ! +--Advection (y-Direction) + ! + ======================= + if(mmy > 1) then + ! do k=1,mmz1 + do j = jp11, my1 + do i = ip11, mx1 + tran = WKxyz3(i, j, k) * (ect_TE(i, j, k) - ect_TE(i, jm1(j), k)) & + + WKxyz4(i, j, k) * (ect_TE(i, jp1(j), k) - ect_TE(i, j, k)) + tranTE(i, j, k) = tranTE(i, j, k) + tran * dti + ect_TE(i, j, k) = ect_TE(i, j, k) + tran + eps_TE(i, j, k) = eps_TE(i, j, k) & + + WKxyz3(i, j, k) * (eps_TE(i, j, k) - eps_TE(i, jm1(j), k)) & + + WKxyz4(i, j, k) * (eps_TE(i, jp1(j), k) - eps_TE(i, j, k)) + enddo + enddo + ! end do + endif + + ! +--Work Arrays Reset + ! + ================= + ! do k=1,mz + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +endsubroutine turtke_advh diff --git a/MAR/code_mar/turtke_advv.f90 b/MAR/code_mar/turtke_advv.f90 new file mode 100644 index 0000000000000000000000000000000000000000..abdcb6bdc48b15d14be91de0820303cac1d4fe90 --- /dev/null +++ b/MAR/code_mar/turtke_advv.f90 @@ -0,0 +1,125 @@ +subroutine turtke_advv(dt_dif) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (TKE) 14-09-2001 MAR | + ! | subroutine turtke_advv includes TKE Vertical Advection Contribution | + ! | solved by a 1st Order Accurate in Space Upstream Scheme | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT / OUTPUT: The Vertical Turbulent Fluxes are included for: | + ! | ^^^^^^^^^^^^^^ | + ! | a) Turbulent Kinetic Energy ect_TE(mx,my,mz) [m2/s2] | + ! | b) Turbulent Kinetic Energy Dissipation eps_TE(mx,my,mz) [m2/s3] | + ! | | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_dy + use mar_te + use mar_wk + + implicit none + + ! +--Global Variables + ! + ================ + + real dt_dif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + real tran + + ! +--Vertical Courant Number + ! + ======================= + + !$OMP PARALLEL do private(i,j,k,tran) + do j = 1, my + + if(staggr) then + do k = 1, mmz1 + ! do j=1,my + do i = 1, mx + WKxyz3(i, j, k) = psigDY(i, j, k) + enddo + ! end do + enddo + else + do k = 1, mmz1 + ! do j=1,my + do i = 1, mx + WKxyz3(i, j, k) = 0.50 * (psigDY(i, j, kp1(k)) + psigDY(i, j, k)) + enddo + ! end do + enddo + endif + + do k = 1, mmz1 + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, k) = -max(zero, WKxyz3(i, j, k)) & + * dt_dif / (pstDYn(i, j) * dsigm1(k)) + WKxyz2(i, j, k) = -min(zero, WKxyz3(i, j, k)) & + * dt_dif / (pstDYn(i, j) * dsigm1(k + 1)) + enddo + ! end do + enddo + + k = mz + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, k) = -max(zero, WKxyz3(i, j, k)) & + * dt_dif / (pstDYn(i, j) * dsigm1(k)) + ! end do + enddo + + ! +--Vertical Advection of TKE and TKE Dissipation + ! + ============================================= + + do k = kp1(1), mz + ! do j=1,my + do i = 1, mx + WKxyz4(i, j, k) = ect_TE(i, j, k) - ect_TE(i, j, k - 1) + WKxyz5(i, j, k) = eps_TE(i, j, k) - eps_TE(i, j, k - 1) + enddo + ! end do + enddo + + do k = kp1(1), mmz1 + ! do j=1,my + do i = 1, mx + tran = zero + tran = WKxyz1(i, j, k) * WKxyz4(i, j, k) & + + WKxyz2(i, j, k) * WKxyz4(i, j, k + 1) + ect_TE(i, j, k) = ect_TE(i, j, k) + tran + eps_TE(i, j, k) = eps_TE(i, j, k) & + + WKxyz1(i, j, k) * WKxyz5(i, j, k) & + + WKxyz2(i, j, k) * WKxyz5(i, j, k + 1) + + tranTE(i, j, k) = tranTE(i, j, k) + tran / dt_dif + + enddo + ! end do + enddo + + ! +--Work Arrays Reset + ! + ================= + + do k = 1, mz + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +endsubroutine turtke_advv diff --git a/MAR/code_mar/turtke_difh.f90 b/MAR/code_mar/turtke_difh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d21a2dacd6ee675ef841cbb1ddaa856ccec520a3 --- /dev/null +++ b/MAR/code_mar/turtke_difh.f90 @@ -0,0 +1,156 @@ +subroutine turtke_difh(dt_dif) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (TKE) 08-09-2017 MAR | + ! | subroutine turtke_difh includes TKE Horizontal Diffusion Contribution| + ! | to Turbulent Kinetic Energy (ect_TE) and Dissipation (eps_TE) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT:TUkhx(mx,my,mz): Horizontal Diffusion Coefficient (x-Direction) | + ! | ^^^^^ TUkhy(mx,my,mz): Horizontal Diffusion Coefficient (y-Direction) | + ! | | + ! | INPUT / OUTPUT | + ! | ^^^^^^^^^^^^^^ | + ! | The Horizontal Diffusion and Correction Terms are included for : | + ! | a) Turbulent Kinetic Energy ect_TE(mx,my,mz) [m2/s2] | + ! | b) Turbulent Kinetic Energy Dissipation eps_TE(mx,my,mz) [m2/s2] | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_dy + use mar_te + use mar_tu + use mar_wk + + implicit none + + ! +--Global Variables + ! + ================ + + real dt_dif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + real tran, dx2inv + + ! +--Computes Horizontal Diffusion using an Explicit Scheme + ! + ====================================================== + + do i = 1, mx1 + do j = 1, my + WKxy1(i, j) = 0.50 * (pstDY(i, j) + pstDY(ip1(i), j)) + enddo + enddo + + do j = 1, my1 + do i = 1, mx + WKxy2(i, j) = 0.50 * (pstDY(i, j) + pstDY(i, jp1(j))) + enddo + enddo + + dx2inv = 1.d0 / dx / dx + do j = 1, my + do i = 1, mx + WKxy3(i, j) = dx2inv / pstDY(i, j) + enddo + enddo + + !$OMP PARALLEL do private (i,j,k,tran) + ! + ================ + do k = kp1(1), mmz1 + ! + ================ + + ! +--Horizontal Diffusion, x-Direction + ! + ================================= + + do i = ip11, mx1 + do j = jp11, my1 + ! + + tran = WKxy3(i, j) & + * (WKxy1(i, j) * TUkhx(i, j, k) & + * (ect_TE(ip1(i), j, k) - ect_TE(i, j, k)) & + - WKxy1(im1(i), j) * TUkhx(im1(i), j, k) & + * (ect_TE(i, j, k) - ect_TE(im1(i), j, k))) + tranTE(i, j, k) = tranTE(i, j, k) + tran + WKxyz1(i, j, k) = dt_dif * tran + + WKxyz2(i, j, k) = dt_dif * WKxy3(i, j) & + * (WKxy1(i, j) * TUkhx(i, j, k) & + * (eps_TE(ip1(i), j, k) - eps_TE(i, j, k)) & + - WKxy1(im1(i), j) * TUkhx(im1(i), j, k) & + * (eps_TE(i, j, k) - eps_TE(im1(i), j, k))) + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + ect_TE(i, j, k) = ect_TE(i, j, k) + WKxyz1(i, j, k) + eps_TE(i, j, k) = eps_TE(i, j, k) + WKxyz2(i, j, k) + enddo + enddo + + ! +--Horizontal Diffusion, y-Direction + ! + ================================= + + if(mmy >= 2) then + + do j = jp11, my1 + do i = ip11, mx1 + + tran = WKxy3(i, j) & + * (WKxy2(i, j) * TUkhy(i, j, k) & + * (ect_TE(i, jp1(j), k) - ect_TE(i, j, k)) & + - WKxy2(i, jm1(j)) * TUkhy(i, jm1(j), k) & + * (ect_TE(i, j, k) - ect_TE(i, jm1(j), k))) + tranTE(i, j, k) = tranTE(i, j, k) + tran + WKxyz1(i, j, k) = dt_dif * tran + + WKxyz2(i, j, k) = dt_dif * WKxy3(i, j) & + * (WKxy2(i, j) * TUkhy(i, j, k) & + * (eps_TE(i, jp1(j), k) - eps_TE(i, j, k)) & + - WKxy2(i, jm1(j)) * TUkhy(i, jm1(j), k) & + * (eps_TE(i, j, k) - eps_TE(i, jm1(j), k))) + enddo + enddo + + do j = jp11, my1 + do i = ip11, mx1 + ect_TE(i, j, k) = ect_TE(i, j, k) + WKxyz1(i, j, k) + eps_TE(i, j, k) = eps_TE(i, j, k) + WKxyz2(i, j, k) + enddo + enddo + + endif + + do j = 1, my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + enddo + enddo + + ! + ====== + enddo + ! + ====== + !$OMP END PARALLEL DO + + ! +--Work Arrays Reset + ! + ================= + + do j = 1, my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + enddo + enddo + + return +endsubroutine turtke_difh diff --git a/MAR/code_mar/turtke_difv.f90 b/MAR/code_mar/turtke_difv.f90 new file mode 100644 index 0000000000000000000000000000000000000000..97fc8142d0489d253a4e49cd120f192a4c6be0ed --- /dev/null +++ b/MAR/code_mar/turtke_difv.f90 @@ -0,0 +1,306 @@ +#include "MAR_pp.def" +subroutine turtke_difv(dt_dif, alphaD) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (TKE) 11-14-2022 MAR | + ! | subroutine turtke_difv includes TKE Vertical Turbulence Contribution | + ! | to Turbulent Kinetic Energy (ect_TE) and Dissipation (eps_TE) | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | INPUT: TUkvm(mx,my,mz): Vertical Turbulent Coeffic.(momentum) [m2/s2] | + ! | ^^^^^^ | + ! | | + ! | INPUT / OUTPUT: The Vertical Turbulent Fluxes are included for: | + ! | ^^^^^^^^^^^^^^ | + ! | a) Turbulent Kinetic Energy ect_TE(mx,my,mz) [m2/s2] | + ! | b) Turbulent Kinetic Energy Dissipation eps_TE(mx,my,mz) [m2/s3] | + ! | | + ! | #OPTIONS: #De: Dirichlet Type Top Boundary Condit. for ect_TE & eps_TE | + ! | #^^^^^^^^ | + ! +------------------------------------------------------------------------+ + + use marphy + use mardim + use margrd + use mar_dy + use mar_te + use mar_tu + use mar_wk +#if(De) + ! cCA : MAR_DI.inc doesn't exist + ! include 'MAR_DI.inc' +#endif + + implicit none + + ! +--Global Variables + ! + ================ + + real dt_dif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + integer k1 + real sige, sigk + real sige0, sigk0, sigek, alpha, beta, ab, alphaD + + ! +--DATA + ! + ==== + + ! Bintanja , 2000, BLM (95),milieu p. 355 : 1/sig_e = 1./1.16 = 0.862 + data sige/0.862e0/ + ! Duynkerke, 1988, JAS (45), end a. p.868 : 1/sig_e = 1./2.38 = 0.420 +#if(PD) + data sige0/0.420e0/ +#endif + ! Kitada , 1987, BLM (41), p.220 : 1/sig_e = 1./1.30 = 0.769 +#if(KI) + data sige0/0.769e0/ +#endif + ! For TKE Closure (Therry and Lacarrere, 1983) +#if(Kl) + data sige0/0.420e0/ +#endif + + ! Duynkerke, 1988, JAS (45), end a. p.868 : 1/sig_k = 1./1.00=1.000 + data sigk/1.000e0/ + ! Kitada , 1987, BLM (41), p.220 : 1/sig_k = 1./1.00=1.000 +#if(KI) + data sigk0/1.000e0/ +#endif + ! Schayes and Thunis, Contribution 60 Inst.Astr.Geoph.(1990) p.6 +#if(Kl) + data sigk0/1.200e0/ +#endif + +#if(PD) + sige = sige0 +#endif +#if(KI) + sige = sige0 +#endif +#if(Kl) + sige = sige0 +#endif + sigek = sige / sigk + + ! +--Parameters for the Numerical Scheme of Vertical Turbulent Transport + ! + =================================================================== + + alpha = alphaD ! Expliciteness := 0 (positive definite) + beta = 1.00 - alpha ! Impliciteness + ab = alpha / beta ! + + ! +--Work Arrays Reset + ! + ================= + + !$OMP PARALLEL do private (i,j,k,k1) + do j = 1, my + do k = 1, mz + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + enddo + enddo + ! end do + + ! +--Vertical Diffusion of Turbulent Kinetic Energy + ! + ============================================== + + ! +--Tridiagonal Matrix Coefficients - ect_TE + ! + ---------------------------------------- + + do k = mmz2, 1, -1 + ! do j= 1,my + do i = 1, mx + WKxyz1(i, j, k) = -gravi2 * (TUkvm(i, j, k) + TUkvm(i, j, k + 1) & + ) * 0.50 * beta * sigk & + * romiDY(i, j, k) * rolvDY(i, j, k) & + / (pstDY2(i, j) * dsigm1(k) * dsig_1(k)) + enddo + ! end do + + ! do j= 1,my + do i = 1, mx + WKxyz3(i, j, kp1(k)) = WKxyz1(i, j, k) * dsigm1(k) / dsigm1(kp1(k)) & + / rolvDY(i, j, k) * rolvDY(i, j, k + 1) + enddo + ! end do + + enddo + + do k = 1, mmz1 + ! do j= 1,my + do i = 1, mx + WKxyz1(i, j, k) = WKxyz1(i, j, k) * dt_dif + WKxyz3(i, j, k) = WKxyz3(i, j, k) * dt_dif + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + ! end do + enddo + + ! +--Second Member of the Tridiagonal System - ect_TE + ! + ------------------------------------------------ + + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, 1) = & + WKxyz1(i, j, 1) * ab * (ect_TE(i, j, 1) - ect_TE(i, j, kp1(1))) +#if(De) + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = ect_DI(i, j) +#endif + enddo + ! end do + + do k = kp1(1), mmz2 + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (ect_TE(i, j, k) - ect_TE(i, j, kp1(k))) & + - WKxyz3(i, j, k) * ab * (ect_TE(i, j, km1(k)) - ect_TE(i, j, k)) + enddo + ! end do + enddo + + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, mmz1) = -(alpha * ect_TE(i, j, mmz1) - ect_TE(i, j, mz)) & + * gravi2 * (TUkvm(i, j, mmz1) + TUkvm(i, j, mmz2) & + ) * 0.50 & + * romiDY(i, j, mmz1) * romiDY(i, j, mmz1) & + / (pstDY2(i, j) * dsigm1(mmz1) * dsig_1(mmz1)) & + - WKxyz3(i, j, mmz1) * ab * (ect_TE(i, j, mmz2) - ect_TE(i, j, mmz1)) + enddo + ! end do + + ! +--Tridiagonal Matrix Inversion - ect_TE + ! + ------------------------------------- + + k1 = 1 +#if(De) + k1 = 2 +#endif + do k = k1, mz + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, k) = WKxyz4(i, j, k) + ect_TE(i, j, k) + enddo + ! end do + enddo + + ! + ************ + call MARgz_1mx1my(1, mmz1, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mmz1 + ! do j= 1,my + do i = 1, mx + tranTE(i, j, k) = tranTE(i, j, k) + (WKxyz7(i, j, k) - ect_TE(i, j, k)) & + / dt_dif + ect_TE(i, j, k) = WKxyz7(i, j, k) + enddo + ! end do + enddo + + ! +--Vertical Diffusion of Dissipation + ! + ================================= + + ! +--Update Tridiagonal Matrix Coefficients - eps_TE + ! + ----------------------------------------------- + + do k = 1, mmz1 + ! do j= 1,my + do i = 1, mx + WKxyz1(i, j, k) = WKxyz1(i, j, k) * sigek + WKxyz3(i, j, k) = WKxyz3(i, j, k) * sigek + WKxyz2(i, j, k) = 1.0 - WKxyz3(i, j, k) - WKxyz1(i, j, k) + enddo + ! end do + enddo + + ! +--Second Member of the Tridiagonal System - eps_TE + ! + ------------------------------------------------ + + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, 1) = & + WKxyz1(i, j, 1) * ab * (eps_TE(i, j, 1) - eps_TE(i, j, kp1(1))) +#if(De) + WKxyz1(i, j, 1) = 0.0 + WKxyz2(i, j, 1) = 1.0 + WKxyz4(i, j, 1) = eps_DI(i, j) +#endif + enddo + ! end do + + do k = kp1(1), mmz2 + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, k) = & + WKxyz1(i, j, k) * ab * (eps_TE(i, j, k) - eps_TE(i, j, kp1(k))) & + - WKxyz3(i, j, k) * ab * (eps_TE(i, j, km1(k)) - eps_TE(i, j, k)) + enddo + ! end do + enddo + + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, mmz1) = -(alpha * eps_TE(i, j, mmz1) - eps_TE(i, j, mz)) & + * gravi2 * (TUkvm(i, j, mmz1) + TUkvm(i, j, mmz2) & + ) * 0.50 & + * romiDY(i, j, mmz1) * romiDY(i, j, mmz1) & + / (pstDY2(i, j) * dsigm1(mmz1) * dsig_1(mmz1)) & + - WKxyz3(i, j, mmz1) * ab * (eps_TE(i, j, mmz2) - eps_TE(i, j, mmz1)) + enddo + ! end do + + ! +--Tridiagonal Matrix Inversion - eps_TE + ! + ------------------------------------- + + k1 = 1 +#if(De) + k1 = 2 +#endif + do k = k1, mz + ! do j= 1,my + do i = 1, mx + WKxyz4(i, j, k) = WKxyz4(i, j, k) + eps_TE(i, j, k) + enddo + ! end do + enddo + + ! + ************ + call MARgz_1mx1my(1, mmz1, j, WKxyz1, WKxyz2, WKxyz3, WKxyz4, WKxyz7) + ! + ************ + + do k = 1, mmz1 + ! do j= 1,my + do i = 1, mx + eps_TE(i, j, k) = WKxyz7(i, j, k) + enddo + ! end do + enddo + + ! +--Work Arrays Reset + ! + ================= + + do k = 1, mz + ! do j= 1,my + do i = 1, mx + WKxyz1(i, j, k) = 0.00 + WKxyz2(i, j, k) = 0.00 + WKxyz3(i, j, k) = 0.00 + WKxyz4(i, j, k) = 0.00 + WKxyz7(i, j, k) = 0.00 + enddo + enddo + enddo + !$OMP END PARALLEL DO + + return +endsubroutine turtke_difv diff --git a/MAR/code_mar/turtke_gen.f90 b/MAR/code_mar/turtke_gen.f90 new file mode 100644 index 0000000000000000000000000000000000000000..4f091b7ac2a18341ff91a6c9bea070a31fb43c49 --- /dev/null +++ b/MAR/code_mar/turtke_gen.f90 @@ -0,0 +1,1089 @@ +#include "MAR_pp.def" +subroutine turtke_gen(dt_dif) + ! +------------------------------------------------------------------------+ + ! | MAR TURBULENCE (TKE) XF 09-11-2020 MAR | + ! | subroutine turtke_gen includes 1 1/2 Vertical Turbulence Closures | + ! | | + ! +------------------------------------------------------------------------+ + ! | | + ! | METHOD: 1. `Standard' Closure of Turbulence: | + ! | ^^^^^^^ E - epsilon , Duynkerke, JAS 45, 865--880, 1988 | + ! | .OR. 2. E - epsilon , Huang and Raman, BLM 55, 381--407, 1991 | + ! | .OR. 3. TKE , Therry et Lacarrere, BLM 25, 63-- 88, 1983 | + ! | | + ! | INPUT : itexpe: Nb of iterations | + ! | ^^^^^^^^ dt_dif: Local Time Step (s) | + ! | explIO: Experiment Label (s) | + ! | | + ! | INPUT / OUTPUT: The Vertical Turbulent Fluxes are included for: | + ! | ^^^^^^^^^^^^^^ | + ! | a) Turbulent Kinetic Energy ect_TE(mx,my,mz) (m2/s2) | + ! | b) Turbulent Kinetic Energy Dissipation eps_TE(mx,my,mz) (m2/s3) | + ! | | + ! | OUTPUT : TUkvm(i,j,k): vertical diffusion coeff. for momentum (m2/s) | + ! | ^^^^^^^^ TUkvh(i,j,k): vertical diffusion coeff. for heat... (m2/s) | + ! | zi__TE(i,j) : inversion height (m) | + ! | | + ! | OPTIONS: #De: Dirichlet Type Top Boundary Condit. for ect_TE & eps_TE | + ! | ^^^^^^^^ #WE: Output on MAR.TKE (unit 29) | + ! | | + ! +------------------------------------------------------------------------+ + + use marctr + use marphy + use mardim + use margrd + use mar_ge + use mar_dy + use mar_te + use mar_tu + use mar_hy + use mar_sl + use mar_wk + use mar_io +#if(De) + ! cCA : MAR_Di.inc does not exist + ! use mar_di +#endif + + implicit none + + ! +--Global Variables + ! + ================ + + real dt_dif + + ! +--Local Variables + ! + ================ + + integer i, j, k, m + logical log_KA + integer locTKE, mz__KA + common / turtke_gen_loc / locTKE, mz__KA + + integer i5, n5, kect, ke +#if(WE) + integer m30, m31 +#endif + + real aalme(mx, mz) + real aalmk(mx, mz) + real flott(mx, mz) + + real epse, epsd, ectmin, turmx, dkect + real sqrcmu, sqrcmu0 + real cmu, c1ep, c2ep, rc1c2, betahr, voninv + real cmu0, c1ep0, c2ep0 + real ectcrt, akz, alme, almk, pousse + real hrel, base + real epslme, ectnew, produc, factur, zeta, stab_s, phimm + real edtnum, edtden + + real phim, dzlev + real sature, sgnLMO, absLMO, se + real alamb, Ri_Sat + real fac_Ri, vuzvun, Kz_vun + real kz_max, kz_mix, kz2mix, KvhMax(mx, my, mz) + + ! +--DATA + ! + ==== + + data epse/0.00000100/ + data epsd/0.00000001/ + + ! +... ectmin:Minimum SBL turbulent kinetic energy + data ectmin/0.00010000/ + + ! +...Bintanja , 2000, BLM (95),milieu p. 355 + data cmu/0.090/ +#if(PD) + ! +...Duynkerke, 1988, JAS (45), haut p. 868 + data cmu0/0.033/ +#endif +#if(KI) + ! +...Kitada , 1987, BLM (41), haut p.220 + data cmu0/0.090/ +#endif + ! +...Bintanja , 2000, BLM (95),milieu p. 355 + data sqrcmu/3.333/ +#if(PD) + ! +...Duynkerke, 1988, JAS (45), (19) p. 869 :(c_mu)^1/2=(0.033)^1/2=5.50 + data sqrcmu0/5.500/ +#endif +#if(KI) + ! +...Kitada , 1987, BLM (41), p.220 :(c_mu)^1/2=(0.090)^1/2=3.333 + data sqrcmu0/3.333/ +#endif +#if(Kl) + ! +...Schayes and Thunis, 1990, Contrib. 60 Inst.Astr.Geoph. p.8 + data sqrcmu0/4.000/ +#endif + + ! +...Duynkerke, 1988, JAS (45),milieu p. 868 + ! +...Bintanja , 2000, BLM (95),milieu p. 355 + data c1ep/1.46/ +#if(KI) + ! +...Kitada , 1987, BLM (41), haut p.220 + data c1ep0/1.44/ +#endif + ! +...Bintanja , 2000, BLM (95),milieu p. 355 + data c2ep/1.92/ +#if(PD) + ! +...Duynkerke, 1988, JAS (45),milieu p. 868 + data c2ep0/1.83/ +#endif +#if(KI) + ! +...Kitada , 1987, BLM (41), haut p.220 + data c2ep0/1.92/ +#endif + +#if(HR) + ! +...Huang and Raman, 1991, BLM (55), p.386 and (A22) p.405 + data betahr/2.00/ +#endif + + data alamb/0.1/! 1 / 10 m + data Ri_Sat/2.0/! Mahalov&al., 2004, GRL +#if(PD) + cmu = cmu0 +#endif +#if(KI) + cmu = cmu0 +#endif +#if(PD) + sqrcmu = sqrcmu0 +#endif +#if(KI) + sqrcmu = sqrcmu0 +#endif +#if(Kl) + sqrcmu = sqrcmu0 +#endif +#if(KI) + c1ep = c1ep0 +#endif +#if(PD) + c2ep = c2ep0 +#endif +#if(KI) + c2ep = c2ep0 +#endif + + rc1c2 = c1ep / c2ep + + ! +--Parameters + ! + ========== + + voninv = 1./vonkar + + n5 = 5 + n5 = min(mx, n5) + + ! +--Initialisation + ! + ============== + + if(.not. ini_KA_TE) then + ini_KA_TE = .true. + mz__KA = mz1 +11 continue + if(zsigma(mz__KA) > 5. .OR. mz__KA <= 1) go to 10 + mz__KA = mz__KA - 1 + go to 11 +10 continue + write(6, 1000) mz - mz__KA +1000 format(/, ' TKE: Moving Average until mz -', i2, ' Level',/) + endif + + if(locTKE == 0 .and. itexpe <= 1) then + + log_KA = .true. +#if(Kl) + log_KA = .false. + if(log_KA) then + write(6, 6000) +6000 format('!?%@&* Conflicting Use of #KA and #Kl', & + ' ==> Emergency EXIT in turtke_gen', 6x, & + ' ### do NOT PRE-PROCESS #KA with #Kl ###') + STOP + endif +#endif + + ! +--Minimum Vertical Turbulent Diffusion Coefficient (ARPS.4.0 Users Guide, + ! + ------------------------------------------------ fin para 6.3.4 p.143) + + do k = 1, mz1 + dzlev = zsigma(k) - zsigma(k + 1) + TUmin(k) = akmol +#if(ARPS) + TUmin(k) = min(0.15, epsi * dzlev * dzlev) +#endif + enddo + k = mz + dzlev = zsigma(k) + TUmin(k) = akmol +#if(ARPS) + TUmin(k) = min(0.15, epsi * dzlev * dzlev) +#endif + + endif + + ! +--Initial E,e + ! + ----------- + +!$OMP PARALLEL do & +!$OMP private(i,j,k,hrel,sature,base,sgnLMO,absLMO,dkect, & +!$OMP akz,alme,almk,pousse,epslme,ectnew,produc,factur, & +!$OMP se,ke,edtden,edtnum,kz2mix,kz_max,kz_mix, & +!$OMP Kz_vun,fac_Ri,vuzvun) + do j = 1, my + if(locTKE == 0 .and. itexpe <= 1) then + do k = 1, mz + do i = 1, mx + ect_TE(i, j, k) = epse + eps_TE(i, j, k) = epsd + ! +... These initial values of TKE and epsilon correspond to K ~ Kmol + + TUkvm(i, j, k) = akmol + TUkvh(i, j, k) = akmol + enddo + enddo + ! end do + + ! do j=1,my + do i = 1, mx + zi__TE(i, j) = max(gpmiDY(i, j, mz) * grvinv - sh(i, j), & + zi__TE(i, j)) + enddo + ! end do + + ! +--Verification: TKE must be Positive Definite + ! + =========================================== + + else + ! do j=1,my + do k = 1, mz + do i = 1, mx + ect_TE(i, j, k) = max(epse, ect_TE(i, j, k)) + eps_TE(i, j, k) = max(epsd, eps_TE(i, j, k)) + enddo + enddo + ! end do + + ! +--Inversion Height + ! + ================ + + do i = 1, mx + WKxy1(i, j) = 0.05 * max(max(ect_TE(i, j, mmz1), & + ect_TE(i, j, mz)), ectmin) + WKxy2(i, j) = 1. + enddo + + do k = 1, mz + do i = 1, mx + if(ect_TE(i, j, k) < WKxy1(i, j)) then + WKxy2(i, j) = min(mz1, k) + endif + enddo + enddo + + do i = 1, mx + k = WKxy2(i, j) + if(ect_TE(i, j, k + 1) < ectmin) then + WKxy1(i, j) = gpmiDY(i, j, mz) * grvinv & + - sh(i, j) + else + dkect = ect_TE(i, j, k) - ect_TE(i, j, k + 1) + WKxy1(i, j) = (gpmiDY(i, j, k + 2) & + + (gpmiDY(i, j, k + 1) - gpmiDY(i, j, k + 2)) & + * (WKxy1(i, j) - ect_TE(i, j, k + 1)) & + / (sign(unun, dkect) & + * max(eps9, abs(dkect))) & + - gplvDY(i, j, mzz) & + ) * grvinv + endif + enddo + + do i = 1, mx + zi__TE(i, j) = min(WKxy1(i, j), & + gpmiDY(i, j, 1) * grvinv - sh(i, j)) + enddo + + do i = 1, mx + zi__TE(i, j) = max(gpmiDY(i, j, mz) * grvinv - sh(i, j), & + zi__TE(i, j)) + WKxy1(i, j) = 0. + WKxy2(i, j) = 0. +#if(WR) + if(zi__TE(i, j) > 10000.) then + kect = k + kect = min(mz - 3, kect) + kect = max(5, kect) + write(6, 6001) i, j, k, kect,(ke, ke=kect + 3, kect - 4, -1) & + , zi__TE(i, j),(ect_TE(i, j, ke), ke=kect + 3, kect - 4, -1) +6001 format('zi / TKE', 2(i6, i4), 8i10, /, d10.3, 18x, 8d10.3) + endif +#endif + enddo + endif + + ! +--TKE Production/Destruction by the Vertical Wind Shear + ! + ===================================================== + + ! do j=1,my + do k = kp1(1), mmz1 + do i = 1, mx + WKxyz3(i, j, k) = uairDY(i, j, k) - uairDY(i, j, k + 1) + WKxyz4(i, j, k) = vairDY(i, j, k) - vairDY(i, j, k + 1) + enddo + enddo + ! end do + + do k = 1, mz + ! do j=1,my + do i = 1, mx + WKxyz5(i, j, k) = & + gravit / (gplvDY(i, j, k) - gplvDY(i, j, k + 1)) + ! +... 1/dz(k+1/2) + enddo + ! end do + enddo + + do k = kp1(1), mmz1 + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, k) = & + TUkvm(i, j, k) * (WKxyz3(i, j, k) * WKxyz3(i, j, k) & + + WKxyz4(i, j, k) * WKxyz4(i, j, k)) & + * WKxyz5(i, j, k) * WKxyz5(i, j, k) + enddo + ! end do + enddo + + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, mz) = 0.0 + enddo + ! end do + + ! +--Buoyancy + ! + ======== + + ! +--Reduced (Equivalent) Potential Temperature + ! + ------------------------------------------ + + ! do j=1,my + do i = 1, mx + WKxy5(i, j) = pktaDY(i, j, mzz) & + * exp(Lv_H2O * qvapSL(i, j) / (cp * TairSL(i, j))) + enddo + ! end do + + do k = 1, mz + ! do j=1,my + do i = 1, mx + WKxyz2(i, j, k) = pktaDY(i, j, k) & + * exp(Lv_H2O * qvDY(i, j, k) / (cp * tairDY(i, j, k))) + enddo + ! end do + enddo + + ! +--Buoyancy Coefficients + ! + --------------------- + + do k = 1, mz + !c#HY do j=1,my + do i = 1, mx + + hrel = 0.50 * (qvDY(i, j, k) / qvswDY(i, j, k) + & + qvDY(i, j, kp1(k)) / qvswDY(i, j, k)) + WKxy3(i, j) = 0.50 * (qvswDY(i, j, k) + qvswDY(i, j, k + 1)) + WKxy4(i, j) = 0.50 * (tairDY(i, j, k) + tairDY(i, j, kp1(k))) + + sature = max(0., sign(1., hrel + eps12 - 1.)) + base = WKxy3(i, j) * Lv_H2O / (RDryAi * WKxy4(i, j)) + + ! +--Vectorization of the unsaturated (H<1) and saturated cases (H=1.) + ! + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + WKxy1(i, j) = & + ! H<1. + 1.-sature & + ! H=1. + + sature * (1.0 + base) & + / (1.0 + base * 0.605 * Lv_H2O / (cp * WKxy4(i, j))) + ! +... C_thq (Duynkerke & Driedonks 1987 JAS 44(1), Table 1 p.47) + + WKxy2(i, j) = & + ! H<1. + (1.-sature) * (Lv_H2O / (cp * WKxy4(i, j)) & + - 0.605) & + ! H=1. + + sature + ! +... C_q_w (Duynkerke and Driedonks 1987) + ! + with (1-Ra/Rv)/(Ra/Rv) = 0.605 [Ra=287.J/kg/K; + ! + Rv=461.J/kg/K] + + ! +--Unsaturated Case + ! + ~~~~~~~~~~~~~~~~ + ! + if (hrel.lt.1.0) then + ! + WKxy1(i,j) = 1.0 + ! + WKxy2(i,j) = Lv_H2O/(cp*WKxy4(i,j)) + ! + . - 0.605 + + ! +--Saturated Case + ! + ~~~~~~~~~~~~~~~~ + ! + else + ! + base = WKxy3(i,j)*Lv_H2O/(RDryAi*WKxy4(i,j)) + ! + WKxy1(i,j) = (1.0+base) + ! + . /(1.0+base*0.605*Lv_H2O/(cp *WKxy4(i,j))) + ! + WKxy2(i,j) = 1.0 + ! + end if + + enddo + !c#HY end do + + ! +--Buoyancy + ! + -------- + + if(k <= mmz1) then + ! do j=1,my + do i = 1, mx + WKxyz3(i, j, k) = gravit & + * WKxyz5(i, j, k) * ((WKxyz2(i, j, k) - WKxyz2(i, j, k + 1)) * 2.0 & + / (WKxyz2(i, j, k) + WKxyz2(i, j, k + 1)) & + * WKxy1(i, j) & + - WKxy2(i, j) & + * (qvDY(i, j, k) - qvDY(i, j, kp1(k)) & + + qwHY(i, j, k) - qwHY(i, j, kp1(k)) & + + qrHY(i, j, k) - qrHY(i, j, kp1(k)) & + + qiHY(i, j, k) - qiHY(i, j, kp1(k)) & + + qsHY(i, j, k) - qsHY(i, j, kp1(k))) & + ) + ! +... (g/theta) X(dtheta/dz) : + ! + Buoyancy Parameter beta X grad.vert.temp.pot. en k+1/2 + enddo + ! end do + + else + ! do j=1,my + do i = 1, mx + WKxyz3(i, j, k) = gravit & + * WKxyz5(i, j, k) * ((WKxyz2(i, j, k) - WKxy5(i, j)) * 2.0 & + / (WKxyz2(i, j, k) + WKxy5(i, j)) & + * WKxy1(i, j) & + ) + ! +... (g/theta) X(dtheta/dz) : + ! + Buoyancy Parameter beta X grad.vert.temp.pot. en k+1/2 + enddo + ! end do + endif + enddo + + ! +--Length Scales Parameters (Therry and Lacarrere 1983 Model) + ! + ======================== + + ! do j=1,my + do i = 1, mx + WKxy3(i, j) = 1.0 / zi__TE(i, j) + + WKxy1(i, j) = 15.0 * WKxy3(i, j) + ! +... Ce1/hi + WKxy2(i, j) = 5.0 * WKxy3(i, j) + ! +... Ce1/hi + WKxy4(i, j) = 11.0 * WKxy3(i, j) + ! +... Ck2/hi + enddo + ! end do + + ! do j=1,my + do i = 1, mx + sgnLMO = sign(unun, SLlmo(i, j)) + absLMO = abs(SLlmo(i, j)) + SLlmo(i, j) = sgnLMO * max(absLMO, eps12) + WKxy3(i, j) = -min(0., sgnLMO) & + / (1.0 - min(0., SLlmo(i, j)) / zi__TE(i, j)) + + ! +--Replacement of: + ! + if (SLlmo(i,j).lt.0.0) then + ! + SLlmo(i,j) = min(SLlmo(i,j),-eps12) + ! + WKxy3(i,j) = 1.0/(1.d0-SLlmo(i,j)/zi__TE(i,j)) + ! + else + ! + SLlmo(i,j) = max(SLlmo(i,j), eps12) + ! + WKxy3(i,j) = 0.0 + ! + end if + ! +... m2 + ! end do + enddo + + do k = kp1(1), mz + ! do j=1,my + do i = 1, mx + WKxyz4(i, j, k) = sqrt(max(zero, WKxyz3(i, j, k)) / ect_TE(i, j, k)) + ! +... 1/ls + enddo + ! end do + enddo + + ! +--Dissipation Length + ! + ------------------ + + do k = kp1(1), mz + ! do j=1,my + do i = 1, mx + akz = voninv * gravit / (gpmiDY(i, j, k + 1) - gplvDY(i, j, mzz)) + ! +... 1/kz(i,j,k+1/2) + ! + + alme = akz + WKxy1(i, j) & + - (akz + WKxy2(i, j)) * WKxy3(i, j) / (1.+5.0e-3 * zi__TE(i, j) * akz) & + + 1.5 * WKxyz4(i, j, k) + ! +... alme=1/Dissipation Length (Therry and Lacarrere, 1983 BLM 25 p.75) + + ! +--Mixing Length + ! + ------------- + + almk = akz + WKxy1(i, j) & + - (akz + WKxy4(i, j)) * WKxy3(i, j) / (1.+2.5e-3 * zi__TE(i, j) * akz) & + + 3.0 * WKxyz4(i, j, k) + ! +... almk=1/Mixing Length (Therry and Lacarrere, 1983 BLM 25 p.78) + + ! +--Contribution of Vertical Wind Shear + Buoyancy + Dissipation to TKE + ! + =================================================================== + + pousse = -TUkvh(i, j, k) * WKxyz3(i, j, k) + + epslme = eps_TE(i, j, k) +#if(Kl) + epslme = 0.125 * alme * sqrt(ect_TE(i, j, k)) * ect_TE(i, j, k) +#endif + ectnew = ect_TE(i, j, k) * & + (ect_TE(i, j, k) + dt_dif * (WKxyz1(i, j, k) + max(zero, pousse))) & + / (ect_TE(i, j, k) + dt_dif * (-min(zero, pousse) & + + epslme)) + ! +... Numerical Scheme : cfr. E. Deleersnijder, 1992 (thesis) pp.59-61 + + ! +--Contribution of Vertical Wind Shear + Buoyancy to epsilon + ! + ========================================================= + +#if(HR) + tranTE(i, j, k) = zero +#endif + produc = WKxyz1(i, j, k) + max(pousse, zero) + max(tranTE(i, j, k), zero) + +#if(KI) + ! based on standard values of Kitada, 1987, BLM 41, p.220 + produc = WKxyz1(i, j, k) + max(zero, pousse) +#endif + +#if(BH) + ! based on values of Betts et Haroutunian, 1983 + ! can be used by replacing strings `c #KI' (except the previous one) + ! and `c #BH' by blanks + ! (cfr. Kitada, 1987, BLM 41, p.220): + ! buoyancy > 0 (unstability) => (1-ce3) X buoyancy = 1.8 X buoyancy + ! buoyancy < 0 ( stability) => (1-ce3) X buoyancy =-1.15 X buoyancy + produc = WKxyz1(i, j, k) + max(zero, pousse) * 1.80 - min(zero, pousse) * 1.15 +#endif + + factur = eps_TE(i, j, k) / ect_TE(i, j, k) + ! Numerical Scheme : cfr. E. Deleersnijder, 1992 (thesis) pp.59-61 + eps_TE(i, j, k) = & + eps_TE(i, j, k) & + * (eps_TE(i, j, k) + dt_dif * factur * c1ep * produc) & + / (eps_TE(i, j, k) + dt_dif * factur * c2ep * eps_TE(i, j, k)) + +#if(Kl) + eps_TE(i, j, k) = epslme +#endif + + ! +--New TKE Value + ! + ============= + + ect_TE(i, j, k) = ectnew + + ! +--Dissipation Lengths Variables are Assigned for Output Purpose + ! + ============================================================= + + WKxyz1(i, j, k) = alme + WKxyz2(i, j, k) = almk + enddo + ! end do + enddo + + ! +--OUTPUT Preparation + ! + ================== + + ! if(( itexpe.gt.0.and.jmmMAR.eq.0.and.jssMAR.eq.0.and. + ! . ((IO_loc.ge.2.and. jhurGE .eq.0) .or. + ! . (IO_loc.ge.2.and.mod(jhurGE,3).eq.0) .or. + ! . (IO_loc.ge.3) ) ).or. + ! . IO_loc.ge.7 ) then + ! + ! do i5 = 1,n5 + ! aalme(i5,1) =0.0 + ! aalmk(i5,1) =0.0 + ! flott(i5,1) =0.0 + ! do k = kp1(1),mz + ! if (WKxyz1(igrdIO(i5),jgrdIO(i5),k).gt.0.0) then + ! aalme(i5,k) = 1.0/WKxyz1(igrdIO(i5),jgrdIO(i5),k) + ! else + ! aalme(i5,k) = 0.0 + ! end if + !C +... Le + ! if (WKxyz2(igrdIO(i5),jgrdIO(i5),k).gt.0.d0) then + ! aalmk(i5,k) = 1.0/WKxyz2(igrdIO(i5),jgrdIO(i5),k) + ! else + ! aalmk(i5,k) = 0.0 + ! end if + !C +... Lk + ! flott(i5,k) = - WKxyz3(igrdIO(i5),jgrdIO(i5),k) + !C +... proportional to the buoyant force (e.g. Demoor, 1978, p.47) + ! end do + ! end do + ! end if + + ! +--Lower Boundary Conditions + ! + ========================= + + do i = 1, mx + ! do j=1,my + WKxy1(i, j) = SLuus(i, j) * SLuus(i, j) ! -> TKE SBC + WKxy3(i, j) = (gplvDY(i, j, mz) - gplvDY(i, j, mzz)) * grvinv! z_SBL + !c#vL end do + enddo + + do i = 1, mx + !c#vL do j=1,my + WKxy2(i, j) = WKxy1(i, j) * SLuus(i, j) ! -> e SBC + ect_TE(i, j, mz) = WKxy1(i, j) * sqrcmu ! TKE SBC + + WKxy4(i, j) = WKxy3(i, j) / SLlmo(i, j) ! zeta + WKxy5(i, j) = max(0.0, sign(unun, SLlmo(i, j))) ! + !c#vL end do + enddo + + do i = 1, mx + !c#vL do j=1,my + eps_TE(i, j, mz) = WKxy2(i, j) & + ! phim Stab. + * ((WKxy5(i, j) * (1.+A_Turb * WKxy4(i, j)) & + ! phim Inst. + + (1.0 - WKxy5(i, j)) / (1.-20.*min(0., WKxy4(i, j)))) & + * voninv / WKxy3(i, j) & + - voninv / SLlmo(i, j)) + ! +... Duynkerke, 1988, JAS (45), (19) p. 869 + +#if(KI) + eps_TE(i, j, mz) = WKxy2(i, j) * voninv / WKxy3(i, j) +#endif + !c#vL end do + enddo + + ! +--When TKE Closure is Used, TKE is Modified near the Lower Boundary + ! + ----------------------------------------------------------------- + + do i = 1, mx + !c#vL do j=1,my +#if(KC) + se = max(0., sign(unun, ect_TE(i, j, mmz2) - ect_TE(i, j, mmz1))) + ke = mmz1 - se + ! Schayes and Thunis, 1990, Contrib. 60 Inst.Astr.Geoph. p.8, 1.4.4. + ect_TE(i, j, mmz1) = ect_TE(i, j, ke) + eps_TE(i, j, mmz1) = eps_TE(i, j, ke) + ! ect_TE(i, j, mmz1) = ect_TE(i, j, mz) + ! eps_TE(i, j, mmz1) = eps_TE(i, j, mz) +#endif + + ! +--Upper Boundary Conditions + ! + ========================= + + ect_TE(i, j, 1) = ect_TE(i, j, kp1(1)) +#if(De) + ect_TE(i, j, 1) = ect_TE(i, j, mz) * rolvDY(i, j, mz) / rolvDY(i, j, 1) + ect_DI(i, j) = ect_TE(i, j, 1) +#endif + + eps_TE(i, j, 1) = eps_TE(i, j, kp1(1)) +#if(De) + eps_TE(i, j, 1) = eps_TE(i, j, mz) * rolvDY(i, j, mz) / rolvDY(i, j, 1) + eps_DI(i, j) = eps_TE(i, j, 1) +#endif + ! + + ! end do + enddo + + ! +--TKE-e Vertical Moving Average + ! + ============================= + + do k = mz__KA, mz1 + !c#KA do j=1,my + do i = 1, mx + WKxyz7(i, j, k) = (dsigm1(kp1(k)) * ect_TE(i, j, kp1(k)) & + + dsigm1(k) * ect_TE(i, j, k) * 2. & + +dsigm1(km1(k)) * ect_TE(i, j, km1(k))) & + / (dsigm1(kp1(k)) & + + dsigm1(k) * 2. & + +dsigm1(km1(k))) + WKxyz8(i, j, k) = (dsigm1(kp1(k)) * eps_TE(i, j, kp1(k)) & + + dsigm1(k) * eps_TE(i, j, k) * 2. & + +dsigm1(km1(k)) * eps_TE(i, j, km1(k))) & + / (dsigm1(kp1(k)) & + + dsigm1(k) * 2. & + +dsigm1(km1(k))) + enddo + !c#KA end do + enddo + + do k = mz__KA, mz1 + !c#KA do j=1,my + do i = 1, mx + ect_TE(i, j, k) = WKxyz7(i, j, k) + eps_TE(i, j, k) = WKxyz8(i, j, k) + enddo + !c#KA end do + enddo + + ! +--Verification: TKE must be Positive Definite + ! + =========================================== + + do k = 1, mz + ! do j=1,my + do i = 1, mx + ect_TE(i, j, k) = max(epse, ect_TE(i, j, k)) + eps_TE(i, j, k) = max(epsd, eps_TE(i, j, k)) + enddo + ! end do + enddo + +#if(HR) + ! +--Minimum Energy Dissipation Time + ! + =============================== + do i = 1, mx + edtnum = 0.0 + edtden = 0.0 + do k = 1, mz + edtnum = edtnum + ect_TE(i, j, k) * dsig_1(k) + edtden = edtden + eps_TE(i, j, k) * dsig_1(k) + enddo + if(edtden > 0.0) then + edt_TE(i, j) = betahr * edtnum / edtden + else + ! edt_TE set to an arbitrary small value + edt_TE(i, j) = 1.e-8 + endif + enddo +#endif + + ! +--Turbulent Diffusion Coefficients + ! + ================================ + + if(locTKE > 0 .or. itexpe > 1) then + + ! +--Richardson Number (contributors) + ! + ----------------- + + ! do j=1,my + do i = 1, mx + TU_Pra(i, j, mz) = 1. + enddo + ! end do + + do k = kp1(1), mz1 + ! do j=1,my + do i = 1, mx + WKxyz6(i, j, k) = 0.0 +#if(RI) + WKxyz6(i, j, k) = 0.5 * (pktadY(i, j, k) - pktadY(i, j, k + 1)) * pcap & + / (tairDY(i, j, k) + tairDY(i, j, k + 1)) + WKxyz7(i, j, k) = max((uairDY(i, j, k) - uairDY(i, j, k + 1))**2 & + + (vairDY(i, j, k) - vairDY(i, j, k + 1))**2, epsi) +#endif + enddo + !c#vK end do + enddo + + ! +--Richardson Number + ! + ----------------- + + do k = kp1(1), mz1 + !c#vK do j=1,my + do i = 1, mx + WKxyz8(i, j, k) = 0.0 +#if(RI) + ! g * dz (k+1/2) + WKxyz8(i, j, k) = (gravit / WKxyz5(i, j, k)) & + ! d(theta)/T (k+1/2) + * WKxyz6(i, j, k) & + ! d|V| + / WKxyz7(i, j, k) +#endif + enddo + !c#vK end do + enddo + + ! +--Diffusion Coefficient for Heat + ! + ------------------------------ + + do k = kp1(1), mz + !c#vK do j=1,my + do i = 1, mx + TUkvh(i, j, k) = & + cmu * ect_TE(i, j, k) * ect_TE(i, j, k) / (eps_TE(i, j, k) & + ) + ! nu_t =c_mu X ECT X ECT / eps +#if(Kl) + TUkvh(i, j, k) = 0.50 * sqrt(ect_TE(i, j, k)) / WKxyz2(i, j, k) +#endif + + kz_max = vonkar * (gplvDY(i, j, k + 1) - gplvDY(i, j, mzz)) * grvinv + kz_mix = kz_max / (1.+kz_max * 0.1) + kz2mix = kz_mix * kz_mix + KvhMax(i, j, k) = max(5000., 100. & + *kz2mix * abs((ssvSL(i, j, k) - ssvSL(i, j, kp1(k))) & + * WKxyz5(i, j, k))) + TUkvh(i, j, k) = min(KvhMax(i, j, k), TUkvh(i, j, k)) + TUkvh(i, j, k) = max(akmol, TUkvh(i, j, k)) + enddo + !c#vK end do + enddo + + ! +--Prandtl Number (Sukoriansky et al., 2005, + ! + -------------- BLM 117: 231-257, Eq.15, 19, 20 & Fig.2) + + do k = kp1(1), mz1 + !c#vK do j=1,my + do i = 1, mx +#if(RI) + fac_Ri = 5.0 * max(WKxyz8(i, j, k), epsi) + vuzvun = 0.4 * (1.-(fac_Ri - 1./fac_Ri) / (fac_Ri + 1./fac_Ri)) + 0.2 + fac_Ri = 4.2 * max(WKxyz8(i, j, k), epsi) + Kz_vun = 0.7 * (1.-(fac_Ri - 1./fac_Ri) / (fac_Ri + 1./fac_Ri)) +#endif + TU_Pra(i, j, k) = 1. +#if(RI) + TU_Pra(i, j, k) = max(0., sign(1., TUkvh(i, j, k) - 0.20)) & + - min(0., sign(1., TUkvh(i, j, k) - 0.20)) & + * min(vuzvun / max(epsi, Kz_vun), 20.00) +#endif + enddo + ! end do + enddo + + ! +--Diffusion Coefficient for Momentum + ! + ---------------------------------- + + do k = kp1(1), mz + ! do j=1,my + do i = 1, mx + TUkvm(i, j, k) = TUkvh(i, j, k) + ! +... cfr Machiels, 1992, TFE (FSA/UCL) (3.21) p.21 + +#if(Kl) + TUkvm(i, j, k) = 0.7 * TUkvh(i, j, k) +#endif + +#if(RI) + TUkvm(i, j, k) = TU_Pra(i, j, k) * TUkvh(i, j, k) +#endif + enddo + ! end do + enddo + + endif + +#if(OB) + ! +--Lateral Boundary Conditions + ! + =========================== + if(openLB) then + if(mmx > 1) then + do k = 1, mz + do j = jp11, my1 + ect_TE(1, j, k) = ect_TE(ip11, j, k) + ect_TE(mx, j, k) = ect_TE(mx1, j, k) + eps_TE(1, j, k) = eps_TE(ip11, j, k) + eps_TE(mx, j, k) = eps_TE(mx1, j, k) + TUkvm(1, j, k) = TUkvm(ip11, j, k) + TUkvm(mx, j, k) = TUkvm(mx1, j, k) + TUkvh(1, j, k) = TUkvh(ip11, j, k) + TUkvh(mx, j, k) = TUkvh(mx1, j, k) + enddo + enddo + endif + if(mmy > 1) then + do k = 1, mz + do i = ip11, mx1 + ect_TE(i, 1, k) = ect_TE(i, jp11, k) + ect_TE(i, my, k) = ect_TE(i, my1, k) + eps_TE(i, 1, k) = eps_TE(i, jp11, k) + eps_TE(i, my, k) = eps_TE(i, my1, k) + TUkvm(i, 1, k) = TUkvm(i, jp11, k) + TUkvm(i, my, k) = TUkvm(i, my1, k) + TUkvh(i, 1, k) = TUkvh(i, jp11, k) + TUkvh(i, my, k) = TUkvh(i, my1, k) + enddo + enddo + endif + ! +... Lateral Boundary Values of Kzm and Kzh are used + ! + during the Initialisation Procedure in 1-D Zone + endif +#endif + + ! +--Hourly Output on Listing + ! + ======================== + + ! if(( itexpe.gt.0.and.jmmMAR.eq.0.and.jssMAR.eq.0.and. + ! . ((IO_loc.ge.2.and. jhurGE .eq.0) .or. + ! . (IO_loc.ge.2.and.mod(jhurGE,3).eq.0) .or. + ! . (IO_loc.ge.3) ) ).or. + ! . IO_loc.ge.7 ) then + ! + ! do i5=1,n5 + ! + ! do k=1,mz + ! WKxza(i5,k) = 6.6d-1 + ! . * (ect_TE(igrdIO(i5),jgrdIO(i5),k)**1.50) + ! . /(eps_TE(igrdIO(i5),jgrdIO(i5),k) + !C +... 0.066 = cmu(Duynkerke) * 2 + !c #HR. +ect_TE(igrdIO(i5),jgrdIO(i5),k) + !c #HR. /edt_TE(igrdIO(i5),jgrdIO(i5)) + ! . ) + ! end do + ! + ! write(4 ,61)explIO,igrdIO(i5),jgrdIO(i5), + ! . jdarGE,jhlrGE(igrdIO(i5),jgrdIO(i5)), + ! . jmmMAR,jssMAR,dt_dif, + ! . xxkm(igrdIO(i5)), + ! . SLlmo(igrdIO(i5),jgrdIO(i5)), + ! . zi__TE(igrdIO(i5),jgrdIO(i5)) + !c #WE if (mod(jhaMAR,12).eq.0) + !c #WE. write(25,61)explIO,igrdIO(i5),jgrdIO(i5), + !c #WE. jdarGE,jhlrGE(igrdIO(i5),jgrdIO(i5)), + !c #WE. jmmMAR,jssMAR,dt_dif, + !c #WE. xxkm(igrdIO(i5)), + !c #WE. SLlmo(igrdIO(i5),jgrdIO(i5)), + !c #WE. zi__TE(igrdIO(i5),jgrdIO(i5)) + ! 61 format(/,' EXP.',a3,' / Pt. (',i3,',',i3,')', + ! . ' / Turbulence Characteristics on', + ! . i5,'d',i2,'LT',i2,'m',i2,'s - dt=',f6.0, + ! . /,' ------------------------------------------', + ! . '-----------------------------------------', + ! . /,' x =',f5.0,'km',3x,'Lo =',e9.2,'m' ,3x,'zi =',f6.0,'m', + ! . /,' lev Altit. Temper. Pot.T. Wind_u Wind_v TKE ', + ! . ' epsilon Buoyancy Le Lk Le(e) Prandtl Kvm', + ! . ' Kvh Kvh MAX', + ! . /,' [m] [K] [K] [m/s] [m/s] [m2/s2] ', + ! . ' [m2/s2] [s-2] [m] [m] [m] [-] [m2/s]', + ! . ' [m2/s] [m2/s]') + ! write(4 ,62)(k, + ! . 0.1019*gplvDY(igrdIO(i5),jgrdIO(i5),k), + ! . tairDY(igrdIO(i5),jgrdIO(i5),k), + ! . 3.7300*pktaDY(igrdIO(i5),jgrdIO(i5),k), + ! . uairDY(igrdIO(i5),jgrdIO(i5),k), + ! . vairDY(igrdIO(i5),jgrdIO(i5),k), + ! . 0.1019*gpmiDY(igrdIO(i5),jgrdIO(i5),k+1), + ! . ect_TE(igrdIO(i5),jgrdIO(i5),k), + ! . eps_TE(igrdIO(i5),jgrdIO(i5),k), + ! . flott(i5,k) ,aalme(i5,k) ,aalmk(i5,k),WKxza(i5,k), + ! . TU_Pra(igrdIO(i5),jgrdIO(i5),k), + ! . TUkvm(igrdIO(i5),jgrdIO(i5),k), + ! . TUkvh(igrdIO(i5),jgrdIO(i5),k), + ! . KvhMax(igrdIO(i5),jgrdIO(i5),k), + ! . k=1,mz) + ! write(4 ,620) + ! 620 format( + ! . ' lev Altit. Temper. Pot.T. Wind_u Wind_v TKE ', + ! . ' epsilon Buoyancy Le Lk Le(e) Prandtl Kvm', + ! . ' Kvh Kvh MAX', + ! . /,' [m] [K] [K] [m/s] [m/s] [m2/s2] ', + ! . ' [m2/s2] [s-2] [m] [m] [m] [-] [m2/s]', + ! . ' [m2/s] [m2/s]', + ! . /,1x) + !c #WE if (mod(jhaMAR,12).eq.0) then + !c #WE m30=min(mz,30) + !c #WE write(25,62)(k, + !c #WE. 0.1019*gplvDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. tairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. 3.7300*pktaDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. uairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. vairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. 0.1019*gpmiDY(igrdIO(i5),jgrdIO(i5),k+1), + !c #WE. ect_TE(igrdIO(i5),jgrdIO(i5),k), + !c #WE. eps_TE(igrdIO(i5),jgrdIO(i5),k), + !c #WE. flott(i5,k) ,aalme(i5,k) ,aalmk(i5,k),WKxza(i5,k), + !c #WE. TU_Pra(igrdIO(i5),jgrdIO(i5),k), + !c #WE. TUkvm(igrdIO(i5),jgrdIO(i5),k), + !c #WE. TUkvh(igrdIO(i5),jgrdIO(i5),k), + !c #WE. KvhMax(igrdIO(i5),jgrdIO(i5),k), + !c #WE. k=1,m30) + !c #WE write(25,64) + ! 64 format(/////) + !c #WE write(25,61)explIO,jhlrGE(igrdIO(i5),jgrdIO(i5)), + !c #WE. minuGE,jsecGE,dt_dif, + !c #WE. xxkm(igrdIO(i5)), + !c #WE. SLlmo(igrdIO(i5),jgrdIO(i5)), + !c #WE. zi__TE(igrdIO(i5),jgrdIO(i5)) + !c #WE m31=min(mz,31) + !c #WE if (mz.ge.m31) + !c #WE. write(25,62)(k, + !c #WE. 0.1019*gplvDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. tairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. 3.7300*pktaDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. uairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. vairDY(igrdIO(i5),jgrdIO(i5),k), + !c #WE. 0.1019*gpmiDY(igrdIO(i5),jgrdIO(i5),k+1), + !c #WE. ect_TE(igrdIO(i5),jgrdIO(i5),k), + !c #WE. eps_TE(igrdIO(i5),jgrdIO(i5),k), + !c #WE. flott(i5,k) ,aalme(i5,k) ,aalmk(i5,k),WKxza(i5,k), + !c #WE. TU_Pra(igrdIO(i5),jgrdIO(i5),k), + !c #WE. TUkvm(igrdIO(i5),jgrdIO(i5),k), + !c #WE. TUkvh(igrdIO(i5),jgrdIO(i5),k), + !c #WE. KvhMax(igrdIO(i5),jgrdIO(i5),k), + !c #WE. k=m31,mz) + !c #WE end if + ! 62 format((i4,f8.0,2f8.2,2f7.2, + ! . /,4x,f8.0,30x,3e9.2,2f6.1,5f8.2)) + ! write(4,63) SL_z0(igrdIO(i5),jgrdIO(i5),1), + ! . TairSL(igrdIO(i5),jgrdIO(i5)) , + ! . SLuus(igrdIO(i5),jgrdIO(i5)) + ! 63 format( 4x,f8.6, f8.2,8x,f8.3) + ! + ! do k=1,mz + ! WKxza(i5,k) = 0.0 + ! end do + ! + ! end do + ! end if + + ! +--Work Arrays Reset + ! + ================= + + ! do j=1,my + do i = 1, mx + WKxy1(i, j) = 0.0 + WKxy2(i, j) = 0.0 + WKxy3(i, j) = 0.0 + WKxy4(i, j) = 0.0 + WKxy5(i, j) = 0.0 + enddo + ! end do + + do k = 1, mz + ! do j=1,my + do i = 1, mx + WKxyz1(i, j, k) = 0.0 + WKxyz2(i, j, k) = 0.0 + WKxyz3(i, j, k) = 0.0 + WKxyz4(i, j, k) = 0.0 + WKxyz5(i, j, k) = 0.0 + WKxyz6(i, j, k) = 0.0 + WKxyz7(i, j, k) = 0.0 + WKxyz8(i, j, k) = 0.0 + tranTE(i, j, k) = 0.0 + enddo + enddo + enddo +!$OMP END PARALLEL DO + + locTKE = 1 + ! +...locTKE: turn on TKE Evolution + + return +endsubroutine turtke_gen