- Timestamp:
- Sep 21, 2021, 9:02:49 AM (4 years ago)
- Location:
- trunk/LMDZ.MARS
- Files:
-
- 1 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/README
r2561 r2562 2466 2466 microphysics (just like water clouds). The amplitude is spantCO2, also read from callphys.def 2467 2467 - The previous logical microphysco2 has been removed. 2468 - Cloud opacity at 1 µm is now computed in the co2cloud.F routine2468 - Cloud opacity at 1µm is now computed in the co2cloud.F routine 2469 2469 - Most of the co2 ice clouds scheme writediagfi are now in co2clouds.F 2470 2470 - Some cleaning of the CO2 ice clouds routine has been done. Not perfect yet! … … 2482 2482 if a gravity wave propagates to the mesosphere or not (wheter the wave saturates on its way or not). 2483 2483 The sub-grid temperature distribution is cancelled if the saturation index value of the column (between 12 and 80 km) is > 0.1, and is applied (+/- 3K) otherwise. if the keyword satindexco2=.true. in callphys.def (only applies if CLFvaryingCO2=.true. anyway). If set to .false., deactivate this filter and the sub grid T distribution applies everywhere and everytime. See comments in co2clouds.F 2484 - All that you need to launch a GCM run with co2 clouds is described in co2clouds.F comments. Ehouarn Millour and Anni M äättänen have the files.2484 - All that you need to launch a GCM run with co2 clouds is described in co2clouds.F comments. Ehouarn Millour and Anni Määttänen have the files. 2485 2485 2486 2486 == 15/11/2017 == EM … … 3446 3446 == 07/09/2021 == EM 3447 3447 Some code cleanup and refactoring around wstats: 3448 - turn wstats.F90 3448 - turn wstats.F90�in a module 3449 3449 - remove no useless statto_mod.F90 3450 3450 - incorporate auxilliary inistats and mkstats routines in wstats_mod.F90 … … 3459 3459 h2o_ice_s into watercap if the amount of h2o_ice_s is above the frost_metam_threshold (on watercaptag only). 3460 3460 One could see it as water frost converted into perennial ice. 3461 3462 == 20/09/2021 == CM 3463 CO2 clouds microphysics improvements: 3464 - add sedimentation at the surface of CNs tracers 3465 - add tracers ccnco2_h2o_mass_ice, ccnco2_h2o_mass_ccn, ccnco2_h2o_number in place of mem_Nccn_co2, mem_Qccn_co2 3466 - modification of updaterice_microco2 to take into account water ice as CN and not only dust as CN -
trunk/LMDZ.MARS/libf/phymars/callsedim_mod.F
r2447 r2562 159 159 INTEGER,SAVE :: iccnco2_number ! index of tracer containing CCN number 160 160 INTEGER,SAVE :: iccnco2_mass ! index of tracer containing CCN number 161 INTEGER,SAVE :: iccnco2_h2o_number ! index of tracer containing CCN number 162 INTEGER,SAVE :: iccnco2_h2o_mass_ice ! index of tracer containing CCN number 163 INTEGER,SAVE :: iccnco2_h2o_mass_ccn ! index of tracer containing CCN number 161 164 INTEGER,SAVE :: ico2_ice ! index of tracer containing CCN number 162 165 … … 241 244 iccnco2_mass=0 242 245 iccnco2_number=0 246 iccnco2_h2o_mass_ice=0 247 iccnco2_h2o_mass_ccn=0 248 iccnco2_h2o_number=0 243 249 ico2_ice=0 244 250 do iq=1,nq … … 254 260 iccnco2_number=iq 255 261 write(*,*)"callsedim: iccnco2_number=",iccnco2_number 262 endif 263 if (noms(iq).eq."ccnco2_h2o_number") then 264 iccnco2_h2o_number=iq 265 write(*,*)"callsedim: iccnco2_h2o_number=", 266 & iccnco2_h2o_number 267 endif 268 if (noms(iq).eq."ccnco2_h2o_mass_ice") then 269 iccnco2_h2o_mass_ice=iq 270 write(*,*)"callsedim: iccnco2_h2o_mass_ice=", 271 & iccnco2_h2o_mass_ice 272 endif 273 if (noms(iq).eq."ccnco2_h2o_mass_ccn") then 274 iccnco2_h2o_mass_ccn=iq 275 write(*,*)"callsedim: iccnco2_h2o_mass_ccn=", 276 & iccnco2_h2o_mass_ccn 256 277 endif 257 278 enddo … … 263 284 call abort_physic(modname,"missing co2 ccn tracers",1) 264 285 endif 286 if (co2useh2o) then 287 if((iccnco2_h2o_mass_ccn.eq.0).or. 288 & (iccnco2_h2o_mass_ice.eq.0).or. 289 & (iccnco2_h2o_number.eq.0)) then 290 write(*,*) 'callsedim: error! could not identify' 291 write(*,*) ' tracers for ccn co2 mass and number mixing' 292 write(*,*) ' ratio and co2clouds are activated!' 293 call abort_physic(modname,"missing co2 ccn tracers",1) 294 end if 295 end if 265 296 ENDIF !of if (co2clouds) 266 297 … … 398 429 if(radius(iq).gt.1.e-9 .and.(iq.ne.ico2_ice) .and. 399 430 & (iq .ne. iccnco2_mass) .and. (iq .ne. 400 & iccnco2_number) .and. ! no sedim for gaz or CO2 clouds (done in microtimestep) 431 & iccnco2_number) .and. 432 & (iq.ne.iccnco2_h2o_number).and. 433 & (iq.ne.iccnco2_h2o_mass_ice).and. 434 & (iq.ne.iccnco2_h2o_mass_ccn).and. ! no sedim for gaz or CO2 clouds (done in microtimestep) 401 435 & iq .ne. igcm_hdo_ice) then !MVals: hdo is transported by h2o 402 436 c ----------------------------------------------------------------- -
trunk/LMDZ.MARS/libf/phymars/co2cloud.F90
r2524 r2562 7 7 ! Contains subroutines: 8 8 ! - co2cloud: of co2 cloud microphysics 9 !10 ! - ini_co2cloud: (only used in phys_state_var_init_mod.F90)11 !12 ! - end_co2cloud: (only used in phys_state_var_init_mod.F90)13 9 !======================================================================================================================! 14 10 module co2cloud_mod 15 11 16 12 implicit none 17 18 double precision, allocatable, save :: &19 mem_Mccn_co2(:,:), &! Memory of CCN mass of H2O and dust used by CO220 mem_Mh2o_co2(:,:), &! Memory of H2O mass integred into CO2 crystal21 mem_Nccn_co2(:,:) ! Memory of CCN number of H2O and dust used by CO222 13 23 14 contains … … 98 89 !======================================================================================================================! 99 90 subroutine co2cloud(ngrid, nlay, ptimestep, pplev, pplay, pdpsrf, pzlay, pt, pdt, pq, pdq, pdqcloudco2, pdtcloudco2, & 100 nq, tau, tauscaling, rdust, rice, riceco2, nuice, rhocloud, rsedcloudco2, rhocloudco2, pzlev, pdqs_sedco2, pdu,&101 p u, pcondicea, co2ice)91 nq, tau, tauscaling, rdust, rice, riceco2, nuice, rhocloud, rsedcloudco2, rhocloudco2, pzlev,& 92 pdqs_sedco2, pdqs_sedccn, pdu, pu, pcondicea, co2ice) 102 93 103 94 use ioipsl_getincom, only: getin … … 107 98 use conc_mod, only: mmean, rnew 108 99 use tracer_mod, only: igcm_co2, igcm_co2_ice, igcm_dust_mass, igcm_dust_number, igcm_h2o_ice, & 109 igcm_ccn_mass, igcm_ccn_number, igcm_ccnco2_mass, igcm_ccnco2_number, rho_dust, & 100 igcm_ccn_mass, igcm_ccn_number, igcm_ccnco2_mass, igcm_ccnco2_number, & 101 igcm_ccnco2_h2o_number, igcm_ccnco2_h2o_mass_ice, igcm_ccnco2_h2o_mass_ccn, rho_dust, & 110 102 nuiceco2_sed, nuiceco2_ref, r3n_q, rho_ice, nuice_sed 111 103 … … 159 151 rhocloud(ngrid,nlay), & ! Water Cloud density (kg.m-3) 160 152 pdqs_sedco2(ngrid), & ! CO2 flux at the surface 153 pdqs_sedccn(ngrid,nq), & ! CCN flux at the surface 161 154 pdqcloudco2(ngrid,nlay,nq),& ! Tendency due to CO2 condensation (kg/kg.s-1) 162 155 pcondicea(ngrid,nlay), & ! Rate of condensation/sublimation of co2 ice in layers … … 240 233 subpdqsed(ngrid,nlay,nq), &! Tendancy due to sedimentation 241 234 sum_subpdqs_sedco2(ngrid), &! CO2 flux at the surface 242 ! ---For sub grid T distribution 235 sum_subpdqs_sedccn(ngrid,nq), &! 236 ! ---For sub grid T distribution 243 237 zt(ngrid,nlay), &! Local value of temperature 244 238 zq_co2vap(ngrid, nlay), &! Local value of CO2 vap … … 251 245 Nccnco2, &! buffer: number of ccn used for co2 condensation 252 246 Qccnco2, &! buffer: mass of ccn used for co2 condensation 247 Nccnco2_h2o, & 248 Qccnco2_h2o, & 253 249 Niceco2, &! buffer: mmr co2 ice 254 250 epaisseur(ngrid,nlay), &! Layer thickness (m) … … 420 416 zqsed0(1:ngrid,1:nlay,1:nq) = 0. 421 417 sum_subpdqs_sedco2(1:ngrid) = 0. 418 sum_subpdqs_sedccn(1:ngrid,1:nq) = 0. 422 419 subpdqsed(1:ngrid,1:nlay,1:nq) = 0. 423 420 !----------------------------------------------------------------------------------------------------------------------! … … 600 597 601 598 sum_subpdq(ig,l,igcm_ccn_number) = sum_subpdq(ig,l,igcm_ccn_number) + pdq(ig,l,igcm_ccn_number) 599 600 sum_subpdq(ig,l,igcm_ccnco2_h2o_number) = sum_subpdq(ig,l,igcm_ccnco2_h2o_number) + & 601 pdq(ig,l,igcm_ccnco2_h2o_number) 602 603 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) + & 604 pdq(ig,l,igcm_ccnco2_h2o_mass_ice) 605 606 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) + & 607 pdq(ig,l,igcm_ccnco2_h2o_mass_ccn) 602 608 end if 603 609 end do ! ngrid … … 607 613 !----------------------------------------------------------------------------------------------------------------------! 608 614 call improvedco2clouds(ngrid, nlay, microtimestep, pplay, pplev, pteff, sum_subpdt, pqeff, sum_subpdq, & 609 subpdqcloudco2, subpdtcloudco2, nq, tauscaling, mem_Mccn_co2, mem_Mh2o_co2, mem_Nccn_co2, & 610 rb_cldco2, sigma_iceco2, dev2) 615 subpdqcloudco2, subpdtcloudco2, nq, tauscaling, rb_cldco2, sigma_iceco2, dev2) 611 616 612 617 do l = 1, nlay 613 618 do ig = 1, ngrid 614 619 if(pq(ig,l,igcm_co2_ice) + microtimestep*(sum_subpdq(ig,l,igcm_co2_ice)+subpdqcloudco2(ig,l,igcm_co2_ice)) & 615 .le.1.e-12) then620 <= 1.e-12) then 616 621 subpdqcloudco2(ig,l,igcm_co2_ice) = -pq(ig,l,igcm_co2_ice)/microtimestep - sum_subpdq(ig,l,igcm_co2_ice) 617 622 subpdqcloudco2(ig,l,igcm_co2) = -subpdqcloudco2(ig,l,igcm_co2_ice) 618 623 end if 619 624 620 if(pq(ig,l,igcm_co2) + microtimestep*(sum_subpdq(ig,l,igcm_co2)+subpdqcloudco2(ig,l,igcm_co2)) .le.1.e-12) then625 if(pq(ig,l,igcm_co2) + microtimestep*(sum_subpdq(ig,l,igcm_co2)+subpdqcloudco2(ig,l,igcm_co2)) <= 1.e-12) then 621 626 subpdqcloudco2(ig,l,igcm_co2) = - pq(ig,l,igcm_co2)/microtimestep - sum_subpdq(ig,l,igcm_co2) 622 627 subpdqcloudco2(ig,l,igcm_co2_ice) = -subpdqcloudco2(ig,l,igcm_co2) 623 628 end if 629 624 630 ! ccnco2_number and ccnco2_mass 625 631 if (((pq(ig,l,igcm_ccnco2_number)+(sum_subpdq(ig,l,igcm_ccnco2_number)+subpdqcloudco2(ig,l,igcm_ccnco2_number)) & 626 *microtimestep) .le.1.) .or. &632 *microtimestep)<=1.) .or. & 627 633 (pq(ig,l,igcm_ccnco2_mass)+(sum_subpdq(ig,l,igcm_ccnco2_mass)+subpdqcloudco2(ig,l,igcm_ccnco2_mass)) & 628 *microtimestep .le.1e-20)) then634 *microtimestep<=1e-20)) then 629 635 subpdqcloudco2(ig,l,igcm_ccnco2_number) = - pq(ig,l,igcm_ccnco2_number)/microtimestep + 1. & 630 636 - sum_subpdq(ig,l,igcm_ccnco2_number) … … 635 641 subpdqcloudco2(ig,l,igcm_dust_mass) = - subpdqcloudco2(ig,l,igcm_ccnco2_mass) 636 642 end if 643 644 ! ccnco2_h2o_number and masses 645 if (co2useh2o) then 646 if (((pq(ig,l,igcm_ccnco2_h2o_number) + (sum_subpdq(ig,l,igcm_ccnco2_h2o_number) + & 647 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_number)) & 648 *microtimestep)<=1.) .or. & 649 (pq(ig,l,igcm_ccnco2_h2o_mass_ice)+pq(ig,l,igcm_ccnco2_h2o_mass_ccn) +& 650 (sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice)+subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) +& 651 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn)+subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn)) & 652 *microtimestep<=1e-20)) then 653 654 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_number) = - pq(ig,l,igcm_ccnco2_h2o_number)/microtimestep + 1. & 655 - sum_subpdq(ig,l,igcm_ccnco2_h2o_number) 656 subpdqcloudco2(ig,l,igcm_ccn_number) = - subpdqcloudco2(ig,l,igcm_ccnco2_h2o_number) 657 658 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) = - pq(ig,l,igcm_ccnco2_h2o_mass_ice)/microtimestep + 1e-20 & 659 - sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) 660 661 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) = - pq(ig,l,igcm_ccnco2_h2o_mass_ccn)/microtimestep + 1e-20 & 662 - sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) 663 664 subpdqcloudco2(ig,l,igcm_ccn_mass) = - subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) & 665 - subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) 666 end if 667 end if 637 668 end do 638 669 end do … … 663 694 664 695 sum_subpdq(ig,l,igcm_ccn_number) = sum_subpdq(ig,l,igcm_ccn_number) + subpdqcloudco2(ig,l,igcm_ccn_number) 696 697 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) + & 698 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) 699 700 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) + & 701 subpdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) 702 703 sum_subpdq(ig,l,igcm_ccnco2_h2o_number) = sum_subpdq(ig,l,igcm_ccnco2_h2o_number) + & 704 subpdqcloudco2(ig,l,igcm_ccnco2_number) 705 665 706 end if 666 707 end do ! ngrid … … 686 727 Qccnco2 = max(zqsed(ig,l,igcm_ccnco2_mass), threshold) 687 728 729 Nccnco2_h2o = 0. 730 Qccnco2_h2o = 0. 731 if (co2useh2o) then 732 Nccnco2_h2o = max(zqsed(ig,l,igcm_ccnco2_h2o_number), threshold) 733 Qccnco2_h2o = max(zqsed(ig,l,igcm_ccnco2_h2o_mass_ice)+zqsed(ig,l,igcm_ccnco2_h2o_mass_ccn), threshold) 734 Nccnco2 = Nccnco2 - Nccnco2_h2o 735 Qccnco2 = Qccnco2 - Qccnco2_h2o 736 end if 737 688 738 ! Get density cloud and co2 ice particle radius 689 if (Niceco2 .ne.0d0) then690 call updaterice_microco2(dble(Niceco2), dble(Qccnco2), dble(Nccnco2), ztsed(ig,l), tauscaling(ig),&691 riceco2(ig,l), rhocloudco2t(ig,l))739 if (Niceco2/=0d0) then 740 call updaterice_microco2(dble(Niceco2), dble(Qccnco2), dble(Nccnco2), dble(Qccnco2_h2o), dble(Nccnco2_h2o),& 741 ztsed(ig,l), tauscaling(ig), riceco2(ig,l), rhocloudco2t(ig,l)) 692 742 else 693 743 riceco2(ig,l) = 0. … … 702 752 zqsed0(:,:,igcm_ccnco2_mass) = zqsed(:,:,igcm_ccnco2_mass) 703 753 zqsed0(:,:,igcm_ccnco2_number) = zqsed(:,:,igcm_ccnco2_number) 754 755 if (co2useh2o) then 756 zqsed0(:,:,igcm_ccnco2_h2o_number) = zqsed(:,:,igcm_ccnco2_h2o_number) 757 zqsed0(:,:,igcm_ccnco2_h2o_mass_ice) = zqsed(:,:,igcm_ccnco2_h2o_mass_ice) 758 zqsed0(:,:,igcm_ccnco2_h2o_mass_ccn) = zqsed(:,:,igcm_ccnco2_h2o_mass_ccn) 759 end if 704 760 !----------------------------------------------------------------------------------------------------------------------! 705 761 ! 4.3.c. Sedimentation of co2 ice … … 726 782 call newsedim(ngrid, nlay, ngrid*nlay, ngrid*nlay, microtimestep, pplev, masse, epaisseur, ztsed, & 727 783 rsedcloudco2, rhocloudco2t, zqsed(:,:,igcm_ccnco2_mass), wq, beta) 728 !TODO: ajouter le calcule de la tendance a la surface comme co2ice 784 do ig = 1, ngrid 785 sum_subpdqs_sedccn(ig,igcm_ccnco2_mass) = sum_subpdqs_sedccn(ig,igcm_ccnco2_mass) + wq(ig,1) / microtimestep 786 end do 729 787 730 788 wq(:,:) = 0. … … 732 790 call newsedim(ngrid, nlay, ngrid*nlay, ngrid*nlay,microtimestep, pplev, masse, epaisseur, ztsed, & 733 791 rsedcloudco2, rhocloudco2t, zqsed(:,:,igcm_ccnco2_number), wq, beta) 734 !TODO: ajouter le calcule de la tendance a la surface comme co2ice 792 do ig = 1, ngrid 793 sum_subpdqs_sedccn(ig,igcm_ccnco2_number) = sum_subpdqs_sedccn(ig,igcm_ccnco2_number) + wq(ig,1) / microtimestep 794 end do 795 796 ! for ccnco2_h2o_mass_ice 797 if (co2useh2o) then 798 wq(:,:) = 0. 799 call newsedim(ngrid, nlay, ngrid*nlay, ngrid*nlay,microtimestep, pplev, masse, epaisseur, ztsed, & 800 rsedcloudco2, rhocloudco2t, zqsed(:,:,igcm_ccnco2_h2o_mass_ice), wq, beta) 801 do ig = 1, ngrid 802 sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_mass_ice) = sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_mass_ice) + & 803 wq(ig,1) / microtimestep 804 end do 805 806 wq(:,:) = 0. 807 ! for ccnco2_h2o_mass_ccn 808 call newsedim(ngrid, nlay, ngrid*nlay, ngrid*nlay,microtimestep, pplev, masse, epaisseur, ztsed, & 809 rsedcloudco2, rhocloudco2t, zqsed(:,:,igcm_ccnco2_h2o_mass_ccn), wq, beta) 810 do ig = 1, ngrid 811 sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_mass_ccn) = sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_mass_ccn) + & 812 wq(ig,1) / microtimestep 813 end do 814 815 wq(:,:) = 0. 816 ! for ccnco2_h2o_number 817 call newsedim(ngrid, nlay, ngrid*nlay, ngrid*nlay,microtimestep, pplev, masse, epaisseur, ztsed, & 818 rsedcloudco2, rhocloudco2t, zqsed(:,:,igcm_ccnco2_h2o_number), wq, beta) 819 do ig = 1, ngrid 820 sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_number) = sum_subpdqs_sedccn(ig,igcm_ccnco2_h2o_number) + & 821 wq(ig,1) / microtimestep 822 end do 823 end if 735 824 !----------------------------------------------------------------------------------------------------------------------! 736 825 ! 4.3.e. Compute tendencies due to the sedimation process … … 745 834 746 835 subpdqsed(ig,l,igcm_co2_ice) = ( zqsed(ig,l,igcm_co2_ice) - zqsed0(ig,l,igcm_co2_ice) ) / microtimestep 836 837 if (co2useh2o) then 838 subpdqsed(ig,l,igcm_ccnco2_h2o_number) = ( zqsed(ig,l,igcm_ccnco2_h2o_number) - & 839 zqsed0(ig,l,igcm_ccnco2_h2o_number) ) / microtimestep 840 841 subpdqsed(ig,l,igcm_ccnco2_h2o_mass_ice) = ( zqsed(ig,l,igcm_ccnco2_h2o_mass_ice) - & 842 zqsed0(ig,l,igcm_ccnco2_h2o_mass_ice) ) / microtimestep 843 844 subpdqsed(ig,l,igcm_ccnco2_h2o_mass_ccn) = ( zqsed(ig,l,igcm_ccnco2_h2o_mass_ccn) - & 845 zqsed0(ig,l,igcm_ccnco2_h2o_mass_ccn) ) / microtimestep 846 end if 747 847 end do 748 848 end do … … 755 855 756 856 sum_subpdq(ig,l,igcm_co2_ice) = sum_subpdq(ig,l,igcm_co2_ice) + subpdqsed(ig,l,igcm_co2_ice) 857 if (co2useh2o) then 858 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) + & 859 subpdqsed(ig,l,igcm_ccnco2_h2o_mass_ice) 860 861 sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) = sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) + & 862 subpdqsed(ig,l,igcm_ccnco2_h2o_mass_ccn) 863 864 sum_subpdq(ig,l,igcm_ccnco2_h2o_number) = sum_subpdq(ig,l,igcm_ccnco2_h2o_number) + & 865 subpdqsed(ig,l,igcm_ccnco2_h2o_number) 866 end if 757 867 end do 758 868 end do … … 772 882 do ig = 1, ngrid 773 883 pdqs_sedco2(ig) = sum_subpdqs_sedco2(ig) / real(imicroco2) 884 pdqs_sedccn(ig,:) = sum_subpdqs_sedccn(ig,:) / real(imicroco2) 774 885 end do 886 775 887 ! temperature tendency (T.s-1) 776 888 do l = 1, nlay … … 808 920 pdqcloudco2(ig,l,igcm_ccn_number) = ( sum_subpdq(ig,l,igcm_ccn_number) / real(imicroco2) ) - & 809 921 pdq(ig,l,igcm_ccn_number) 922 923 pdqcloudco2(ig,l,igcm_ccnco2_h2o_number) = ( sum_subpdq(ig,l,igcm_ccnco2_h2o_number) / real(imicroco2) ) - & 924 pdq(ig,l,igcm_ccnco2_h2o_number) 925 926 pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) = ( sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ice) / real(imicroco2) ) - & 927 pdq(ig,l,igcm_ccnco2_h2o_mass_ice) 928 929 pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) = ( sum_subpdq(ig,l,igcm_ccnco2_h2o_mass_ccn) / real(imicroco2) )- & 930 pdq(ig,l,igcm_ccnco2_h2o_mass_ccn) 931 810 932 end if 811 933 end do ! ngrid … … 831 953 myT = pteff(ig,l) + (pdt(ig,l)+pdtcloudco2(ig,l))*ptimestep 832 954 955 Nccnco2_h2o = 0. 956 Qccnco2_h2o = 0. 957 if (co2useh2o) then 958 Nccnco2_h2o = max( (pqeff(ig,l,igcm_ccnco2_h2o_number) + (pdq(ig,l,igcm_ccnco2_h2o_number) + & 959 pdqcloudco2(ig,l, igcm_ccnco2_h2o_number)) * ptimestep) & 960 , threshold) 961 962 Qccnco2_h2o = max( (pqeff(ig,l,igcm_ccnco2_h2o_mass_ice) + pqeff(ig,l,igcm_ccnco2_h2o_mass_ccn) + & 963 (pdq(ig,l,igcm_ccnco2_h2o_mass_ice) + pdq(ig,l,igcm_ccnco2_h2o_mass_ccn) + & 964 pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) + pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn)) * & 965 ptimestep)& 966 , threshold) 967 Nccnco2 = Nccnco2 - Nccnco2_h2o 968 Qccnco2 = Qccnco2 - Qccnco2_h2o 969 end if 833 970 ! Compute particle size 834 call updaterice_microco2(dble(Niceco2), dble(Qccnco2), dble(Nccnco2), myT, tauscaling(ig), riceco2(ig,l), &835 rhocloudco2(ig,l))971 call updaterice_microco2(dble(Niceco2), dble(Qccnco2), dble(Nccnco2), dble(Qccnco2_h2o), dble(Nccnco2_h2o), myT, & 972 tauscaling(ig), riceco2(ig,l), rhocloudco2(ig,l)) 836 973 837 974 ! Compute opacities 838 if ( (Niceco2 <= threshold .or. Nccnco2*tauscaling(ig) <= 1.) ) then975 if ( (Niceco2 <= threshold .or. (Nccnco2)*tauscaling(ig) <= 1.) ) then ! Nccnco2 inclut Nccnco2_h2o 839 976 riceco2(ig,l) = 0. 840 977 Qext1bins2(ig,l) = 0. … … 844 981 845 982 do i = 1, nbinco2_cld 846 n_aer(i) = -0.5 * Nccnco2*tauscaling(ig) * n_derf983 n_aer(i) = -0.5 * (Nccnco2)*tauscaling(ig) * n_derf 847 984 848 985 n_derf = derf((rb_cldco2(i+1)-log(riceco2(ig,l))) *dev2) 849 n_aer(i) = n_aer(i) + (0.5 * Nccnco2*tauscaling(ig) * n_derf)986 n_aer(i) = n_aer(i) + (0.5 * (Nccnco2)*tauscaling(ig) * n_derf) 850 987 851 988 Qext1bins2(ig,l) = Qext1bins2(ig,l) + Qext1bins(i) * n_aer(i) … … 928 1065 929 1066 pdqcloudco2(ig,l,igcm_ccn_number) = pdqcloudco2(ig,l,igcm_ccn_number) * co2cloudfrac(ig,l) 1067 1068 pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) = pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ice) * co2cloudfrac(ig,l) 1069 1070 pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) = pdqcloudco2(ig,l,igcm_ccnco2_h2o_mass_ccn) * co2cloudfrac(ig,l) 1071 1072 pdqcloudco2(ig,l,igcm_ccnco2_h2o_number) = pdqcloudco2(ig,l,igcm_ccnco2_h2o_number) * co2cloudfrac(ig,l) 930 1073 end if 931 1074 end do ! ngrid … … 960 1103 call WRITEDIAGFI(ngrid, "tau1mic", "co2 ice opacity 1 micron", " ", 2, tau1mic) 961 1104 962 call WRITEDIAGFI(ngrid, "mem_Nccn_co2", "CCN number used by CO2", "kg.kg-1", 3, mem_Nccn_co2)963 964 call WRITEDIAGFI(ngrid, "mem_Mccn_co2", "CCN mass used by CO2", "kg.kg-1", 3, mem_Mccn_co2)965 966 call WRITEDIAGFI(ngrid, "mem_Mh2o_co2", "H2O mass in CO2 crystal", "kg.kg-1", 3, mem_Mh2o_co2)967 1105 if (CLFvaryingCO2) then 968 1106 call WRITEDIAGFI(ngrid, "co2cloudfrac", "co2 cloud fraction", " ", 3, co2cloudfrac) … … 973 1111 end subroutine co2cloud 974 1112 975 976 !**********************************************************************************************************************!977 !**********************************************************************************************************************!978 979 980 !======================================================================================================================!981 ! SUBROUTINE: ini_co2cloud ============================================================================================!982 !======================================================================================================================!983 ! Subject:984 !---------985 ! Allocate arrays used for co2 microphysics986 !======================================================================================================================!987 subroutine ini_co2cloud(ngrid,nlayer)988 989 implicit none990 991 integer, intent(in) :: &992 ngrid, &! number of atmospheric columns993 nlayer ! number of atmospheric layers994 995 allocate(mem_Nccn_co2(ngrid,nlayer))996 allocate(mem_Mccn_co2(ngrid,nlayer))997 allocate(mem_Mh2o_co2(ngrid,nlayer))998 999 end subroutine ini_co2cloud1000 1001 !**********************************************************************************************************************!1002 !**********************************************************************************************************************!1003 1004 !======================================================================================================================!1005 ! SUBROUTINE: end_co2cloud ============================================================================================!1006 !======================================================================================================================!1007 ! Subject:1008 !---------1009 ! Deallocate arrays used for co2 microphysics1010 !======================================================================================================================!1011 subroutine end_co2cloud1012 1013 implicit none1014 1015 if (allocated(mem_Nccn_co2)) deallocate(mem_Nccn_co2)1016 if (allocated(mem_Mccn_co2)) deallocate(mem_Mccn_co2)1017 if (allocated(mem_Mh2o_co2)) deallocate(mem_Mh2o_co2)1018 1019 end subroutine end_co2cloud1020 1021 1113 end module co2cloud_mod -
trunk/LMDZ.MARS/libf/phymars/improvedco2clouds_mod.F90
r2494 r2562 61 61 !======================================================================================================================! 62 62 subroutine improvedCO2clouds(ngrid, nlay, microtimestep, pplay, pplev, pteff, sum_subpdt, pqeff, sum_subpdq, & 63 subpdqcloudco2, subpdtcloudco2, nq, tauscaling, mem_Mccn_co2, mem_Mh2o_co2, & 64 mem_Nccn_co2, rb_cldco2, sigma_iceco2, dev2) 63 subpdqcloudco2, subpdtcloudco2, nq, tauscaling, rb_cldco2, sigma_iceco2, dev2) 65 64 66 65 use comcstfi_h, only: pi, g, cpp … … 69 68 70 69 use tracer_mod, only: igcm_dust_mass, igcm_dust_number, rho_dust, igcm_h2o_ice, igcm_ccn_mass, igcm_ccn_number, & 71 nuice_sed, igcm_co2, igcm_co2_ice, igcm_ccnco2_mass, igcm_ccnco2_number, nuiceco2_sed, & 70 nuice_sed, igcm_co2, igcm_co2_ice, igcm_ccnco2_mass, igcm_ccnco2_number, & 71 igcm_ccnco2_h2o_mass_ice, igcm_ccnco2_h2o_mass_ccn, igcm_ccnco2_h2o_number, nuiceco2_sed, & 72 72 nuiceco2_ref 73 73 74 74 use conc_mod, only: mmean 75 75 76 use nucleaco2_mod, only: nucleaco2 76 77 use datafile_mod, only: datadir 77 78 … … 163 164 164 165 real :: & 166 Nccnco2, & 167 Qccnco2, & 168 Nccnco2_h2o, & 169 Qccnco2_h2o, & 165 170 masse(ngrid,nlay), &! mass layer (kg.m-2) 166 171 rice(ngrid,nlay), &! water ice mass mean radius (m): used for nucleation of CO2 on ice-coated ccns … … 189 194 n_derf, &! derf( (rb_cldco2(1)+Rn) *dev3) 190 195 m_derf, &! derf( (rb_cldco2(1)+Rm) *dev2) 191 mem_Mccn_co2(ngrid,nlay), &! Memory of CCN mass of H2O and dust used by CO2192 mem_Mh2o_co2(ngrid,nlay), &! Memory of H2O mass integred into CO2 crystal193 mem_Nccn_co2(ngrid,nlay), &! Memory of CCN number of H2O and dust used by CO2194 196 n_aer(nbinco2_cld), &! Radius used by the microphysical scheme (m) 195 197 m_aer(nbinco2_cld), &! number concentration V-1 of particle/each size bin 196 198 n_aer_h2oice(nbinco2_cld), &! mass mixing ratio of particle/each size bin 197 199 m_aer_h2oice(nbinco2_cld), &! Same - for CO2 nucleation 198 rad_h2oice(nbinco2_cld), &! Same - for CO2 nucleation199 200 Ic_rice, &! Mass transfer rate CO2 ice crystal 200 201 ratioh2o_ccn, &! 1./(zq(ig,l,igcm_h2o_ice) + zq(ig,l,igcm_ccn_mass)*tauscaling(ig)) … … 374 375 end do 375 376 376 ! Ajout meteor_ccn particles aux particules de poussière background377 if (meteo_flux) then378 do i = 1, nbinco2_cld379 n_aer(i) = n_aer(i) + meteor_ccn(ig,l,i)380 381 m_aer(i) = m_aer(i) + (4./3.) * pi * rho_dust *meteor_ccn(ig,l,i) * rad_cldco2(i)**3382 end do383 end if384 385 ! Same but with h2o particles as CCN only if co2useh2o = .true.386 n_aer_h2oice(:)=0.387 m_aer_h2oice(:)=0.388 389 if (co2useh2o) then390 call updaterice_micro(zq(ig,l,igcm_h2o_ice), zq(ig,l,igcm_ccn_mass), zq(ig,l,igcm_ccn_number), &391 tauscaling(ig), rice(ig,l), rhocloud(ig,l))392 393 Mo = zq(ig,l,igcm_h2o_ice) + zq(ig,l,igcm_ccn_mass) * tauscaling(ig) + threshold394 395 ! Total mass of H20 crystals,CCN included396 No = zq(ig,l,igcm_ccn_number) * tauscaling(ig) + threshold397 398 Rn = -log(rice(ig,l))399 400 Rm = Rn - 3. * sigma_ice * sigma_ice401 402 n_derf = derf( (rb_cldco2(1)+Rn) *dev3)403 m_derf = derf( (rb_cldco2(1)+Rm) *dev3)404 405 do i = 1, nbinco2_cld406 n_aer_h2oice(i) = -0.5 * No * n_derf407 m_aer_h2oice(i) = -0.5 * Mo * m_derf408 409 n_derf = derf( (rb_cldco2(i+1)+Rn) *dev3)410 m_derf = derf( (rb_cldco2(i+1)+Rm) *dev3)411 412 n_aer_h2oice(i) = n_aer_h2oice(i) + 0.5 * No * n_derf413 m_aer_h2oice(i) = m_aer_h2oice(i) + 0.5 * Mo * m_derf414 415 rad_h2oice(i) = rad_cldco2(i)416 end do417 end if418 419 377 ! Call to nucleation routine 420 call nucleaCO2(dble(pco2), zt(ig,l), dble(satu), n_aer, rate, n_aer_h2oice, rad_h2oice, rateh2o, vo2co2) 421 378 call nucleaco2(dble(pco2), zt(ig,l), dble(satu), n_aer, rate, vo2co2, mtetaco2) 422 379 dN = 0. 423 380 dM = 0. 424 dNh2o = 0.425 dMh2o = 0.426 381 427 382 do i = 1, nbinco2_cld … … 431 386 end do 432 387 433 if (co2useh2o) then 388 ! Now increment CCN tracers and update dust tracers 389 dNN = min(dN,zq(ig,l,igcm_dust_number)) ! dNN est devenu DN 390 dMM = min(dM,zq(ig,l,igcm_dust_mass)) ! idem dans le min 391 392 zq(ig,l,igcm_ccnco2_mass) = zq(ig,l,igcm_ccnco2_mass) + dMM /tauscaling(ig) 393 394 zq(ig,l,igcm_ccnco2_number) = zq(ig,l,igcm_ccnco2_number) + dNN /tauscaling(ig) 395 396 zq(ig,l,igcm_dust_mass) = zq(ig,l,igcm_dust_mass) - dMM /tauscaling(ig) 397 398 zq(ig,l,igcm_dust_number) = zq(ig,l,igcm_dust_number) - dNN /tauscaling(ig) 399 400 ! Ajout meteor_ccn particles aux particules de poussière background 401 if (meteo_flux) then 402 do i = 1, nbinco2_cld 403 n_aer(i) = n_aer(i) + meteor_ccn(ig,l,i) 404 405 m_aer(i) = m_aer(i) + (4./3.) * pi * rho_dust * meteor_ccn(ig,l,i) * rad_cldco2(i)**3 406 end do 407 end if 408 end if ! of if No > 1e-30 409 410 ! Same but with h2o particles as CCN only if co2useh2o = .true. 411 if (co2useh2o) then 412 call updaterice_micro(zq(ig,l,igcm_h2o_ice), zq(ig,l,igcm_ccn_mass), zq(ig,l,igcm_ccn_number), & 413 tauscaling(ig), rice(ig,l), rhocloud(ig,l)) 414 415 ! Total mass of H20 crystals,CCN included 416 Mo = zq(ig,l,igcm_h2o_ice) + zq(ig,l,igcm_ccn_mass) * tauscaling(ig) + threshold 417 418 No = zq(ig,l,igcm_ccn_number) * tauscaling(ig) + threshold 419 if (No > threshold) then 420 Rn = -log(rice(ig,l)) 421 422 Rm = Rn - 3. * sigma_ice * sigma_ice 423 424 n_derf = derf( (rb_cldco2(1)+Rn) *dev3) 425 m_derf = derf( (rb_cldco2(1)+Rm) *dev3) 426 427 n_aer_h2oice(:)=0. 428 m_aer_h2oice(:)=0. 429 do i = 1, nbinco2_cld 430 n_aer_h2oice(i) = -0.5 * No * n_derf 431 m_aer_h2oice(i) = -0.5 * Mo * m_derf 432 433 n_derf = derf( (rb_cldco2(i+1)+Rn) *dev3) 434 m_derf = derf( (rb_cldco2(i+1)+Rm) *dev3) 435 436 n_aer_h2oice(i) = n_aer_h2oice(i) + 0.5 * No * n_derf 437 m_aer_h2oice(i) = m_aer_h2oice(i) + 0.5 * Mo * m_derf 438 end do 439 440 call nucleaco2(dble(pco2), zt(ig,l), dble(satu), n_aer_h2oice, rateh2o, vo2co2, mteta) 441 dNh2o = 0. 442 dMh2o = 0. 443 434 444 do i = 1, nbinco2_cld 435 445 Probah2o = 1.0 - exp(-1.*microtimestep*rateh2o(i)) … … 437 447 dMh2o = dMh2o + m_aer_h2oice(i) * Probah2o 438 448 end do 439 end if 440 441 ! Now increment CCN tracers and update dust tracers 442 dNN = min(dN,zq(ig,l,igcm_dust_number)) ! dNN est devenu DN 443 dMM = min(dM,zq(ig,l,igcm_dust_mass)) ! idem dans le min 444 445 zq(ig,l,igcm_ccnco2_mass) = zq(ig,l,igcm_ccnco2_mass) + dMM /tauscaling(ig) 446 447 zq(ig,l,igcm_ccnco2_number) = zq(ig,l,igcm_ccnco2_number) + dNN /tauscaling(ig) 448 449 zq(ig,l,igcm_dust_mass) = zq(ig,l,igcm_dust_mass) - dMM /tauscaling(ig) 450 451 zq(ig,l,igcm_dust_number) = zq(ig,l,igcm_dust_number) - dNN /tauscaling(ig) 452 453 ! Update CCN for CO2 nucleating on H2O CCN : Warning: must keep memory of it 454 if (co2useh2o) then 449 450 ! Update CCN for CO2 nucleating on H2O CCN : Warning: must keep memory of it 455 451 dNNh2o = dNh2o/tauscaling(ig) 456 452 dNNh2o = min(dNNh2o,zq(ig,l,igcm_ccn_number)) … … 465 461 dMh2o_ice = min(dMh2o_ice,zq(ig,l,igcm_h2o_ice)) 466 462 467 zq(ig,l,igcm_ccnco2_mass) = zq(ig,l,igcm_ccnco2_mass) + dMh2o_ice + dMh2o_ccn 468 469 zq(ig,l,igcm_ccnco2_number) = zq(ig,l,igcm_ccnco2_number) + dNNh2o 470 471 zq(ig,l,igcm_ccn_number) = zq(ig,l,igcm_ccn_number) - dNNh2o 472 463 zq(ig,l,igcm_ccnco2_h2o_mass_ice) = zq(ig,l,igcm_ccnco2_h2o_mass_ice) + dMh2o_ice 464 zq(ig,l,igcm_ccnco2_h2o_mass_ccn) = zq(ig,l,igcm_ccnco2_h2o_mass_ccn) + dMh2o_ccn 465 zq(ig,l,igcm_ccnco2_h2o_number) = zq(ig,l,igcm_ccnco2_h2o_number) + dNNh2o 466 467 zq(ig,l,igcm_ccn_number) = zq(ig,l,igcm_ccn_number) - dNNh2o 473 468 zq(ig,l,igcm_h2o_ice) = zq(ig,l,igcm_h2o_ice) - dMh2o_ice 474 475 469 zq(ig,l,igcm_ccn_mass) = zq(ig,l,igcm_ccn_mass) - dMh2o_ccn 476 470 477 mem_Mh2o_co2(ig,l) = mem_Mh2o_co2(ig,l) + dMh2o_ice 478 mem_Mccn_co2(ig,l) = mem_Mccn_co2(ig,l) + dMh2o_ccn 479 mem_Nccn_co2(ig,l) = mem_Nccn_co2(ig,l) + dNNh2o 480 end if ! of if co2useh2o 481 end if ! of if No > 1e-30 471 zq(ig,l,igcm_ccnco2_mass) = zq(ig,l,igcm_ccnco2_mass) + dMh2o_ice + dMh2o_ccn 472 zq(ig,l,igcm_ccnco2_number) = zq(ig,l,igcm_ccnco2_number) + dNNh2o 473 end if 474 end if ! of if co2useh2o 482 475 end if ! of is satu > 1 483 476 !----------------------------------------------------------------------------------------------------------------------! … … 489 482 !----------------------------------------------------------------------------------------------------------------------! 490 483 ! we trigger crystal growth 491 if (zq(ig,l,igcm_ccnco2_number) * tauscaling(ig) + threshold >= 1) then 492 493 call updaterice_microco2(dble(zq(ig,l,igcm_co2_ice)), dble(zq(ig,l,igcm_ccnco2_mass)), & 494 dble(zq(ig,l,igcm_ccnco2_number)), zt(ig,l), tauscaling(ig), riceco2(ig,l), & 495 rhocloudco2(ig,l)) 484 if ((zq(ig,l,igcm_ccnco2_number)) * tauscaling(ig) + threshold >= 1) then 485 Nccnco2 = dble(zq(ig,l,igcm_ccnco2_number)) 486 Qccnco2 = dble(zq(ig,l,igcm_ccnco2_mass)) 487 Nccnco2_h2o = 0. 488 Qccnco2_h2o = 0. 489 490 if (co2useh2o) then 491 Nccnco2_h2o = zq(ig,l,igcm_ccnco2_h2o_number) 492 Qccnco2_h2o = zq(ig,l,igcm_ccnco2_h2o_mass_ice) + zq(ig,l,igcm_ccnco2_h2o_mass_ccn) 493 Nccnco2 = Nccnco2 - Nccnco2_h2o 494 Qccnco2 = Qccnco2 - Qccnco2_h2o 495 end if 496 497 call updaterice_microco2(dble(zq(ig,l,igcm_co2_ice)), dble(Qccnco2), dble(Nccnco2), dble(Qccnco2_h2o), & 498 dble(Nccnco2_h2o), zt(ig,l), tauscaling(ig), riceco2(ig,l), rhocloudco2(ig,l)) 496 499 Ic_rice = 0. 497 500 … … 532 535 ! On sublime tout 533 536 if ((zq(ig,l,igcm_co2_ice) <= threshold).or.(zq(ig,l,igcm_ccnco2_number) * tauscaling(ig) < 1.)) then 534 535 if (co2useh2o) then 536 537 if (mem_Mccn_co2(ig,l) > 0) then 538 zq(ig,l,igcm_ccn_mass) = zq(ig,l,igcm_ccn_mass) + mem_Mccn_co2(ig,l) 537 zq(ig,l,igcm_dust_mass) = zq(ig,l,igcm_dust_mass) + zq(ig,l,igcm_ccnco2_mass) 538 zq(ig,l,igcm_dust_number) = zq(ig,l,igcm_dust_number) + zq(ig,l,igcm_ccnco2_number) 539 zq(ig,l,igcm_ccnco2_mass) = 0. 540 zq(ig,l,igcm_ccnco2_number) = 0. 541 if (co2useh2o) then 542 zq(ig,l,igcm_dust_mass) = zq(ig,l,igcm_dust_mass) - zq(ig,l,igcm_ccnco2_h2o_mass_ccn) - & 543 zq(ig,l,igcm_ccnco2_h2o_mass_ice) 544 zq(ig,l,igcm_dust_number) = zq(ig,l,igcm_dust_number) - zq(ig,l,igcm_ccnco2_h2o_number) 545 546 zq(ig,l,igcm_ccn_mass) = zq(ig,l,igcm_ccn_mass) + zq(ig,l,igcm_ccnco2_h2o_mass_ccn) 547 zq(ig,l,igcm_h2o_ice) = zq(ig,l,igcm_h2o_ice) + zq(ig,l,igcm_ccnco2_h2o_mass_ice) 548 zq(ig,l,igcm_ccn_number) = zq(ig,l,igcm_ccn_number) + zq(ig,l,igcm_ccnco2_h2o_number) 549 zq(ig,l,igcm_ccnco2_h2o_number) = 0. 550 zq(ig,l,igcm_ccnco2_h2o_mass_ccn) = 0. 551 zq(ig,l,igcm_ccnco2_h2o_mass_ice) = 0. 539 552 end if 540 541 if (mem_Mh2o_co2(ig,l) > 0) then 542 zq(ig,l,igcm_h2o_ice) = zq(ig,l,igcm_h2o_ice) + mem_Mh2o_co2(ig,l) 543 end if 544 545 if (mem_Nccn_co2(ig,l) > 0) then 546 zq(ig,l,igcm_ccn_number) = zq(ig,l,igcm_ccn_number) + mem_Nccn_co2(ig,l) 547 end if 548 549 end if 550 551 zq(ig,l,igcm_dust_mass) = zq(ig,l,igcm_dust_mass) + zq(ig,l,igcm_ccnco2_mass) - ( mem_Mh2o_co2(ig,l) + & 552 mem_Mccn_co2(ig,l) ) 553 554 zq(ig,l,igcm_dust_number) = zq(ig,l,igcm_dust_number) + zq(ig,l,igcm_ccnco2_number) - mem_Nccn_co2(ig,l) 555 556 zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2) + zq(ig,l,igcm_co2_ice) 557 558 zq(ig,l,igcm_co2_ice) = 0. 559 zq(ig,l,igcm_ccnco2_mass) = 0. 560 zq(ig,l,igcm_ccnco2_number) = 0. 561 mem_Nccn_co2(ig,l) = 0. 562 mem_Mh2o_co2(ig,l) = 0. 563 mem_Mccn_co2(ig,l) = 0. 564 riceco2(ig,l) = 0. 553 zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2) + zq(ig,l,igcm_co2_ice) 554 zq(ig,l,igcm_co2_ice) = 0. 555 riceco2(ig,l) = 0. 565 556 end if !of if co2_ice < threshold or zq(ccnco2_number) < 1 566 557 end do ! of ig loop … … 587 578 588 579 subpdqcloudco2(:,:,igcm_ccn_number) = ( zq(:,:,igcm_ccn_number) - zq0(:,:,igcm_ccn_number) ) / microtimestep 580 581 subpdqcloudco2(:,:,igcm_ccnco2_h2o_mass_ice) = (zq(:,:,igcm_ccnco2_h2o_mass_ice)-zq0(:,:,igcm_ccnco2_h2o_mass_ice)& 582 )/microtimestep 583 584 subpdqcloudco2(:,:,igcm_ccnco2_h2o_mass_ccn) = (zq(:,:,igcm_ccnco2_h2o_mass_ccn)-zq0(:,:,igcm_ccnco2_h2o_mass_ccn)& 585 )/microtimestep 586 587 subpdqcloudco2(:,:,igcm_ccnco2_h2o_number) = ( zq(:,:,igcm_ccnco2_h2o_number) - zq0(:,:,igcm_ccnco2_h2o_number) & 588 )/microtimestep 589 589 end if 590 590 !======================================================================================================================! -
trunk/LMDZ.MARS/libf/phymars/initracer.F
r2494 r2562 64 64 igcm_ccnco2_mass=0 65 65 igcm_ccnco2_number=0 66 igcm_ccnco2_h2o_mass_ice=0 67 igcm_ccnco2_h2o_mass_ccn=0 68 igcm_ccnco2_h2o_number=0 66 69 igcm_dust_mass=0 67 70 igcm_dust_number=0 … … 425 428 count=count+1 426 429 endif 430 if (co2useh2o) then 431 if (noms(iq).eq."ccnco2_h2o_number") then 432 igcm_ccnco2_h2o_number=iq 433 count=count+1 434 endif 435 if (noms(iq).eq."ccnco2_h2o_mass_ice") then 436 igcm_ccnco2_h2o_mass_ice=iq 437 count=count+1 438 endif 439 if (noms(iq).eq."ccnco2_h2o_mass_ccn") then 440 igcm_ccnco2_h2o_mass_ccn=iq 441 count=count+1 442 endif 443 end if 427 444 endif 428 445 enddo ! of do iq=1,nq -
trunk/LMDZ.MARS/libf/phymars/phyetat0_mod.F90
r2545 r2562 8 8 subroutine phyetat0 (fichnom,tab0,Lmodif,nsoil,ngrid,nlay,nq, & 9 9 day_ini,time0,tsurf,tsoil,albedo,emis,q2,qsurf,co2ice, & 10 tauscaling,totcloudfrac,wstar,mem_Mccn_co2,mem_Nccn_co2,& 11 mem_Mh2o_co2,watercap) 10 tauscaling,totcloudfrac,wstar,watercap) 12 11 13 12 use tracer_mod, only: noms ! tracer names … … 28 27 !====================================================================== 29 28 ! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818 30 ! Adaptation àMars : Yann Wanherdrick29 ! Adaptation � Mars : Yann Wanherdrick 31 30 ! Objet: Lecture de l etat initial pour la physique 32 31 ! Modifs: Aug.2010 EM : use NetCDF90 to load variables (enables using … … 66 65 real,intent(out) :: totcloudfrac(ngrid) ! total cloud fraction 67 66 real,intent(out) :: wstar(ngrid) ! Max vertical velocity in thermals (m/s) 68 real,intent(out) :: mem_Mccn_co2(ngrid,nlay) ! Memory of CCN mass of H2O and dust used by CO269 real,intent(out) :: mem_Nccn_co2(ngrid,nlay) ! Memory of CCN number of H2O and dust used by CO270 real,intent(out) :: mem_Mh2o_co2(ngrid,nlay) ! Memory of H2O mass integred into CO2 crystal71 67 real,intent(out) :: watercap(ngrid) ! h2o_ice_cover 72 68 !====================================================================== … … 363 359 minval(co2ice), maxval(co2ice) 364 360 365 ! Memory of the origin of the co2 particles366 if (startphy_file) then367 call get_field("mem_Mccn_co2",mem_Mccn_co2,found,indextime)368 if (.not.found) then369 write(*,*) "phyetat0: <mem_Mccn_co2> not in file"370 mem_Mccn_co2(:,:)=0371 endif372 else373 mem_Mccn_co2(:,:)=0374 endif !if (startphy_file)375 write(*,*) "phyetat0: Memory of CCN mass of H2O and dust used by CO2"376 write(*,*) " <mem_Mccn_co2> range:", &377 minval(mem_Mccn_co2), maxval(mem_Mccn_co2)378 379 if (startphy_file) then380 call get_field("mem_Nccn_co2",mem_Nccn_co2,found,indextime)381 if (.not.found) then382 write(*,*) "phyetat0: <mem_Nccn_co2> not in file"383 mem_Nccn_co2(:,:)=0384 endif385 else386 mem_Nccn_co2(:,:)=0387 endif ! if (startphy_file)388 write(*,*) "phyetat0: Memory of CCN number of H2O and dust used by CO2"389 write(*,*) " <mem_Nccn_co2> range:", &390 minval(mem_Nccn_co2), maxval(mem_Nccn_co2)391 392 if (startphy_file) then393 call get_field("mem_Mh2o_co2",mem_Mh2o_co2,found,indextime)394 if (.not.found) then395 write(*,*) "phyetat0: <mem_Mh2o_co2> not in file"396 mem_Mh2o_co2(:,:)=0397 endif398 else399 mem_Mh2o_co2(:,:)=0400 endif ! if (startphy_file)401 write(*,*) "phyetat0: Memory of H2O mass integred into CO2 crystal"402 write(*,*) " <mem_Mh2o_co2> range:", &403 minval(mem_Mh2o_co2), maxval(mem_Mh2o_co2)404 405 361 ! Dust conversion factor 406 362 if (startphy_file) then -
trunk/LMDZ.MARS/libf/phymars/phyredem.F90
r2494 r2562 150 150 phystep,time,tsurf,tsoil,co2ice,albedo,emis,q2,qsurf,& 151 151 tauscaling,totcloudfrac,wstar, & 152 mem_Mccn_co2,mem_Nccn_co2,mem_Mh2o_co2,watercap)152 watercap) 153 153 ! write time-dependent variable to restart file 154 154 use iostart, only : open_restartphy, close_restartphy, & … … 181 181 real,intent(in) :: totcloudfrac(ngrid) 182 182 real,intent(in) :: wstar(ngrid) 183 real,intent(in) :: mem_Mccn_co2(ngrid,nlay) ! CCN mass of H2O and dust used by CO2184 real,intent(in) :: mem_Nccn_co2(ngrid,nlay) ! CCN number of H2O and dust used by CO2185 real,intent(in) :: mem_Mh2o_co2(ngrid,nlay) ! H2O mass integred into CO2 crystal186 183 real,intent(in) :: watercap(ngrid) 187 184 … … 311 308 enddo 312 309 endif 313 ! Memory of the origin of the co2 particles 314 if (co2useh2o) then 315 call put_field("mem_Mccn_co2","CCN mass of H2O and dust used by CO2",mem_Mccn_co2,time) 316 call put_field("mem_Nccn_co2","CCN number of H2O and dust used by CO2",mem_Nccn_co2,time) 317 call put_field("mem_Mh2o_co2","H2O mass integred into CO2 crystal",mem_Mh2o_co2,time) 318 endif 319 310 320 311 ! Non-orographic gavity waves 321 312 if (calllott_nonoro) then -
trunk/LMDZ.MARS/libf/phymars/phys_state_var_init_mod.F90
r2511 r2562 48 48 use tracer_mod, only: ini_tracer_mod,end_tracer_mod 49 49 use time_phylmdz_mod, only: init_time 50 use co2cloud_mod, only: ini_co2cloud,end_co2cloud51 50 use compute_dtau_mod, only: ini_compute_dtau_mod, & 52 51 end_compute_dtau_mod … … 129 128 call end_turb_mod 130 129 call ini_turb_mod(ngrid,nlayer) 131 132 ! allocate arrays in "co2cloud" : 133 ! Memory of the origin of the co2 particles 134 call end_co2cloud 135 call ini_co2cloud(ngrid,nlayer) 136 130 137 131 ! allocate arrays in "compute_dtau_mod": 138 132 call end_compute_dtau_mod -
trunk/LMDZ.MARS/libf/phymars/physiq_mod.F
r2561 r2562 19 19 use co2condens_mod, only: co2condens 20 20 use co2condens_mod4micro, only: co2condens4micro 21 use co2cloud_mod, only: co2cloud, mem_Mccn_co2, mem_Mh2o_co2, 22 & mem_Nccn_co2 21 use co2cloud_mod, only: co2cloud 23 22 use callradite_mod, only: callradite 24 23 use callsedim_mod, only: callsedim … … 31 30 & igcm_ccn_mass, igcm_ccn_number, 32 31 & igcm_ccnco2_mass, igcm_ccnco2_number, 32 & igcm_ccnco2_h2o_mass_ice, 33 & igcm_ccnco2_h2o_mass_ccn, 34 & igcm_ccnco2_h2o_number, 33 35 & rho_ice_co2,nuiceco2_sed,nuiceco2_ref, 34 36 & igcm_dust_mass, igcm_dust_number, igcm_h2o2, … … 265 267 DOUBLE PRECISION riceco2(ngrid,nlayer) ! co2 ice geometric mean radius (m) 266 268 real zdqssed_co2(ngrid) ! CO2 flux at the surface (kg.m-2.s-1) 269 real zdqssed_ccn(ngrid,nq) ! CCN flux at the surface (kg.m-2.s-1) 267 270 real zcondicea_co2microp(ngrid,nlayer) 268 271 c Variables used by the photochemistry … … 551 554 & tsurf,tsoil,albedo,emis, 552 555 & q2,qsurf,co2ice,tauscaling,totcloudfrac,wstar, 553 & mem_Mccn_co2,mem_Nccn_co2, 554 & mem_Mh2o_co2,watercap) 556 & watercap) 555 557 556 558 #else … … 573 575 !!! a couple initializations (dummy for mesoscale) done in phyetat0 574 576 !!! --- maybe this should be done in update_inputs_physiq_mod 575 mem_Mccn_co2(:,:)=0.0 576 mem_Nccn_co2(:,:)=0.0 577 mem_Mh2o_co2(:,:)=0.0 577 578 578 tauscaling(:)=1.0 !! probably important 579 579 totcloudfrac(:)=1.0 … … 1653 1653 c imicroco2=50 micro-timestep is 1/50 of physical timestep 1654 1654 zdqssed_co2(:) = 0. 1655 zdqssed_ccn(:,:) = 0. 1655 1656 1656 1657 IF (co2clouds) THEN … … 1660 1661 & nq,tau,tauscaling,rdust,rice,riceco2,nuice, 1661 1662 & rhocloud, rsedcloudco2,rhocloudco2,zzlev,zdqssed_co2, 1662 & pdu,pu,zcondicea_co2microp, co2ice) 1663 1663 & zdqssed_ccn,pdu,pu,zcondicea_co2microp, co2ice) 1664 1665 DO iq=1, nq 1666 DO ig=1,ngrid 1667 dqsurf(ig,iq)=dqsurf(ig,iq)+zdqssed_ccn(ig,iq) 1668 ENDDO ! (ig) 1669 ENDDO ! (iq) 1664 1670 c Temperature variation due to latent heat release 1665 pdt(1:ngrid,1:nlayer) = 1671 pdt(1:ngrid,1:nlayer) = 1666 1672 & pdt(1:ngrid,1:nlayer) + 1667 1673 & zdtcloudco2(1:ngrid,1:nlayer) 1668 1674 1669 1675 1670 1676 ! increment dust and ccn masses and numbers … … 1701 1707 & pdq(1:ngrid,1:nlayer,igcm_ccn_number) + 1702 1708 & zdqcloudco2(1:ngrid,1:nlayer,igcm_ccn_number) 1709 1710 pdq(:,:,igcm_ccnco2_h2o_mass_ice) = 1711 & pdq(:,:,igcm_ccnco2_h2o_mass_ice) + 1712 & zdqcloudco2(:,:,igcm_ccnco2_h2o_mass_ice) 1713 1714 pdq(:,:,igcm_ccnco2_h2o_mass_ccn) = 1715 & pdq(:,:,igcm_ccnco2_h2o_mass_ccn) + 1716 & zdqcloudco2(:,:,igcm_ccnco2_h2o_mass_ccn) 1717 1718 pdq(:,:,igcm_ccnco2_h2o_number) = 1719 & pdq(:,:,igcm_ccnco2_h2o_number) + 1720 & zdqcloudco2(:,:,igcm_ccnco2_h2o_number) 1703 1721 1704 1722 c Negative values? … … 1718 1736 & - pq(:,:,igcm_ccn_number)/ptimestep + 1.e-30 1719 1737 end where 1738 where (pq(:,:,igcm_ccnco2_h2o_mass_ice) + 1739 & pq(:,:,igcm_ccnco2_h2o_mass_ccn) + 1740 & (pdq(:,:,igcm_ccnco2_h2o_mass_ice) + 1741 & pdq(:,:,igcm_ccnco2_h2o_mass_ccn) 1742 & )*ptimestep < 0.) 1743 pdq(:,:,igcm_ccnco2_h2o_mass_ice) = 1744 & - pq(:,:,igcm_ccnco2_h2o_mass_ice) 1745 & /ptimestep + 1.e-30 1746 pdq(:,:,igcm_ccnco2_h2o_mass_ccn) = 1747 & - pq(:,:,igcm_ccnco2_h2o_mass_ccn) 1748 & /ptimestep + 1.e-30 1749 pdq(:,:,igcm_ccnco2_h2o_number) = 1750 & - pq(:,:,igcm_ccnco2_h2o_number) 1751 & /ptimestep + 1.e-30 1752 end where 1753 1754 where (pq(:,:,igcm_ccnco2_h2o_number) + 1755 & (pdq(:,:,igcm_ccnco2_h2o_number) 1756 & )*ptimestep < 0.) 1757 pdq(:,:,igcm_ccnco2_h2o_mass_ice) = 1758 & - pq(:,:,igcm_ccnco2_h2o_mass_ice) 1759 & /ptimestep + 1.e-30 1760 pdq(:,:,igcm_ccnco2_h2o_mass_ccn) = 1761 & - pq(:,:,igcm_ccnco2_h2o_mass_ccn) 1762 & /ptimestep + 1.e-30 1763 pdq(:,:,igcm_ccnco2_h2o_number) = 1764 & - pq(:,:,igcm_ccnco2_h2o_number) 1765 & /ptimestep + 1.e-30 1766 end where 1720 1767 endif ! of if (co2useh2o) 1721 1768 c Negative values? … … 1960 2007 $ zdtc,zdtsurfc,pdpsrf,zduc,zdvc,zdqc, 1961 2008 $ fluxsurf_sw,zls, 1962 $ zdqssed_co2,zcondicea_co2microp) 2009 $ zdqssed_co2,zcondicea_co2microp 2010 & ) 1963 2011 ! no scavenging yet 1964 2012 zdqsc(:,:) = 0. … … 2366 2414 . tsurf,tsoil,co2ice,albedo,emis, 2367 2415 . q2,qsurf,tauscaling,totcloudfrac,wstar, 2368 . mem_Mccn_co2,mem_Nccn_co2,mem_Mh2o_co2,watercap)2416 . watercap) 2369 2417 2370 2418 ENDIF -
trunk/LMDZ.MARS/libf/phymars/tracer_mod.F90
r2461 r2562 49 49 integer,save :: igcm_ccnco2_mass ! CCN (dust and/or water ice) for CO2 mass mixing ratio 50 50 integer,save :: igcm_ccnco2_number ! CCN (dust and/or water ice) for CO2 number mixing ratio 51 integer,save :: igcm_ccnco2_h2o_mass_ice ! CCN (dust and/or water ice) for CO2 mass mixing ratio 52 integer,save :: igcm_ccnco2_h2o_mass_ccn ! CCN (dust and/or water ice) for CO2 mass mixing ratio 53 integer,save :: igcm_ccnco2_h2o_number ! CCN (dust and/or water ice) for CO2 number mixing ratio 51 54 52 55 ! water -
trunk/LMDZ.MARS/libf/phymars/updaterad.F90
r2494 r2562 100 100 !============================================================================ 101 101 !============================================================================ 102 subroutine updaterice_microco2(qice, qccn, nccn, temperature, coeff, rice, rhocloudco2)103 use tracer_mod, only: rho_dust 102 subroutine updaterice_microco2(qice, qccn, nccn, qccn_h2o, nccn_h2o, temperature, coeff, rice, rhocloudco2) 103 use tracer_mod, only: rho_dust, rho_ice 104 104 use comcstfi_h, only: pi 105 105 use density_co2_ice_mod, only: density_co2_ice … … 108 108 !CO2 clouds parameter update by CL and JA 09/16 109 109 110 DOUBLE PRECISION, intent(in) :: qice,qccn,nccn 110 DOUBLE PRECISION, intent(in) :: qice,qccn,nccn, qccn_h2o, nccn_h2o 111 111 real, intent(in) :: coeff ! this coeff is tauscaling if microphy = T (possibly ccn_factor^-1 otherwise) 112 112 real, intent(in) :: temperature ! temperature effective for density co2_ice computation 113 113 real, intent(out) :: rhocloudco2 ! rhocloud is needed for sedimentation and is also a good diagnostic variable 114 114 double precision, intent(out) :: rice 115 real nccn_true,qccn_true ! nombre et masse de CCN115 real nccn_true,qccn_true, qccn_h2o_true, nccn_h2o_true ! nombre et masse de CCN 116 116 double precision :: rho_ice_co2T ! density co2_ice Temperature-dependent 117 117 … … 119 119 qccn_true = max(qccn * coeff, 1.e-30) 120 120 121 nccn_h2o_true = max(nccn_h2o, 1.e-30) 122 qccn_h2o_true = max(qccn_h2o, 1.e-30) 123 121 124 call density_co2_ice(dble(temperature), rho_ice_co2T) 122 125 123 rhocloudco2 = (qice * rho_ice_co2T + qccn_true*rho_dust ) / (qice + qccn_true)126 rhocloudco2 = (qice * rho_ice_co2T + qccn_true*rho_dust + qccn_h2o_true*rho_ice) / (qice + qccn_true + qccn_h2o_true) 124 127 125 128 rhocloudco2 = min(max(rhocloudco2,rho_ice_co2T), rho_dust) 126 129 127 rice = (qice + qccn_true ) * 0.75 / pi / rhocloudco2 / nccn_true128 129 rhocloudco2 = (qice * rho_ice_co2T + qccn_true*rho_dust ) / (qice + qccn_true)130 131 if (rice .le.r3iceco2min) then !r3icemin radius power 3 ?130 rice = (qice + qccn_true + qccn_h2o_true) * 0.75 / pi / rhocloudco2 / (nccn_true + nccn_h2o_true) 131 132 rhocloudco2 = (qice * rho_ice_co2T + qccn_true*rho_dust + qccn_h2o_true*rho_ice) / (qice + qccn_true + qccn_h2o_true) 133 134 if (rice <= r3iceco2min) then !r3icemin radius power 3 ? 132 135 rice = riceco2min 133 else if (rice .ge.r3iceco2max) then !r3icemin radius power 3 ?136 else if (rice >= r3iceco2max) then !r3icemin radius power 3 ? 134 137 rice = riceco2max 135 138 else -
trunk/LMDZ.MARS/libf/phymars/updatereffrad_mod.F
r2494 r2562 15 15 & igcm_co2_ice, nuiceco2_ref, 16 16 & igcm_ccnco2_number, igcm_ccnco2_mass, 17 & igcm_ccnco2_h2o_number, 18 & igcm_ccnco2_h2o_mass_ice, 19 & igcm_ccnco2_h2o_mass_ccn, 17 20 & igcm_ccn_number, nuice_ref, varian, 18 21 & ref_r0, igcm_dust_submicron, … … 96 99 97 100 LOGICAL,SAVE :: firstcall=.true. 98 101 REAL Nccnco2, Qccnco2 102 REAL Nccnco2_h2o, Qccnco2_h2o 99 103 REAL CBRT 100 104 EXTERNAL CBRT … … 191 195 DO l=1,nlayer 192 196 DO ig=1,ngrid 197 Nccnco2 = pq(ig,l,igcm_ccnco2_number) 198 Qccnco2 = pq(ig,l,igcm_ccnco2_mass) 199 Nccnco2_h2o = 0. 200 Qccnco2_h2o = 0. 201 if (co2useh2o) then 202 Nccnco2_h2o = pq(ig,l,igcm_ccnco2_h2o_number) 203 Qccnco2_h2o = pq(ig,l,igcm_ccnco2_h2o_mass_ice) 204 & + pq(ig,l,igcm_ccnco2_h2o_mass_ccn) 205 Nccnco2 = Nccnco2 - Nccnco2_h2o 206 Qccnco2 = Qccnco2 - Qccnco2_h2o 207 end if 208 193 209 call updaterice_microco2(dble(pq(ig,l,igcm_co2_ice)), 194 & dble(pq(ig,l,igcm_ccnco2_mass)), 195 & dble(pq(ig,l,igcm_ccnco2_number)), 210 & dble(Qccnco2), dble(Nccnco2), 211 & dble(Qccnco2_h2o), 212 & dble(Nccnco2_h2o), 196 213 & pt(ig,l), 197 214 & tauscaling(ig),riceco2(ig,l),
Note: See TracChangeset
for help on using the changeset viewer.