Watching birds and squirrels, on the ledge of my picture window, at the feeders each morning, is fun. They expect to be fed close to sun-up, though. That has me changing out the Raccoon feeders for seeds at about sunrise. (We get the ‘Possum & Raccoon show between about 2 hours after sunset and an hour before sunrise, most nights)
This lets me see the status of “Frost On The Roof” each morning, and preps the spouse for how much to scape the car window and how early to depart…
That is also time for pondering over the first hot beverage of the day.
So the last few weeks I’ve been pondering frost.
Every night when it gets cold, a BUNCH of water vapor gets sucked out of the air and deposited on roofs, grass, cars, etc. When the sun rises, it melts and much of it runs off into the soil. Some of it does evaporate back to vapor, but most of it seems to just stay liquid and run off somewhere.
Now this sure looks to me like a “Water Vapor Pump” pumping water vapor out of the air. We are all familiar with “crisp winter nights”. They can be very dry.
Now as that water vapor is pumped out of the air mass, the next night it is dryer, and ought to cool faster, and frost earlier and more easily. Repeat until the air is very dry or spring arrives… This is a “frost feedback cycle”, IMHO. Being near the ocean, we get a fresh batch of air most evenings, with moisture to some extent restored (but while leaving the ocean that vapor took more heat with it out of the ocean, cooling it more) This is a classical heat pipe in effect. Vapor leaves the ocean taking heat, comes ashore and condenses, then runs back to the ocean as cold water. The heat radiating away through that cold clear water vapor deficient frosty night air.
Then that dry air goes more inland and the cycle repeats, especially at any rises like the Sierra Nevada mountains. Thus the Great Southwest Deserts and the cold deserts even up into Canada. (The Canadians are very proud of their desert – more than one Canadian told me so ;-) It is a nice trip to look at it. Just over the border from Washington State and inland from the coast; rather like the desert areas of Washington, Oregon, Nevada, California… )
So it sure looks like there is a Frost Feedback with positive being to the cold side (or a negative feedback on warming). The more the air dries from frost, the more it gets cold, the more the frost dries the air, the colder it gets, repeat until a cold dry winter desert in Nevada…
As a quick first look, we can just search for “frost” in the source code of the models. If it is discussed, there ought to be a comment or keyword for it. At least in comments.
The Linux commands I’ll be using are “ls” to “LiSt” the files in a directory, and “grep” or “Global Regular Expression and Print” that looks for a pattern and prints what matches. The “*” means “match any character”, so “*ohn” would match John Bohn and Rohn but not Johan.
First well look at Model II. I do a ‘cd’ Change Directory into where it is stored, then list the files so you can see this is where the source code is listed. After that, I search for “FROST” as all caps, then for “rost” to find “frost” or “Frost” (and anything odd like grost…). Similarly, using ‘*’ in a file name like “*.f” says to find any file ending in “.f” and look in it. When if finds nothing, it prints nothing.
chiefio@Headend:/Climate/GCM/modelII/trunk$ ls B83XXDBL.COM FORCINGSmac.COM Makefile.win R83ZAmacDBL.o RFRCmacDBL.o pd_COMMON BA94jalC9.COM Info.plist Makefile.win.gui RANVAX.f UTILmacDBL.f setpath.f DB11pdC9.f Makefile Mjal2cpdC9.f RANVAX.o UTILmacDBL.o setpath.o DB11pdC9.o Makefile.Mac.PPC Mjal2cpdC9.o RANVAXxlf.f UTILwinDBL.f FFT36macDBL.f Makefile.README Pjal0C9.f README.f commandlinetest.gui FFT36macDBL.o Makefile.gfortran Pjal0C9.o README.f.in model.command FORCINGSjalC9.f Makefile.ifort PostBuild.sh README.o modelF.r FORCINGSjalC9.o Makefile.pi R83ZAmacDBL.f RFRCmacDBL.f mrweprefs.r chiefio@Headend:/Climate/GCM/modelII/trunk$ grep FROST *.f chiefio@Headend:/Climate/GCM/modelII/trunk$ grep rost *.f chiefio@Headend:/Climate/GCM/modelII/trunk$ grep rost *.COM chiefio@Headend:/Climate/GCM/modelII/trunk$ grep FROST *.COM chiefio@Headend:/Climate/GCM/modelII/trunk$ grep rost *.sh chiefio@Headend:/Climate/GCM/modelII/trunk$ grep FROST *.sh
It just isn’t in there. Now maybe it is hiding in the watervapor calcuations somewhere as a ‘what happens at 0C’ term, but not named Frost… but it isn’t looking good.
How about the “way more advanced” Model E?
Here the source code is in three directories. The model itself is in ‘model’ while auxiliary programs are in ‘aux’ and initializations are in ‘init’. We can search them all by saying */*.f that means ‘search all directories for any file ending in “.f” and grep it’.
chiefio@Headend:/Climate/modelE2_AR5_branch$ grep FROST */*.f chiefio@Headend:/Climate/modelE2_AR5_branch$ grep rost */*.f model/BLK_DRV.f:c khvorostyanov and curry, 2005 model/DIAG.f: * ,j_rictr,j_rostr,j_ltro,j_ricst,j_rosst,j_lstr,j_gamm,j_gam model/DIAG.f: call inc_aj(i,j,it,j_rostr,rossn*ftype(it,i,j)) model/ENT_DRV.f: integer :: do_frost_hardiness,do_patchdynamics model/ENT_DRV.f: do_frost_hardiness = 1 !true model/ENT_DRV.f: call sync_param( "do_frost_hardiness",do_frost_hardiness) model/ENT_DRV.f: & ,do_frost_hardiness=(do_frost_hardiness==1) !.true. !.false. model/ENT_DRV_devel.f: integer :: do_frost_hardiness,do_patchdynamics model/ENT_DRV_devel.f: do_frost_hardiness = 1 !true model/ENT_DRV_devel.f: call sync_param( "do_frost_hardiness",do_frost_hardiness) model/ENT_DRV_devel.f: & ,do_frost_hardiness=(do_frost_hardiness==1) !.true. !.false. model/TRAMP_setup.f: REAL,PARAMETER:: GMR = 34.163195 ! hydrostatic constant model/TRDRYDEP.f:C Walcek, C.J., R.A. Brost, J.S. Chang, and M.L. Wesely, SO2, model/momtum.f:c --- hydrostatic equation chiefio@Headend:/Climate/modelE2_AR5_branch$
Well, the first line is an example of a ‘false hit’ in that khvorostyanov contains ‘rost’ but isn’t Frost or frost. (There is a more complicated way to phrase the search to fix that, but I wanted this to be a more attainable and broad search).
Then we find a variable name ‘rostr’. Nice, but not frost… Skipping over ENV_DRV.f for now, down at the bottom we find that “hydrostatic” contains ‘rost’ as well as does “Brost”. OK, we know our search is looking very broadly.
Hey, it even found “frost_hardiness” in ENT_DRV.f (!), so wonder what that is?
#include "rundeck_opts.h" module ent_drv !@sum ent_drv contains variables and routines for vegetation driver !@auth I. Alienov, N. Kiang, Y. Kim
Oh. The “frost kills the plants” and how frost resistant is any given vegetation type. Nice to know they do that, but what about the negative feedback on water vapor?
Model E has clouds and particulate and aerosols, it has icedynamics:
ICEDYN.f ICEDYN_DRV.f ICEDYN_DUM.f ICEDYNo_DUM.f LANDICE.f LANDICE_DRV.f
it even has sea ice and snow:
SEAICE.f SEAICE_DRV.f SNOW.f SNOW_DRV.f
Even something called eice:
even irrigation and lightning:
But not a peep about frost…
Makes a fella go “HHmmmmm….”
Clearly this is a “Dig Here!”. It might be hiding in the relative humidity calculaitons as implicit, or maybe in the ‘ice’ as a class of ‘ice’? or ??
Or it might just be politely ignored as it is a feedback “the wrong way” for the narrative…
So that is an example of how you can do a bit of archeology on a package at a very top level just to see if there’s a potential issue to explore. Didn’t have to read any FORTRAN, nor compile and run anything. Just some interesting text searching.
The next step would be to actually dig into the bits of code that are tangentially related to frost and see if it is handled implicitly via a physics dependency on cold… but there is a difference between freezing water our of air (snow, hail, sleet, and several other varieties) and having it condense out as frost. For one thing, frost forms above freezing…
So I’m really wondering how they handle this, or if they just ignore it.
As a comparison benchmark, searching on “snow” then counting the lines finds:
chiefio@Headend:/Climate/modelE2_AR5_branch$ grep snow */*.f | wc -l 1215
Yup. 1215 lines have some reference to “snow” in them.
model/RAD_DRV.f: zsnwoi=snowoi/rhos model/RAD_DRV.f: & ,wmag,snowoi,snowli,snowe ! 1+1+1+1+ model/RAD_DRV.f: & ,snow_frac,zlake,plake ! 2+1+1+ model/RAD_UTILS.f:!@sum RXSNOW calculate zenith angle dependence for snow/ice albedo model/RAD_UTILS.f:!@var GGSNO Asymmetry parameter for snow model/SEAICE.f:C**** snow/ice thermal diffusivity (Pringle et al, 2007) model/SEAICE.f:!@param alami0,alams lambda coefficient for ice/snow J/(m*degC*sec) model/SEAICE.f:!@param RHOS density of snow (kg/m^3) model/SEAICE.f:!@param BYRLS reciprical of snow density*lambda model/SEAICE.f:!@dbparam snow_ice =1 to allow for snow ice formation (default=1) model/SEAICE.f: INTEGER :: snow_ice = 1 model/SEAICE.f:!@param SNOMAX maximum allowed snowdepth (1m equivalent) (kg/m^2) model/SEAICE.f:!@param dSNdRN rate of conversion of snow to ice as a function of rain model/SEAICE.f:!@var SNOW snow mass (kg/m^2) [...] model/TRDUST.f: snowe=pbl_args%snow model/TRDUST.f: IF (pmei .AND. snowe 0.D0 .AND. wsgcm > vtrsh) model/TRDUST.f: IF (itype == 4 .AND. snowe <= 1.D0) THEN model/VEG_DRV.f: use sle001, only : shw !,pres,ts !fr,snowm, ws,shc, model/VEG_DRV.f: vegcell%snowm=vegcell%vh*spgsn model/regridinput.f: real*8, allocatable :: snowe(:,:),Te(:,:),WTRe(:,:),ICEe(:,:), model/regridinput.f: real*8, allocatable :: snowe_out(:,:,:),Te_out(:,:,:), model/regridinput.f: & snowe(ims,jms),Te(ims,jms),WTRe(ims,jms),ICEe(ims,jms), model/regridinput.f: & snowe_out(imt,jmt,ntt),Te_out(imt,jmt,ntt), model/regridinput.f: read(iu_GIC) TITLEEARTH01, snowe,Te,WTRe, ICEe, SNOage,evmax, model/regridinput.f: tsource(:,:,1)=snowe(:,:) model/regridinput.f: snowe_out(:,:,:)=ttargglob(:,:,:) model/regridinput.f: & snowe,Te,WTRe,ICEe, model/regridinput.f: call defvar(dd2d,fid,snw_out,'snowi(im,jm,tile)') model/regridinput.f: call defvar(dd2d,fid,snowe_out,'snowe(im,jm,tile)') model/regridinput.f: & 'snowbv(ls_nfrac,im,jm,tile)') model/regridinput.f: call defvar(dd2d,fid,SNOW_out,'snowli(im,jm,tile)') model/regridinput.f: call write_data(dd2d,fid,'snowi',snw_out) model/regridinput.f: call write_data(dd2d,fid,'snowe',snowe_out) model/regridinput.f: call write_data(dd2d,fid,'snowbv',SNWbv_out) model/regridinput.f: call write_data(dd2d,fid,'snowli',SNOW_out) model/regridinput.f: & flag_dsws_out,snowe_out,Te_out,
You would think frost, being far more common than snow (we get frost here, but not snow) would deserve at least one little line… But then again, you would think.