From a453cbacf1620ea1fcfd9a6140f1b456967c9a5b Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 28 Feb 2023 16:14:02 -0800 Subject: [PATCH 001/125] Add luh2 module and conda environment yaml file --- tools/conda-luh2.yml | 10 ++++++++++ tools/luh2.py | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tools/conda-luh2.yml create mode 100644 tools/luh2.py diff --git a/tools/conda-luh2.yml b/tools/conda-luh2.yml new file mode 100644 index 0000000000..a0f1dea53f --- /dev/null +++ b/tools/conda-luh2.yml @@ -0,0 +1,10 @@ +name: luh2 +channels: + - conda-forge + - defaults +dependencies: + - python=3.7.9 + - xarray + - netcdf4 + - scipy +prefix: /home/glemieux/local/conda/miniconda3/envs/luh2 diff --git a/tools/luh2.py b/tools/luh2.py new file mode 100644 index 0000000000..70d40c6a1f --- /dev/null +++ b/tools/luh2.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# +import xarray as xr +import pynco + +def importdata(inputarg): + + # Open files + # Check to see if a ValueError is raised which is likely due + # to the LUH2 time units being undecodable by cftime module + try: + ds = xr.open_dataset(inputarg) + except ValueError as err: + print("ValueError:", err) + errmsg = "User direction: If error is due to units being 'years since ...' " \ + "update the input data file to change to 'common_years since...'. " \ + "This can be done using the NCO tool `ncatted`." + print() + print(errmsg) + # exit(2) + +# Close files +# management_ds.close() From fda4aff84f0d0c0173e39ccfaa808255dc5c7b17 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 1 Mar 2023 13:57:52 -0800 Subject: [PATCH 002/125] Add function to update luh2 time units --- tools/luh2.py | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 70d40c6a1f..d86d5800ba 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,23 +1,59 @@ #!/usr/bin/env python3 -# + +import re import xarray as xr -import pynco +from nco import Nco +from nco.custom import Atted -def importdata(inputarg): +# Import luh2 data +def importdata(inputarg,datasetout): # Open files # Check to see if a ValueError is raised which is likely due # to the LUH2 time units being undecodable by cftime module try: - ds = xr.open_dataset(inputarg) + datasetout = xr.open_dataset(inputarg) except ValueError as err: print("ValueError:", err) errmsg = "User direction: If error is due to units being 'years since ...' " \ "update the input data file to change to 'common_years since...'. " \ - "This can be done using the NCO tool `ncatted`." + "This can be done using the luh2.attribupdate function." print() print(errmsg) # exit(2) +# Modify the luh2 metadata to enable xarray to read in data +# This issue here is that the luh2 time units start prior to +# +def attribupdate(inputarg,outputarg): + + nco = Nco() + + # Get the 'time:units' string from the input using ncks + timeunitstr = nco.ncks(input=inputarg,variable="time",options=["-m"]).decode() + + # Grab the units string and replace "years" with "common_years" + substr = re.search('time:units.*".*"',timeunitstr) + newstr = substr.group().replace("time:units = \"years","\"common_years") + + # Use ncatted to update the time units + att = "units" + var = "time" + att_type = "c" + opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] + nco.ncatted(input=inputarg, output=outputarg, options=opts) + + # The following is fixed with PR #62 for pynco but isn't in that latest update yet + # on conda + # nco.ncatted(input=inputarg,output=outputarg,options=[ + # Atted(mode="overwrite", + # att_name="units", + # var_name="time", + # value=newstr + # stype="c" + # ), + # ]) + + # Close files # management_ds.close() From c7871a913d27212a69ae020f14111951b36338e1 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 1 Mar 2023 14:51:06 -0800 Subject: [PATCH 003/125] Update conda environment for luh2 tools --- tools/conda-luh2.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/conda-luh2.yml b/tools/conda-luh2.yml index a0f1dea53f..7ac42e9f24 100644 --- a/tools/conda-luh2.yml +++ b/tools/conda-luh2.yml @@ -7,4 +7,6 @@ dependencies: - xarray - netcdf4 - scipy + - nco + - pynco prefix: /home/glemieux/local/conda/miniconda3/envs/luh2 From f464b7bdb544caaa6f3576313be751d1b754da62 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 2 Mar 2023 09:10:44 -0800 Subject: [PATCH 004/125] Adding functionality notes --- tools/luh2.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index d86d5800ba..e3dfb9be8c 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -6,7 +6,7 @@ from nco.custom import Atted # Import luh2 data -def importdata(inputarg,datasetout): +def importdata(inputarg): # Open files # Check to see if a ValueError is raised which is likely due @@ -22,6 +22,8 @@ def importdata(inputarg,datasetout): print(errmsg) # exit(2) + return(datasetout) + # Modify the luh2 metadata to enable xarray to read in data # This issue here is that the luh2 time units start prior to # @@ -54,6 +56,14 @@ def attribupdate(inputarg,outputarg): # ), # ]) - -# Close files -# management_ds.close() +# General functionality needed +# - collect data for specific user-defined time period +# - collect subset of the data variables (e.g. pasture, rangeland, etc) +# - write the subset to the necessary format to pass to regridding tools +# - This may need to be specific to the particular hlm tooling +# - call regridding tooling in hlm model +# - this will need to point at existing mapping data files, which are external to hlm +# - this may need a new mksurf_xxxx module if it can't conform to existing modules due +# to needing to use new fields +# future functionality: +# - importdata function for aforestation and other data to add to luh2 data From 202b09c420f5324733153450802c75b208a47137 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 6 Mar 2023 16:12:41 -0800 Subject: [PATCH 005/125] Start bringing in Charlie's xesmf code --- tools/luh2.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/luh2.py b/tools/luh2.py index e3dfb9be8c..d7a0f2d2bb 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,10 +1,14 @@ #!/usr/bin/env python3 import re +import numpy as np import xarray as xr +import xesmf as xe from nco import Nco from nco.custom import Atted +# Add version checking here in case environment.yml not used + # Import luh2 data def importdata(inputarg): @@ -26,7 +30,8 @@ def importdata(inputarg): # Modify the luh2 metadata to enable xarray to read in data # This issue here is that the luh2 time units start prior to -# +# year 1672, which cftime should be able to handle, but it +# appears to need a specific unit name convention "common_years" def attribupdate(inputarg,outputarg): nco = Nco() @@ -56,6 +61,9 @@ def attribupdate(inputarg,outputarg): # ), # ]) +# Update the formatting to meet HLM needs +# def clmformatter(): + # General functionality needed # - collect data for specific user-defined time period # - collect subset of the data variables (e.g. pasture, rangeland, etc) From 6ef45bbdddcf7220e8b30c857c61560a0081817c Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 13 Mar 2023 16:52:22 -0700 Subject: [PATCH 006/125] Update yml environment file --- tools/conda-luh2.yml | 1 + tools/luh2.py | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/conda-luh2.yml b/tools/conda-luh2.yml index 7ac42e9f24..0be4e7b3b7 100644 --- a/tools/conda-luh2.yml +++ b/tools/conda-luh2.yml @@ -9,4 +9,5 @@ dependencies: - scipy - nco - pynco + - xesmf prefix: /home/glemieux/local/conda/miniconda3/envs/luh2 diff --git a/tools/luh2.py b/tools/luh2.py index d7a0f2d2bb..04e064c871 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -24,7 +24,6 @@ def importdata(inputarg): "This can be done using the luh2.attribupdate function." print() print(errmsg) - # exit(2) return(datasetout) @@ -61,6 +60,22 @@ def attribupdate(inputarg,outputarg): # ), # ]) +# Make necessary (?) changes to metadata for XESMF conservative regrid +# Any LUH2 data set should work as the input dataset, but +# we should have some sort of check to make sure that the +# data sets being used are consistent in the final calling script +def metadatachange(inputdataset,outputdataset): + + # Drop the invalid lat, lon label names + outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) + outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) + # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 + # outputdatatset["YEAR"] = xr.DataArray(np.arange(len(fin["time"]), dtype=np.int16) + 850, dims=("time")) + + # make mask of LUH2 data + outputdatatset["mask"] = xr.where(~np.isnan(inputdataset["primf_to_range"].isel(time=0)), 1, 0) + # Update the formatting to meet HLM needs # def clmformatter(): From 4c9a47fa85d2c9acfe55200aaa3822f292f70cdc Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 13 Mar 2023 17:10:16 -0700 Subject: [PATCH 007/125] Continue converting Charlie's script --- tools/luh2.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 04e064c871..f5511dc63b 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -64,17 +64,44 @@ def attribupdate(inputarg,outputarg): # Any LUH2 data set should work as the input dataset, but # we should have some sort of check to make sure that the # data sets being used are consistent in the final calling script -def metadatachange(inputdataset,outputdataset): +def MetadataUpdateLUH2(inputdataset,outputdataset): - # Drop the invalid lat, lon label names + # if this is LUH2 data + # Drop the invalid lat, lon variable labels and replace with "lat_b" and "lon_b" + # This is only necessary for the conservative method (?) per xESMF docs outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 # outputdatatset["YEAR"] = xr.DataArray(np.arange(len(fin["time"]), dtype=np.int16) + 850, dims=("time")) +def definemask(inputdataset,outputdataset,label_to_mask): # make mask of LUH2 data outputdatatset["mask"] = xr.where(~np.isnan(inputdataset["primf_to_range"].isel(time=0)), 1, 0) + # make mask of surface data file + fin2b["mask"] = fin2b["PCT_NATVEG"]> 0. + +# load CLM surface data file +def MetadataUpdateSurfDS(inputdataset,outputdataset): + + # Move this out to be handled by opening function + # fin2 = xr.open_dataset('surfdata_4x5_hist_16pfts_Irrig_CMIP6_simyr2000_c190214.nc') + + # make soem chagnes to metadata + fin2b = fin2.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + fin2b['longitude'] = fin2b.LONGXY.isel(latitude=0) + fin2b['latitude'] = fin2b.LATIXY.isel(longitude=0) + +def RegridConservative(datasets_in,datasets_out,regridder): + # define the regridder transformation + regridder = xe.Regridder(dataset_in, dataset_out, "conservative") + + #regrid the various LUH2 datasets, from smallest to largest + fin_states_regrid = regridder(finb_states) + fin_management_regrid = regridder(finb_management) + + ### memory crashes on the transition data + #fin_transitions_regrid = regridder(finb) # Update the formatting to meet HLM needs # def clmformatter(): From 134ed79b55d4c80bbbf9520f7587abc0a06b4b34 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 14 Mar 2023 12:01:11 -0700 Subject: [PATCH 008/125] Update notes --- tools/luh2.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index f5511dc63b..2fbd1a5026 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -10,13 +10,13 @@ # Add version checking here in case environment.yml not used # Import luh2 data -def importdata(inputarg): +def importdata(inputfile): # Open files # Check to see if a ValueError is raised which is likely due # to the LUH2 time units being undecodable by cftime module try: - datasetout = xr.open_dataset(inputarg) + datasetout = xr.open_dataset(inputfile) except ValueError as err: print("ValueError:", err) errmsg = "User direction: If error is due to units being 'years since ...' " \ @@ -31,12 +31,16 @@ def importdata(inputarg): # This issue here is that the luh2 time units start prior to # year 1672, which cftime should be able to handle, but it # appears to need a specific unit name convention "common_years" -def attribupdate(inputarg,outputarg): +def attribupdate(inputfile,output_append="modified"): + + # Define the output filename + index = inputfile.find(".nc") + outputfile = inputfile[:index] + "_" + output_append + inputfile[index:] nco = Nco() # Get the 'time:units' string from the input using ncks - timeunitstr = nco.ncks(input=inputarg,variable="time",options=["-m"]).decode() + timeunitstr = nco.ncks(input=inputfile,variable="time",options=["-m"]).decode() # Grab the units string and replace "years" with "common_years" substr = re.search('time:units.*".*"',timeunitstr) @@ -47,11 +51,15 @@ def attribupdate(inputarg,outputarg): var = "time" att_type = "c" opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] - nco.ncatted(input=inputarg, output=outputarg, options=opts) + nco.ncatted(input=inputfile, output=outputfile, options=opts) + + print("Generated modified output file: {}".format(outputfile)) + + return(outputfile) # The following is fixed with PR #62 for pynco but isn't in that latest update yet # on conda - # nco.ncatted(input=inputarg,output=outputarg,options=[ + # nco.ncatted(input=inputfile,output=outputfile,options=[ # Atted(mode="overwrite", # att_name="units", # var_name="time", @@ -64,12 +72,19 @@ def attribupdate(inputarg,outputarg): # Any LUH2 data set should work as the input dataset, but # we should have some sort of check to make sure that the # data sets being used are consistent in the final calling script -def MetadataUpdateLUH2(inputdataset,outputdataset): +def MetadataUpdateLUH2(inputdataset): # if this is LUH2 data # Drop the invalid lat, lon variable labels and replace with "lat_b" and "lon_b" # This is only necessary for the conservative method (?) per xESMF docs + + # Is dropping these variables really necessary? Will xESMF get confused or is this + # for the users's sake? outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + + # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional + # _bounds array. + # xESMF needs these variable names for bounding the conservative regridding outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 @@ -87,8 +102,12 @@ def MetadataUpdateSurfDS(inputdataset,outputdataset): # Move this out to be handled by opening function # fin2 = xr.open_dataset('surfdata_4x5_hist_16pfts_Irrig_CMIP6_simyr2000_c190214.nc') - # make soem chagnes to metadata + # Rename the surface dataset dimensions to something recognizable by xESMF. + # That said, since regridder just needs the values, I'm not sure this is necessary. + # We might just be able to rename t fin2b = fin2.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + + # Populate the new surface dataset with the actual lat/lon values fin2b['longitude'] = fin2b.LONGXY.isel(latitude=0) fin2b['latitude'] = fin2b.LATIXY.isel(longitude=0) From da4a06dd2882ae5c4383a5ebb62286f01ee6bb77 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 16 Mar 2023 10:43:43 -0700 Subject: [PATCH 009/125] Update comments --- tools/luh2.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/luh2.py b/tools/luh2.py index 2fbd1a5026..7416f16018 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -68,6 +68,13 @@ def attribupdate(inputfile,output_append="modified"): # ), # ]) +# Fix the boundaries of the LUH2 data +# Each lat/lon boundary array is a 2D array corresponding to the bounds of each +# coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate +# of 89.875). +def BoundsFixLUH2(): + + # Make necessary (?) changes to metadata for XESMF conservative regrid # Any LUH2 data set should work as the input dataset, but # we should have some sort of check to make sure that the @@ -80,7 +87,7 @@ def MetadataUpdateLUH2(inputdataset): # Is dropping these variables really necessary? Will xESMF get confused or is this # for the users's sake? - outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + # outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional # _bounds array. From 2b7364e6e709089e5f59d0a7b53fe5f02b82b296 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 20 Mar 2023 16:09:34 -0700 Subject: [PATCH 010/125] Renamed luh2 module and added primary script --- tools/luh2.py | 163 +++++++++------------------------------------- tools/luh2mod.py | 164 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 134 deletions(-) create mode 100644 tools/luh2mod.py diff --git a/tools/luh2.py b/tools/luh2.py index 7416f16018..5facc30ea4 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,145 +1,40 @@ #!/usr/bin/env python3 -import re -import numpy as np -import xarray as xr -import xesmf as xe -from nco import Nco -from nco.custom import Atted +import luh2mod as luh2 -# Add version checking here in case environment.yml not used +# Location of luh2 data - move this to input +# file_states = "/home/glemieux/Data/luh2/orig/states.nc" +# file_management = "/home/glemieux/Data/luh2/orig/management.nc" +# file_transitions = "/home/glemieux/Data/luh2/orig/transitions.nc" -# Import luh2 data -def importdata(inputfile): +# # Modify the files +# mod_file_states = luh2.attribupdate(file_states) +# mod_file_management = luh2.attribupdate(file_management) +# mod_file_transitions = luh2.attribupdate(file_transitions) +mod_file_states = "/home/glemieux/Data/luh2/states_modified.nc" +mod_file_management = "/home/glemieux/Data/luh2/management_modified.nc" +mod_file_transitions = "/home/glemieux/Data/luh2/transitions_modified.nc" - # Open files - # Check to see if a ValueError is raised which is likely due - # to the LUH2 time units being undecodable by cftime module - try: - datasetout = xr.open_dataset(inputfile) - except ValueError as err: - print("ValueError:", err) - errmsg = "User direction: If error is due to units being 'years since ...' " \ - "update the input data file to change to 'common_years since...'. " \ - "This can be done using the luh2.attribupdate function." - print() - print(errmsg) +# Open modified files +ds_states = luh2.importdata(mod_file_states) +ds_management = luh2.importdata(mod_file_management) +ds_transitions = luh2.importdata(mod_file_transitions) - return(datasetout) +# Fix the bounds +ds_states = luh2.BoundsFixLUH2(ds_states) +ds_management= luh2.BoundsFixLUH2(ds_management) +ds_transitions = luh2.BoundsFixLUH2(ds_transitions) -# Modify the luh2 metadata to enable xarray to read in data -# This issue here is that the luh2 time units start prior to -# year 1672, which cftime should be able to handle, but it -# appears to need a specific unit name convention "common_years" -def attribupdate(inputfile,output_append="modified"): +# Grab surface data set to use as regrid "target" +# Import the surface dataset +file_surfdata = "/home/glemieux/Data/luh2/surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc" - # Define the output filename - index = inputfile.find(".nc") - outputfile = inputfile[:index] + "_" + output_append + inputfile[index:] +# modify the surface data set to enable xesmf regridder to find necessary data +ds_surfdata = luh2.DimensionFixSurfData(file_surfdata) - nco = Nco() +print("done") - # Get the 'time:units' string from the input using ncks - timeunitstr = nco.ncks(input=inputfile,variable="time",options=["-m"]).decode() - # Grab the units string and replace "years" with "common_years" - substr = re.search('time:units.*".*"',timeunitstr) - newstr = substr.group().replace("time:units = \"years","\"common_years") - - # Use ncatted to update the time units - att = "units" - var = "time" - att_type = "c" - opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] - nco.ncatted(input=inputfile, output=outputfile, options=opts) - - print("Generated modified output file: {}".format(outputfile)) - - return(outputfile) - - # The following is fixed with PR #62 for pynco but isn't in that latest update yet - # on conda - # nco.ncatted(input=inputfile,output=outputfile,options=[ - # Atted(mode="overwrite", - # att_name="units", - # var_name="time", - # value=newstr - # stype="c" - # ), - # ]) - -# Fix the boundaries of the LUH2 data -# Each lat/lon boundary array is a 2D array corresponding to the bounds of each -# coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate -# of 89.875). -def BoundsFixLUH2(): - - -# Make necessary (?) changes to metadata for XESMF conservative regrid -# Any LUH2 data set should work as the input dataset, but -# we should have some sort of check to make sure that the -# data sets being used are consistent in the final calling script -def MetadataUpdateLUH2(inputdataset): - - # if this is LUH2 data - # Drop the invalid lat, lon variable labels and replace with "lat_b" and "lon_b" - # This is only necessary for the conservative method (?) per xESMF docs - - # Is dropping these variables really necessary? Will xESMF get confused or is this - # for the users's sake? - # outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) - - # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional - # _bounds array. - # xESMF needs these variable names for bounding the conservative regridding - outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) - outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) - # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 - # outputdatatset["YEAR"] = xr.DataArray(np.arange(len(fin["time"]), dtype=np.int16) + 850, dims=("time")) - -def definemask(inputdataset,outputdataset,label_to_mask): - # make mask of LUH2 data - outputdatatset["mask"] = xr.where(~np.isnan(inputdataset["primf_to_range"].isel(time=0)), 1, 0) - # make mask of surface data file - fin2b["mask"] = fin2b["PCT_NATVEG"]> 0. - -# load CLM surface data file -def MetadataUpdateSurfDS(inputdataset,outputdataset): - - # Move this out to be handled by opening function - # fin2 = xr.open_dataset('surfdata_4x5_hist_16pfts_Irrig_CMIP6_simyr2000_c190214.nc') - - # Rename the surface dataset dimensions to something recognizable by xESMF. - # That said, since regridder just needs the values, I'm not sure this is necessary. - # We might just be able to rename t - fin2b = fin2.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) - - # Populate the new surface dataset with the actual lat/lon values - fin2b['longitude'] = fin2b.LONGXY.isel(latitude=0) - fin2b['latitude'] = fin2b.LATIXY.isel(longitude=0) - -def RegridConservative(datasets_in,datasets_out,regridder): - # define the regridder transformation - regridder = xe.Regridder(dataset_in, dataset_out, "conservative") - - #regrid the various LUH2 datasets, from smallest to largest - fin_states_regrid = regridder(finb_states) - fin_management_regrid = regridder(finb_management) - - ### memory crashes on the transition data - #fin_transitions_regrid = regridder(finb) - -# Update the formatting to meet HLM needs -# def clmformatter(): - -# General functionality needed -# - collect data for specific user-defined time period -# - collect subset of the data variables (e.g. pasture, rangeland, etc) -# - write the subset to the necessary format to pass to regridding tools -# - This may need to be specific to the particular hlm tooling -# - call regridding tooling in hlm model -# - this will need to point at existing mapping data files, which are external to hlm -# - this may need a new mksurf_xxxx module if it can't conform to existing modules due -# to needing to use new fields -# future functionality: -# - importdata function for aforestation and other data to add to luh2 data +# def main(): +# if __name__ == "__main__": +# main() diff --git a/tools/luh2mod.py b/tools/luh2mod.py new file mode 100644 index 0000000000..65cf029c34 --- /dev/null +++ b/tools/luh2mod.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 + +import re +import numpy as np +import xarray as xr +import xesmf as xe +from nco import Nco +from nco.custom import Atted + +# Add version checking here in case environment.yml not used + +# Import luh2 data +def importdata(inputfile): + + # Open files + # Check to see if a ValueError is raised which is likely due + # to the LUH2 time units being undecodable by cftime module + try: + datasetout = xr.open_dataset(inputfile) + print("Input file dataset opened: {}".format(inputfile)) + return(datasetout) + except ValueError as err: + print("ValueError:", err) + errmsg = "User direction: If error is due to units being 'years since ...' " \ + "update the input data file to change to 'common_years since...'. " \ + "This can be done using the luh2.attribupdate function." + print() + print(errmsg) + + +# Modify the luh2 metadata to enable xarray to read in data +# This issue here is that the luh2 time units start prior to +# year 1672, which cftime should be able to handle, but it +# appears to need a specific unit name convention "common_years" +def attribupdate(inputfile,output_append="modified"): + + # Define the output filename + index = inputfile.find(".nc") + outputfile = inputfile[:index] + "_" + output_append + inputfile[index:] + + nco = Nco() + + # Get the 'time:units' string from the input using ncks + timeunitstr = nco.ncks(input=inputfile,variable="time",options=["-m"]).decode() + + # Grab the units string and replace "years" with "common_years" + substr = re.search('time:units.*".*"',timeunitstr) + newstr = substr.group().replace("time:units = \"years","\"common_years") + + # Use ncatted to update the time units + att = "units" + var = "time" + att_type = "c" + opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] + nco.ncatted(input=inputfile, output=outputfile, options=opts) + + print("Generated modified output file: {}".format(outputfile)) + + return(outputfile) + + # The following is fixed with PR #62 for pynco but isn't in that latest update yet + # on conda + # nco.ncatted(input=inputfile,output=outputfile,options=[ + # Atted(mode="overwrite", + # att_name="units", + # var_name="time", + # value=newstr + # stype="c" + # ), + # ]) + +# Fix the boundaries of the LUH2 data +# Each lat/lon boundary array is a 2D array corresponding to the bounds of each +# coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate +# of 89.875). +def BoundsFixLUH2(inputdataset): + + # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional + # _bounds array. + # xESMF needs these variable names for bounding the conservative regridding + outputdataset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + outputdataset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) + outputdataset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) + print("LUH2 dataset bounds fixed") + + return(outputdataset) + +def DimensionFixSurfData(inputfile): + + # Move this out to be handled by opening function + surfdataset = xr.open_dataset(inputfile) + + # Rename the surface dataset dimensions to something recognizable by xESMF. + outputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + + # Populate the new surface dataset with the actual lat/lon values + outputdataset['longitude'] = outputdataset.LONGXY.isel(latitude=0) + outputdataset['latitude'] = outputdataset.LATIXY.isel(longitude=0) + + print("Surface dataset regrid target loaded: {}".format(inputfile)) + + return(outputdataset, surfdataset) + +def setmask(inputdataset,label_to_mask): + + # note that the label will depend on the type of input file + + # check what sort of inputdata is being provided; surface dataset or luh2 + # make mask of LUH2 data "primf_to_range" + if(inputdataset.source.find("LUH2") != -1): + # Add check of variables to use as mask + inputdataset["mask"] = xr.where(~np.isnan(inputdataset[label_to_mask].isel(time=0)), 1, 0) + elif(inpudataset.source.version.find("mksurf") != -1): + inputdataset["mask"] = inputdatatset["PCT_NATVEG"]> 0 + else: + print("Incorrect dataset provided") + inputdataset["mask"] = None + + return(inputdataset) + +def RegridConservative(dataset_from,dataset_to): + # define the regridder transformation + regridder = xe.Regridder(dataset_from, dataset_to, "conservative") + + regrid_states = regridder(finb_states) + regrid_management= regridder(finb_management) + regrid_transitions= regridder(finb_management) + + ### memory crashes on the transition data + #fin_transitions_regrid = regridder(finb) + # +# Make necessary (?) changes to metadata for XESMF conservative regrid +# Any LUH2 data set should work as the input dataset, but +# we should have some sort of check to make sure that the +# data sets being used are consistent in the final calling script +#def MetadataUpdateLUH2(inputdataset): + + # if this is LUH2 data + # Drop the invalid lat, lon variable labels and replace with "lat_b" and "lon_b" + # This is only necessary for the conservative method (?) per xESMF docs + + # Is dropping these variables really necessary? Will xESMF get confused or is this + # for the users's sake? + # outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + + # outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) + # outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) + # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 + # outputdatatset["YEAR"] = xr.DataArray(np.arange(len(fin["time"]), dtype=np.int16) + 850, dims=("time")) + +# Update the formatting to meet HLM needs +# def clmformatter(): + +# General functionality needed +# - collect data for specific user-defined time period +# - collect subset of the data variables (e.g. pasture, rangeland, etc) +# - write the subset to the necessary format to pass to regridding tools +# - This may need to be specific to the particular hlm tooling +# - call regridding tooling in hlm model +# - this will need to point at existing mapping data files, which are external to hlm +# - this may need a new mksurf_xxxx module if it can't conform to existing modules due +# to needing to use new fields +# future functionality: +# - importdata function for aforestation and other data to add to luh2 data From 6a32ff0a79be4043ee0bf5ad51017a13ed83a736 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 30 Mar 2023 17:02:08 -0700 Subject: [PATCH 011/125] Moving script into module function --- tools/luh2.py | 18 +++---- tools/luh2mod.py | 136 +++++++++++++++++++++++++++++------------------ 2 files changed, 93 insertions(+), 61 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 5facc30ea4..44cd0d1e9a 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -16,21 +16,21 @@ mod_file_transitions = "/home/glemieux/Data/luh2/transitions_modified.nc" # Open modified files -ds_states = luh2.importdata(mod_file_states) -ds_management = luh2.importdata(mod_file_management) -ds_transitions = luh2.importdata(mod_file_transitions) +ds_states = luh2.ImportData(mod_file_states) +# ds_management = luh2.importdata(mod_file_management) +# ds_transitions = luh2.importdata(mod_file_transitions) -# Fix the bounds -ds_states = luh2.BoundsFixLUH2(ds_states) -ds_management= luh2.BoundsFixLUH2(ds_management) -ds_transitions = luh2.BoundsFixLUH2(ds_transitions) +# Fix the bounds of the LUH2 variable for xESMF +ds_states = luh2.BoundsVariableFixLUH2(ds_states) +# ds_management= luh2.BoundsFixLUH2(ds_management) +# ds_transitions = luh2.BoundsFixLUH2(ds_transitions) # Grab surface data set to use as regrid "target" # Import the surface dataset file_surfdata = "/home/glemieux/Data/luh2/surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc" - +ds_surfdata = luh2.ImportData(file_surfdata) # modify the surface data set to enable xesmf regridder to find necessary data -ds_surfdata = luh2.DimensionFixSurfData(file_surfdata) + = luh2.DimensionFixSurfData(file_surfdata) print("done") diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 65cf029c34..c7548cc2dc 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -9,8 +9,32 @@ # Add version checking here in case environment.yml not used -# Import luh2 data -def importdata(inputfile): + + +# Primary function to regrid luh2 data +# +# Prepare the +def PrepDataSet(inputfile_luh2,inputfile_surface): + + # Import the data + ds_luh2 = ImportData(inputfile_luh2) + ds_surfdata = ImportData(inputfile_surface) + + # Correct the necessary variables for both datasets + ds_luh2 = BoundsVariableFixLUH2(ds_luh2) + ds_surfdata = DimensionFixSurfData(ds_surfdata) + + # Set dataset masks + ds_luh2 = SetMask(ds_luh2) + ds_surfdata = SetMask(ds_surfdata) + + # Define the xESMF regridder if necessary + regridder = RegridConservative(ds_luh2,ds_surfdata) + + return(ds_luh2,ds_surfdata,regridder) + +# Import luh2 or surface data sets +def ImportData(inputfile): # Open files # Check to see if a ValueError is raised which is likely due @@ -32,7 +56,7 @@ def importdata(inputfile): # This issue here is that the luh2 time units start prior to # year 1672, which cftime should be able to handle, but it # appears to need a specific unit name convention "common_years" -def attribupdate(inputfile,output_append="modified"): +def AttribUpdateLUH2(inputfile,output_append="modified"): # Define the output filename index = inputfile.find(".nc") @@ -69,26 +93,27 @@ def attribupdate(inputfile,output_append="modified"): # ), # ]) -# Fix the boundaries of the LUH2 data +# Create the necessary variable "lat_b" and "lon_b" for xESMF conservative regridding # Each lat/lon boundary array is a 2D array corresponding to the bounds of each # coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate # of 89.875). -def BoundsFixLUH2(inputdataset): +def BoundsVariableFixLUH2(inputdataset): - # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional - # _bounds array. - # xESMF needs these variable names for bounding the conservative regridding + # Drop the old boundary names to avoid confusion outputdataset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + + # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional_bounds array. + # Future todo: is it possible to have xESMF recognize and use the original 2D array? outputdataset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) outputdataset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) - print("LUH2 dataset bounds fixed") - return(outputdataset) + print("LUH2 dataset lat/lon boundary variables formatted and added as new variable for xESMF") -def DimensionFixSurfData(inputfile): + return(outputdataset) - # Move this out to be handled by opening function - surfdataset = xr.open_dataset(inputfile) +# The user will need to use a surface data set to regrid from, but the surface datasets +# need to have their dimensions renamed to something recognizable by xESMF +def DimensionFixSurfData(surfdataset): # Rename the surface dataset dimensions to something recognizable by xESMF. outputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) @@ -97,59 +122,66 @@ def DimensionFixSurfData(inputfile): outputdataset['longitude'] = outputdataset.LONGXY.isel(latitude=0) outputdataset['latitude'] = outputdataset.LATIXY.isel(longitude=0) - print("Surface dataset regrid target loaded: {}".format(inputfile)) + print("Surface dataset dimensions renamed for xESMF") - return(outputdataset, surfdataset) - -def setmask(inputdataset,label_to_mask): + return(outputdataset) - # note that the label will depend on the type of input file +def SetMask(inputdataset): # check what sort of inputdata is being provided; surface dataset or luh2 # make mask of LUH2 data "primf_to_range" - if(inputdataset.source.find("LUH2") != -1): - # Add check of variables to use as mask - inputdataset["mask"] = xr.where(~np.isnan(inputdataset[label_to_mask].isel(time=0)), 1, 0) - elif(inpudataset.source.version.find("mksurf") != -1): - inputdataset["mask"] = inputdatatset["PCT_NATVEG"]> 0 - else: - print("Incorrect dataset provided") - inputdataset["mask"] = None + try: + dsflag = CheckDataSet(inputdataset) + if(dsflag == "LUH2"): + SetMaskLUH2(inputdataset,'primf_to_range') # temporary test + elif(dsflag == "Surface"): + SetMaskSurfData(inputdataset) + else: + raise + print("mask added") + except: + print("nope") + +# Check which dataset we're working with +def CheckDataSet(inputdataset): - return(inputdataset) + try: + if(inputdataset.source.find("LUH2") != -1): + dsflag = 'LUH2' + elif(inpudataset.Version.find("mksurf") != -1): + dsflag = 'Surface' + else: + raise + return(dsflag) + except: + print("Unrecognized dataset provided") + +# LUH2 specific masking sub-function +def SetMaskLUH2(inputdataset,label_to_mask): + # Instead of passing the label_to_mask, loop through this for all labels? + inputdataset["mask"] = xr.where(~np.isnan(inputdataset[label_to_mask].isel(time=0)), 1, 0) + # return(outputdataset) + +# Surface dataset specific masking sub-function +def SetMaskSurfData(inputdataset): + # Instead of passing the label_to_mask, loop through this for all labels? + inputdataset["mask"] = inputdatatset["PCT_NATVEG"]> 0 + # return(outputdataset) def RegridConservative(dataset_from,dataset_to): # define the regridder transformation regridder = xe.Regridder(dataset_from, dataset_to, "conservative") - regrid_states = regridder(finb_states) - regrid_management= regridder(finb_management) - regrid_transitions= regridder(finb_management) + return(regridder) + + + # Apply regridder + # regrid_states = regridder(finb_states) + # regrid_management= regridder(finb_management) + # regrid_transitions= regridder(finb_management) ### memory crashes on the transition data #fin_transitions_regrid = regridder(finb) - # -# Make necessary (?) changes to metadata for XESMF conservative regrid -# Any LUH2 data set should work as the input dataset, but -# we should have some sort of check to make sure that the -# data sets being used are consistent in the final calling script -#def MetadataUpdateLUH2(inputdataset): - - # if this is LUH2 data - # Drop the invalid lat, lon variable labels and replace with "lat_b" and "lon_b" - # This is only necessary for the conservative method (?) per xESMF docs - - # Is dropping these variables really necessary? Will xESMF get confused or is this - # for the users's sake? - # outputdatatset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) - - # outputdatatset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) - # outputdatatset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) - # outputdatatset["time"] = np.arange(len(fin["time"]), dtype=np.int16) + 850 - # outputdatatset["YEAR"] = xr.DataArray(np.arange(len(fin["time"]), dtype=np.int16) + 850, dims=("time")) - -# Update the formatting to meet HLM needs -# def clmformatter(): # General functionality needed # - collect data for specific user-defined time period From d3e347f630866323dcd537b0fa5b2f1d1b1abfe6 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 31 Mar 2023 13:56:48 -0700 Subject: [PATCH 012/125] Intermediate improvements --- tools/luh2mod.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index c7548cc2dc..d698bc3573 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -129,32 +129,32 @@ def DimensionFixSurfData(surfdataset): def SetMask(inputdataset): # check what sort of inputdata is being provided; surface dataset or luh2 - # make mask of LUH2 data "primf_to_range" - try: - dsflag = CheckDataSet(inputdataset) - if(dsflag == "LUH2"): - SetMaskLUH2(inputdataset,'primf_to_range') # temporary test - elif(dsflag == "Surface"): + # LUH2 data will need to be masked based on the variable input to mask + dsflag,dstype = CheckDataSet(inputdataset) + if (dsflag): + if(dstype == "LUH2"): + SetMaskLUH2(inputdataset,'primf') # temporary test + elif(dstype == "Surface"): SetMaskSurfData(inputdataset) - else: - raise print("mask added") - except: - print("nope") # Check which dataset we're working with def CheckDataSet(inputdataset): - try: - if(inputdataset.source.find("LUH2") != -1): - dsflag = 'LUH2' - elif(inpudataset.Version.find("mksurf") != -1): - dsflag = 'Surface' - else: - raise - return(dsflag) - except: - print("Unrecognized dataset provided") + dsflag = False + if('primf' in list(inputdataset.variables)): + dstype = 'LUH2' + dsflag = True + print("LUH2") + elif('natpft' in list(inputdataset.variables)): + dstype = 'Surface' + dsflag = True + print("Surface") + else: + dstype = 'Unknown' + print("Unrecognize data set") + + return(dsflag,dstype) # LUH2 specific masking sub-function def SetMaskLUH2(inputdataset,label_to_mask): @@ -165,7 +165,7 @@ def SetMaskLUH2(inputdataset,label_to_mask): # Surface dataset specific masking sub-function def SetMaskSurfData(inputdataset): # Instead of passing the label_to_mask, loop through this for all labels? - inputdataset["mask"] = inputdatatset["PCT_NATVEG"]> 0 + inputdataset["mask"] = inputdataset["PCT_NATVEG"]> 0 # return(outputdataset) def RegridConservative(dataset_from,dataset_to): From f334f2291dfd990e3862d66a633880c1ba0d5c4e Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 31 Mar 2023 16:33:24 -0700 Subject: [PATCH 013/125] Fixup --- tools/luh2mod.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index d698bc3573..f30116e5a0 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -29,9 +29,10 @@ def PrepDataSet(inputfile_luh2,inputfile_surface): ds_surfdata = SetMask(ds_surfdata) # Define the xESMF regridder if necessary - regridder = RegridConservative(ds_luh2,ds_surfdata) + # regridder = RegridConservative(ds_luh2,ds_surfdata) - return(ds_luh2,ds_surfdata,regridder) + # return(ds_luh2,ds_surfdata,regridder) + return(ds_luh2,ds_surfdata) # Import luh2 or surface data sets def ImportData(inputfile): @@ -133,11 +134,13 @@ def SetMask(inputdataset): dsflag,dstype = CheckDataSet(inputdataset) if (dsflag): if(dstype == "LUH2"): - SetMaskLUH2(inputdataset,'primf') # temporary test + SetMaskLUH2(inputdataset,'primf') # temporary elif(dstype == "Surface"): SetMaskSurfData(inputdataset) print("mask added") + return(inputdataset) + # Check which dataset we're working with def CheckDataSet(inputdataset): @@ -161,12 +164,14 @@ def SetMaskLUH2(inputdataset,label_to_mask): # Instead of passing the label_to_mask, loop through this for all labels? inputdataset["mask"] = xr.where(~np.isnan(inputdataset[label_to_mask].isel(time=0)), 1, 0) # return(outputdataset) + return(inputdataset) # Surface dataset specific masking sub-function def SetMaskSurfData(inputdataset): # Instead of passing the label_to_mask, loop through this for all labels? inputdataset["mask"] = inputdataset["PCT_NATVEG"]> 0 # return(outputdataset) + return(inputdataset) def RegridConservative(dataset_from,dataset_to): # define the regridder transformation From b6193220042a193812c7faf1370f897cbc4ce14d Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 3 Apr 2023 15:55:14 -0600 Subject: [PATCH 014/125] move cohort to its own module --- biogeochem/EDCohortDynamicsMod.F90 | 878 +++++++++++------------------ main/EDTypesMod.F90 | 352 +----------- main/FatesCohortMod.F90 | 624 ++++++++++++++++++++ main/FatesConstantsMod.F90 | 7 + main/FatesInventoryInitMod.F90 | 11 +- parteh/PRTAllometricCarbonMod.F90 | 5 +- 6 files changed, 976 insertions(+), 901 deletions(-) create mode 100644 main/FatesCohortMod.F90 diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 1385f846cb..6f14ce4e66 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -26,7 +26,8 @@ Module EDCohortDynamicsMod use EDPftvarcon , only : GetDecompyFrac use PRTParametersMod , only : prt_params use FatesParameterDerivedMod, only : param_derived - use EDTypesMod , only : ed_site_type, ed_patch_type, ed_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : nclmax use PRTGenericMod , only : element_list use PRTGenericMod , only : StorageNutrientTarget @@ -85,7 +86,6 @@ Module EDCohortDynamicsMod use PRTGenericMod, only : repro_organ use PRTGenericMod, only : struct_organ use PRTGenericMod, only : SetState - use PRTAllometricCarbonMod, only : callom_prt_vartypes use PRTAllometricCarbonMod, only : ac_bc_inout_id_netdc use PRTAllometricCarbonMod, only : ac_bc_in_id_pft @@ -117,7 +117,6 @@ Module EDCohortDynamicsMod ! public :: create_cohort public :: zero_cohort - public :: nan_cohort public :: terminate_cohorts public :: terminate_cohort public :: fuse_cohorts @@ -150,316 +149,225 @@ Module EDCohortDynamicsMod contains !-------------------------------------------------------------------------------------! - subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & - prt, status, recruitstatus,ctrim, carea, clayer, crowndamage, spread, bc_in) - - ! - ! !DESCRIPTION: - ! create new cohort - ! There are 4 places this is called - ! 1) Initializing new cohorts at the beginning of a cold-start simulation - ! 2) Initializing new recruits during dynamics - ! 3) Initializing new cohorts at the beginning of a inventory read - ! 4) Initializing new cohorts during restart - ! - ! It is assumed that in the first 3, this is called with a reasonable amount of starter information. - ! - ! !USES: - ! - ! !ARGUMENTS - - type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type), intent(inout), pointer :: patchptr - - integer, intent(in) :: pft ! Cohort Plant Functional Type - integer, intent(in) :: crowndamage ! Cohort damage class - integer, intent(in) :: clayer ! canopy status of cohort - ! (1 = canopy, 2 = understorey, etc.) - integer, intent(in) :: status ! growth status of plant - ! (2 = leaves on , 1 = leaves off) - integer, intent(in) :: recruitstatus ! recruit status of plant - ! (1 = recruitment , 0 = other) - real(r8), intent(in) :: nn ! number of individuals in cohort - ! per 'area' (10000m2 default) - real(r8), intent(in) :: hite ! height: meters - real(r8), intent(in) :: coage ! cohort age in years - real(r8), intent(in) :: dbh ! dbh: cm - class(prt_vartypes),intent(inout), pointer :: prt ! The allocated PARTEH - !class(prt_vartypes),target :: prt ! The allocated PARTEH - ! object - real(r8), intent(in) :: ctrim ! What is the fraction of the maximum - ! leaf biomass that we are targeting? - real(r8), intent(in) :: spread ! The community assembly effects how - ! spread crowns are in horizontal space - real(r8), intent(in) :: carea ! area of cohort ONLY USED IN SP MODE. - type(bc_in_type), intent(in) :: bc_in ! External boundary conditions - - - ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: new_cohort ! Pointer to New Cohort structure. - type(ed_cohort_type), pointer :: storesmallcohort - type(ed_cohort_type), pointer :: storebigcohort - integer :: iage ! loop counter for leaf age classes - real(r8) :: leaf_c ! total leaf carbon - integer :: tnull,snull ! are the tallest and shortest cohorts allocate - integer :: nlevrhiz ! number of rhizosphere layers - - !---------------------------------------------------------------------- - - allocate(new_cohort) - - call nan_cohort(new_cohort) ! Make everything in the cohort not-a-number - call zero_cohort(new_cohort) ! Zero things that need to be zeroed. - - ! Point to the PARTEH object - new_cohort%prt => prt - - ! The PARTEH cohort object should be allocated and already - ! initialized in this routine. - call new_cohort%prt%CheckInitialConditions() - - !**********************/ - ! Define cohort state variable - !**********************/ - - new_cohort%indexnumber = fates_unset_int ! Cohort indexing was not thread-safe, setting - ! bogus value for the time being (RGK-012017) - - new_cohort%patchptr => patchptr - - new_cohort%pft = pft - new_cohort%crowndamage = crowndamage - new_cohort%status_coh = status - new_cohort%n = nn - new_cohort%hite = hite - new_cohort%dbh = dbh - new_cohort%coage = coage - new_cohort%canopy_trim = ctrim - new_cohort%canopy_layer = clayer - new_cohort%canopy_layer_yesterday = real(clayer, r8) - - ! Initialize the leaf to fineroot biomass ratio - ! for C-only, this will stay constant, for nutrient enabled - ! this will be dynamic. In both cases, new cohorts are - ! initialized with the minimum. This works in the nutrient - ! enabled case, because cohorts are also initialized with - ! full stores, which match with minimum fr biomass - - new_cohort%l2fr = prt_params%allom_l2fr(pft) - - if(hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then - new_cohort%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt - new_cohort%cnp_limiter = 0 ! Assume limitations are unknown - end if - - ! This sets things like vcmax25top, that depend on the - ! leaf age fractions (which are defined by PARTEH) - call UpdateCohortBioPhysRates(new_cohort) - - call sizetype_class_index(new_cohort%dbh, new_cohort%pft, & - new_cohort%size_class,new_cohort%size_by_pft_class) - - ! If cohort age trackign is off we call this here once - ! just so everythin is in the first bin - - ! this makes it easier to copy and terminate cohorts later - ! we don't need to update this ever if cohort age tracking is off - call coagetype_class_index(new_cohort%coage, new_cohort%pft, & - new_cohort%coage_class,new_cohort%coage_by_pft_class) - - ! This routine may be called during restarts, and at this point in the call sequence - ! the actual cohort data is unknown, as this is really only used for allocation - ! In these cases, testing if things like biomass are reasonable is pre-mature - ! However, in this part of the code, we will pass in nominal values for size, number and type - - if (new_cohort%dbh <= 0._r8 .or. new_cohort%n == 0._r8 .or. new_cohort%pft == 0 ) then - write(fates_log(),*) 'ED: something is zero in create_cohort', & - new_cohort%dbh,new_cohort%n, & - new_cohort%pft - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - ! Assign canopy extent and depth - if(hlm_use_sp.eq.ifalse)then - call carea_allom(new_cohort%dbh,new_cohort%n,spread,new_cohort%pft, & - new_cohort%crowndamage,new_cohort%c_area) - else - new_cohort%c_area = carea ! set this from previously precision-controlled value in SP mode - endif - ! Query PARTEH for the leaf carbon [kg] - leaf_c = new_cohort%prt%GetState(leaf_organ,carbon12_element) - - new_cohort%treelai = tree_lai(leaf_c, new_cohort%pft, new_cohort%c_area, & - new_cohort%n, new_cohort%canopy_layer, & - patchptr%canopy_layer_tlai,new_cohort%vcmax25top ) - - if(hlm_use_sp.eq.ifalse)then - new_cohort%treesai = tree_sai(new_cohort%pft, new_cohort%dbh, & - new_cohort%crowndamage, new_cohort%canopy_trim, & - new_cohort%c_area, new_cohort%n, new_cohort%canopy_layer, & - patchptr%canopy_layer_tlai, new_cohort%treelai,new_cohort%vcmax25top,2 ) - end if - - - ! Put cohort at the right place in the linked list - storebigcohort => patchptr%tallest - storesmallcohort => patchptr%shortest - - if (associated(patchptr%tallest)) then - tnull = 0 - else - tnull = 1 - patchptr%tallest => new_cohort - endif - - if (associated(patchptr%shortest)) then - snull = 0 - else - snull = 1 - patchptr%shortest => new_cohort - endif - - ! Allocate running mean functions - - ! (Keeping as an example) - !! allocate(new_cohort%tveg_lpa) - !! call new_cohort%tveg_lpa%InitRMean(ema_lpa,init_value=patchptr%tveg_lpa%GetMean()) - - call InitPRTBoundaryConditions(new_cohort) - - - ! Recuits do not have mortality rates, nor have they moved any - ! carbon when they are created. They will bias our statistics - ! until they have experienced a full day. We need a newly recruited flag. - ! This flag will be set to false after it has experienced - ! growth, disturbance and mortality. - new_cohort%isnew = .true. - - if( hlm_use_planthydro.eq.itrue ) then - - nlevrhiz = currentSite%si_hydr%nlevrhiz - - ! This allocates array spaces - call InitHydrCohort(currentSite,new_cohort) - - ! zero out the water balance error - new_cohort%co_hydr%errh2o = 0._r8 - - ! This calculates node heights - call UpdatePlantHydrNodes(new_cohort,new_cohort%pft, & - new_cohort%hite,currentSite%si_hydr) - - ! This calculates volumes and lengths - call UpdatePlantHydrLenVol(new_cohort,currentSite%si_hydr) - - ! This updates the Kmax's of the plant's compartments - call UpdatePlantKmax(new_cohort%co_hydr,new_cohort,currentSite%si_hydr) - - ! Since this is a newly initialized plant, we set the previous compartment-size - ! equal to the ones we just calculated. - call SavePreviousCompartmentVolumes(new_cohort%co_hydr) - - ! This comes up with starter suctions and then water contents - ! based on the soil values - call InitPlantHydStates(currentSite,new_cohort) - - if(recruitstatus==1)then - - new_cohort%co_hydr%is_newly_recruited = .true. - - ! If plant hydraulics is active, we must constrain the - ! number density of the new recruits based on the moisture - ! available to be subsumed in the new plant tissues. - ! So we go through the process of pre-initializing the hydraulic - ! states in the temporary cohort, to calculate this new number density - - call ConstrainRecruitNumber(currentSite,new_cohort, bc_in) - - endif - - endif - - call insert_cohort(new_cohort, patchptr%tallest, patchptr%shortest, tnull, snull, & - storebigcohort, storesmallcohort) - - patchptr%tallest => storebigcohort - patchptr%shortest => storesmallcohort - - end subroutine create_cohort - - ! ------------------------------------------------------------------------------------- - - subroutine InitPRTBoundaryConditions(new_cohort) - - ! Set the boundary conditions that flow in an out of the PARTEH - ! allocation hypotheses. Each of these calls to "RegsterBC" are simply - ! setting pointers. - ! For instance, if the hypothesis wants to know what - ! the DBH of the plant is, then we pass in the dbh as an argument (new_cohort%dbh), - ! and also tell it which boundary condition we are talking about (which is - ! defined by an integer index (ac_bc_inout_id_dbh) - ! - ! Again, elaborated Example: - ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index - ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" - ! that is classified as input and output "inout". - ! See PRTAllometricCarbonMod.F90 to track its usage. - ! bc_rval is used as the optional argument identifyer to specify a real - ! value boundary condition. - ! bc_ival is used as the optional argument identifyer to specify an integer - ! value boundary condition. - - type(ed_cohort_type), intent(inout), target :: new_cohort - - select case(hlm_parteh_mode) - case (prt_carbon_allom_hyp) +subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & + prt, status, recruitstatus,ctrim, carea, clayer, crowndamage, spread, bc_in) + +! +! !DESCRIPTION: +! create new cohort +! There are 4 places this is called +! 1) Initializing new cohorts at the beginning of a cold-start simulation +! 2) Initializing new recruits during dynamics +! 3) Initializing new cohorts at the beginning of a inventory read +! 4) Initializing new cohorts during restart +! +! It is assumed that in the first 3, this is called with a reasonable amount of starter information. +! +! !USES: +! +! !ARGUMENTS + +type(ed_site_type), intent(inout), target :: currentSite +type(ed_patch_type), intent(inout), pointer :: patchptr + +integer, intent(in) :: pft ! Cohort Plant Functional Type +integer, intent(in) :: crowndamage ! Cohort damage class +integer, intent(in) :: clayer ! canopy status of cohort + ! (1 = canopy, 2 = understorey, etc.) +integer, intent(in) :: status ! growth status of plant + ! (2 = leaves on , 1 = leaves off) +integer, intent(in) :: recruitstatus ! recruit status of plant + ! (1 = recruitment , 0 = other) +real(r8), intent(in) :: nn ! number of individuals in cohort + ! per 'area' (10000m2 default) +real(r8), intent(in) :: hite ! height: meters +real(r8), intent(in) :: coage ! cohort age in years +real(r8), intent(in) :: dbh ! dbh: cm +class(prt_vartypes),intent(inout), pointer :: prt ! The allocated PARTEH +!class(prt_vartypes),target :: prt ! The allocated PARTEH + ! object +real(r8), intent(in) :: ctrim ! What is the fraction of the maximum + ! leaf biomass that we are targeting? +real(r8), intent(in) :: spread ! The community assembly effects how + ! spread crowns are in horizontal space +real(r8), intent(in) :: carea ! area of cohort ONLY USED IN SP MODE. +type(bc_in_type), intent(in) :: bc_in ! External boundary conditions + + +! !LOCAL VARIABLES: +type(fates_cohort_type), pointer :: new_cohort ! Pointer to New Cohort structure. +type(fates_cohort_type), pointer :: storesmallcohort +type(fates_cohort_type), pointer :: storebigcohort +integer :: iage ! loop counter for leaf age classes +real(r8) :: leaf_c ! total leaf carbon +integer :: tnull,snull ! are the tallest and shortest cohorts allocate +integer :: nlevrhiz ! number of rhizosphere layers + +!---------------------------------------------------------------------- + +allocate(new_cohort) + +new_cohort%init(prt) + +!**********************/ +! Define cohort state variable +!**********************/ + +new_cohort%indexnumber = fates_unset_int ! Cohort indexing was not thread-safe, setting + ! bogus value for the time being (RGK-012017) + +new_cohort%patchptr => patchptr + +new_cohort%pft = pft +new_cohort%crowndamage = crowndamage +new_cohort%status_coh = status +new_cohort%n = nn +new_cohort%hite = hite +new_cohort%dbh = dbh +new_cohort%coage = coage +new_cohort%canopy_trim = ctrim +new_cohort%canopy_layer = clayer +new_cohort%canopy_layer_yesterday = real(clayer, r8) + +! Initialize the leaf to fineroot biomass ratio +! for C-only, this will stay constant, for nutrient enabled +! this will be dynamic. In both cases, new cohorts are +! initialized with the minimum. This works in the nutrient +! enabled case, because cohorts are also initialized with +! full stores, which match with minimum fr biomass + +new_cohort%l2fr = prt_params%allom_l2fr(pft) + +if(hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then + new_cohort%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + new_cohort%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + new_cohort%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt + new_cohort%cnp_limiter = 0 ! Assume limitations are unknown +end if + +! This sets things like vcmax25top, that depend on the +! leaf age fractions (which are defined by PARTEH) +call UpdateCohortBioPhysRates(new_cohort) + +call sizetype_class_index(new_cohort%dbh, new_cohort%pft, & + new_cohort%size_class,new_cohort%size_by_pft_class) + +! If cohort age trackign is off we call this here once +! just so everythin is in the first bin - +! this makes it easier to copy and terminate cohorts later +! we don't need to update this ever if cohort age tracking is off +call coagetype_class_index(new_cohort%coage, new_cohort%pft, & + new_cohort%coage_class,new_cohort%coage_by_pft_class) + +! This routine may be called during restarts, and at this point in the call sequence +! the actual cohort data is unknown, as this is really only used for allocation +! In these cases, testing if things like biomass are reasonable is pre-mature +! However, in this part of the code, we will pass in nominal values for size, number and type + +if (new_cohort%dbh <= 0._r8 .or. new_cohort%n == 0._r8 .or. new_cohort%pft == 0 ) then + write(fates_log(),*) 'ED: something is zero in create_cohort', & + new_cohort%dbh,new_cohort%n, & + new_cohort%pft + call endrun(msg=errMsg(sourcefile, __LINE__)) +endif + +! Assign canopy extent and depth +if(hlm_use_sp.eq.ifalse)then + call carea_allom(new_cohort%dbh,new_cohort%n,spread,new_cohort%pft, & + new_cohort%crowndamage,new_cohort%c_area) +else + new_cohort%c_area = carea ! set this from previously precision-controlled value in SP mode +endif +! Query PARTEH for the leaf carbon [kg] +leaf_c = new_cohort%prt%GetState(leaf_organ,carbon12_element) + +new_cohort%treelai = tree_lai(leaf_c, new_cohort%pft, new_cohort%c_area, & + new_cohort%n, new_cohort%canopy_layer, & + patchptr%canopy_layer_tlai,new_cohort%vcmax25top ) + +if(hlm_use_sp.eq.ifalse)then + new_cohort%treesai = tree_sai(new_cohort%pft, new_cohort%dbh, & + new_cohort%crowndamage, new_cohort%canopy_trim, & + new_cohort%c_area, new_cohort%n, new_cohort%canopy_layer, & + patchptr%canopy_layer_tlai, new_cohort%treelai,new_cohort%vcmax25top,2 ) +end if + + +! Put cohort at the right place in the linked list +storebigcohort => patchptr%tallest +storesmallcohort => patchptr%shortest + +if (associated(patchptr%tallest)) then + tnull = 0 +else + tnull = 1 + patchptr%tallest => new_cohort +endif + +if (associated(patchptr%shortest)) then + snull = 0 +else + snull = 1 + patchptr%shortest => new_cohort +endif + +! Allocate running mean functions + +! (Keeping as an example) +!! allocate(new_cohort%tveg_lpa) +!! call new_cohort%tveg_lpa%InitRMean(ema_lpa,init_value=patchptr%tveg_lpa%GetMean()) + +if( hlm_use_planthydro.eq.itrue ) then + + nlevrhiz = currentSite%si_hydr%nlevrhiz + + ! This allocates array spaces + call InitHydrCohort(currentSite,new_cohort) + + ! zero out the water balance error + new_cohort%co_hydr%errh2o = 0._r8 + + ! This calculates node heights + call UpdatePlantHydrNodes(new_cohort,new_cohort%pft, & + new_cohort%hite,currentSite%si_hydr) + + ! This calculates volumes and lengths + call UpdatePlantHydrLenVol(new_cohort,currentSite%si_hydr) + + ! This updates the Kmax's of the plant's compartments + call UpdatePlantKmax(new_cohort%co_hydr,new_cohort,currentSite%si_hydr) + + ! Since this is a newly initialized plant, we set the previous compartment-size + ! equal to the ones we just calculated. + call SavePreviousCompartmentVolumes(new_cohort%co_hydr) + + ! This comes up with starter suctions and then water contents + ! based on the soil values + call InitPlantHydStates(currentSite,new_cohort) + + if(recruitstatus==1)then - ! Register boundary conditions for the Carbon Only Allometric Hypothesis + new_cohort%co_hydr%is_newly_recruited = .true. - call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_dbh,bc_rval = new_cohort%dbh) - call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_netdc,bc_rval = new_cohort%npp_acc) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_pft,bc_ival = new_cohort%pft) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_lstat,bc_ival = new_cohort%status_coh) - - case (prt_cnp_flex_allom_hyp) + ! If plant hydraulics is active, we must constrain the + ! number density of the new recruits based on the moisture + ! available to be subsumed in the new plant tissues. + ! So we go through the process of pre-initializing the hydraulic + ! states in the temporary cohort, to calculate this new number density - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pft,bc_ival = new_cohort%pft) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_lstat,bc_ival = new_cohort%status_coh) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval = new_cohort%npp_acc) + call ConstrainRecruitNumber(currentSite,new_cohort, bc_in) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_nc_repro,bc_rval = new_cohort%nc_repro) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pc_repro,bc_rval = new_cohort%pc_repro) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) - - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_dbh,bc_rval = new_cohort%dbh) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess,bc_rval = new_cohort%resp_excess) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr,bc_rval = new_cohort%l2fr) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int,bc_rval = new_cohort%cx_int) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt,bc_rval = new_cohort%ema_dcxdt) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx0,bc_rval = new_cohort%cx0) - - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval = new_cohort%daily_n_gain) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval = new_cohort%daily_p_gain) - - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval = new_cohort%daily_c_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval = new_cohort%daily_n_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval = new_cohort%daily_p_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival = new_cohort%cnp_limiter) - - case DEFAULT + endif - write(fates_log(),*) 'You specified an unknown PRT module' - write(fates_log(),*) 'Aborting' - call endrun(msg=errMsg(sourcefile, __LINE__)) +endif - end select +call insert_cohort(new_cohort, patchptr%tallest, patchptr%shortest, tnull, snull, & + storebigcohort, storesmallcohort) +patchptr%tallest => storebigcohort +patchptr%shortest => storesmallcohort - end subroutine InitPRTBoundaryConditions +end subroutine create_cohort ! ------------------------------------------------------------------------------------! @@ -517,223 +425,6 @@ end subroutine InitPRTObject !-------------------------------------------------------------------------------------! - subroutine nan_cohort(cc_p) - ! - ! !DESCRIPTION: - ! Make all the cohort variables NaN so they aren't used before defined. - ! - ! !USES: - - use FatesConstantsMod, only : fates_unset_int - - ! - ! !ARGUMENTS - type (ed_cohort_type), intent(inout), target :: cc_p - ! - ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: currentCohort - !---------------------------------------------------------------------- - - currentCohort => cc_p - - currentCohort%taller => null() ! pointer to next tallest cohort - currentCohort%shorter => null() ! pointer to next shorter cohort - currentCohort%patchptr => null() ! pointer to patch that cohort is in - - nullify(currentCohort%taller) - nullify(currentCohort%shorter) - nullify(currentCohort%patchptr) - - ! VEGETATION STRUCTURE - currentCohort%pft = fates_unset_int ! pft number - currentCohort%crowndamage = fates_unset_int ! Crown damage class - currentCohort%indexnumber = fates_unset_int ! unique number for each cohort. (within clump?) - currentCohort%canopy_layer = fates_unset_int ! canopy status of cohort (1 = canopy, 2 = understorey, etc.) - currentCohort%canopy_layer_yesterday = nan ! recent canopy status of cohort (1 = canopy, 2 = understorey, etc.) - currentCohort%NV = fates_unset_int ! Number of leaf layers: - - currentCohort%status_coh = fates_unset_int ! growth status of plant (2 = leaves on , 1 = leaves off) - currentCohort%size_class = fates_unset_int ! size class index - currentCohort%size_class_lasttimestep = fates_unset_int ! size class index - currentCohort%size_by_pft_class = fates_unset_int ! size by pft classification index - currentCohort%coage_class = fates_unset_int ! cohort age class index - currentCohort%coage_by_pft_class = fates_unset_int ! cohort age by pft class index - - currentCohort%n = nan ! number of individuals in cohort per 'area' (10000m2 default) - currentCohort%dbh = nan ! 'diameter at breast height' in cm - currentCohort%coage = nan ! age of the cohort in years - currentCohort%hite = nan ! height: meters - currentCohort%g_sb_laweight = nan ! Total leaf conductance of cohort (stomata+blayer) weighted by leaf-area [m/s]*[m2] - currentCohort%canopy_trim = nan ! What is the fraction of the maximum leaf biomass that we are targeting? :- - currentCohort%leaf_cost = nan ! How much does it cost to maintain leaves: kgC/m2/year-1 - currentCohort%excl_weight = nan ! How much of this cohort is demoted each year, as a proportion of all cohorts:- - currentCohort%prom_weight = nan ! How much of this cohort is promoted each year, as a proportion of all cohorts:- - currentCohort%c_area = nan ! areal extent of canopy (m2) - currentCohort%treelai = nan ! lai of tree (total leaf area (m2) / canopy area (m2) - currentCohort%treesai = nan ! stem area index of tree (total stem area (m2) / canopy area (m2) - currentCohort%seed_prod = nan - currentCohort%vcmax25top = nan - currentCohort%jmax25top = nan - currentCohort%tpu25top = nan - currentCohort%kp25top = nan - - ! CARBON FLUXES - currentCohort%gpp_acc_hold = nan ! GPP: kgC/indiv/year - currentCohort%gpp_tstep = nan ! GPP: kgC/indiv/timestep - currentCohort%gpp_acc = nan ! GPP: kgC/indiv/day - currentCohort%npp_acc_hold = nan ! NPP: kgC/indiv/year - currentCohort%npp_tstep = nan ! NPP: kGC/indiv/timestep - currentCohort%npp_acc = nan ! NPP: kgC/indiv/day - currentCohort%year_net_uptake(:) = nan ! Net uptake of individual leaf layers kgC/m2/year - currentCohort%ts_net_uptake(:) = nan ! Net uptake of individual leaf layers kgC/m2/s - currentCohort%resp_acc_hold = nan ! RESP: kgC/indiv/year - currentCohort%resp_tstep = nan ! RESP: kgC/indiv/timestep - currentCohort%resp_acc = nan ! RESP: kGC/cohort/day - - ! Fluxes from nutrient allocation - currentCohort%daily_nh4_uptake = nan - currentCohort%daily_no3_uptake = nan - currentCohort%daily_n_gain = nan - currentCohort%sym_nfix_daily = nan - currentCohort%sym_nfix_tstep = nan - currentCohort%daily_p_gain = nan - currentCohort%daily_c_efflux = nan - currentCohort%daily_n_efflux = nan - currentCohort%daily_p_efflux = nan - currentCohort%daily_n_demand = nan - currentCohort%daily_p_demand = nan - currentCohort%cx_int = nan - currentCohort%cx0 = nan - currentCohort%ema_dcxdt = nan - currentCohort%cnp_limiter = fates_unset_int - - currentCohort%c13disc_clm = nan ! C13 discrimination, per mil at indiv/timestep - currentCohort%c13disc_acc = nan ! C13 discrimination, per mil at indiv/timestep at indiv/daily at the end of a day - - !RESPIRATION - currentCohort%rdark = nan - currentCohort%resp_m = nan ! Maintenance respiration. kGC/cohort/year - currentCohort%resp_m_unreduced = nan ! Diagnostic-only unreduced Maintenance respiration. kGC/cohort/year - currentCohort%resp_excess = nan ! Respiration of excess (unallocatable) carbon (kg/indiv/day) - currentCohort%livestem_mr = nan ! Live stem maintenance respiration. kgC/indiv/s-1 - currentCohort%livecroot_mr = nan ! Coarse root maintenance respiration. kgC/indiv/s-1 - currentCohort%froot_mr = nan ! Fine root maintenance respiration. kgC/indiv/s-1 - currentCohort%resp_g_tstep = nan ! Growth respiration. kGC/indiv/timestep - - - ! ALLOCATION - currentCohort%dmort = nan ! proportional mortality rate. (year-1) - - ! logging - currentCohort%lmort_direct = nan - currentCohort%lmort_infra = nan - currentCohort%lmort_collateral = nan - currentCohort%l_degrad = nan - - currentCohort%c_area = nan ! areal extent of canopy (m2) - currentCohort%treelai = nan ! lai of tree (total leaf area (m2) / canopy area (m2) - currentCohort%treesai = nan ! stem area index of tree (total stem area (m2) / canopy area (m2) - - - ! VARIABLES NEEDED FOR INTEGRATION - currentCohort%dndt = nan ! time derivative of cohort size - currentCohort%dhdt = nan ! time derivative of height - currentCohort%ddbhdt = nan ! time derivative of dbh - - ! FIRE - currentCohort%fraction_crown_burned = nan ! proportion of crown affected by fire - currentCohort%cambial_mort = nan ! probability that trees dies due to cambial char P&R (1986) - currentCohort%crownfire_mort = nan ! probability of tree post-fire mortality due to crown scorch - currentCohort%fire_mort = nan ! post-fire mortality from cambial and crown damage assuming two are independent - - end subroutine nan_cohort - - !-------------------------------------------------------------------------------------! - - subroutine zero_cohort(cc_p) - ! - ! !DESCRIPTION: - ! Zero variables that need to be accounted for if - ! this cohort is altered before they are defined. - ! - ! !USES: - ! - ! !ARGUMENTS - type (ed_cohort_type), intent(inout), target :: cc_p - ! - ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: currentCohort - !---------------------------------------------------------------------- - - currentCohort => cc_p - - currentCohort%NV = 0 - currentCohort%status_coh = 0 - currentCohort%rdark = 0._r8 - currentCohort%resp_m = 0._r8 - currentCohort%resp_m_unreduced = 0._r8 - currentCohort%resp_excess = 0._r8 - currentCohort%resp_g_tstep = 0._r8 - currentCohort%livestem_mr = 0._r8 - currentCohort%livecroot_mr = 0._r8 - currentCohort%froot_mr = 0._r8 - currentCohort%fire_mort = 0._r8 - currentcohort%npp_acc = 0._r8 - currentcohort%gpp_acc = 0._r8 - currentcohort%resp_acc = 0._r8 - currentcohort%npp_tstep = 0._r8 - currentcohort%gpp_tstep = 0._r8 - currentcohort%resp_tstep = 0._r8 - currentcohort%resp_acc_hold = 0._r8 - - currentcohort%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. - currentcohort%ts_net_uptake(:) = 0._r8 - currentcohort%fraction_crown_burned = 0._r8 - currentCohort%size_class = 1 - currentCohort%coage_class = 1 - currentCohort%seed_prod = 0._r8 - currentCohort%size_class_lasttimestep = 0 - currentcohort%npp_acc_hold = 0._r8 - currentcohort%gpp_acc_hold = 0._r8 - currentcohort%dmort = 0._r8 - currentcohort%g_sb_laweight = 0._r8 - currentcohort%treesai = 0._r8 - currentCohort%lmort_direct = 0._r8 - currentCohort%lmort_infra = 0._r8 - currentCohort%lmort_collateral = 0._r8 - currentCohort%l_degrad = 0._r8 - currentCohort%leaf_cost = 0._r8 - currentcohort%excl_weight = 0._r8 - currentcohort%prom_weight = 0._r8 - currentcohort%crownfire_mort = 0._r8 - currentcohort%cambial_mort = 0._r8 - currentCohort%c13disc_clm = 0._r8 - currentCohort%c13disc_acc = 0._r8 - - ! Daily nutrient fluxes are INTEGRATED over the course of the - ! day. This variable MUST be zerod upon creation AND - ! after allocation. These variables exist in - ! carbon-only mode but are not used. - - currentCohort%daily_nh4_uptake = 0._r8 - currentCohort%daily_no3_uptake = 0._r8 - currentCohort%daily_p_gain = 0._r8 - - currentCohort%daily_c_efflux = 0._r8 - currentCohort%daily_n_efflux = 0._r8 - currentCohort%daily_p_efflux = 0._r8 - - ! Initialize these as negative - currentCohort%daily_p_demand = -9._r8 - currentCohort%daily_n_demand = -9._r8 - - ! Fixation is also integrated over the course of the day - ! and must be zeroed upon creation and after plant - ! resource allocation - currentCohort%sym_nfix_daily = 0._r8 - - end subroutine zero_cohort - - !-------------------------------------------------------------------------------------! subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_in) ! ! !DESCRIPTION: @@ -759,9 +450,9 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: currentCohort - type (ed_cohort_type) , pointer :: shorterCohort - type (ed_cohort_type) , pointer :: tallerCohort + type (fates_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: shorterCohort + type (fates_cohort_type) , pointer :: tallerCohort real(r8) :: leaf_c ! leaf carbon [kg] real(r8) :: store_c ! storage carbon [kg] @@ -862,12 +553,12 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) ! !ARGUMENTS type (ed_site_type) , intent(inout), target :: currentSite type (ed_patch_type) , intent(inout), target :: currentPatch - type (ed_cohort_type), intent(inout), target :: currentCohort + type (fates_cohort_type), intent(inout), target :: currentCohort type(bc_in_type), intent(in) :: bc_in ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: shorterCohort - type (ed_cohort_type) , pointer :: tallerCohort + type (fates_cohort_type) , pointer :: shorterCohort + type (fates_cohort_type) , pointer :: tallerCohort real(r8) :: leaf_c ! leaf carbon [kg] real(r8) :: store_c ! storage carbon [kg] @@ -968,7 +659,7 @@ subroutine SendCohortToLitter(csite,cpatch,ccohort,nplant,bc_in) ! Arguments type (ed_site_type) , target :: csite type (ed_patch_type) , target :: cpatch - type (ed_cohort_type) , target :: ccohort + type (fates_cohort_type) , target :: ccohort real(r8) :: nplant ! Number (absolute) ! of plants to transfer type(bc_in_type), intent(in) :: bc_in @@ -1087,7 +778,7 @@ subroutine DeallocateCohort(currentCohort) ! the cohort structure itself. ! ---------------------------------------------------------------------------------- - type(ed_cohort_type),intent(inout) :: currentCohort + type(fates_cohort_type),intent(inout) :: currentCohort integer :: istat ! return status code character(len=255) :: smsg @@ -1130,12 +821,12 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in) ! ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: currentCohort - type (ed_cohort_type) , pointer :: nextc - type (ed_cohort_type) , pointer :: nextnextc + type (fates_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: nextc + type (fates_cohort_type) , pointer :: nextnextc - type (ed_cohort_type) , pointer :: shorterCohort - type (ed_cohort_type) , pointer :: tallerCohort + type (fates_cohort_type) , pointer :: shorterCohort + type (fates_cohort_type) , pointer :: tallerCohort integer :: i integer :: fusion_took_place @@ -1691,10 +1382,10 @@ subroutine sort_cohorts(patchptr) type(ed_patch_type) , intent(inout), target :: patchptr type(ed_patch_type) , pointer :: current_patch - type(ed_cohort_type), pointer :: current_c, next_c - type(ed_cohort_type), pointer :: shortestc, tallestc - type(ed_cohort_type), pointer :: storesmallcohort - type(ed_cohort_type), pointer :: storebigcohort + type(fates_cohort_type), pointer :: current_c, next_c + type(fates_cohort_type), pointer :: shortestc, tallestc + type(fates_cohort_type), pointer :: storesmallcohort + type(fates_cohort_type), pointer :: storebigcohort integer :: snull,tnull current_patch => patchptr @@ -1741,19 +1432,19 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store ! !USES: ! ! !ARGUMENTS - type(ed_cohort_type) , intent(inout), pointer :: pcc - type(ed_cohort_type) , intent(inout), pointer :: ptall - type(ed_cohort_type) , intent(inout), pointer :: pshort + type(fates_cohort_type) , intent(inout), pointer :: pcc + type(fates_cohort_type) , intent(inout), pointer :: ptall + type(fates_cohort_type) , intent(inout), pointer :: pshort integer , intent(in) :: tnull integer , intent(in) :: snull - type(ed_cohort_type) , intent(inout),pointer,optional :: storesmallcohort ! storage of the smallest cohort for insertion routine - type(ed_cohort_type) , intent(inout),pointer,optional :: storebigcohort ! storage of the largest cohort for insertion routine + type(fates_cohort_type) , intent(inout),pointer,optional :: storesmallcohort ! storage of the smallest cohort for insertion routine + type(fates_cohort_type) , intent(inout),pointer,optional :: storebigcohort ! storage of the largest cohort for insertion routine ! ! !LOCAL VARIABLES: type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: current - type(ed_cohort_type), pointer :: tallptr, shortptr, icohort - type(ed_cohort_type), pointer :: ptallest, pshortest + type(fates_cohort_type), pointer :: current + type(fates_cohort_type), pointer :: tallptr, shortptr, icohort + type(fates_cohort_type), pointer :: ptallest, pshortest real(r8) :: tsp integer :: tallptrnull,exitloop !---------------------------------------------------------------------- @@ -1853,11 +1544,11 @@ subroutine copy_cohort( currentCohort,copyc ) ! !USES: ! ! !ARGUMENTS - type(ed_cohort_type), intent(inout) , target :: copyc ! New cohort argument. - type(ed_cohort_type), intent(in) , target :: currentCohort ! Old cohort argument. + type(fates_cohort_type), intent(inout) , target :: copyc ! New cohort argument. + type(fates_cohort_type), intent(in) , target :: currentCohort ! Old cohort argument. ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: n,o ! New and old cohort pointers + type(fates_cohort_type), pointer :: n,o ! New and old cohort pointers !---------------------------------------------------------------------- o => currentCohort @@ -2021,7 +1712,7 @@ subroutine count_cohorts( currentPatch ) type(ed_patch_type), intent(inout), target :: currentPatch !new site ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort !new patch + type(fates_cohort_type), pointer :: currentCohort !new patch integer :: backcount !---------------------------------------------------------------------- @@ -2063,7 +1754,7 @@ subroutine UpdateCohortBioPhysRates(currentCohort) ! of different age classes are unchanged until the next day. ! -------------------------------------------------------------------------------- - type(ed_cohort_type),intent(inout) :: currentCohort + type(fates_cohort_type),intent(inout) :: currentCohort real(r8) :: frac_leaf_aclass(max_nleafage) ! Fraction of leaves in each age-class @@ -2136,7 +1827,7 @@ subroutine EvaluateAndCorrectDBH(currentCohort,delta_dbh,delta_hite) ! ----------------------------------------------------------------------------------- ! argument - type(ed_cohort_type),intent(inout) :: currentCohort + type(fates_cohort_type),intent(inout) :: currentCohort real(r8),intent(out) :: delta_dbh real(r8),intent(out) :: delta_hite @@ -2234,11 +1925,11 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) type(ed_site_type) :: csite ! Site of the current cohort type(ed_patch_type) :: cpatch ! patch of the current cohort - type(ed_cohort_type),pointer :: ccohort ! Current (damaged) cohort + type(fates_cohort_type),pointer :: ccohort ! Current (damaged) cohort logical :: newly_recovered ! true if we create a new cohort ! locals - type(ed_cohort_type), pointer :: rcohort ! New cohort that recovers by + type(fates_cohort_type), pointer :: rcohort ! New cohort that recovers by ! having a lower damage class real(r8) :: sapw_area ! sapwood area real(r8) :: target_sapw_c,target_sapw_m ! sapwood mass, C and N/P @@ -2442,6 +2133,83 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) return end subroutine DamageRecovery + + + subroutine InitPRTBoundaryConditions(this) + ! + ! DESCRIPTION: + ! Set the boundary conditions that flow in an out of the PARTEH + ! allocation hypotheses. Each of these calls to "RegsterBC" are simply + ! setting pointers. + ! For instance, if the hypothesis wants to know what + ! the DBH of the plant is, then we pass in the dbh as an argument (this%dbh), + ! and also tell it which boundary condition we are talking about (which is + ! defined by an integer index (ac_bc_inout_id_dbh) + ! + ! Again, elaborated Example: + ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index + ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" + ! that is classified as input and output "inout". + ! See PRTAllometricCarbonMod.F90 to track its usage. + ! bc_rval is used as the optional argument identifyer to specify a real + ! value boundary condition. + ! bc_ival is used as the optional argument identifyer to specify an integer + ! value boundary condition. + ! + + ! ARGUMENTS: + type(fates_cohort_type), intent(inout) :: this + + select case(hlm_parteh_mode) + + case (prt_carbon_allom_hyp) + + ! register boundary conditions for the Carbon Only Allometric Hypothesis + call this%prt%RegisterBCInOut(ac_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(ac_bc_inout_id_netdc, bc_rval=this%npp_acc) + call this%prt%RegisterBCIn(ac_bc_in_id_cdamage, bc_ival=this%crowndamage) + call this%prt%RegisterBCIn(ac_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(ac_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(ac_bc_in_id_lstat, bc_ival=this%status_coh) + + case (prt_cnp_flex_allom_hyp) + + call this%prt%RegisterBCIn(acnp_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(acnp_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(acnp_bc_in_id_lstat, bc_ival=this%status_coh) + call this%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval=this%npp_acc) + + call this%prt%RegisterBCIn(acnp_bc_in_id_nc_repro, bc_rval=this%nc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_pc_repro, bc_rval=this%pc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_cdamage, bc_ival=this%crowndamage) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess, bc_rval=this%resp_excess) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr, bc_rval=this%l2fr) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int, bc_rval=this%cx_int) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt, bc_rval=this%ema_dcxdt) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx0, bc_rval=this%cx0) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval=this%daily_n_gain) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval=this%daily_p_gain) + + call this%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval=this%daily_c_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval=this%daily_n_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval=this%daily_p_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival=this%cnp_limiter) + + case DEFAULT + + write(fates_log(),*) 'You specified an unknown PRT module' + write(fates_log(),*) 'Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) + + end select + + end subroutine InitPRTBoundaryConditions + +!:.........................................................................: + end module EDCohortDynamicsMod diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 834561deaa..258849c066 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -4,6 +4,8 @@ module EDTypesMod use FatesConstantsMod, only : ifalse use FatesConstantsMod, only : itrue use FatesGlobals, only : fates_log + use FatesCohortMod, only : fates_cohort_type + use FatesCohortMod, only : nlevleaf use FatesHydraulicsMemMod, only : ed_cohort_hydr_type use FatesHydraulicsMemMod, only : ed_site_hydr_type use PRTGenericMod, only : prt_vartypes @@ -22,16 +24,15 @@ module EDTypesMod use FatesRunningMeanMod, only : rmean_type use FatesInterfaceTypesMod,only : bc_in_type use FatesInterfaceTypesMod,only : bc_out_type + implicit none private ! By default everything is private save integer, parameter, public :: nclmax = 2 ! Maximum number of canopy layers - integer, parameter, public :: ican_upper = 1 ! Nominal index for the upper canopy - integer, parameter, public :: ican_ustory = 2 ! Nominal index for diagnostics that refer - ! to understory layers (all layers that - ! are not the top canopy layer) + + integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed ! the parameter file may determine that fewer @@ -53,8 +54,7 @@ module EDTypesMod integer, parameter, public :: idirect = 1 ! This is the array index for direct radiation integer, parameter, public :: idiffuse = 2 ! This is the array index for diffuse radiation - ! parameters that govern the VAI (LAI+SAI) bins used in radiative transfer code - integer, parameter, public :: nlevleaf = 30 ! number of leaf+stem layers in canopy layer + real(r8), public :: dinc_vai(nlevleaf) = fates_unset_r8 ! VAI bin widths array real(r8), public :: dlower_vai(nlevleaf) = fates_unset_r8 ! lower edges of VAI bins @@ -83,11 +83,6 @@ module EDTypesMod ! can be approximated to be equal to the visible band - integer, parameter, public :: leaves_on = 2 ! Flag specifying that a deciduous plant has leaves - ! and should be allocating to them as well - integer, parameter, public :: leaves_off = 1 ! Flag specifying that a deciduous plant has dropped - ! its leaves and should not be trying to allocate - ! towards any growth. ! Flag to turn on/off salinity effects on the effective "btran" ! btran stress function. @@ -186,230 +181,6 @@ module EDTypesMod integer, public :: n_uptake_mode integer, public :: p_uptake_mode - - !************************************ - !** COHORT type structure ** - !************************************ - type, public :: ed_cohort_type - - ! POINTERS - type (ed_cohort_type) , pointer :: taller => null() ! pointer to next tallest cohort - type (ed_cohort_type) , pointer :: shorter => null() ! pointer to next shorter cohort - type (ed_patch_type) , pointer :: patchptr => null() ! pointer to patch that cohort is in - - - - ! Multi-species, multi-organ Plant Reactive Transport (PRT) - ! Contains carbon and nutrient state variables for various plant organs - - class(prt_vartypes), pointer :: prt - - real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant - ! in carbon only simulationss, and is set by the - ! allom_l2fr_min parameter. In nutrient - ! enabled simulations, this is dynamic, will - ! vary between allom_l2fr_min and allom_l2fr_max - ! parameters, with a tendency driven by - ! nutrient storage) [kg root / kg leaf] - - - - - - ! VEGETATION STRUCTURE - integer :: pft ! pft number - real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) - real(r8) :: dbh ! dbh: cm - real(r8) :: coage ! cohort age in years - real(r8) :: hite ! height: meters - integer :: indexnumber ! unique number for each cohort. (within clump?) - integer :: canopy_layer ! canopy status of cohort (1 = canopy, 2 = understorey, etc.) - integer :: crowndamage ! crown damage class of the cohort [1: undamaged, >1: damaged] - real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort - ! (1 = canopy, 2 = understorey, etc.) - ! real to be conservative during fusion - real(r8) :: g_sb_laweight ! Total conductance (stomata+boundary layer) of the cohort, weighted by its leaf area [m/s]*[m2] - real(r8) :: canopy_trim ! What is the fraction of the maximum leaf biomass that we are targeting? :- - real(r8) :: leaf_cost ! How much does it cost to maintain leaves: kgC/m2/year-1 - real(r8) :: excl_weight ! How much of this cohort is demoted each year, as a proportion of all cohorts:- - real(r8) :: prom_weight ! How much of this cohort is promoted each year, as a proportion of all cohorts:- - integer :: nv ! Number of leaf layers: - - integer :: status_coh ! growth status of plant (2 = leaves on , 1 = leaves off) - real(r8) :: c_area ! areal extent of canopy (m2) - real(r8) :: treelai ! lai of an individual within cohort leaf area (m2) / crown area (m2) - real(r8) :: treesai ! stem area index of an indiv. within cohort: stem area (m2) / crown area (m2) - logical :: isnew ! flag to signify a new cohort, new cohorts have not experienced - ! npp or mortality and should therefore not be fused or averaged - integer :: size_class ! An index that indicates which diameter size bin the cohort currently resides in - ! this is used for history output. We maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_class ! An index that indicates which age bin the cohort currently resides in - ! used for history output. - integer :: size_by_pft_class ! An index that indicates the cohorts position of the joint size-class x functional - ! type classification. We also maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_by_pft_class ! An index that indicates the cohorts position of the join cohort age class x PFT - integer :: size_class_lasttimestep ! size class of the cohort at the last time step - - ! CARBON FLUXES - - ! ---------------------------------------------------------------------------------- - ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types.* - ! - ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics - ! time-step (ie photosynthesis, sub-hourly). (kgC/indiv/timestep) - ! _acc: The accumulation of the _tstep variable from the beginning to ending of - ! the dynamics time-scale. This variable is zero'd during initialization and - ! after the dynamics call-sequence is completed. (kgC/indiv/day) - ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, - ! _acc_hold "holds" the integrated value until the next time dynamics is - ! called. This is necessary for restarts. This variable also has units - ! converted to a useful rate (kgC/indiv/yr) - ! ---------------------------------------------------------------------------------- - - real(r8) :: gpp_tstep ! Gross Primary Production (see above *) - real(r8) :: gpp_acc - real(r8) :: gpp_acc_hold - - real(r8) :: npp_tstep ! Net Primary Production (see above *) - real(r8) :: npp_acc - real(r8) :: npp_acc_hold - - real(r8) :: resp_tstep ! Autotrophic respiration (see above *) - real(r8) :: resp_acc - real(r8) :: resp_acc_hold - - ! carbon 13c discrimination - real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon: part-per-mil, at each indiv/timestep - real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon: part-per-mil, at each indiv/day, at the end of a day - - - ! Used for CNP - integer :: cnp_limiter ! Which element is limiting growth? ! 0=none,1=C,2=N,3=P - real(r8) :: cx_int ! The time integration of the log of the relative carbon storage over relative nutrient - real(r8) :: ema_dcxdt ! The derivative of the log of the relative carbon storage over relative nutrient - real(r8) :: cx0 ! The value on the previous time-step of log of the relative carbon - ! storage over relative nutrient - real(r8) :: nc_repro ! The NC ratio of a new recruit, used also for defining reproductive stoich - real(r8) :: pc_repro ! The PC ratio of a new recruit - - ! Nutrient Fluxes (if N, P, etc. are turned on) - - real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition in soil [kg N / plant/ day] - real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition in soil [kg N / plant/ day] - - real(r8) :: sym_nfix_daily ! Accumulated symbiotic N fixation from the roots [kgN/indiv/day] - real(r8) :: sym_nfix_tstep ! Symbiotic N fixation from the roots for the time-step[kgN/indiv/tstep] - - real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized nh4/no3 in solution as well as symbiotic fixation - real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition in soil [kg P / plant/ day] - - real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kg C/plant/day] - real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kg N/plant/day] - real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kg P/plant/day] - - real(r8) :: daily_n_demand ! The daily amount of N demanded by the plant [kgN/plant/day] - real(r8) :: daily_p_demand ! The daily amount of P demanded by the plant [kgN/plant/day] - - - ! The following four biophysical rates are assumed to be - ! at the canopy top, at reference temp 25C, and based on the - ! leaf age weighted average of the PFT parameterized values. The last - ! condition is why it is dynamic and tied to the cohort - - real(r8) :: vcmax25top ! Maximum carboxylation at the cohort's top - ! at reference temperature (25C). - real(r8) :: jmax25top ! canopy top: maximum electron transport - ! rate at 25C (umol electrons/m**2/s) - real(r8) :: tpu25top ! canopy top: triose phosphate utilization - ! rate at 25C (umol CO2/m**2/s) - real(r8) :: kp25top ! canopy top: initial slope of CO2 response - ! curve (C4 plants) at 25C - - - - real(r8) :: ts_net_uptake(nlevleaf) ! Net uptake of leaf layers: kgC/m2/timestep - real(r8) :: year_net_uptake(nlevleaf) ! Net uptake of leaf layers: kgC/m2/year - - - ! RESPIRATION COMPONENTS - real(r8) :: rdark ! Dark respiration: kgC/indiv/s - - real(r8) :: resp_g_tstep ! Growth respiration: kgC/indiv/timestep - real(r8) :: resp_m ! Maintenance respiration: kgC/indiv/timestep - real(r8) :: resp_m_unreduced ! Diagnostic-only unreduced maintenance respiration: kgC/indiv/timestep - real(r8) :: resp_excess ! Respiration of excess carbon kgC/indiv/day - real(r8) :: livestem_mr ! Live stem maintenance respiration: kgC/indiv/s - ! (Above ground) - real(r8) :: livecroot_mr ! Live stem maintenance respiration: kgC/indiv/s - ! (below ground) - real(r8) :: froot_mr ! Live fine root maintenance respiration: kgC/indiv/s - - !DAMAGE - real(r8) :: branch_frac ! Fraction of aboveground woody biomass in branches - - !MORTALITY - real(r8) :: dmort ! proportional mortality rate. (year-1) - - ! Mortality Rate Partitions - real(r8) :: bmort ! background mortality rate n/year - real(r8) :: cmort ! carbon starvation mortality rate n/year - real(r8) :: hmort ! hydraulic failure mortality rate n/year - real(r8) :: frmort ! freezing mortality n/year - real(r8) :: smort ! senesence mortality n/year - real(r8) :: asmort ! age senescence mortality n/year - real(r8) :: dgmort ! damage mortality n/year - - ! Logging Mortality Rate - ! Yi Xu & M. Huang - real(r8) :: lmort_direct ! directly logging rate fraction /per logging activity - real(r8) :: lmort_collateral ! collaterally damaged rate fraction /per logging activity - real(r8) :: lmort_infra ! mechanically damaged rate fraction /per logging activity - real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation - ! (i.e. they are moved to newly-anthro-disturbed secondary - ! forest patch). fraction /per logging activity - - real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] - - ! NITROGEN POOLS - ! ---------------------------------------------------------------------------------- - ! Nitrogen pools are not prognostic in the current implementation. - ! They are diagnosed during photosynthesis using a simple C2N parameter. Local values - ! used in that routine. - ! ---------------------------------------------------------------------------------- - - ! GROWTH DERIVIATIVES - real(r8) :: dndt ! time derivative of cohort size : n/year - real(r8) :: dhdt ! time derivative of height : m/year - real(r8) :: ddbhdt ! time derivative of dbh : cm/year - real(r8) :: dbdeaddt ! time derivative of dead biomass : KgC/year - - - - - ! FIRE - real(r8) :: fraction_crown_burned ! proportion of crown affected by fire:- - real(r8) :: cambial_mort ! probability that trees dies due to cambial char - ! (conditional on the tree being subjected to the fire) - real(r8) :: crownfire_mort ! probability of tree post-fire mortality - ! due to crown scorch (conditional on the tree being subjected to the fire) - real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent:- - - ! Hydraulics - type(ed_cohort_hydr_type), pointer :: co_hydr ! All cohort hydraulics data, see FatesHydraulicsMemMod.F90 - - - ! Running means - - ! (keeping this in-code as an example) - !class(rmean_type), pointer :: tveg_lpa ! exponential moving average of leaf temperature at the - ! leaf photosynthetic acclimation time-scale [K] - - - end type ed_cohort_type - !************************************ !** Patch type structure ** !************************************ @@ -417,8 +188,8 @@ module EDTypesMod type, public :: ed_patch_type ! POINTERS - type (ed_cohort_type), pointer :: tallest => null() ! pointer to patch's tallest cohort - type (ed_cohort_type), pointer :: shortest => null() ! pointer to patch's shortest cohort + type (fates_cohort_type), pointer :: tallest => null() ! pointer to patch's tallest cohort + type (fates_cohort_type), pointer :: shortest => null() ! pointer to patch's shortest cohort type (ed_patch_type), pointer :: older => null() ! pointer to next older patch type (ed_patch_type), pointer :: younger => null() ! pointer to next younger patch @@ -907,33 +678,13 @@ module EDTypesMod public :: val_check_ed_vars public :: dump_site public :: dump_patch - public :: dump_cohort public :: dump_cohort_hydr public :: CanUpperUnder contains ! ===================================================================================== - function CanUpperUnder(ccohort) result(can_position) - - ! This simple function is used to determine if a - ! cohort's crown position is in the upper portion (ie the canopy) - ! or the understory. This differentiation is only used for - ! diagnostic purposes. Functionally, the model uses - ! the canopy layer position, which may have more than two layers - ! at any given time. Utlimately, every plant that is not in the - ! top layer (canopy), is considered understory. - - type(ed_cohort_type) :: ccohort ! Current cohort of interest - integer :: can_position - - if(ccohort%canopy_layer == 1)then - can_position = ican_upper - else - can_position = ican_ustory - end if - - end function CanUpperUnder + ! ===================================================================================== @@ -1002,7 +753,7 @@ subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) ! return 10+ if an overflow ! return 100% if an underflow ! Locals - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort ! Check through a registry of variables to check @@ -1116,95 +867,14 @@ end subroutine dump_patch ! ===================================================================================== - subroutine dump_cohort(ccohort) - type(ed_cohort_type),intent(in),target :: ccohort - - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) ' Dumping Cohort Information ' - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'co%pft = ', ccohort%pft - write(fates_log(),*) 'co%n = ', ccohort%n - write(fates_log(),*) 'co%dbh = ', ccohort%dbh - write(fates_log(),*) 'co%hite = ', ccohort%hite - write(fates_log(),*) 'co%crowndamage = ', ccohort%crowndamage - write(fates_log(),*) 'co%coage = ', ccohort%coage - write(fates_log(),*) 'co%l2fr = ', ccohort%l2fr - write(fates_log(),*) 'leaf carbon = ', ccohort%prt%GetState(leaf_organ,carbon12_element) - write(fates_log(),*) 'fineroot carbon = ', ccohort%prt%GetState(fnrt_organ,carbon12_element) - write(fates_log(),*) 'sapwood carbon = ', ccohort%prt%GetState(sapw_organ,carbon12_element) - write(fates_log(),*) 'structural (dead) carbon = ', ccohort%prt%GetState(struct_organ,carbon12_element) - write(fates_log(),*) 'storage carbon = ', ccohort%prt%GetState(store_organ,carbon12_element) - write(fates_log(),*) 'reproductive carbon = ', ccohort%prt%GetState(repro_organ,carbon12_element) - write(fates_log(),*) 'co%g_sb_laweight = ', ccohort%g_sb_laweight - write(fates_log(),*) 'co%leaf_cost = ', ccohort%leaf_cost - write(fates_log(),*) 'co%canopy_layer = ', ccohort%canopy_layer - write(fates_log(),*) 'co%canopy_layer_yesterday = ', ccohort%canopy_layer_yesterday - write(fates_log(),*) 'co%nv = ', ccohort%nv - write(fates_log(),*) 'co%status_coh = ', ccohort%status_coh - write(fates_log(),*) 'co%canopy_trim = ', ccohort%canopy_trim - write(fates_log(),*) 'co%excl_weight = ', ccohort%excl_weight - write(fates_log(),*) 'co%prom_weight = ', ccohort%prom_weight - write(fates_log(),*) 'co%size_class = ', ccohort%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', ccohort%size_by_pft_class - write(fates_log(),*) 'co%coage_class = ', ccohort%coage_class - write(fates_log(),*) 'co%coage_by_pft_class = ', ccohort%coage_by_pft_class - write(fates_log(),*) 'co%gpp_acc_hold = ', ccohort%gpp_acc_hold - write(fates_log(),*) 'co%gpp_acc = ', ccohort%gpp_acc - write(fates_log(),*) 'co%gpp_tstep = ', ccohort%gpp_tstep - write(fates_log(),*) 'co%npp_acc_hold = ', ccohort%npp_acc_hold - write(fates_log(),*) 'co%npp_tstep = ', ccohort%npp_tstep - write(fates_log(),*) 'co%npp_acc = ', ccohort%npp_acc - write(fates_log(),*) 'co%resp_tstep = ', ccohort%resp_tstep - write(fates_log(),*) 'co%resp_acc = ', ccohort%resp_acc - write(fates_log(),*) 'co%resp_acc_hold = ', ccohort%resp_acc_hold - write(fates_log(),*) 'co%rdark = ', ccohort%rdark - write(fates_log(),*) 'co%resp_m = ', ccohort%resp_m - write(fates_log(),*) 'co%resp_g_tstep = ', ccohort%resp_g_tstep - write(fates_log(),*) 'co%livestem_mr = ', ccohort%livestem_mr - write(fates_log(),*) 'co%livecroot_mr = ', ccohort%livecroot_mr - write(fates_log(),*) 'co%froot_mr = ', ccohort%froot_mr - write(fates_log(),*) 'co%dgmort = ', ccohort%dgmort - write(fates_log(),*) 'co%treelai = ', ccohort%treelai - write(fates_log(),*) 'co%treesai = ', ccohort%treesai - write(fates_log(),*) 'co%c_area = ', ccohort%c_area - write(fates_log(),*) 'co%cmort = ', ccohort%cmort - write(fates_log(),*) 'co%bmort = ', ccohort%bmort - write(fates_log(),*) 'co%smort = ', ccohort%smort - write(fates_log(),*) 'co%asmort = ', ccohort%asmort - write(fates_log(),*) 'co%dgmort = ', ccohort%dgmort - write(fates_log(),*) 'co%hmort = ', ccohort%hmort - write(fates_log(),*) 'co%frmort = ', ccohort%frmort - write(fates_log(),*) 'co%asmort = ', ccohort%asmort - write(fates_log(),*) 'co%lmort_direct = ', ccohort%lmort_direct - write(fates_log(),*) 'co%lmort_collateral = ', ccohort%lmort_collateral - write(fates_log(),*) 'co%lmort_infra = ', ccohort%lmort_infra - write(fates_log(),*) 'co%isnew = ', ccohort%isnew - write(fates_log(),*) 'co%dndt = ', ccohort%dndt - write(fates_log(),*) 'co%dhdt = ', ccohort%dhdt - write(fates_log(),*) 'co%ddbhdt = ', ccohort%ddbhdt - write(fates_log(),*) 'co%dbdeaddt = ', ccohort%dbdeaddt - write(fates_log(),*) 'co%fraction_crown_burned = ', ccohort%fraction_crown_burned - write(fates_log(),*) 'co%fire_mort = ', ccohort%fire_mort - write(fates_log(),*) 'co%crownfire_mort = ', ccohort%crownfire_mort - write(fates_log(),*) 'co%cambial_mort = ', ccohort%cambial_mort - write(fates_log(),*) 'co%size_class = ', ccohort%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', ccohort%size_by_pft_class - - if (associated(ccohort%co_hydr) ) then - call dump_cohort_hydr(ccohort) - endif - write(fates_log(),*) '----------------------------------------' - return - end subroutine dump_cohort - ! ===================================================================================== subroutine dump_cohort_hydr(ccohort) - type(ed_cohort_type),intent(in),target :: ccohort + type(fates_cohort_type),intent(in),target :: ccohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr ccohort_hydr => ccohort%co_hydr diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 new file mode 100644 index 0000000000..5d1ffa89a7 --- /dev/null +++ b/main/FatesCohortMod.F90 @@ -0,0 +1,624 @@ +module FatesCohortMod + + use FatesConstantsMod, only : r8 => fates_r8 + use FatesGlobals, only : fates_log + use PRTGenericMod, only : prt_vartypes + use FatesHydraulicsMemMod, only : ed_cohort_hydr_type + use FatesInterfaceTypesMod, only : hlm_parteh_mode + + implicit none + private + + ! PARAMETERS + + ! parameters that govern the VAI (LAI+SAI) bins used in radiative transfer code + integer, parameter, public :: nlevleaf = 30 ! number of leaf+stem layers in each canopy layer + + integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy + integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers + ! (all layers that are not the top canopy layer) + + type, public :: fates_cohort_type + + ! POINTERS + type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort + type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort + + !:.........................................................................: + + ! Multi-species, multi-organ Plant Reactive Transport (PRT) + ! Contains carbon and nutrient state variables for various plant organs + class(prt_vartypes), pointer :: prt + real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant + ! in carbon only simulationss, and is set by the + ! allom_l2fr_min parameter. In nutrient + ! enabled simulations, this is dynamic, will + ! vary between allom_l2fr_min and allom_l2fr_max + ! parameters, with a tendency driven by + ! nutrient storage) [kg root / kg leaf] + + !:.........................................................................: + + ! VEGETATION STRUCTURE + + integer :: pft ! pft index + real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) [/m2] + real(r8) :: dbh ! diameter at breast height [cm] + real(r8) :: coage ! age [years] + real(r8) :: hite ! height [m] + integer :: indexnumber ! unique number for each cohort (within clump?) + integer :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] + real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort [1 = canopy, 2 = understorey, etc.] + ! real to be conservative during fusion + integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] + real(r8) :: g_sb_laweight ! total conductance (stomata + boundary layer) of the cohort + ! weighted by its leaf area [m/s]*[m2] + real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] + real(r8) :: leaf_cost ! how much does it cost to maintain leaves [kgC/m2/year] + real(r8) :: excl_weight ! how much of this cohort is demoted each year, as a proportion of all cohorts + real(r8) :: prom_weight ! how much of this cohort is promoted each year, as a proportion of all cohorts + integer :: nv ! number of leaf layers + integer :: status_coh ! growth status of plant [2 = leaves on , 1 = leaves off] + real(r8) :: c_area ! areal extent of canopy [m2] + real(r8) :: treelai ! lai of an individual within cohort leaf area [m2 leaf area/m2 crown area] + real(r8) :: treesai ! stem area index of an individual within cohort [m2 stem area/m2 crown area] + logical :: isnew ! flag to signify a new cohort - new cohorts have not experienced + ! npp or mortality and should therefore not be fused or averaged + integer :: size_class ! index that indicates which diameter size bin the cohort currently resides in + ! this is used for history output. We maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_class ! index that indicates which age bin the cohort currently resides in + ! (used for history output) + integer :: size_by_pft_class ! index that indicates the cohorts position of the joint size-class x functional + ! type classification. We also maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT + integer :: size_class_lasttimestep ! size class of the cohort at the last time step + + !:.........................................................................: + + ! CARBON AND NUTRIENT FLUXES + + ! -------------------------------------------------------------------------- + ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types* + ! + ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics + ! time-step (ie photosynthesis, sub-hourly) [kgC/indiv/timestep] + ! _acc: The accumulation of the _tstep variable from the beginning to ending of + ! the dynamics time-scale. This variable is zero'd during initialization and + ! after the dynamics call-sequence is completed. [kgC/indiv/day] + ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, + ! _acc_hold "holds" the integrated value until the next time dynamics is + ! called. This is necessary for restarts. This variable also has units + ! converted to a useful rate [kgC/indiv/yr] + ! -------------------------------------------------------------------------- + + real(r8) :: gpp_tstep ! Gross Primary Production (see above *) + real(r8) :: gpp_acc + real(r8) :: gpp_acc_hold + + real(r8) :: npp_tstep ! Net Primary Production (see above *) + real(r8) :: npp_acc + real(r8) :: npp_acc_hold + + real(r8) :: resp_tstep ! Autotrophic respiration (see above *) + real(r8) :: resp_acc + real(r8) :: resp_acc_hold + + real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon at each indiv/timestep [ppm] + real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon at each indiv/day + ! at the end of a day [ppm] + + ! The following four biophysical rates are assumed to be at the canopy top, at reference temp 25degC, + ! and based on the leaf age weighted average of the PFT parameterized values. + ! The last condition is why it is dynamic and tied to the cohort + + real(r8) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: jmax25top ! maximum electron transport rate at canopy top and 25degC [umol electrons/m2/s] + real(r8) :: tpu25top ! triose phosphate utilization rate at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: kp25top ! initial slope of CO2 response curve (C4 plants) at 25C + + real(r8) :: ts_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/timestep] + real(r8) :: year_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/year] + + ! used for CNP + integer :: cnp_limiter ! which element is limiting growth [0 = none, 1 = C, 2 = N, 3 = P] + real(r8) :: cx_int ! time integration of the log of the relative carbon storage over relative nutrient + real(r8) :: ema_dcxdt ! derivative of the log of the relative carbon storage over relative nutrient + real(r8) :: cx0 ! value on the previous time-step of log of the relative carbon storage over + ! relative nutrient + real(r8) :: nc_repro ! N:C ratio of a new recruit, used also for defining reproductive stoich + real(r8) :: pc_repro ! P:C ratio of a new recruit + + ! Nutrient Fluxes (if N, P, etc. are turned on) + real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition + ! in soil [kgN/plant/day] + real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition + ! in soil [kgN/plant/day] + + real(r8) :: sym_nfix_daily ! accumulated symbiotic N fixation from the roots [kgN/indiv/day] + real(r8) :: sym_nfix_tstep ! symbiotic N fixation from the roots for the time-step [kgN/indiv/timestep] + + real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized NH4/NO3 in solution as well as + ! symbiotic fixation + real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition + ! in soil [kgP/plant/day] + + real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kgC/plant/day] + real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kgN/plant/day] + real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kgP/plant/day] + + real(r8) :: daily_n_demand ! daily amount of N demanded by the plant [kgN/plant/day] + real(r8) :: daily_p_demand ! daily amount of P demanded by the plant [kgN/plant/day] + + real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] + + !:.........................................................................: + + ! RESPIRATION COMPONENTS + real(r8) :: rdark ! dark respiration [kgC/indiv/s] + real(r8) :: resp_g_tstep ! growth respiration [kgC/indiv/timestep] + real(r8) :: resp_m ! maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_m_unreduced ! diagnostic-only unreduced maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_excess ! respiration of excess carbon [kgC/indiv/day] + real(r8) :: livestem_mr ! aboveground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] + + !:.........................................................................: + + ! DAMAGE + real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] + + !:.........................................................................: + + ! MORTALITY + real(r8) :: dmort ! proportional mortality rate [/year] + + ! Mortality Rate Partitions + real(r8) :: bmort ! background mortality rate [indiv/year] + real(r8) :: cmort ! carbon starvation mortality rate [indiv/year] + real(r8) :: hmort ! hydraulic failure mortality rate [indiv/year] + real(r8) :: frmort ! freezing mortality rate [indiv/year] + real(r8) :: smort ! senesence mortality [indiv/year] + real(r8) :: asmort ! age senescence mortality [indiv/year] + real(r8) :: dgmort ! damage mortality [indiv/year] + + ! Logging Mortality Rate + ! Yi Xu & M. Huang + real(r8) :: lmort_direct ! directly logging rate [fraction/logging activity] + real(r8) :: lmort_collateral ! collaterally damaged rate [fraction/logging activity] + real(r8) :: lmort_infra ! mechanically damaged rate [fraction/logging activity] + real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation + ! (i.e. they are moved to newly-anthro-disturbed secondary + ! forest patch) [fraction/logging activity] + + !:.........................................................................: + + ! NITROGEN POOLS + ! -------------------------------------------------------------------------- + ! Nitrogen pools are not prognostic in the current implementation. + ! They are diagnosed during photosynthesis using a simple C2N parameter. + ! Local values are used in that routine. + ! -------------------------------------------------------------------------- + + !:.........................................................................: + + ! GROWTH DERIVIATIVES + real(r8) :: dndt ! time derivative of cohort size [n/year] + real(r8) :: dhdt ! time derivative of height [m/year] + real(r8) :: ddbhdt ! time derivative of dbh [cm/year] + real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] + + !:.........................................................................: + + ! FIRE + real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] + real(r8) :: cambial_mort ! probability that trees dies due to cambial charring [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] + + !:.........................................................................: + + ! HYDRAULICS + type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 + + !:.........................................................................: + + contains + + procedure :: init + procedure :: dump + procedure :: nan_values + procedure :: zero_values + procedure :: CanUpperUnder + + end type fates_cohort_type + + !:...........................................................................: + + contains + + subroutine init(this, prt) + ! + ! DESCRIPTION: + ! Create new cohort and set default values for all variables + ! + + ! ARGUMENTS: + type(fates_cohort_type), intent(inout), target :: this + class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object + + call this%nan_cohort() ! make everything in the cohort not-a-number + call this%zero_cohort() ! zero things that need to be zeroed + + ! point to the PARTEH object + this%prt => prt + + ! The PARTEH cohort object should be allocated and already + ! initialized in this routine. + call this%prt%CheckInitialConditions() + + call this%InitPRTBoundaryConditions() + + ! new cohorts do not have mortality rates, nor have they moved any + ! carbon when they are created. They will bias our statistics + ! until they have experienced a full day. We need a newly recruited flag. + ! This flag will be set to false after it has experienced + ! growth, disturbance and mortality. + this%isnew = .true. + + end subroutine init + + !:.........................................................................: + + subroutine nan_values(this) + ! + ! DESCRIPTION: + ! make all the cohort variables NaN or unset so they aren't used before defined + ! + + ! USES: + use FatesConstantsMod, only : fates_unset_int + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + + ! ARGUMENTS: + type(fates_cohort_type), intent(inout) :: this + + ! set pointers to null + this%taller => null() + this%shorter => null() + this%prt => null() + this%co_hydr => null() + nullify(this%taller) + nullify(this%shorter) + nullify(this%prt) + nullify(this%co_hydr) + + ! VEGETATION STRUCTURE + this%l2fr = nan + this%pft = fates_unset_int + this%n = nan + this%dbh = nan + this%coage = nan + this%hite = nan + this%indexnumber = fates_unset_int + this%canopy_layer = fates_unset_int + this%canopy_layer_yesterday = nan + this%crowndamage = fates_unset_int + this%g_sb_laweight = nan + this%canopy_trim = nan + this%leaf_cost = nan + this%excl_weight = nan + this%prom_weight = nan + this%nv = fates_unset_int + this%status_coh = fates_unset_int + this%c_area = nan + this%treelai = nan + this%treesai = nan + this%isnew = .false. + this%size_class = fates_unset_int + this%coage_class = fates_unset_int + this%size_by_pft_class = fates_unset_int + this%coage_by_pft_class = fates_unset_int + this%size_class_lasttimestep = fates_unset_int + + ! CARBON AND NUTRIENT FLUXES + this%gpp_tstep = nan + this%gpp_acc = nan + this%gpp_acc_hold = nan + this%npp_tstep = nan + this%npp_acc = nan + this%npp_acc_hold = nan + this%resp_tstep = nan + this%resp_acc = nan + this%resp_acc_hold = nan + this%c13disc_clm = nan + this%c13disc_acc = nan + this%vcmax25top = nan + this%jmax25top = nan + this%tpu25top = nan + this%kp25top = nan + this%year_net_uptake(:) = nan + this%ts_net_uptake(:) = nan + this%cnp_limiter = fates_unset_int + this%cx_int = nan + this%ema_dcxdt = nan + this%cx0 = nan + this%nc_repro = nan + this%pc_repro = nan + this%daily_nh4_uptake = nan + this%daily_no3_uptake = nan + this%sym_nfix_daily = nan + this%sym_nfix_tstep = nan + this%daily_n_gain = nan + this%daily_p_gain = nan + this%daily_c_efflux = nan + this%daily_n_efflux = nan + this%daily_p_efflux = nan + this%daily_n_demand = nan + this%daily_p_demand = nan + this%seed_prod = nan + + ! RESPIRATION COMPONENTS + this%rdark = nan + this%resp_g_tstep = nan + this%resp_m = nan + this%resp_m_unreduced = nan + this%resp_excess = nan + this%livestem_mr = nan + this%livecroot_mr = nan + this%froot_mr = nan + + ! DAMAGE + this%branch_frac = nan + + ! MORTALITY + this%dmort = nan + this%bmort = nan + this%cmort = nan + this%frmort = nan + this%smort = nan + this%asmort = nan + this%dgmort = nan + this%lmort_direct = nan + this%lmort_collateral = nan + this%lmort_infra = nan + this%l_degrad = nan + + ! GROWTH DERIVATIVES + this%dndt = nan + this%dhdt = nan + this%ddbhdt = nan + this%dbdeaddt = nan + + ! FIRE + this%fraction_crown_burned = nan + this%cambial_mort = nan + this%crownfire_mort = nan + this%fire_mort = nan + + end subroutine nan_values + + !:.........................................................................: + + subroutine zero_cohort(this) + ! + ! DESCRIPTION: + ! Zero variables that need to be accounted for if this cohort is altered + ! before they are defined. + ! + ! ARGUMENTS + type (fates_cohort_type), intent(inout) :: this + + !this%l2fr + !this%pft + !this%n + !this%dbh + !this%coage + !this%hite + !this%indexnumber + !this%canopy_layer + !this%canopy_layer_yesterday + !this%crowndamage + this%g_sb_laweight = 0._r8 + !this%canopy_trim + this%leaf_cost = 0._r8 + this%excl_weight = 0._r8 + this%prom_weight = 0._r8 + this%nv = 0 + this%status_coh = 0 + !this%c_area + !this%treelai + this%treesai = 0._r8 + this%size_class = 1 + this%coage_class = 1 + !this%size_by_pft_class + !this%coage_by_pft_class + this%size_class_lasttimestep = 0 + this%gpp_tstep = 0._r8 + this%gpp_acc = 0._r8 + this%gpp_acc_hold = 0._r8 + this%npp_tstep = 0._r8 + this%npp_acc = 0._r8 + this%npp_acc_hold = 0._r8 + this%resp_tstep = 0._r8 + this%resp_acc = 0._r8 + this%resp_acc_hold = 0._r8 + this%c13disc_clm = 0._r8 + this%c13disc_acc = 0._r8 + !this%vcmax25top + !this%jmax25top + !this%tpu25top + !this%kp25top + this%ts_net_uptake(:) = 0._r8 + this%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. + !this%cnp_limiter + !this%cx_int + !this%ema_dcxdt + !this%cx0 + !this%nc_repro + !this%pc_repro + this%daily_nh4_uptake = 0._r8 + this%daily_no3_uptake = 0._r8 + + ! fixation is also integrated over the course of the day and must be + ! zeroed upon creation and after plant resource allocation + this%sym_nfix_daily = 0._r8 + !this%daily_n_gain + this%daily_p_gain = 0._r8 + + ! daily nutrient fluxes are INTEGRATED over the course of the day. + ! These variables MUST be zerod upon creation AND after allocation. + ! These variables exist in carbon-only mode but are not used. + this%daily_c_efflux = 0._r8 + this%daily_n_efflux = 0._r8 + this%daily_p_efflux = 0._r8 + + ! initialize these as negative + this%daily_n_demand = -9._r8 + this%daily_p_demand = -9._r8 + this%seed_prod = 0._r8 + this%rdark = 0._r8 + this%resp_g_tstep = 0._r8 + this%resp_m = 0._r8 + this%resp_m_unreduced = 0._r8 + this%resp_excess = 0._r8 + this%livestem_mr = 0._r8 + this%livecroot_mr = 0._r8 + this%froot_mr = 0._r8 + !this%branch_frac + this%dmort = 0._r8 + this%lmort_direct = 0._r8 + this%lmort_collateral = 0._r8 + this%lmort_infra = 0._r8 + this%l_degrad = 0._r8 + this%fraction_crown_burned = 0._r8 + this%cambial_mort = 0._r8 + this%crownfire_mort = 0._r8 + this%fire_mort = 0._r8 + + end subroutine zero_cohort + + !:.........................................................................: + + function CanUpperUnder(this) result(can_position) + ! + ! DESCRIPTION: + ! This simple function is used to determine if a cohort's crown position + ! is in the upper portion (ie the canopy) or the understory. This + ! differentiation is only used for diagnostic purposes. Functionally, + ! the model uses the canopy layer position, which may have more than + ! two layers at any given time. Utlimately, every plant that is not in + ! the top layer (canopy), is considered understory. + ! + + ! ARGUMENTS: + type(fates_cohort_type) :: this ! current cohort of interest + integer :: can_position ! canopy position + + if (this%canopy_layer == 1)then + can_position = ican_upper + else + can_position = ican_ustory + end if + + end function CanUpperUnder + + !:.........................................................................: + + subroutine dump(this) + ! + ! DESCRIPTION: + ! Print out attributes of a cohort + ! + + ! ARGUMENTS: + type(fates_cohort_type), intent(in), target :: this + + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) ' Dumping Cohort Information ' + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) 'co%pft = ', this%pft + write(fates_log(),*) 'co%n = ', this%n + write(fates_log(),*) 'co%dbh = ', this%dbh + write(fates_log(),*) 'co%hite = ', this%hite + write(fates_log(),*) 'co%crowndamage = ', this%crowndamage + write(fates_log(),*) 'co%coage = ', this%coage + write(fates_log(),*) 'co%l2fr = ', this%l2fr + write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) + write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) + write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) + write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) + write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) + write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) + write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight + write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost + write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer + write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday + write(fates_log(),*) 'co%nv = ', this%nv + write(fates_log(),*) 'co%status_coh = ', this%status_coh + write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim + write(fates_log(),*) 'co%excl_weight = ', this%excl_weight + write(fates_log(),*) 'co%prom_weight = ', this%prom_weight + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'co%coage_class = ', this%coage_class + write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class + write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold + write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc + write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep + write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold + write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep + write(fates_log(),*) 'co%npp_acc = ', this%npp_acc + write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep + write(fates_log(),*) 'co%resp_acc = ', this%resp_acc + write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold + write(fates_log(),*) 'co%rdark = ', this%rdark + write(fates_log(),*) 'co%resp_m = ', this%resp_m + write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep + write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr + write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr + write(fates_log(),*) 'co%froot_mr = ', this%froot_mr + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%treelai = ', this%treelai + write(fates_log(),*) 'co%treesai = ', this%treesai + write(fates_log(),*) 'co%c_area = ', this%c_area + write(fates_log(),*) 'co%cmort = ', this%cmort + write(fates_log(),*) 'co%bmort = ', this%bmort + write(fates_log(),*) 'co%smort = ', this%smort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%hmort = ', this%hmort + write(fates_log(),*) 'co%frmort = ', this%frmort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct + write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral + write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra + write(fates_log(),*) 'co%isnew = ', this%isnew + write(fates_log(),*) 'co%dndt = ', this%dndt + write(fates_log(),*) 'co%dhdt = ', this%dhdt + write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt + write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt + write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned + write(fates_log(),*) 'co%fire_mort = ', this%fire_mort + write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort + write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + + if (associated(this%co_hydr)) call dump_cohort_hydr(this) + + write(fates_log(),*) '----------------------------------------' + + return + + end subroutine dump + + !:...........................................................................: + +end module FatesCohortMod \ No newline at end of file diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index ea413ca901..d865187294 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -35,6 +35,13 @@ module FatesConstantsMod integer, parameter, public :: primaryforest = 1 integer, parameter, public :: secondaryforest = 2 + + integer, parameter, public :: leaves_on = 2 ! Flag specifying that a deciduous plant has leaves + ! and should be allocating to them as well + integer, parameter, public :: leaves_off = 1 ! Flag specifying that a deciduous plant has dropped + ! its leaves and should not be trying to allocate + ! towards any growth. + ! Bareground label for no competition mode integer, parameter, public :: nocomp_bareground = 0 diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index a0304f2935..58156dd3fb 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -65,6 +65,7 @@ module FatesInventoryInitMod use FatesRunningMeanMod, only : ema_lpa use PRTGenericMod, only : StorageNutrientTarget use FatesConstantsMod, only : fates_unset_int + use EDCanopyStructureMod, only : canopy_summarization, canopy_structure implicit none private @@ -94,7 +95,7 @@ module FatesInventoryInitMod ! defined in model memory and a physical ! site listed in the file - logical, parameter :: do_inventory_out = .false. + logical, parameter :: do_inventory_out = .true. public :: initialize_sites_by_inventory @@ -141,6 +142,7 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) real(r8) :: area_init ! dummy value for creating a patch integer :: s ! site index integer :: ipa ! patch index + integer :: iv, ft, ic integer :: total_cohorts ! cohort counter for error checking integer, allocatable :: inv_format_list(:) ! list of format specs character(len=path_strlen), allocatable :: inv_css_list(:) ! list of css file names @@ -518,6 +520,7 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) ! Report Basal Area (as a check on if things were read in) ! ---------------------------------------------------------------------------------------- + !call canopy_structure(sites(s),bc_in(s)) basal_area_postf = 0.0_r8 currentpatch => sites(s)%youngest_patch do while(associated(currentpatch)) @@ -527,9 +530,12 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) currentcohort%n*0.25*((currentcohort%dbh/100.0_r8)**2.0_r8)*pi_const currentcohort => currentcohort%shorter end do + currentPatch => currentpatch%older enddo + + write(fates_log(),*) '-------------------------------------------------------' write(fates_log(),*) 'Basal Area from inventory, AFTER fusion' write(fates_log(),*) 'Lat: ',sites(s)%lat,' Lon: ',sites(s)%lon @@ -538,11 +544,14 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) ! If this is flagged as true, the post-fusion inventory will be written to file ! in the run directory. + if(do_inventory_out)then call write_inventory_type1(sites(s)) end if end do + !call canopy_summarization(nsites, sites, bc_in) + deallocate(inv_format_list, inv_pss_list, inv_css_list, inv_lat_list, inv_lon_list) return diff --git a/parteh/PRTAllometricCarbonMod.F90 b/parteh/PRTAllometricCarbonMod.F90 index 91c685fa22..9f34e39e9c 100644 --- a/parteh/PRTAllometricCarbonMod.F90 +++ b/parteh/PRTAllometricCarbonMod.F90 @@ -48,11 +48,8 @@ module PRTAllometricCarbonMod use FatesConstantsMod , only : nearzero use FatesConstantsMod , only : itrue use FatesConstantsMod , only : years_per_day - use PRTParametersMod , only : prt_params - - use EDTypesMod , only : leaves_on - use EDTypesMod , only : leaves_off + use FatesConstantsMod , only : leaves_on, leaves_off implicit none private From 8f64de3aa31627512d437b6a6066fd36024479f2 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 4 Apr 2023 17:11:04 -0600 Subject: [PATCH 015/125] initial refactor of cohort type --- biogeochem/DamageMainMod.F90 | 9 +- biogeochem/EDCanopyStructureMod.F90 | 38 +- biogeochem/EDCohortDynamicsMod.F90 | 75 +- biogeochem/EDLoggingMortalityMod.F90 | 8 +- biogeochem/EDMortalityFunctionsMod.F90 | 8 +- biogeochem/EDPatchDynamicsMod.F90 | 32 +- biogeochem/EDPhysiologyMod.F90 | 32 +- biogeochem/FatesAllometryMod.F90 | 4 +- biogeochem/FatesLitterMod.F90 | 11 +- biogeochem/FatesSoilBGCFluxMod.F90 | 16 +- biogeophys/EDAccumulateFluxesMod.F90 | 4 +- biogeophys/EDBtranMod.F90 | 4 +- biogeophys/EDSurfaceAlbedoMod.F90 | 12 +- biogeophys/FatesBstressMod.F90 | 4 +- biogeophys/FatesPlantHydraulicsMod.F90 | 58 +- biogeophys/FatesPlantRespPhotosynthMod.F90 | 8 +- fire/SFMainMod.F90 | 26 +- fire/SFParamsMod.F90 | 2 +- .../parteh/f90src/FatesCohortWrapMod.F90 | 16 +- main/ChecksBalancesMod.F90 | 6 +- main/EDInitMod.F90 | 4 +- main/EDMainMod.F90 | 16 +- main/EDParamsMod.F90 | 41 + main/EDPftvarcon.F90 | 4 +- main/EDTypesMod.F90 | 751 ++++++++++++++++-- main/FatesCohortMod.F90 | 624 --------------- main/FatesHistoryInterfaceMod.F90 | 10 +- main/FatesInterfaceMod.F90 | 18 +- main/FatesInventoryInitMod.F90 | 8 +- main/FatesRestartInterfaceMod.F90 | 18 +- main/FatesSizeAgeTypeIndicesMod.F90 | 2 +- parteh/PRTAllometricCNPMod.F90 | 7 +- parteh/PRTAllometricCarbonMod.F90 | 2 +- 33 files changed, 936 insertions(+), 942 deletions(-) delete mode 100644 main/FatesCohortMod.F90 diff --git a/biogeochem/DamageMainMod.F90 b/biogeochem/DamageMainMod.F90 index f0a05f7ee6..f59b43d94d 100644 --- a/biogeochem/DamageMainMod.F90 +++ b/biogeochem/DamageMainMod.F90 @@ -11,10 +11,7 @@ module DamageMainMod use EDPftvarcon , only : EDPftvarcon_inst use EDParamsMod , only : damage_event_code use EDParamsMod , only : ED_val_history_damage_bin_edges - use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type - use EDTypesMod , only : AREA + ! use EDTypesMod , only : ed_site_type use FatesInterfaceTypesMod, only : hlm_current_day use FatesInterfaceTypesMod, only : hlm_current_month use FatesInterfaceTypesMod, only : hlm_current_year @@ -54,7 +51,7 @@ module DamageMainMod - subroutine IsItDamageTime(is_master, currentSite) + subroutine IsItDamageTime(is_master) !---------------------------------------------------------------------------- ! This subroutine determines whether damage should occur (it is called daily) @@ -63,7 +60,7 @@ subroutine IsItDamageTime(is_master, currentSite) integer, intent(in) :: is_master - type(ed_site_type), intent(inout), target :: currentSite + !type(ed_site_type), intent(inout), target :: currentSite integer :: icode ! Integer equivalent of the event code (parameter file only allows reals) integer :: damage_date ! Day of month for damage extracted from event code diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 3ce5f38e29..692ffee47a 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -20,9 +20,9 @@ module EDCanopyStructureMod use EDCohortDynamicsMod , only : InitPRTBoundaryConditions use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai - use EDtypesMod , only : ed_site_type, ed_patch_type, ed_cohort_type - use EDTypesMod , only : nclmax - use EDTypesMod , only : nlevleaf + use EDtypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type + use EDParamsMod , only : nclmax + use EDParamsMod , only : nlevleaf use EDtypesMod , only : AREA use EDLoggingMortalityMod , only : UpdateHarvestC use FatesGlobals , only : endrun => fates_endrun @@ -137,7 +137,7 @@ subroutine canopy_structure( currentSite , bc_in ) ! ! !LOCAL VARIABLES: type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort integer :: i_lyr ! current layer index integer :: z ! Current number of canopy layers. (1= canopy, 2 = understorey) integer :: ipft @@ -346,9 +346,9 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) type(bc_in_type), intent(in) :: bc_in ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort - type(ed_cohort_type), pointer :: copyc - type(ed_cohort_type), pointer :: nextc ! The next cohort in line + type(fates_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: copyc + type(fates_cohort_type), pointer :: nextc ! The next cohort in line integer :: i_cwd ! Index for CWD pool real(r8) :: cc_loss ! cohort crown area loss in demotion (m2) real(r8) :: leaf_c ! leaf carbon [kg] @@ -801,9 +801,9 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) integer, intent(in) :: i_lyr ! Current canopy layer of interest ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort - type(ed_cohort_type), pointer :: copyc - type(ed_cohort_type), pointer :: nextc ! the next cohort, or used for looping + type(fates_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: copyc + type(fates_cohort_type), pointer :: nextc ! the next cohort, or used for looping ! cohorts against the current real(r8) :: scale_factor ! for prob. exclusion - scales weight to a fraction @@ -1243,7 +1243,7 @@ subroutine canopy_spread( currentSite ) type (ed_site_type), intent(inout), target :: currentSite ! ! !LOCAL VARIABLES: - type (ed_cohort_type), pointer :: currentCohort + type (fates_cohort_type), pointer :: currentCohort type (ed_patch_type) , pointer :: currentPatch real(r8) :: sitelevel_canopyarea ! Amount of canopy in top layer at the site level real(r8) :: inc ! Arbitrary daily incremental change in canopy area @@ -1309,7 +1309,7 @@ subroutine canopy_summarization( nsites, sites, bc_in ) ! ! !LOCAL VARIABLES: type (ed_patch_type) , pointer :: currentPatch - type (ed_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: currentCohort integer :: s integer :: ft ! plant functional type integer :: ifp ! the number of the vegetated patch (1,2,3). In SP mode bareground patch is 0 @@ -1509,7 +1509,7 @@ subroutine leaf_area_profile( currentSite ) ! ! !LOCAL VARIABLES: type (ed_patch_type) , pointer :: currentPatch - type (ed_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: currentCohort real(r8) :: remainder !Thickness of layer at bottom of canopy. real(r8) :: fleaf ! fraction of cohort incepting area that is leaves. integer :: ft ! Plant functional type index. @@ -1801,7 +1801,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) ! to vegetation coverage to the host land model. ! ---------------------------------------------------------------------------------- - use EDTypesMod , only : ed_patch_type, ed_cohort_type, & + use EDTypesMod , only : ed_patch_type, fates_cohort_type, & ed_site_type, AREA use FatesInterfaceTypesMod , only : bc_out_type @@ -1813,7 +1813,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) type(bc_out_type), intent(inout) :: bc_out(nsites) ! Locals - type (ed_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: currentCohort integer :: s, ifp, c, p type (ed_patch_type) , pointer :: currentPatch real(r8) :: bare_frac_area @@ -2100,7 +2100,7 @@ subroutine CanopyLayerArea(currentPatch,site_spread,layer_index,layer_area) integer,intent(in) :: layer_index real(r8),intent(inout) :: layer_area - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort layer_area = 0.0_r8 @@ -2132,7 +2132,7 @@ subroutine UpdatePatchLAI(currentPatch) type(ed_patch_type),intent(inout), target :: currentPatch ! Local Variables - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort integer :: cl ! Canopy layer index integer :: ft ! Plant functional type index @@ -2178,7 +2178,7 @@ subroutine UpdateCohortLAI(currentCohort, canopy_layer_tlai, total_canopy_area) use EDtypesMod, only : dlower_vai ! Arguments - type(ed_cohort_type),intent(inout), target :: currentCohort + type(fates_cohort_type),intent(inout), target :: currentCohort real(r8), intent(in) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer real(r8), intent(in) :: total_canopy_area ! either patch%total_canopy_area or patch%area @@ -2224,7 +2224,7 @@ function NumPotentialCanopyLayers(currentPatch,site_spread,include_substory) res real(r8),intent(in) :: site_spread logical :: include_substory - type(ed_cohort_type),pointer :: currentCohort + type(fates_cohort_type),pointer :: currentCohort integer :: z real(r8) :: c_area diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 6f14ce4e66..3d6296b6a7 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -27,8 +27,8 @@ Module EDCohortDynamicsMod use PRTParametersMod , only : prt_params use FatesParameterDerivedMod, only : param_derived use EDTypesMod , only : ed_site_type, ed_patch_type - use FatesCohortMod , only : fates_cohort_type - use EDTypesMod , only : nclmax + use EDTypesMod , only : fates_cohort_type + use EDParamsMod , only : nclmax use PRTGenericMod , only : element_list use PRTGenericMod , only : StorageNutrientTarget use FatesLitterMod , only : ncwd @@ -2135,78 +2135,7 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) end subroutine DamageRecovery - subroutine InitPRTBoundaryConditions(this) - ! - ! DESCRIPTION: - ! Set the boundary conditions that flow in an out of the PARTEH - ! allocation hypotheses. Each of these calls to "RegsterBC" are simply - ! setting pointers. - ! For instance, if the hypothesis wants to know what - ! the DBH of the plant is, then we pass in the dbh as an argument (this%dbh), - ! and also tell it which boundary condition we are talking about (which is - ! defined by an integer index (ac_bc_inout_id_dbh) - ! - ! Again, elaborated Example: - ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index - ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" - ! that is classified as input and output "inout". - ! See PRTAllometricCarbonMod.F90 to track its usage. - ! bc_rval is used as the optional argument identifyer to specify a real - ! value boundary condition. - ! bc_ival is used as the optional argument identifyer to specify an integer - ! value boundary condition. - ! - - ! ARGUMENTS: - type(fates_cohort_type), intent(inout) :: this - - select case(hlm_parteh_mode) - - case (prt_carbon_allom_hyp) - - ! register boundary conditions for the Carbon Only Allometric Hypothesis - call this%prt%RegisterBCInOut(ac_bc_inout_id_dbh, bc_rval=this%dbh) - call this%prt%RegisterBCInOut(ac_bc_inout_id_netdc, bc_rval=this%npp_acc) - call this%prt%RegisterBCIn(ac_bc_in_id_cdamage, bc_ival=this%crowndamage) - call this%prt%RegisterBCIn(ac_bc_in_id_pft, bc_ival=this%pft) - call this%prt%RegisterBCIn(ac_bc_in_id_ctrim, bc_rval=this%canopy_trim) - call this%prt%RegisterBCIn(ac_bc_in_id_lstat, bc_ival=this%status_coh) - - case (prt_cnp_flex_allom_hyp) - - call this%prt%RegisterBCIn(acnp_bc_in_id_pft, bc_ival=this%pft) - call this%prt%RegisterBCIn(acnp_bc_in_id_ctrim, bc_rval=this%canopy_trim) - call this%prt%RegisterBCIn(acnp_bc_in_id_lstat, bc_ival=this%status_coh) - call this%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval=this%npp_acc) - - call this%prt%RegisterBCIn(acnp_bc_in_id_nc_repro, bc_rval=this%nc_repro) - call this%prt%RegisterBCIn(acnp_bc_in_id_pc_repro, bc_rval=this%pc_repro) - call this%prt%RegisterBCIn(acnp_bc_in_id_cdamage, bc_ival=this%crowndamage) - - call this%prt%RegisterBCInOut(acnp_bc_inout_id_dbh, bc_rval=this%dbh) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess, bc_rval=this%resp_excess) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr, bc_rval=this%l2fr) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int, bc_rval=this%cx_int) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt, bc_rval=this%ema_dcxdt) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx0, bc_rval=this%cx0) - - call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval=this%daily_n_gain) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval=this%daily_p_gain) - - call this%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval=this%daily_c_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval=this%daily_n_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval=this%daily_p_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival=this%cnp_limiter) - - case DEFAULT - - write(fates_log(),*) 'You specified an unknown PRT module' - write(fates_log(),*) 'Aborting' - call endrun(msg=errMsg(sourcefile, __LINE__)) - - end select - end subroutine InitPRTBoundaryConditions !:.........................................................................: diff --git a/biogeochem/EDLoggingMortalityMod.F90 b/biogeochem/EDLoggingMortalityMod.F90 index a98dd055cf..53aa3be4dd 100644 --- a/biogeochem/EDLoggingMortalityMod.F90 +++ b/biogeochem/EDLoggingMortalityMod.F90 @@ -15,7 +15,7 @@ module EDLoggingMortalityMod use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : rsnbl_math_prec - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_patch_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type @@ -461,7 +461,7 @@ subroutine get_harvestable_carbon (csite, site_area, hlm_harvest_catnames, harve ! Local Variables type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: harvestable_patch_c ! patch level total carbon available for harvest, kgC site-1 real(r8) :: harvestable_cohort_c ! cohort level total carbon available for harvest, kgC site-1 real(r8) :: sapw_m ! Biomass of sap wood @@ -717,7 +717,7 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site use EDtypesMod, only : area use EDtypesMod, only : ed_site_type use EDtypesMod, only : ed_patch_type - use EDtypesMod, only : ed_cohort_type + use EDtypesMod, only : fates_cohort_type use FatesConstantsMod, only : rsnbl_math_prec use FatesAllometryMod, only : carea_allom @@ -731,7 +731,7 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(site_massbal_type), pointer :: site_mass type(site_fluxdiags_type), pointer :: flux_diags type(litter_type),pointer :: new_litt diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index db5122a8d9..c8c72f4de9 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -9,7 +9,7 @@ module EDMortalityFunctionsMod use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : fates_log use EDPftvarcon , only : EDPftvarcon_inst - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type use FatesConstantsMod , only : itrue,ifalse @@ -62,7 +62,7 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort,smort,asmor use FatesConstantsMod, only : fates_check_param_set use DamageMainMod, only : GetDamageMortality - type (ed_cohort_type), intent(in) :: cohort_in + type (fates_cohort_type), intent(in) :: cohort_in type (bc_in_type), intent(in) :: bc_in real(r8),intent(out) :: bmort ! background mortality : Fraction per year real(r8),intent(out) :: cmort ! carbon starvation mortality @@ -239,7 +239,7 @@ subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_pr ! ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite - type(ed_cohort_type),intent(inout), target :: currentCohort + type(fates_cohort_type),intent(inout), target :: currentCohort type(bc_in_type), intent(in) :: bc_in real(r8), intent(in) :: frac_site_primary @@ -322,7 +322,7 @@ function ExemptTreefallDist(ccohort) result(is_exempt) ! ============================================================================ ! Arguments - type(ed_cohort_type),intent(in), target :: ccohort + type(fates_cohort_type),intent(in), target :: ccohort logical :: is_exempt ! if true, then treat all mortality from this cohort as non-disturbance-generating diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 4c4efca18f..ad4b6e898f 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -19,12 +19,12 @@ module EDPatchDynamicsMod use EDTypesMod , only : homogenize_seed_pfts use EDTypesMod , only : n_dbh_bins, area, patchfusion_dbhbin_loweredges use EDtypesMod , only : force_patchfuse_min_biomass - use EDTypesMod , only : ed_site_type, ed_patch_type, ed_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type use EDTypesMod , only : min_patch_area use EDTypesMod , only : min_patch_area_forced - use EDTypesMod , only : nclmax + use EDParamsMod , only : nclmax use EDTypesMod , only : maxpft use EDTypesMod , only : dtype_ifall use EDTypesMod , only : dtype_ilog @@ -175,7 +175,7 @@ subroutine disturbance_rates( site_in, bc_in) ! ! !LOCAL VARIABLES: type (ed_patch_type) , pointer :: currentPatch - type (ed_cohort_type), pointer :: currentCohort + type (fates_cohort_type), pointer :: currentCohort real(r8) :: cmort real(r8) :: bmort @@ -418,10 +418,10 @@ subroutine spawn_patches( currentSite, bc_in) type (ed_patch_type) , pointer :: new_patch_primary type (ed_patch_type) , pointer :: new_patch_secondary type (ed_patch_type) , pointer :: currentPatch - type (ed_cohort_type), pointer :: currentCohort - type (ed_cohort_type), pointer :: nc - type (ed_cohort_type), pointer :: storesmallcohort - type (ed_cohort_type), pointer :: storebigcohort + type (fates_cohort_type), pointer :: currentCohort + type (fates_cohort_type), pointer :: nc + type (fates_cohort_type), pointer :: storesmallcohort + type (fates_cohort_type), pointer :: storebigcohort real(r8) :: site_areadis_primary ! total area disturbed (to primary forest) in m2 per site per day real(r8) :: site_areadis_secondary ! total area disturbed (to secondary forest) in m2 per site per day real(r8) :: patch_site_areadis ! total area disturbed in m2 per patch per day @@ -1627,7 +1627,7 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, & ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(litter_type), pointer :: new_litt type(litter_type), pointer :: curr_litt type(site_massbal_type), pointer :: site_mass @@ -1863,7 +1863,7 @@ subroutine mortality_litter_fluxes(currentSite, currentPatch, & type(bc_in_type) , intent(in) :: bc_in ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(litter_type), pointer :: new_litt type(litter_type), pointer :: curr_litt type(site_massbal_type), pointer :: site_mass @@ -2640,10 +2640,10 @@ subroutine fuse_2_patches(csite, dp, rp) ! ! !LOCAL VARIABLES: - type (ed_cohort_type), pointer :: currentCohort ! Current Cohort - type (ed_cohort_type), pointer :: nextc ! Remembers next cohort in list - type (ed_cohort_type), pointer :: storesmallcohort - type (ed_cohort_type), pointer :: storebigcohort + type (fates_cohort_type), pointer :: currentCohort ! Current Cohort + type (fates_cohort_type), pointer :: nextc ! Remembers next cohort in list + type (fates_cohort_type), pointer :: storesmallcohort + type (fates_cohort_type), pointer :: storebigcohort integer :: c,p !counters for pft and litter size class. integer :: tnull,snull ! are the tallest and shortest cohorts associated? integer :: el ! loop counting index for elements @@ -3017,8 +3017,8 @@ subroutine dealloc_patch(cpatch) type(ed_patch_type) :: cpatch - type(ed_cohort_type), pointer :: ccohort ! current - type(ed_cohort_type), pointer :: ncohort ! next + type(fates_cohort_type), pointer :: ccohort ! current + type(fates_cohort_type), pointer :: ncohort ! next integer :: el ! loop counter for elements ! First Deallocate the cohort space @@ -3097,7 +3097,7 @@ subroutine patch_pft_size_profile(cp_pnt) ! ! !LOCAL VARIABLES: type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: mind(N_DBH_BINS) ! Bottom of DBH bin real(r8) :: maxd(N_DBH_BINS) ! Top of DBH bin real(r8) :: delta_dbh ! Size of DBH bin diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 5c63524ef0..8c8632d5db 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -49,12 +49,12 @@ module EDPhysiologyMod use FatesLitterMod , only : ilabile use FatesLitterMod , only : ilignin use FatesLitterMod , only : icellulose - use EDTypesMod , only : nclmax + use EDParamsMod , only : nclmax use EDTypesMod , only : AREA,AREA_INV - use EDTypesMod , only : nlevleaf + use EDParamsMod , only : nlevleaf use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : maxpft - use EDTypesMod , only : ed_site_type, ed_patch_type, ed_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type use EDTypesMod , only : leaves_on use EDTypesMod , only : leaves_off use EDTypesMod , only : min_n_safemath @@ -186,7 +186,7 @@ subroutine ZeroAllocationRates( currentSite ) ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%youngest_patch do while(associated(currentPatch)) @@ -216,8 +216,8 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) ! Locals - type(ed_cohort_type), pointer :: ccohort ! Current cohort - type(ed_cohort_type), pointer :: ndcohort ! New damage-class cohort + type(fates_cohort_type), pointer :: ccohort ! Current cohort + type(fates_cohort_type), pointer :: ndcohort ! New damage-class cohort type(litter_type), pointer :: litt ! Points to the litter object type(site_fluxdiags_type), pointer :: flux_diags ! pointer to site level flux diagnostics object integer :: cd ! Damage class index @@ -558,7 +558,7 @@ subroutine trim_canopy( currentSite ) type (ed_site_type),intent(inout), target :: currentSite ! ! !LOCAL VARIABLES: - type (ed_cohort_type) , pointer :: currentCohort + type (fates_cohort_type) , pointer :: currentCohort type (ed_patch_type) , pointer :: currentPatch integer :: z ! leaf layer @@ -1255,7 +1255,7 @@ subroutine phenology_leafonoff(currentSite) ! ! !LOCAL VARIABLES: type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: leaf_c ! leaf carbon [kg] real(r8) :: sapw_c ! sapwood carbon [kg] @@ -1515,7 +1515,7 @@ subroutine satellite_phenology(currentSite, bc_in) ! !LOCAL VARIABLES: type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: spread ! dummy value of canopy spread to estimate c_area real(r8) :: leaf_c ! leaf carbon estimated to generate target tlai @@ -1630,7 +1630,7 @@ subroutine assign_cohort_SP_properties(currentCohort,htop,tlai,tsai,parea,init,l ! -----------------------------------------------------------------------------------! - type(ed_cohort_type), intent(inout), target :: currentCohort + type(fates_cohort_type), intent(inout), target :: currentCohort real(r8), intent(in) :: tlai ! target leaf area index from SP inputs real(r8), intent(in) :: tsai ! target stem area index from SP inputs @@ -1762,7 +1762,7 @@ subroutine SeedIn( currentSite, bc_in ) type(ed_patch_type), pointer :: currentPatch type(litter_type), pointer :: litt - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(site_massbal_type), pointer :: site_mass integer :: pft @@ -1993,7 +1993,7 @@ subroutine recruitment( currentSite, currentPatch, bc_in ) class(prt_vartypes), pointer :: prt integer :: ft integer :: c - type (ed_cohort_type) , pointer :: temp_cohort + type (fates_cohort_type) , pointer :: temp_cohort type (litter_type), pointer :: litt ! The litter object (carbon right now) type(site_massbal_type), pointer :: site_mass ! For accounting total in-out mass fluxes integer :: cohortstatus @@ -2319,7 +2319,7 @@ subroutine CWDInput( currentSite, currentPatch, litt, bc_in) ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(site_fluxdiags_type), pointer :: flux_diags type(site_massbal_type), pointer :: site_mass integer :: c @@ -2790,7 +2790,7 @@ subroutine UpdateRecruitL2FR(csite) type(ed_site_type) :: csite type(ed_patch_type), pointer :: cpatch - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort real(r8) :: rec_n(maxpft,nclmax) ! plant count real(r8) :: rec_l2fr0(maxpft,nclmax) ! mean l2fr for this day @@ -2858,7 +2858,7 @@ subroutine UpdateRecruitStoich(csite) type(ed_site_type) :: csite type(ed_patch_type), pointer :: cpatch - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort integer :: ft ! functional type index integer :: cl ! canopy layer index real(r8) :: rec_l2fr_pft ! Actual l2fr of a pft in it's patch @@ -2901,7 +2901,7 @@ subroutine SetRecruitL2FR(csite) type(ed_site_type) :: csite type(ed_patch_type), pointer :: cpatch - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort integer :: ft,cl if(hlm_parteh_mode .ne. prt_cnp_flex_allom_hyp) return diff --git a/biogeochem/FatesAllometryMod.F90 b/biogeochem/FatesAllometryMod.F90 index a6d7126e4a..47fd652c30 100644 --- a/biogeochem/FatesAllometryMod.F90 +++ b/biogeochem/FatesAllometryMod.F90 @@ -96,8 +96,8 @@ module FatesAllometryMod use FatesGlobals , only : fates_log use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : FatesWarn,N2S,A2S,I2S - use EDTypesMod , only : nlevleaf, dinc_vai - use EDTypesMod , only : nclmax + use EDParamsMod , only : nlevleaf, dinc_vai + use EDParamsMod , only : nclmax use DamageMainMod , only : GetCrownReduction implicit none diff --git a/biogeochem/FatesLitterMod.F90 b/biogeochem/FatesLitterMod.F90 index be5ec48aa9..5776324430 100644 --- a/biogeochem/FatesLitterMod.F90 +++ b/biogeochem/FatesLitterMod.F90 @@ -36,7 +36,6 @@ module FatesLitterMod use FatesConstantsMod, only : nearzero use FatesConstantsMod, only : calloc_abs_error use FatesConstantsMod, only : fates_unset_r8 - use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : fates_log use shr_log_mod , only : errMsg => shr_log_errMsg @@ -55,6 +54,16 @@ module FatesLitterMod integer, public, parameter :: icellulose = 2 ! Array index for cellulose portion integer, public, parameter :: ilignin = 3 ! Array index for the lignin portion + ! SPITFIRE + + integer, parameter, public :: NFSC = NCWD+2 ! number fuel size classes (4 cwd size classes, leaf litter, and grass) + integer, parameter, public :: tw_sf = 1 ! array index of twig pool for spitfire + integer, parameter, public :: lb_sf = 3 ! array index of large branch pool for spitfire + integer, parameter, public :: tr_sf = 4 ! array index of dead trunk pool for spitfire + integer, parameter, public :: dl_sf = 5 ! array index of dead leaf pool for spitfire (dead grass and dead leaves) + integer, parameter, public :: lg_sf = 6 ! array index of live grass pool for spitfire + + type, public :: litter_type diff --git a/biogeochem/FatesSoilBGCFluxMod.F90 b/biogeochem/FatesSoilBGCFluxMod.F90 index ae01df7c93..e29a884fd2 100644 --- a/biogeochem/FatesSoilBGCFluxMod.F90 +++ b/biogeochem/FatesSoilBGCFluxMod.F90 @@ -41,11 +41,11 @@ module FatesSoilBGCFluxMod use FatesAllometryMod , only : bstore_allom use FatesAllometryMod , only : bbgw_allom use FatesAllometryMod , only : carea_allom - use EDTypesMod , only : p_uptake_mode - use EDTypesMod , only : n_uptake_mode + use EDParamsMod , only : p_uptake_mode + use EDParamsMod , only : n_uptake_mode use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : AREA,AREA_INV use FatesInterfaceTypesMod, only : bc_in_type use FatesInterfaceTypesMod, only : bc_out_type @@ -127,7 +127,7 @@ subroutine UnPackNutrientAquisitionBCs(sites, bc_in) integer :: id ! decomp layer index integer :: pft ! pft index type(ed_patch_type), pointer :: cpatch ! current patch pointer - type(ed_cohort_type), pointer :: ccohort ! current cohort pointer + type(fates_cohort_type), pointer :: ccohort ! current cohort pointer real(r8) :: fnrt_c ! fine-root carbon [kg] nsites = size(sites,dim=1) @@ -250,7 +250,7 @@ subroutine PrepCH4BCs(csite,bc_in,bc_out) type(bc_out_type), intent(inout) :: bc_out type(bc_in_type), intent(in) :: bc_in type(ed_patch_type), pointer :: cpatch ! current patch pointer - type(ed_cohort_type), pointer :: ccohort ! current cohort pointer + type(fates_cohort_type), pointer :: ccohort ! current cohort pointer integer :: pft ! plant functional type integer :: fp ! patch index of the site real(r8) :: agnpp ! Above ground daily npp @@ -420,7 +420,7 @@ subroutine PrepNutrientAquisitionBCs(csite, bc_in, bc_out) integer :: id ! decomp index (might == j) integer :: pft ! plant functional type type(ed_patch_type), pointer :: cpatch ! current patch pointer - type(ed_cohort_type), pointer :: ccohort ! current cohort pointer + type(fates_cohort_type), pointer :: ccohort ! current cohort pointer real(r8) :: fnrt_c ! fine-root carbon [kg] real(r8) :: veg_rootc ! fine root carbon in each layer [g/m3] real(r8) :: decompmicc_layer ! Microbial dedcomposer biomass for current layer @@ -533,7 +533,7 @@ subroutine EffluxIntoLitterPools(csite, cpatch, ccohort, bc_in ) ! Arguments type(ed_site_type), intent(inout) :: csite type(ed_patch_type), intent(inout) :: cpatch - type(ed_cohort_type), intent(inout),target :: ccohort + type(fates_cohort_type), intent(inout),target :: ccohort type(bc_in_type), intent(in) :: bc_in ! locals @@ -632,7 +632,7 @@ subroutine FluxIntoLitterPools(csite, bc_in, bc_out) ! !LOCAL VARIABLES: type (ed_patch_type), pointer :: currentPatch - type (ed_cohort_type), pointer :: ccohort + type (fates_cohort_type), pointer :: ccohort real(r8), pointer :: flux_cel_si(:) real(r8), pointer :: flux_lab_si(:) real(r8), pointer :: flux_lig_si(:) diff --git a/biogeophys/EDAccumulateFluxesMod.F90 b/biogeophys/EDAccumulateFluxesMod.F90 index 9756c743f0..3ef45ac742 100644 --- a/biogeophys/EDAccumulateFluxesMod.F90 +++ b/biogeophys/EDAccumulateFluxesMod.F90 @@ -38,7 +38,7 @@ subroutine AccumulateFluxes_ED(nsites, sites, bc_in, bc_out, dt_time) ! ! !USES: - use EDTypesMod , only : ed_patch_type, ed_cohort_type, & + use EDTypesMod , only : ed_patch_type, fates_cohort_type, & ed_site_type, AREA use FatesInterfaceTypesMod , only : bc_in_type,bc_out_type @@ -51,7 +51,7 @@ subroutine AccumulateFluxes_ED(nsites, sites, bc_in, bc_out, dt_time) real(r8), intent(in) :: dt_time ! timestep interval ! ! !LOCAL VARIABLES: - type(ed_cohort_type), pointer :: ccohort ! current cohort + type(fates_cohort_type), pointer :: ccohort ! current cohort type(ed_patch_type) , pointer :: cpatch ! current patch integer :: iv !leaf layer integer :: c ! clm/alm column diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index 7b803469e5..89deb8c4d0 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -11,7 +11,7 @@ module EDBtranMod use FatesConstantsMod , only : nocomp_bareground use EDTypesMod , only : ed_site_type, & ed_patch_type, & - ed_cohort_type, & + fates_cohort_type, & maxpft use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & @@ -111,7 +111,7 @@ subroutine btran_ed( nsites, sites, bc_in, bc_out) ! ! !LOCAL VARIABLES: type(ed_patch_type),pointer :: cpatch ! Current Patch Pointer - type(ed_cohort_type),pointer :: ccohort ! Current cohort pointer + type(fates_cohort_type),pointer :: ccohort ! Current cohort pointer integer :: s ! site integer :: j ! soil layer integer :: ifp ! patch vector index for the site diff --git a/biogeophys/EDSurfaceAlbedoMod.F90 b/biogeophys/EDSurfaceAlbedoMod.F90 index 48b9d1e448..360abf38cd 100644 --- a/biogeophys/EDSurfaceAlbedoMod.F90 +++ b/biogeophys/EDSurfaceAlbedoMod.F90 @@ -20,15 +20,15 @@ module EDSurfaceRadiationMod use FatesInterfaceTypesMod , only : bc_out_type use FatesInterfaceTypesMod , only : hlm_numSWb use FatesInterfaceTypesMod , only : numpft - use EDTypesMod , only : maxSWb - use EDTypesMod , only : nclmax - use EDTypesMod , only : nlevleaf + use EDParamsMod , only : maxSWb + use EDParamsMod , only : nclmax + use EDParamsMod , only : nlevleaf use EDTypesMod , only : n_rad_stream_types use EDTypesMod , only : idiffuse use EDTypesMod , only : idirect - use EDTypesMod , only : ivis - use EDTypesMod , only : inir - use EDTypesMod , only : ipar + use EDParamsMod , only : ivis + use EDParamsMod , only : inir + use EDParamsMod , only : ipar use EDCanopyStructureMod, only: calc_areaindex use FatesGlobals , only : fates_log use FatesGlobals, only : endrun => fates_endrun diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 index c56b4930f5..f160612633 100644 --- a/biogeophys/FatesBstressMod.F90 +++ b/biogeophys/FatesBstressMod.F90 @@ -9,7 +9,7 @@ module FatesBstressMod use FatesConstantsMod , only : itrue,ifalse use EDTypesMod , only : ed_site_type, & ed_patch_type, & - ed_cohort_type, & + fates_cohort_type, & maxpft use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & @@ -49,7 +49,7 @@ subroutine btran_sal_stress_fates( nsites, sites, bc_in) ! ! !LOCAL VARIABLES: type(ed_patch_type),pointer :: cpatch ! Current Patch Pointer - type(ed_cohort_type),pointer :: ccohort ! Current cohort pointer + type(fates_cohort_type),pointer :: ccohort ! Current cohort pointer integer :: s ! site integer :: j ! soil layer integer :: ft ! plant functional type index diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index 285dc98702..4846336c9f 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -53,10 +53,10 @@ module FatesPlantHydraulicsMod use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : AREA_INV use EDTypesMod , only : AREA - use EDTypesMod , only : leaves_on + use EDParamsMod , only : leaves_on use FatesInterfaceTypesMod , only : bc_in_type use FatesInterfaceTypesMod , only : bc_out_type @@ -337,7 +337,7 @@ subroutine RestartHydrStates(sites,nsites,bc_in,bc_out) ! ---------------------------------------------------------------------------------- ! LL pointers type(ed_patch_type),pointer :: cpatch ! current patch - type(ed_cohort_type),pointer :: ccohort ! current cohort + type(fates_cohort_type),pointer :: ccohort ! current cohort type(ed_cohort_hydr_type),pointer :: ccohort_hydr type(ed_site_hydr_type),pointer :: csite_hydr integer :: s ! site loop counter @@ -533,7 +533,7 @@ subroutine InitPlantHydStates(site, cohort) ! !ARGUMENTS: type(ed_site_type), intent(inout), target :: site ! current site pointer - type(ed_cohort_type), intent(inout), target :: cohort ! current cohort pointer + type(fates_cohort_type), intent(inout), target :: cohort ! current cohort pointer ! ! !LOCAL VARIABLES: type(ed_site_hydr_type), pointer :: csite_hydr @@ -682,7 +682,7 @@ subroutine UpdatePlantPsiFTCFromTheta(ccohort,csite_hydr) ! of total conductivity based on the relative water ! content ! Arguments - type(ed_cohort_type),intent(inout), target :: ccohort + type(fates_cohort_type),intent(inout), target :: ccohort type(ed_site_hydr_type),intent(in), target :: csite_hydr ! Locals @@ -742,7 +742,7 @@ subroutine UpdatePlantHydrNodes(ccohort,ft,plant_height,csite_hydr) ! -------------------------------------------------------------------------------- ! Arguments - type(ed_cohort_type), intent(inout) :: ccohort + type(fates_cohort_type), intent(inout) :: ccohort integer,intent(in) :: ft ! plant functional type index real(r8), intent(in) :: plant_height ! [m] type(ed_site_hydr_type), intent(in) :: csite_hydr @@ -845,7 +845,7 @@ subroutine UpdateSizeDepPlantHydProps(currentSite,ccohort,bc_in) ! ARGUMENTS: type(ed_site_type) , intent(in) :: currentSite ! Site stuff - type(ed_cohort_type) , intent(inout) :: ccohort ! current cohort pointer + type(fates_cohort_type) , intent(inout) :: ccohort ! current cohort pointer type(bc_in_type) , intent(in) :: bc_in ! Boundary Conditions ! Locals @@ -894,7 +894,7 @@ subroutine UpdatePlantHydrLenVol(ccohort,csite_hydr) ! ----------------------------------------------------------------------------------- ! Arguments - type(ed_cohort_type),intent(inout) :: ccohort + type(fates_cohort_type),intent(inout) :: ccohort type(ed_site_hydr_type),intent(in) :: csite_hydr type(ed_cohort_hydr_type),pointer :: ccohort_hydr ! Plant hydraulics structure @@ -1096,7 +1096,7 @@ subroutine UpdateSizeDepPlantHydStates(currentSite,ccohort) ! !ARGUMENTS: type(ed_site_type) , intent(in) :: currentSite ! Site stuff - type(ed_cohort_type) , intent(inout) :: ccohort + type(fates_cohort_type) , intent(inout) :: ccohort ! ! !LOCAL VARIABLES: type(ed_cohort_hydr_type), pointer :: ccohort_hydr @@ -1198,8 +1198,8 @@ end function constrain_water_contents subroutine CopyCohortHydraulics(newCohort, oldCohort) ! Arguments - type(ed_cohort_type), intent(inout), target :: newCohort - type(ed_cohort_type), intent(inout), target :: oldCohort + type(fates_cohort_type), intent(inout), target :: newCohort + type(fates_cohort_type), intent(inout), target :: oldCohort ! Locals type(ed_cohort_hydr_type), pointer :: ncohort_hydr @@ -1266,8 +1266,8 @@ end subroutine CopyCohortHydraulics subroutine FuseCohortHydraulics(currentSite,currentCohort, nextCohort, bc_in, newn) - type(ed_cohort_type), intent(inout), target :: currentCohort ! current cohort - type(ed_cohort_type), intent(inout), target :: nextCohort ! next (donor) cohort + type(fates_cohort_type), intent(inout), target :: currentCohort ! current cohort + type(fates_cohort_type), intent(inout), target :: nextCohort ! next (donor) cohort type(ed_site_type), intent(inout), target :: currentSite ! current site type(bc_in_type), intent(in) :: bc_in @@ -1372,7 +1372,7 @@ subroutine InitHydrCohort(currentSite,currentCohort) ! Arguments type(ed_site_type), target :: currentSite - type(ed_cohort_type), target :: currentCohort + type(fates_cohort_type), target :: currentCohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr if ( hlm_use_planthydro.eq.ifalse ) return @@ -1388,7 +1388,7 @@ end subroutine InitHydrCohort subroutine DeallocateHydrCohort(currentCohort) ! Arguments - type(ed_cohort_type), target :: currentCohort + type(fates_cohort_type), target :: currentCohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr if ( hlm_use_planthydro.eq.ifalse ) return @@ -1776,7 +1776,7 @@ subroutine UpdateH2OVeg(csite,bc_out,prev_site_h2o,icall) ! Locals - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(ed_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr @@ -1859,7 +1859,7 @@ subroutine RecruitWUptake(nsites,sites,bc_in,dtime,recruitflag) logical, intent(out) :: recruitflag !flag to check if there is newly recruited cohorts ! Locals - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(ed_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr @@ -1934,7 +1934,7 @@ subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) ! Arguments type(ed_site_type), intent(inout), target :: csite - type(ed_cohort_type) , intent(inout), target :: ccohort + type(fates_cohort_type) , intent(inout), target :: ccohort type(bc_in_type) , intent(in) :: bc_in ! Locals @@ -2061,7 +2061,7 @@ subroutine UpdateSizeDepRhizVolLenCon(currentSite, bc_in) ! !LOCAL VARIABLES: type(ed_site_hydr_type), pointer :: csite_hydr type(ed_patch_type) , pointer :: cPatch - type(ed_cohort_type) , pointer :: cCohort + type(fates_cohort_type) , pointer :: cCohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr real(r8) :: hksat_s ! hksat converted to units of 10^6sec ! which is equiv to [kg m-1 s-1 MPa-1] @@ -2198,7 +2198,7 @@ subroutine BTranForHLMDiagnosticsFromCohortHydr(nsites,sites,bc_out) integer :: ifp real(r8) :: balive_patch type(ed_patch_type),pointer :: cpatch - type(ed_cohort_type),pointer :: ccohort + type(fates_cohort_type),pointer :: ccohort do s = 1,nsites @@ -2428,7 +2428,7 @@ subroutine hydraulics_bc ( nsites, sites, bc_in, bc_out, dtime) !---------------------------------------------------------------------- type (ed_patch_type), pointer :: cpatch ! current patch pointer - type (ed_cohort_type), pointer :: ccohort ! current cohort pointer + type (fates_cohort_type), pointer :: ccohort ! current cohort pointer type(ed_site_hydr_type), pointer :: csite_hydr ! site hydraulics pointer type(ed_cohort_hydr_type), pointer :: ccohort_hydr ! cohort hydraulics pointer @@ -2943,7 +2943,7 @@ subroutine UpdatePlantKmax(ccohort_hydr,ccohort,csite_hydr) ! Arguments type(ed_cohort_hydr_type),intent(inout),target :: ccohort_hydr - type(ed_cohort_type),intent(in),target :: ccohort + type(fates_cohort_type),intent(in),target :: ccohort type(ed_site_hydr_type),intent(in),target :: csite_hydr ! Locals @@ -3153,7 +3153,7 @@ subroutine OrderLayersForSolve1D(csite_hydr,cohort,cohort_hydr,ordered, kbg_laye ! Arguments (IN) type(ed_site_hydr_type), intent(in),target :: csite_hydr - type(ed_cohort_type), intent(in),target :: cohort + type(fates_cohort_type), intent(in),target :: cohort type(ed_cohort_hydr_type),intent(in),target :: cohort_hydr @@ -3295,7 +3295,7 @@ subroutine ImTaylorSolve1D(slat, slon,recruitflag,csite_hydr,cohort,cohort_hydr, real(r8), intent(in) :: slat ! latitidue of the site real(r8), intent(in) :: slon ! longitidue of the site logical, intent(in) :: recruitflag - type(ed_cohort_type),intent(in),target :: cohort + type(fates_cohort_type),intent(in),target :: cohort type(ed_cohort_hydr_type),intent(inout),target :: cohort_hydr type(ed_site_hydr_type), intent(in),target :: csite_hydr real(r8), intent(in) :: dtime @@ -3988,7 +3988,7 @@ subroutine Report1DError(cohort, csite_hydr, ilayer, z_node, v_node, & ! like, and then quits. ! Arguments (IN) - type(ed_cohort_type),intent(in),target :: cohort + type(fates_cohort_type),intent(in),target :: cohort type(ed_site_hydr_type),intent(in), target :: csite_hydr integer, intent(in) :: ilayer ! soil layer index of interest real(r8), intent(in) :: z_node(:) ! elevation of nodes @@ -4301,7 +4301,7 @@ subroutine AccumulateMortalityWaterStorage(csite,ccohort,delta_n) ! Arguments type(ed_site_type), intent(inout), target :: csite - type(ed_cohort_type) , intent(inout), target :: ccohort + type(fates_cohort_type) , intent(inout), target :: ccohort real(r8), intent(in) :: delta_n ! Loss in number density ! for this cohort /ha/day @@ -4345,7 +4345,7 @@ subroutine RecruitWaterStorage(nsites,sites,bc_out) type(bc_out_type), intent(inout) :: bc_out(nsites) ! Locals - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(ed_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr @@ -4795,7 +4795,7 @@ subroutine MatSolve2D(csite_hydr,cohort,cohort_hydr, & ! ----------------------------------------------------------------------------------- type(ed_site_hydr_type), intent(inout),target :: csite_hydr ! ED csite_hydr structure type(ed_cohort_hydr_type), target :: cohort_hydr - type(ed_cohort_type) , intent(inout), target :: cohort + type(fates_cohort_type) , intent(inout), target :: cohort real(r8),intent(in) :: tmx ! time interval to integrate over [s] real(r8),intent(in) :: qtop real(r8),intent(out) :: sapflow ! time integrated mass flux between transp-root and stem [kg] @@ -5564,7 +5564,7 @@ subroutine PicardSolve2D(csite_hydr,cohort,cohort_hydr, & ! ----------------------------------------------------------------------------------- type(ed_site_hydr_type), intent(inout),target :: csite_hydr ! ED csite_hydr structure type(ed_cohort_hydr_type), target :: cohort_hydr - type(ed_cohort_type) , intent(inout), target :: cohort + type(fates_cohort_type) , intent(inout), target :: cohort real(r8),intent(in) :: tmx ! time interval to integrate over [s] real(r8),intent(in) :: qtop integer :: nnode !total number of nodes diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index fa1228b733..74f93e67ce 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -127,7 +127,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) use FatesSynchronizedParamsMod , only : FatesSynchronizedParamsInst use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : maxpft use EDTypesMod , only : dinc_vai @@ -161,7 +161,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! LOCAL VARIABLES: ! ----------------------------------------------------------------------------------- type (ed_patch_type) , pointer :: currentPatch - type (ed_cohort_type), pointer :: currentCohort + type (fates_cohort_type), pointer :: currentCohort ! ----------------------------------------------------------------------------------- ! These three arrays hold leaf-level biophysical rates that are calculated @@ -1893,11 +1893,11 @@ subroutine UpdateCanopyNCanNRadPresent(currentPatch) use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type ! Arguments type(ed_patch_type), target :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort ! Locals integer :: cl ! Canopy Layer Index diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 16aca5d243..7090decc90 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -25,15 +25,15 @@ module SFMainMod use PRTGenericMod , only : element_pos use EDtypesMod , only : ed_site_type use EDtypesMod , only : ed_patch_type - use EDtypesMod , only : ed_cohort_type + use EDtypesMod , only : fates_cohort_type use EDtypesMod , only : AREA - use EDtypesMod , only : DL_SF - use EDTypesMod , only : TW_SF - use EDtypesMod , only : LB_SF - use EDtypesMod , only : LG_SF + use FatesLitterMod , only : DL_SF + use FatesLitterMod , only : TW_SF + use FatesLitterMod , only : LB_SF + use FatesLitterMod , only : LG_SF use FatesLitterMod , only : ncwd - use EDtypesMod , only : NFSC - use EDtypesMod , only : TR_SF + use FatesLitterMod , only : NFSC + use FatesLitterMod , only : TR_SF use FatesLitterMod , only : litter_type use PRTGenericMod, only : leaf_organ @@ -182,7 +182,7 @@ subroutine charecteristics_of_fuel ( currentSite ) type(ed_site_type), intent(in), target :: currentSite type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort type(litter_type), pointer :: litt_c real(r8) alpha_FMC(nfsc) ! Relative fuel moisture adjusted per drying ratio @@ -358,7 +358,7 @@ subroutine wind_effect ( currentSite, bc_in) type(bc_in_type) , intent(in) :: bc_in type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: total_grass_area ! per patch,in m2 real(r8) :: tree_fraction ! site level. no units @@ -896,7 +896,7 @@ subroutine crown_scorching ( currentSite ) type(ed_site_type), intent(in), target :: currentSite type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: tree_ag_biomass ! total amount of above-ground tree biomass in patch. kgC/m2 real(r8) :: leaf_c ! leaf carbon [kg] @@ -960,7 +960,7 @@ subroutine crown_damage ( currentSite ) type(ed_site_type), intent(in), target :: currentSite type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: crown_depth ! Depth of crown in meters currentPatch => currentSite%oldest_patch @@ -1027,7 +1027,7 @@ subroutine cambial_damage_kill ( currentSite ) type(ed_site_type), intent(in), target :: currentSite type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: tau_c !critical time taken to kill cambium (minutes) real(r8) :: bt !bark thickness in cm. @@ -1083,7 +1083,7 @@ subroutine post_fire_mortality ( currentSite ) type(ed_site_type), intent(in), target :: currentSite type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%oldest_patch diff --git a/fire/SFParamsMod.F90 b/fire/SFParamsMod.F90 index 65849f829d..306034a804 100644 --- a/fire/SFParamsMod.F90 +++ b/fire/SFParamsMod.F90 @@ -4,7 +4,7 @@ module SFParamsMod ! use FatesConstantsMod , only: r8 => fates_r8 use FatesConstantsMod , only: fates_check_param_set - use EDtypesMod , only: NFSC + use FatesLitterMod , only: NFSC use FatesLitterMod , only: ncwd use FatesParametersInterface, only : param_string_length use FatesGlobals, only : fates_log diff --git a/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 b/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 index 6238111e30..9f520593b3 100644 --- a/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 +++ b/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 @@ -78,7 +78,7 @@ module FatesCohortWrapMod implicit none private ! Modules are private by default - type, public :: ed_cohort_type + type, public :: fates_cohort_type integer :: pft ! pft number real(r8) :: dbh ! dbh: cm @@ -106,11 +106,11 @@ module FatesCohortWrapMod ! Multi-species, multi-pool Reactive Transport class(prt_vartypes), pointer :: prt - end type ed_cohort_type + end type fates_cohort_type ! Global Instances - type(ed_cohort_type), pointer, public :: cohort_array(:) + type(fates_cohort_type), pointer, public :: cohort_array(:) integer, public :: numcohort character(len=*), parameter, private :: sourcefile = __FILE__ @@ -132,7 +132,7 @@ subroutine CohortInitAlloc(numcohorts) ! Locals integer(i4) :: ico - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort allocate(cohort_array(numcohorts)) @@ -189,7 +189,7 @@ subroutine CohortPySet(ipft,hgt_min,canopy_trim) ! Locals - type(ed_cohort_type), pointer :: ccohort ! Current cohort + type(fates_cohort_type), pointer :: ccohort ! Current cohort real(r8) :: leaf_c real(r8) :: fnrt_c real(r8) :: sapw_c @@ -376,7 +376,7 @@ subroutine WrapDailyPRT(ipft,daily_carbon_gain,canopy_trim,flush_c,drop_frac_c,l real(r8), intent(in), optional :: daily_phosphorus_gain real(r8), intent(in), optional :: daily_r_maint_demand - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort logical, parameter :: is_drought = .false. ccohort => cohort_array(ipft) @@ -443,7 +443,7 @@ subroutine WrapQueryVars(ipft,crowndamage, leaf_area,crown_area,agb,store_c,targ real(r8),intent(out) :: target_leaf_c real(r8) :: leaf_c - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort real(r8),parameter :: nplant = 1.0_r8 real(r8),parameter :: site_spread = 1.0_r8 @@ -540,7 +540,7 @@ subroutine WrapQueryDiagnostics(ipft, dbh, & real(r8),intent(out) :: growth_resp real(r8),intent(out) :: crown_area - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort real(r8),parameter :: nplant = 1.0_r8 real(r8),parameter :: site_spread = 1.0_r8 diff --git a/main/ChecksBalancesMod.F90 b/main/ChecksBalancesMod.F90 index ab76715fe6..8c867219b1 100644 --- a/main/ChecksBalancesMod.F90 +++ b/main/ChecksBalancesMod.F90 @@ -4,7 +4,7 @@ module ChecksBalancesMod use shr_const_mod, only : SHR_CONST_CDAY use EDtypesMod, only : ed_site_type use EDTypesMod, only : ed_patch_type - use EDTypesMod, only : ed_cohort_type + use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : AREA use EDTypesMod, only : site_massbal_type use PRTGenericMod, only : num_elements @@ -49,7 +49,7 @@ subroutine SiteMassStock(currentSite,el,total_stock,biomass_stock,litter_stock,s real(r8),intent(out) :: biomass_stock ! kg real(r8),intent(out) :: seed_stock ! kg type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort real(r8) :: patch_biomass ! kg real(r8) :: patch_seed ! kg real(r8) :: patch_litter ! kg @@ -88,7 +88,7 @@ subroutine PatchMassStock(currentPatch,el,live_stock,seed_stock,litter_stock) real(r8),intent(out) :: litter_stock type(litter_type), pointer :: litt ! litter object - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort integer :: element_id litt => currentPatch%litter(el) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 45b3ac7551..f02653ef5c 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -23,7 +23,7 @@ module EDInitMod use EDPhysiologyMod , only : assign_cohort_sp_properties use ChecksBalancesMod , only : SiteMassStock use FatesInterfaceTypesMod , only : hlm_day_of_year - use EDTypesMod , only : ed_site_type, ed_patch_type, ed_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type use EDTypesMod , only : numWaterMem use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : maxpft @@ -748,7 +748,7 @@ subroutine init_cohorts( site_in, patch_in, bc_in) type(bc_in_type), intent(in) :: bc_in ! ! !LOCAL VARIABLES: - type(ed_cohort_type),pointer :: temp_cohort + type(fates_cohort_type),pointer :: temp_cohort class(prt_vartypes),pointer :: prt_obj integer :: cstatus integer :: pft diff --git a/main/EDMainMod.F90 b/main/EDMainMod.F90 index 427a687f8c..0912b05655 100644 --- a/main/EDMainMod.F90 +++ b/main/EDMainMod.F90 @@ -66,7 +66,7 @@ module EDMainMod use FatesLitterMod , only : ncwd use EDtypesMod , only : ed_site_type use EDtypesMod , only : ed_patch_type - use EDtypesMod , only : ed_cohort_type + use EDtypesMod , only : fates_cohort_type use EDTypesMod , only : AREA use EDTypesMod , only : site_massbal_type use PRTGenericMod , only : num_elements @@ -178,7 +178,7 @@ subroutine ed_ecosystem_dynamics(currentSite, bc_in, bc_out) call IsItLoggingTime(hlm_masterproc,currentSite) ! Call a routine that identifies if damage should occur - call IsItDamageTime(hlm_masterproc, currentSite) + call IsItDamageTime(hlm_masterproc) !************************************************************************** ! Fire, growth, biogeochemistry. @@ -356,10 +356,10 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) ! !LOCAL VARIABLES: type(site_massbal_type), pointer :: site_cmass type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type) , pointer :: currentCohort - type(ed_cohort_type) , pointer :: nc - type(ed_cohort_type) , pointer :: storesmallcohort - type(ed_cohort_type) , pointer :: storebigcohort + type(fates_cohort_type) , pointer :: currentCohort + type(fates_cohort_type) , pointer :: nc + type(fates_cohort_type) , pointer :: storesmallcohort + type(fates_cohort_type) , pointer :: storebigcohort integer :: snull integer :: tnull @@ -887,7 +887,7 @@ subroutine TotalBalanceCheck (currentSite, call_index ) ! we can account for the changing areas of patches. type(ed_patch_type) , pointer :: currentPatch - type(ed_cohort_type) , pointer :: currentCohort + type(fates_cohort_type) , pointer :: currentCohort type(litter_type), pointer :: litt logical, parameter :: print_cohorts = .true. ! Set to true if you want ! to print cohort data @@ -1042,7 +1042,7 @@ subroutine bypass_dynamics(currentSite) ! Locals type(ed_patch_type), pointer :: currentPatch - type(ed_cohort_type), pointer :: currentCohort + type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%youngest_patch do while(associated(currentPatch)) diff --git a/main/EDParamsMod.F90 b/main/EDParamsMod.F90 index 40edc6a0b8..a9bdf7ab59 100644 --- a/main/EDParamsMod.F90 +++ b/main/EDParamsMod.F90 @@ -9,6 +9,7 @@ module EDParamsMod use FatesParametersInterface, only : param_string_length use FatesGlobals , only : fates_log use FatesGlobals , only : endrun => fates_endrun + use FatesConstantsMod, only : fates_unset_r8 ! CIME Globals use shr_log_mod , only : errMsg => shr_log_errMsg @@ -71,6 +72,46 @@ module EDParamsMod ! empirical curvature parameters for ac, aj photosynthesis co-limitation, c3 and c4 plants respectively real(r8),protected,public :: theta_cj_c3 real(r8),protected,public :: theta_cj_c4 + + ! Global identifier of how nutrients interact with the host land model + ! either they are fully coupled, or they generate uptake rates synthetically + ! in prescribed mode. In the latter, there is both NO mass removed from the HLM's soil + ! BGC N and P pools, and there is also none removed. + + integer, public :: n_uptake_mode + integer, public :: p_uptake_mode + + integer, parameter, public :: nclmax = 2 ! Maximum number of canopy layers + + ! parameters that govern the VAI (LAI+SAI) bins used in radiative transfer code + integer, parameter, public :: nlevleaf = 30 ! number of leaf+stem layers in each canopy layer + + real(r8), public :: dinc_vai(nlevleaf) = fates_unset_r8 ! VAI bin widths array + real(r8), public :: dlower_vai(nlevleaf) = fates_unset_r8 ! lower edges of VAI bins + + ! TODO: we use this cp_maxSWb only because we have a static array q(size=2) of + ! land-ice abledo for vis and nir. This should be a parameter, which would + ! get us on track to start using multi-spectral or hyper-spectral (RGK 02-2017) + + integer, parameter, public :: maxSWb = 2 ! maximum number of broad-bands in the + ! shortwave spectrum cp_numSWb <= cp_maxSWb + ! this is just for scratch-array purposes + ! if cp_numSWb is larger than this value + ! simply bump this number up as needed + +integer, parameter, public :: ivis = 1 ! This is the array index for short-wave + ! radiation in the visible spectrum, as expected + ! in boundary condition files and parameter + ! files. This will be compared with + ! the HLM's expectation in FatesInterfaceMod +integer, parameter, public :: inir = 2 ! This is the array index for short-wave + ! radiation in the near-infrared spectrum, as expected + ! in boundary condition files and parameter + ! files. This will be compared with + ! the HLM's expectation in FatesInterfaceMod + +integer, parameter, public :: ipar = ivis ! The photosynthetically active band + ! can be approximated to be equal to the visible band real(r8),protected,public :: q10_mr ! Q10 for respiration rate (for soil fragmenation and plant respiration) (unitless) real(r8),protected,public :: q10_froz ! Q10 for frozen-soil respiration rates (for soil fragmentation) (unitless) diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90 index 96c3fddf93..c55a6b955a 100644 --- a/main/EDPftvarcon.F90 +++ b/main/EDPftvarcon.F90 @@ -6,8 +6,8 @@ module EDPftvarcon ! read and initialize vegetation (PFT) constants. ! ! !USES: - use EDTypesMod , only : maxSWb, ivis, inir - use EDTypesMod , only : n_uptake_mode, p_uptake_mode + use EDParamsMod , only : maxSWb, ivis, inir + use EDParamsMod , only : n_uptake_mode, p_uptake_mode use FatesConstantsMod, only : r8 => fates_r8 use FatesConstantsMod, only : nearzero use FatesConstantsMod, only : itrue, ifalse diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 258849c066..a7f7b25fa1 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -1,39 +1,39 @@ module EDTypesMod use FatesConstantsMod, only : r8 => fates_r8 + use FatesGlobals, only : endrun => fates_endrun use FatesConstantsMod, only : ifalse use FatesConstantsMod, only : itrue use FatesGlobals, only : fates_log - use FatesCohortMod, only : fates_cohort_type - use FatesCohortMod, only : nlevleaf use FatesHydraulicsMemMod, only : ed_cohort_hydr_type use FatesHydraulicsMemMod, only : ed_site_hydr_type use PRTGenericMod, only : prt_vartypes use PRTGenericMod, only : leaf_organ, fnrt_organ, sapw_organ use PRTGenericMod, only : repro_organ, store_organ, struct_organ + use PRTGenericMod, only : prt_carbon_allom_hyp + use PRTGenericMod, only : prt_cnp_flex_allom_hyp use PRTGenericMod, only : num_organ_types use PRTGenericMod, only : num_elements use PRTGenericMod, only : element_list use PRTGenericMod, only : num_element_types use PRTGenericMod, only : carbon12_element use FatesLitterMod, only : litter_type - use FatesLitterMod, only : ncwd + use FatesLitterMod, only : ncwd, NFSC use FatesConstantsMod, only : n_anthro_disturbance_categories use FatesConstantsMod, only : days_per_year use FatesConstantsMod, only : fates_unset_r8 use FatesRunningMeanMod, only : rmean_type use FatesInterfaceTypesMod,only : bc_in_type use FatesInterfaceTypesMod,only : bc_out_type + use FatesInterfaceTypesMod,only : hlm_parteh_mode + use EDParamsMod, only : maxSWb, nclmax, nlevleaf + use shr_log_mod, only : errMsg => shr_log_errMsg implicit none private ! By default everything is private save - integer, parameter, public :: nclmax = 2 ! Maximum number of canopy layers - - - integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed ! the parameter file may determine that fewer ! are used, but this helps allocate scratch @@ -49,42 +49,19 @@ module EDTypesMod ! ------------------------------------------------------------------------------------- + + integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy + integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers + ! (all layers that are not the top canopy layer) + + integer, parameter, public :: n_rad_stream_types = 2 ! The number of radiation streams used (direct/diffuse) integer, parameter, public :: idirect = 1 ! This is the array index for direct radiation integer, parameter, public :: idiffuse = 2 ! This is the array index for diffuse radiation - real(r8), public :: dinc_vai(nlevleaf) = fates_unset_r8 ! VAI bin widths array - real(r8), public :: dlower_vai(nlevleaf) = fates_unset_r8 ! lower edges of VAI bins - - ! TODO: we use this cp_maxSWb only because we have a static array q(size=2) of - ! land-ice abledo for vis and nir. This should be a parameter, which would - ! get us on track to start using multi-spectral or hyper-spectral (RGK 02-2017) - - integer, parameter, public :: maxSWb = 2 ! maximum number of broad-bands in the - ! shortwave spectrum cp_numSWb <= cp_maxSWb - ! this is just for scratch-array purposes - ! if cp_numSWb is larger than this value - ! simply bump this number up as needed - - integer, parameter, public :: ivis = 1 ! This is the array index for short-wave - ! radiation in the visible spectrum, as expected - ! in boundary condition files and parameter - ! files. This will be compared with - ! the HLM's expectation in FatesInterfaceMod - integer, parameter, public :: inir = 2 ! This is the array index for short-wave - ! radiation in the near-infrared spectrum, as expected - ! in boundary condition files and parameter - ! files. This will be compared with - ! the HLM's expectation in FatesInterfaceMod - - integer, parameter, public :: ipar = ivis ! The photosynthetically active band - ! can be approximated to be equal to the visible band - - - - ! Flag to turn on/off salinity effects on the effective "btran" + ! Flag to turn on/off salinity effects on the effective "btran" ! btran stress function. logical, parameter, public :: do_fates_salinity = .false. @@ -134,16 +111,6 @@ module EDTypesMod integer, parameter, public :: phen_dstat_moiston = 2 ! Leaves on due to moisture avail (drought phenology) integer, parameter, public :: phen_dstat_timeon = 3 ! Leaves on due to time exceedance (drought phenology) - - ! SPITFIRE - - integer, parameter, public :: NFSC = NCWD+2 ! number fuel size classes (4 cwd size classes, leaf litter, and grass) - integer, parameter, public :: tw_sf = 1 ! array index of twig pool for spitfire - integer, parameter, public :: lb_sf = 3 ! array index of large branch pool for spitfire - integer, parameter, public :: tr_sf = 4 ! array index of dead trunk pool for spitfire - integer, parameter, public :: dl_sf = 5 ! array index of dead leaf pool for spitfire (dead grass and dead leaves) - integer, parameter, public :: lg_sf = 6 ! array index of live grass pool for spitfire - ! PATCH FUSION real(r8), parameter, public :: force_patchfuse_min_biomass = 0.005_r8 ! min biomass (kg / m2 patch area) below which to force-fuse patches integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches @@ -171,15 +138,229 @@ module EDTypesMod ! special mode to cause PFTs to create seed mass of all currently-existing PFTs logical, parameter, public :: homogenize_seed_pfts = .false. + character(len=*), parameter, private :: sourcefile = __FILE__ - ! Global identifier of how nutrients interact with the host land model - ! either they are fully coupled, or they generate uptake rates synthetically - ! in prescribed mode. In the latter, there is both NO mass removed from the HLM's soil - ! BGC N and P pools, and there is also none removed. + type, public :: fates_cohort_type + + ! POINTERS + type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort + type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort + + !:.........................................................................: + + ! Multi-species, multi-organ Plant Reactive Transport (PRT) + ! Contains carbon and nutrient state variables for various plant organs + class(prt_vartypes), pointer :: prt + real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant + ! in carbon only simulationss, and is set by the + ! allom_l2fr_min parameter. In nutrient + ! enabled simulations, this is dynamic, will + ! vary between allom_l2fr_min and allom_l2fr_max + ! parameters, with a tendency driven by + ! nutrient storage) [kg root / kg leaf] + + !:.........................................................................: + + ! VEGETATION STRUCTURE + + integer :: pft ! pft index + real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) [/m2] + real(r8) :: dbh ! diameter at breast height [cm] + real(r8) :: coage ! age [years] + real(r8) :: hite ! height [m] + integer :: indexnumber ! unique number for each cohort (within clump?) + integer :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] + real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort [1 = canopy, 2 = understorey, etc.] + ! real to be conservative during fusion + integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] + real(r8) :: g_sb_laweight ! total conductance (stomata + boundary layer) of the cohort + ! weighted by its leaf area [m/s]*[m2] + real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] + real(r8) :: leaf_cost ! how much does it cost to maintain leaves [kgC/m2/year] + real(r8) :: excl_weight ! how much of this cohort is demoted each year, as a proportion of all cohorts + real(r8) :: prom_weight ! how much of this cohort is promoted each year, as a proportion of all cohorts + integer :: nv ! number of leaf layers + integer :: status_coh ! growth status of plant [2 = leaves on , 1 = leaves off] + real(r8) :: c_area ! areal extent of canopy [m2] + real(r8) :: treelai ! lai of an individual within cohort leaf area [m2 leaf area/m2 crown area] + real(r8) :: treesai ! stem area index of an individual within cohort [m2 stem area/m2 crown area] + logical :: isnew ! flag to signify a new cohort - new cohorts have not experienced + ! npp or mortality and should therefore not be fused or averaged + integer :: size_class ! index that indicates which diameter size bin the cohort currently resides in + ! this is used for history output. We maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_class ! index that indicates which age bin the cohort currently resides in + ! (used for history output) + integer :: size_by_pft_class ! index that indicates the cohorts position of the joint size-class x functional + ! type classification. We also maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT + integer :: size_class_lasttimestep ! size class of the cohort at the last time step + + !:.........................................................................: + + ! CARBON AND NUTRIENT FLUXES + + ! -------------------------------------------------------------------------- + ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types* + ! + ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics + ! time-step (ie photosynthesis, sub-hourly) [kgC/indiv/timestep] + ! _acc: The accumulation of the _tstep variable from the beginning to ending of + ! the dynamics time-scale. This variable is zero'd during initialization and + ! after the dynamics call-sequence is completed. [kgC/indiv/day] + ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, + ! _acc_hold "holds" the integrated value until the next time dynamics is + ! called. This is necessary for restarts. This variable also has units + ! converted to a useful rate [kgC/indiv/yr] + ! -------------------------------------------------------------------------- + + real(r8) :: gpp_tstep ! Gross Primary Production (see above *) + real(r8) :: gpp_acc + real(r8) :: gpp_acc_hold + + real(r8) :: npp_tstep ! Net Primary Production (see above *) + real(r8) :: npp_acc + real(r8) :: npp_acc_hold + + real(r8) :: resp_tstep ! Autotrophic respiration (see above *) + real(r8) :: resp_acc + real(r8) :: resp_acc_hold + + real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon at each indiv/timestep [ppm] + real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon at each indiv/day + ! at the end of a day [ppm] + + ! The following four biophysical rates are assumed to be at the canopy top, at reference temp 25degC, + ! and based on the leaf age weighted average of the PFT parameterized values. + ! The last condition is why it is dynamic and tied to the cohort + + real(r8) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: jmax25top ! maximum electron transport rate at canopy top and 25degC [umol electrons/m2/s] + real(r8) :: tpu25top ! triose phosphate utilization rate at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: kp25top ! initial slope of CO2 response curve (C4 plants) at 25C + + real(r8) :: ts_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/timestep] + real(r8) :: year_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/year] + + ! used for CNP + integer :: cnp_limiter ! which element is limiting growth [0 = none, 1 = C, 2 = N, 3 = P] + real(r8) :: cx_int ! time integration of the log of the relative carbon storage over relative nutrient + real(r8) :: ema_dcxdt ! derivative of the log of the relative carbon storage over relative nutrient + real(r8) :: cx0 ! value on the previous time-step of log of the relative carbon storage over + ! relative nutrient + real(r8) :: nc_repro ! N:C ratio of a new recruit, used also for defining reproductive stoich + real(r8) :: pc_repro ! P:C ratio of a new recruit + + ! Nutrient Fluxes (if N, P, etc. are turned on) + real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition + ! in soil [kgN/plant/day] + real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition + ! in soil [kgN/plant/day] + + real(r8) :: sym_nfix_daily ! accumulated symbiotic N fixation from the roots [kgN/indiv/day] + real(r8) :: sym_nfix_tstep ! symbiotic N fixation from the roots for the time-step [kgN/indiv/timestep] + + real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized NH4/NO3 in solution as well as + ! symbiotic fixation + real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition + ! in soil [kgP/plant/day] + + real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kgC/plant/day] + real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kgN/plant/day] + real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kgP/plant/day] + + real(r8) :: daily_n_demand ! daily amount of N demanded by the plant [kgN/plant/day] + real(r8) :: daily_p_demand ! daily amount of P demanded by the plant [kgN/plant/day] + + real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] + + !:.........................................................................: + + ! RESPIRATION COMPONENTS + real(r8) :: rdark ! dark respiration [kgC/indiv/s] + real(r8) :: resp_g_tstep ! growth respiration [kgC/indiv/timestep] + real(r8) :: resp_m ! maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_m_unreduced ! diagnostic-only unreduced maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_excess ! respiration of excess carbon [kgC/indiv/day] + real(r8) :: livestem_mr ! aboveground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] + + !:.........................................................................: + + ! DAMAGE + real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] + + !:.........................................................................: + + ! MORTALITY + real(r8) :: dmort ! proportional mortality rate [/year] + + ! Mortality Rate Partitions + real(r8) :: bmort ! background mortality rate [indiv/year] + real(r8) :: cmort ! carbon starvation mortality rate [indiv/year] + real(r8) :: hmort ! hydraulic failure mortality rate [indiv/year] + real(r8) :: frmort ! freezing mortality rate [indiv/year] + real(r8) :: smort ! senesence mortality [indiv/year] + real(r8) :: asmort ! age senescence mortality [indiv/year] + real(r8) :: dgmort ! damage mortality [indiv/year] + + ! Logging Mortality Rate + ! Yi Xu & M. Huang + real(r8) :: lmort_direct ! directly logging rate [fraction/logging activity] + real(r8) :: lmort_collateral ! collaterally damaged rate [fraction/logging activity] + real(r8) :: lmort_infra ! mechanically damaged rate [fraction/logging activity] + real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation + ! (i.e. they are moved to newly-anthro-disturbed secondary + ! forest patch) [fraction/logging activity] + + !:.........................................................................: + + ! NITROGEN POOLS + ! -------------------------------------------------------------------------- + ! Nitrogen pools are not prognostic in the current implementation. + ! They are diagnosed during photosynthesis using a simple C2N parameter. + ! Local values are used in that routine. + ! -------------------------------------------------------------------------- + + !:.........................................................................: + + ! GROWTH DERIVIATIVES + real(r8) :: dndt ! time derivative of cohort size [n/year] + real(r8) :: dhdt ! time derivative of height [m/year] + real(r8) :: ddbhdt ! time derivative of dbh [cm/year] + real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] + + !:.........................................................................: + + ! FIRE + real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] + real(r8) :: cambial_mort ! probability that trees dies due to cambial charring [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] + + !:.........................................................................: + + ! HYDRAULICS + type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 + + !:.........................................................................: + + contains + + procedure :: init + procedure :: dump + procedure :: nan_values + procedure :: zero_values + procedure :: CanUpperUnder - integer, public :: n_uptake_mode - integer, public :: p_uptake_mode + end type fates_cohort_type !************************************ !** Patch type structure ** @@ -734,6 +915,470 @@ end subroutine ZeroMassBalFlux ! ===================================================================================== + subroutine init(this, prt) + ! + ! DESCRIPTION: + ! Create new cohort and set default values for all variables + ! + + ! ARGUMENTS: + class(fates_cohort_type), intent(inout), target :: this + class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object + + call this%nan_values() ! make everything in the cohort not-a-number + call this%zero_values() ! zero things that need to be zeroed + + ! point to the PARTEH object + this%prt => prt + + ! The PARTEH cohort object should be allocated and already + ! initialized in this routine. + call this%prt%CheckInitialConditions() + + call InitPRTBoundaryConditions(this) + + ! new cohorts do not have mortality rates, nor have they moved any + ! carbon when they are created. They will bias our statistics + ! until they have experienced a full day. We need a newly recruited flag. + ! This flag will be set to false after it has experienced + ! growth, disturbance and mortality. + this%isnew = .true. + + end subroutine init + + !:.........................................................................: + + subroutine InitPRTBoundaryConditions(new_cohort) + + ! Set the boundary conditions that flow in an out of the PARTEH + ! allocation hypotheses. Each of these calls to "RegsterBC" are simply + ! setting pointers. + ! For instance, if the hypothesis wants to know what + ! the DBH of the plant is, then we pass in the dbh as an argument (new_cohort%dbh), + ! and also tell it which boundary condition we are talking about (which is + ! defined by an integer index (ac_bc_inout_id_dbh) + ! + ! Again, elaborated Example: + ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index + ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" + ! that is classified as input and output "inout". + ! See PRTAllometricCarbonMod.F90 to track its usage. + ! bc_rval is used as the optional argument identifyer to specify a real + ! value boundary condition. + ! bc_ival is used as the optional argument identifyer to specify an integer + ! value boundary condition. + + use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & + ac_bc_in_id_cdamage, ac_bc_in_id_pft, & + ac_bc_in_id_ctrim, ac_bc_in_id_lstat + use PRTAllometricCNPMod, only : acnp_bc_in_id_pft, acnp_bc_in_id_ctrim, & + acnp_bc_in_id_lstat, acnp_bc_in_id_netdc, & + acnp_bc_in_id_netdc, acnp_bc_in_id_nc_repro, & + acnp_bc_in_id_pc_repro, acnp_bc_in_id_cdamage, & + acnp_bc_inout_id_dbh, acnp_bc_inout_id_resp_excess, & + acnp_bc_inout_id_l2fr, acnp_bc_inout_id_cx_int, & + acnp_bc_inout_id_emadcxdt, acnp_bc_inout_id_cx0, & + acnp_bc_inout_id_netdn, acnp_bc_inout_id_netdp, & + acnp_bc_out_id_cefflux, acnp_bc_out_id_nefflux, & + acnp_bc_out_id_pefflux, acnp_bc_out_id_limiter + + type(fates_cohort_type), intent(inout), target :: new_cohort + + select case(hlm_parteh_mode) + case (prt_carbon_allom_hyp) + + ! Register boundary conditions for the Carbon Only Allometric Hypothesis + + call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_dbh,bc_rval = new_cohort%dbh) + call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_netdc,bc_rval = new_cohort%npp_acc) + call new_cohort%prt%RegisterBCIn(ac_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) + call new_cohort%prt%RegisterBCIn(ac_bc_in_id_pft,bc_ival = new_cohort%pft) + call new_cohort%prt%RegisterBCIn(ac_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) + call new_cohort%prt%RegisterBCIn(ac_bc_in_id_lstat,bc_ival = new_cohort%status_coh) + + case (prt_cnp_flex_allom_hyp) + + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pft,bc_ival = new_cohort%pft) + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_lstat,bc_ival = new_cohort%status_coh) + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval = new_cohort%npp_acc) + + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_nc_repro,bc_rval = new_cohort%nc_repro) + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pc_repro,bc_rval = new_cohort%pc_repro) + call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) + + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_dbh,bc_rval = new_cohort%dbh) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess,bc_rval = new_cohort%resp_excess) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr,bc_rval = new_cohort%l2fr) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int,bc_rval = new_cohort%cx_int) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt,bc_rval = new_cohort%ema_dcxdt) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx0,bc_rval = new_cohort%cx0) + + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval = new_cohort%daily_n_gain) + call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval = new_cohort%daily_p_gain) + + call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval = new_cohort%daily_c_efflux) + call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval = new_cohort%daily_n_efflux) + call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval = new_cohort%daily_p_efflux) + call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival = new_cohort%cnp_limiter) + + case DEFAULT + + write(fates_log(),*) 'You specified an unknown PRT module' + write(fates_log(),*) 'Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) + + end select + + + end subroutine InitPRTBoundaryConditions + + + subroutine nan_values(this) + ! + ! DESCRIPTION: + ! make all the cohort variables NaN or unset so they aren't used before defined + ! + + ! USES: + use FatesConstantsMod, only : fates_unset_int + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + + ! ARGUMENTS: + class(fates_cohort_type), intent(inout) :: this + + ! set pointers to null + this%taller => null() + this%shorter => null() + this%prt => null() + this%co_hydr => null() + nullify(this%taller) + nullify(this%shorter) + nullify(this%prt) + nullify(this%co_hydr) + + ! VEGETATION STRUCTURE + this%l2fr = nan + this%pft = fates_unset_int + this%n = nan + this%dbh = nan + this%coage = nan + this%hite = nan + this%indexnumber = fates_unset_int + this%canopy_layer = fates_unset_int + this%canopy_layer_yesterday = nan + this%crowndamage = fates_unset_int + this%g_sb_laweight = nan + this%canopy_trim = nan + this%leaf_cost = nan + this%excl_weight = nan + this%prom_weight = nan + this%nv = fates_unset_int + this%status_coh = fates_unset_int + this%c_area = nan + this%treelai = nan + this%treesai = nan + this%isnew = .false. + this%size_class = fates_unset_int + this%coage_class = fates_unset_int + this%size_by_pft_class = fates_unset_int + this%coage_by_pft_class = fates_unset_int + this%size_class_lasttimestep = fates_unset_int + + ! CARBON AND NUTRIENT FLUXES + this%gpp_tstep = nan + this%gpp_acc = nan + this%gpp_acc_hold = nan + this%npp_tstep = nan + this%npp_acc = nan + this%npp_acc_hold = nan + this%resp_tstep = nan + this%resp_acc = nan + this%resp_acc_hold = nan + this%c13disc_clm = nan + this%c13disc_acc = nan + this%vcmax25top = nan + this%jmax25top = nan + this%tpu25top = nan + this%kp25top = nan + this%year_net_uptake(:) = nan + this%ts_net_uptake(:) = nan + this%cnp_limiter = fates_unset_int + this%cx_int = nan + this%ema_dcxdt = nan + this%cx0 = nan + this%nc_repro = nan + this%pc_repro = nan + this%daily_nh4_uptake = nan + this%daily_no3_uptake = nan + this%sym_nfix_daily = nan + this%sym_nfix_tstep = nan + this%daily_n_gain = nan + this%daily_p_gain = nan + this%daily_c_efflux = nan + this%daily_n_efflux = nan + this%daily_p_efflux = nan + this%daily_n_demand = nan + this%daily_p_demand = nan + this%seed_prod = nan + + ! RESPIRATION COMPONENTS + this%rdark = nan + this%resp_g_tstep = nan + this%resp_m = nan + this%resp_m_unreduced = nan + this%resp_excess = nan + this%livestem_mr = nan + this%livecroot_mr = nan + this%froot_mr = nan + + ! DAMAGE + this%branch_frac = nan + + ! MORTALITY + this%dmort = nan + this%bmort = nan + this%cmort = nan + this%frmort = nan + this%smort = nan + this%asmort = nan + this%dgmort = nan + this%lmort_direct = nan + this%lmort_collateral = nan + this%lmort_infra = nan + this%l_degrad = nan + + ! GROWTH DERIVATIVES + this%dndt = nan + this%dhdt = nan + this%ddbhdt = nan + this%dbdeaddt = nan + + ! FIRE + this%fraction_crown_burned = nan + this%cambial_mort = nan + this%crownfire_mort = nan + this%fire_mort = nan + + end subroutine nan_values + + !:.........................................................................: + + subroutine zero_values(this) + ! + ! DESCRIPTION: + ! Zero variables that need to be accounted for if this cohort is altered + ! before they are defined. + ! + ! ARGUMENTS + class(fates_cohort_type), intent(inout) :: this + + !this%l2fr + !this%pft + !this%n + !this%dbh + !this%coage + !this%hite + !this%indexnumber + !this%canopy_layer + !this%canopy_layer_yesterday + !this%crowndamage + this%g_sb_laweight = 0._r8 + !this%canopy_trim + this%leaf_cost = 0._r8 + this%excl_weight = 0._r8 + this%prom_weight = 0._r8 + this%nv = 0 + this%status_coh = 0 + !this%c_area + !this%treelai + this%treesai = 0._r8 + this%size_class = 1 + this%coage_class = 1 + !this%size_by_pft_class + !this%coage_by_pft_class + this%size_class_lasttimestep = 0 + this%gpp_tstep = 0._r8 + this%gpp_acc = 0._r8 + this%gpp_acc_hold = 0._r8 + this%npp_tstep = 0._r8 + this%npp_acc = 0._r8 + this%npp_acc_hold = 0._r8 + this%resp_tstep = 0._r8 + this%resp_acc = 0._r8 + this%resp_acc_hold = 0._r8 + this%c13disc_clm = 0._r8 + this%c13disc_acc = 0._r8 + !this%vcmax25top + !this%jmax25top + !this%tpu25top + !this%kp25top + this%ts_net_uptake(:) = 0._r8 + this%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. + !this%cnp_limiter + !this%cx_int + !this%ema_dcxdt + !this%cx0 + !this%nc_repro + !this%pc_repro + this%daily_nh4_uptake = 0._r8 + this%daily_no3_uptake = 0._r8 + + ! fixation is also integrated over the course of the day and must be + ! zeroed upon creation and after plant resource allocation + this%sym_nfix_daily = 0._r8 + this%daily_n_gain = 0._r8 + this%daily_p_gain = 0._r8 + + ! daily nutrient fluxes are INTEGRATED over the course of the day. + ! These variables MUST be zerod upon creation AND after allocation. + ! These variables exist in carbon-only mode but are not used. + this%daily_c_efflux = 0._r8 + this%daily_n_efflux = 0._r8 + this%daily_p_efflux = 0._r8 + + ! initialize these as negative + this%daily_n_demand = -9._r8 + this%daily_p_demand = -9._r8 + this%seed_prod = 0._r8 + this%rdark = 0._r8 + this%resp_g_tstep = 0._r8 + this%resp_m = 0._r8 + this%resp_m_unreduced = 0._r8 + this%resp_excess = 0._r8 + this%livestem_mr = 0._r8 + this%livecroot_mr = 0._r8 + this%froot_mr = 0._r8 + !this%branch_frac + this%dmort = 0._r8 + this%lmort_direct = 0._r8 + this%lmort_collateral = 0._r8 + this%lmort_infra = 0._r8 + this%l_degrad = 0._r8 + this%fraction_crown_burned = 0._r8 + this%cambial_mort = 0._r8 + this%crownfire_mort = 0._r8 + this%fire_mort = 0._r8 + + end subroutine zero_values + + !:.........................................................................: + + function CanUpperUnder(this) result(can_position) + ! + ! DESCRIPTION: + ! This simple function is used to determine if a cohort's crown position + ! is in the upper portion (ie the canopy) or the understory. This + ! differentiation is only used for diagnostic purposes. Functionally, + ! the model uses the canopy layer position, which may have more than + ! two layers at any given time. Utlimately, every plant that is not in + ! the top layer (canopy), is considered understory. + ! + + ! ARGUMENTS: + class(fates_cohort_type) :: this ! current cohort of interest + integer :: can_position ! canopy position + + if (this%canopy_layer == 1)then + can_position = ican_upper + else + can_position = ican_ustory + end if + + end function CanUpperUnder + + !:.........................................................................: + + subroutine dump(this) + ! + ! DESCRIPTION: + ! Print out attributes of a cohort + ! + + ! ARGUMENTS: + class(fates_cohort_type), intent(in), target :: this + + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) ' Dumping Cohort Information ' + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) 'co%pft = ', this%pft + write(fates_log(),*) 'co%n = ', this%n + write(fates_log(),*) 'co%dbh = ', this%dbh + write(fates_log(),*) 'co%hite = ', this%hite + write(fates_log(),*) 'co%crowndamage = ', this%crowndamage + write(fates_log(),*) 'co%coage = ', this%coage + write(fates_log(),*) 'co%l2fr = ', this%l2fr + write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) + write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) + write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) + write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) + write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) + write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) + write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight + write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost + write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer + write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday + write(fates_log(),*) 'co%nv = ', this%nv + write(fates_log(),*) 'co%status_coh = ', this%status_coh + write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim + write(fates_log(),*) 'co%excl_weight = ', this%excl_weight + write(fates_log(),*) 'co%prom_weight = ', this%prom_weight + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'co%coage_class = ', this%coage_class + write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class + write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold + write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc + write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep + write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold + write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep + write(fates_log(),*) 'co%npp_acc = ', this%npp_acc + write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep + write(fates_log(),*) 'co%resp_acc = ', this%resp_acc + write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold + write(fates_log(),*) 'co%rdark = ', this%rdark + write(fates_log(),*) 'co%resp_m = ', this%resp_m + write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep + write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr + write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr + write(fates_log(),*) 'co%froot_mr = ', this%froot_mr + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%treelai = ', this%treelai + write(fates_log(),*) 'co%treesai = ', this%treesai + write(fates_log(),*) 'co%c_area = ', this%c_area + write(fates_log(),*) 'co%cmort = ', this%cmort + write(fates_log(),*) 'co%bmort = ', this%bmort + write(fates_log(),*) 'co%smort = ', this%smort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%hmort = ', this%hmort + write(fates_log(),*) 'co%frmort = ', this%frmort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct + write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral + write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra + write(fates_log(),*) 'co%isnew = ', this%isnew + write(fates_log(),*) 'co%dndt = ', this%dndt + write(fates_log(),*) 'co%dhdt = ', this%dhdt + write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt + write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt + write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned + write(fates_log(),*) 'co%fire_mort = ', this%fire_mort + write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort + write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + + if (associated(this%co_hydr)) call dump_cohort_hydr(this) + + write(fates_log(),*) '----------------------------------------' + + return + +end subroutine dump + +!:...........................................................................: + subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) ! ---------------------------------------------------------------------------------- diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 deleted file mode 100644 index 5d1ffa89a7..0000000000 --- a/main/FatesCohortMod.F90 +++ /dev/null @@ -1,624 +0,0 @@ -module FatesCohortMod - - use FatesConstantsMod, only : r8 => fates_r8 - use FatesGlobals, only : fates_log - use PRTGenericMod, only : prt_vartypes - use FatesHydraulicsMemMod, only : ed_cohort_hydr_type - use FatesInterfaceTypesMod, only : hlm_parteh_mode - - implicit none - private - - ! PARAMETERS - - ! parameters that govern the VAI (LAI+SAI) bins used in radiative transfer code - integer, parameter, public :: nlevleaf = 30 ! number of leaf+stem layers in each canopy layer - - integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy - integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers - ! (all layers that are not the top canopy layer) - - type, public :: fates_cohort_type - - ! POINTERS - type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort - type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort - - !:.........................................................................: - - ! Multi-species, multi-organ Plant Reactive Transport (PRT) - ! Contains carbon and nutrient state variables for various plant organs - class(prt_vartypes), pointer :: prt - real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant - ! in carbon only simulationss, and is set by the - ! allom_l2fr_min parameter. In nutrient - ! enabled simulations, this is dynamic, will - ! vary between allom_l2fr_min and allom_l2fr_max - ! parameters, with a tendency driven by - ! nutrient storage) [kg root / kg leaf] - - !:.........................................................................: - - ! VEGETATION STRUCTURE - - integer :: pft ! pft index - real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) [/m2] - real(r8) :: dbh ! diameter at breast height [cm] - real(r8) :: coage ! age [years] - real(r8) :: hite ! height [m] - integer :: indexnumber ! unique number for each cohort (within clump?) - integer :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] - real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort [1 = canopy, 2 = understorey, etc.] - ! real to be conservative during fusion - integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] - real(r8) :: g_sb_laweight ! total conductance (stomata + boundary layer) of the cohort - ! weighted by its leaf area [m/s]*[m2] - real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] - real(r8) :: leaf_cost ! how much does it cost to maintain leaves [kgC/m2/year] - real(r8) :: excl_weight ! how much of this cohort is demoted each year, as a proportion of all cohorts - real(r8) :: prom_weight ! how much of this cohort is promoted each year, as a proportion of all cohorts - integer :: nv ! number of leaf layers - integer :: status_coh ! growth status of plant [2 = leaves on , 1 = leaves off] - real(r8) :: c_area ! areal extent of canopy [m2] - real(r8) :: treelai ! lai of an individual within cohort leaf area [m2 leaf area/m2 crown area] - real(r8) :: treesai ! stem area index of an individual within cohort [m2 stem area/m2 crown area] - logical :: isnew ! flag to signify a new cohort - new cohorts have not experienced - ! npp or mortality and should therefore not be fused or averaged - integer :: size_class ! index that indicates which diameter size bin the cohort currently resides in - ! this is used for history output. We maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_class ! index that indicates which age bin the cohort currently resides in - ! (used for history output) - integer :: size_by_pft_class ! index that indicates the cohorts position of the joint size-class x functional - ! type classification. We also maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT - integer :: size_class_lasttimestep ! size class of the cohort at the last time step - - !:.........................................................................: - - ! CARBON AND NUTRIENT FLUXES - - ! -------------------------------------------------------------------------- - ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types* - ! - ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics - ! time-step (ie photosynthesis, sub-hourly) [kgC/indiv/timestep] - ! _acc: The accumulation of the _tstep variable from the beginning to ending of - ! the dynamics time-scale. This variable is zero'd during initialization and - ! after the dynamics call-sequence is completed. [kgC/indiv/day] - ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, - ! _acc_hold "holds" the integrated value until the next time dynamics is - ! called. This is necessary for restarts. This variable also has units - ! converted to a useful rate [kgC/indiv/yr] - ! -------------------------------------------------------------------------- - - real(r8) :: gpp_tstep ! Gross Primary Production (see above *) - real(r8) :: gpp_acc - real(r8) :: gpp_acc_hold - - real(r8) :: npp_tstep ! Net Primary Production (see above *) - real(r8) :: npp_acc - real(r8) :: npp_acc_hold - - real(r8) :: resp_tstep ! Autotrophic respiration (see above *) - real(r8) :: resp_acc - real(r8) :: resp_acc_hold - - real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon at each indiv/timestep [ppm] - real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon at each indiv/day - ! at the end of a day [ppm] - - ! The following four biophysical rates are assumed to be at the canopy top, at reference temp 25degC, - ! and based on the leaf age weighted average of the PFT parameterized values. - ! The last condition is why it is dynamic and tied to the cohort - - real(r8) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] - real(r8) :: jmax25top ! maximum electron transport rate at canopy top and 25degC [umol electrons/m2/s] - real(r8) :: tpu25top ! triose phosphate utilization rate at canopy top and 25degC [umol CO2/m2/s] - real(r8) :: kp25top ! initial slope of CO2 response curve (C4 plants) at 25C - - real(r8) :: ts_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/timestep] - real(r8) :: year_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/year] - - ! used for CNP - integer :: cnp_limiter ! which element is limiting growth [0 = none, 1 = C, 2 = N, 3 = P] - real(r8) :: cx_int ! time integration of the log of the relative carbon storage over relative nutrient - real(r8) :: ema_dcxdt ! derivative of the log of the relative carbon storage over relative nutrient - real(r8) :: cx0 ! value on the previous time-step of log of the relative carbon storage over - ! relative nutrient - real(r8) :: nc_repro ! N:C ratio of a new recruit, used also for defining reproductive stoich - real(r8) :: pc_repro ! P:C ratio of a new recruit - - ! Nutrient Fluxes (if N, P, etc. are turned on) - real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition - ! in soil [kgN/plant/day] - real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition - ! in soil [kgN/plant/day] - - real(r8) :: sym_nfix_daily ! accumulated symbiotic N fixation from the roots [kgN/indiv/day] - real(r8) :: sym_nfix_tstep ! symbiotic N fixation from the roots for the time-step [kgN/indiv/timestep] - - real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized NH4/NO3 in solution as well as - ! symbiotic fixation - real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition - ! in soil [kgP/plant/day] - - real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kgC/plant/day] - real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kgN/plant/day] - real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kgP/plant/day] - - real(r8) :: daily_n_demand ! daily amount of N demanded by the plant [kgN/plant/day] - real(r8) :: daily_p_demand ! daily amount of P demanded by the plant [kgN/plant/day] - - real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] - - !:.........................................................................: - - ! RESPIRATION COMPONENTS - real(r8) :: rdark ! dark respiration [kgC/indiv/s] - real(r8) :: resp_g_tstep ! growth respiration [kgC/indiv/timestep] - real(r8) :: resp_m ! maintenance respiration [kgC/indiv/timestep] - real(r8) :: resp_m_unreduced ! diagnostic-only unreduced maintenance respiration [kgC/indiv/timestep] - real(r8) :: resp_excess ! respiration of excess carbon [kgC/indiv/day] - real(r8) :: livestem_mr ! aboveground live stem maintenance respiration [kgC/indiv/s] - real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] - real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] - - !:.........................................................................: - - ! DAMAGE - real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] - - !:.........................................................................: - - ! MORTALITY - real(r8) :: dmort ! proportional mortality rate [/year] - - ! Mortality Rate Partitions - real(r8) :: bmort ! background mortality rate [indiv/year] - real(r8) :: cmort ! carbon starvation mortality rate [indiv/year] - real(r8) :: hmort ! hydraulic failure mortality rate [indiv/year] - real(r8) :: frmort ! freezing mortality rate [indiv/year] - real(r8) :: smort ! senesence mortality [indiv/year] - real(r8) :: asmort ! age senescence mortality [indiv/year] - real(r8) :: dgmort ! damage mortality [indiv/year] - - ! Logging Mortality Rate - ! Yi Xu & M. Huang - real(r8) :: lmort_direct ! directly logging rate [fraction/logging activity] - real(r8) :: lmort_collateral ! collaterally damaged rate [fraction/logging activity] - real(r8) :: lmort_infra ! mechanically damaged rate [fraction/logging activity] - real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation - ! (i.e. they are moved to newly-anthro-disturbed secondary - ! forest patch) [fraction/logging activity] - - !:.........................................................................: - - ! NITROGEN POOLS - ! -------------------------------------------------------------------------- - ! Nitrogen pools are not prognostic in the current implementation. - ! They are diagnosed during photosynthesis using a simple C2N parameter. - ! Local values are used in that routine. - ! -------------------------------------------------------------------------- - - !:.........................................................................: - - ! GROWTH DERIVIATIVES - real(r8) :: dndt ! time derivative of cohort size [n/year] - real(r8) :: dhdt ! time derivative of height [m/year] - real(r8) :: ddbhdt ! time derivative of dbh [cm/year] - real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] - - !:.........................................................................: - - ! FIRE - real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] - real(r8) :: cambial_mort ! probability that trees dies due to cambial charring [0-1] - ! (conditional on the tree being subjected to the fire) - real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1] - ! (conditional on the tree being subjected to the fire) - real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] - - !:.........................................................................: - - ! HYDRAULICS - type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 - - !:.........................................................................: - - contains - - procedure :: init - procedure :: dump - procedure :: nan_values - procedure :: zero_values - procedure :: CanUpperUnder - - end type fates_cohort_type - - !:...........................................................................: - - contains - - subroutine init(this, prt) - ! - ! DESCRIPTION: - ! Create new cohort and set default values for all variables - ! - - ! ARGUMENTS: - type(fates_cohort_type), intent(inout), target :: this - class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object - - call this%nan_cohort() ! make everything in the cohort not-a-number - call this%zero_cohort() ! zero things that need to be zeroed - - ! point to the PARTEH object - this%prt => prt - - ! The PARTEH cohort object should be allocated and already - ! initialized in this routine. - call this%prt%CheckInitialConditions() - - call this%InitPRTBoundaryConditions() - - ! new cohorts do not have mortality rates, nor have they moved any - ! carbon when they are created. They will bias our statistics - ! until they have experienced a full day. We need a newly recruited flag. - ! This flag will be set to false after it has experienced - ! growth, disturbance and mortality. - this%isnew = .true. - - end subroutine init - - !:.........................................................................: - - subroutine nan_values(this) - ! - ! DESCRIPTION: - ! make all the cohort variables NaN or unset so they aren't used before defined - ! - - ! USES: - use FatesConstantsMod, only : fates_unset_int - use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) - - ! ARGUMENTS: - type(fates_cohort_type), intent(inout) :: this - - ! set pointers to null - this%taller => null() - this%shorter => null() - this%prt => null() - this%co_hydr => null() - nullify(this%taller) - nullify(this%shorter) - nullify(this%prt) - nullify(this%co_hydr) - - ! VEGETATION STRUCTURE - this%l2fr = nan - this%pft = fates_unset_int - this%n = nan - this%dbh = nan - this%coage = nan - this%hite = nan - this%indexnumber = fates_unset_int - this%canopy_layer = fates_unset_int - this%canopy_layer_yesterday = nan - this%crowndamage = fates_unset_int - this%g_sb_laweight = nan - this%canopy_trim = nan - this%leaf_cost = nan - this%excl_weight = nan - this%prom_weight = nan - this%nv = fates_unset_int - this%status_coh = fates_unset_int - this%c_area = nan - this%treelai = nan - this%treesai = nan - this%isnew = .false. - this%size_class = fates_unset_int - this%coage_class = fates_unset_int - this%size_by_pft_class = fates_unset_int - this%coage_by_pft_class = fates_unset_int - this%size_class_lasttimestep = fates_unset_int - - ! CARBON AND NUTRIENT FLUXES - this%gpp_tstep = nan - this%gpp_acc = nan - this%gpp_acc_hold = nan - this%npp_tstep = nan - this%npp_acc = nan - this%npp_acc_hold = nan - this%resp_tstep = nan - this%resp_acc = nan - this%resp_acc_hold = nan - this%c13disc_clm = nan - this%c13disc_acc = nan - this%vcmax25top = nan - this%jmax25top = nan - this%tpu25top = nan - this%kp25top = nan - this%year_net_uptake(:) = nan - this%ts_net_uptake(:) = nan - this%cnp_limiter = fates_unset_int - this%cx_int = nan - this%ema_dcxdt = nan - this%cx0 = nan - this%nc_repro = nan - this%pc_repro = nan - this%daily_nh4_uptake = nan - this%daily_no3_uptake = nan - this%sym_nfix_daily = nan - this%sym_nfix_tstep = nan - this%daily_n_gain = nan - this%daily_p_gain = nan - this%daily_c_efflux = nan - this%daily_n_efflux = nan - this%daily_p_efflux = nan - this%daily_n_demand = nan - this%daily_p_demand = nan - this%seed_prod = nan - - ! RESPIRATION COMPONENTS - this%rdark = nan - this%resp_g_tstep = nan - this%resp_m = nan - this%resp_m_unreduced = nan - this%resp_excess = nan - this%livestem_mr = nan - this%livecroot_mr = nan - this%froot_mr = nan - - ! DAMAGE - this%branch_frac = nan - - ! MORTALITY - this%dmort = nan - this%bmort = nan - this%cmort = nan - this%frmort = nan - this%smort = nan - this%asmort = nan - this%dgmort = nan - this%lmort_direct = nan - this%lmort_collateral = nan - this%lmort_infra = nan - this%l_degrad = nan - - ! GROWTH DERIVATIVES - this%dndt = nan - this%dhdt = nan - this%ddbhdt = nan - this%dbdeaddt = nan - - ! FIRE - this%fraction_crown_burned = nan - this%cambial_mort = nan - this%crownfire_mort = nan - this%fire_mort = nan - - end subroutine nan_values - - !:.........................................................................: - - subroutine zero_cohort(this) - ! - ! DESCRIPTION: - ! Zero variables that need to be accounted for if this cohort is altered - ! before they are defined. - ! - ! ARGUMENTS - type (fates_cohort_type), intent(inout) :: this - - !this%l2fr - !this%pft - !this%n - !this%dbh - !this%coage - !this%hite - !this%indexnumber - !this%canopy_layer - !this%canopy_layer_yesterday - !this%crowndamage - this%g_sb_laweight = 0._r8 - !this%canopy_trim - this%leaf_cost = 0._r8 - this%excl_weight = 0._r8 - this%prom_weight = 0._r8 - this%nv = 0 - this%status_coh = 0 - !this%c_area - !this%treelai - this%treesai = 0._r8 - this%size_class = 1 - this%coage_class = 1 - !this%size_by_pft_class - !this%coage_by_pft_class - this%size_class_lasttimestep = 0 - this%gpp_tstep = 0._r8 - this%gpp_acc = 0._r8 - this%gpp_acc_hold = 0._r8 - this%npp_tstep = 0._r8 - this%npp_acc = 0._r8 - this%npp_acc_hold = 0._r8 - this%resp_tstep = 0._r8 - this%resp_acc = 0._r8 - this%resp_acc_hold = 0._r8 - this%c13disc_clm = 0._r8 - this%c13disc_acc = 0._r8 - !this%vcmax25top - !this%jmax25top - !this%tpu25top - !this%kp25top - this%ts_net_uptake(:) = 0._r8 - this%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. - !this%cnp_limiter - !this%cx_int - !this%ema_dcxdt - !this%cx0 - !this%nc_repro - !this%pc_repro - this%daily_nh4_uptake = 0._r8 - this%daily_no3_uptake = 0._r8 - - ! fixation is also integrated over the course of the day and must be - ! zeroed upon creation and after plant resource allocation - this%sym_nfix_daily = 0._r8 - !this%daily_n_gain - this%daily_p_gain = 0._r8 - - ! daily nutrient fluxes are INTEGRATED over the course of the day. - ! These variables MUST be zerod upon creation AND after allocation. - ! These variables exist in carbon-only mode but are not used. - this%daily_c_efflux = 0._r8 - this%daily_n_efflux = 0._r8 - this%daily_p_efflux = 0._r8 - - ! initialize these as negative - this%daily_n_demand = -9._r8 - this%daily_p_demand = -9._r8 - this%seed_prod = 0._r8 - this%rdark = 0._r8 - this%resp_g_tstep = 0._r8 - this%resp_m = 0._r8 - this%resp_m_unreduced = 0._r8 - this%resp_excess = 0._r8 - this%livestem_mr = 0._r8 - this%livecroot_mr = 0._r8 - this%froot_mr = 0._r8 - !this%branch_frac - this%dmort = 0._r8 - this%lmort_direct = 0._r8 - this%lmort_collateral = 0._r8 - this%lmort_infra = 0._r8 - this%l_degrad = 0._r8 - this%fraction_crown_burned = 0._r8 - this%cambial_mort = 0._r8 - this%crownfire_mort = 0._r8 - this%fire_mort = 0._r8 - - end subroutine zero_cohort - - !:.........................................................................: - - function CanUpperUnder(this) result(can_position) - ! - ! DESCRIPTION: - ! This simple function is used to determine if a cohort's crown position - ! is in the upper portion (ie the canopy) or the understory. This - ! differentiation is only used for diagnostic purposes. Functionally, - ! the model uses the canopy layer position, which may have more than - ! two layers at any given time. Utlimately, every plant that is not in - ! the top layer (canopy), is considered understory. - ! - - ! ARGUMENTS: - type(fates_cohort_type) :: this ! current cohort of interest - integer :: can_position ! canopy position - - if (this%canopy_layer == 1)then - can_position = ican_upper - else - can_position = ican_ustory - end if - - end function CanUpperUnder - - !:.........................................................................: - - subroutine dump(this) - ! - ! DESCRIPTION: - ! Print out attributes of a cohort - ! - - ! ARGUMENTS: - type(fates_cohort_type), intent(in), target :: this - - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) ' Dumping Cohort Information ' - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'co%pft = ', this%pft - write(fates_log(),*) 'co%n = ', this%n - write(fates_log(),*) 'co%dbh = ', this%dbh - write(fates_log(),*) 'co%hite = ', this%hite - write(fates_log(),*) 'co%crowndamage = ', this%crowndamage - write(fates_log(),*) 'co%coage = ', this%coage - write(fates_log(),*) 'co%l2fr = ', this%l2fr - write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) - write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) - write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) - write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) - write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) - write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) - write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight - write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost - write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer - write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday - write(fates_log(),*) 'co%nv = ', this%nv - write(fates_log(),*) 'co%status_coh = ', this%status_coh - write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim - write(fates_log(),*) 'co%excl_weight = ', this%excl_weight - write(fates_log(),*) 'co%prom_weight = ', this%prom_weight - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class - write(fates_log(),*) 'co%coage_class = ', this%coage_class - write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class - write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold - write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc - write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep - write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold - write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep - write(fates_log(),*) 'co%npp_acc = ', this%npp_acc - write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep - write(fates_log(),*) 'co%resp_acc = ', this%resp_acc - write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold - write(fates_log(),*) 'co%rdark = ', this%rdark - write(fates_log(),*) 'co%resp_m = ', this%resp_m - write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep - write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr - write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr - write(fates_log(),*) 'co%froot_mr = ', this%froot_mr - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%treelai = ', this%treelai - write(fates_log(),*) 'co%treesai = ', this%treesai - write(fates_log(),*) 'co%c_area = ', this%c_area - write(fates_log(),*) 'co%cmort = ', this%cmort - write(fates_log(),*) 'co%bmort = ', this%bmort - write(fates_log(),*) 'co%smort = ', this%smort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%hmort = ', this%hmort - write(fates_log(),*) 'co%frmort = ', this%frmort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct - write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral - write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra - write(fates_log(),*) 'co%isnew = ', this%isnew - write(fates_log(),*) 'co%dndt = ', this%dndt - write(fates_log(),*) 'co%dhdt = ', this%dhdt - write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt - write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt - write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned - write(fates_log(),*) 'co%fire_mort = ', this%fire_mort - write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort - write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class - - if (associated(this%co_hydr)) call dump_cohort_hydr(this) - - write(fates_log(),*) '----------------------------------------' - - return - - end subroutine dump - - !:...........................................................................: - -end module FatesCohortMod \ No newline at end of file diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index cf66408133..f984ed8365 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -19,7 +19,7 @@ module FatesHistoryInterfaceMod use PRTGenericMod , only : prt_cnp_flex_allom_hyp use EDTypesMod , only : site_fluxdiags_type use EDtypesMod , only : ed_site_type - use EDtypesMod , only : ed_cohort_type + use EDtypesMod , only : fates_cohort_type use EDtypesMod , only : ed_patch_type use EDtypesMod , only : AREA use EDtypesMod , only : AREA_INV @@ -1919,7 +1919,7 @@ subroutine update_history_nutrflux(this,csite) type(ed_site_type), intent(in) :: csite type(ed_patch_type), pointer :: cpatch - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort integer :: iclscpf ! layer x size x pft class index integer :: iscpf ! Size x pft class index integer :: io_si ! site's global index in the history vector @@ -2205,7 +2205,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: return_code type(ed_patch_type),pointer :: cpatch - type(ed_cohort_type),pointer :: ccohort + type(fates_cohort_type),pointer :: ccohort real(r8), parameter :: reallytalltrees = 1000. ! some large number (m) @@ -4363,7 +4363,7 @@ subroutine update_history_hifrq(this,nc,nsites,sites,bc_in,dt_tstep) integer :: ipa2 ! patch incrementer integer :: cnlfpft_indx, cnlf_indx, ipft, ican, ileaf ! more iterators and indices type(ed_patch_type),pointer :: cpatch - type(ed_cohort_type),pointer :: ccohort + type(fates_cohort_type),pointer :: ccohort real(r8) :: per_dt_tstep ! Time step in frequency units (/s) associate( hio_gpp_si => this%hvars(ih_gpp_si)%r81d, & @@ -4855,7 +4855,7 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,bc_in,dt_tstep) real(r8) :: depth_frac ! fraction of rhizosphere layer depth occupied by current soil layer character(2) :: fmt_char type(ed_patch_type),pointer :: cpatch - type(ed_cohort_type),pointer :: ccohort + type(fates_cohort_type),pointer :: ccohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: site_hydr real(r8) :: per_dt_tstep ! Time step in frequency units (/s) diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index 4fc365ce62..f922b4ee36 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -19,18 +19,18 @@ module FatesInterfaceMod use EDParamsMod , only : maxpatch_primary use EDParamsMod , only : maxpatch_secondary use EDParamsMod , only : max_cohort_per_patch - use EDTypesMod , only : maxSWb - use EDTypesMod , only : ivis - use EDTypesMod , only : inir - use EDTypesMod , only : nclmax - use EDTypesMod , only : nlevleaf + use EDParamsMod , only : maxSWb + use EDParamsMod , only : ivis + use EDParamsMod , only : inir + use EDParamsMod , only : nclmax + use EDParamsMod , only : nlevleaf use EDTypesMod , only : maxpft use EDTypesMod , only : do_fates_salinity use EDTypesMod , only : numWaterMem use EDTypesMod , only : numlevsoil_max use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : area_inv use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : itrue,ifalse @@ -57,8 +57,8 @@ module FatesInterfaceMod use EDParamsMod , only : ED_val_history_height_bin_edges use EDParamsMod , only : ED_val_history_coageclass_bin_edges use CLMFatesParamInterfaceMod , only : FatesReadParameters - use EDTypesMod , only : p_uptake_mode - use EDTypesMod , only : n_uptake_mode + use EDParamsMod , only : p_uptake_mode + use EDParamsMod , only : n_uptake_mode use EDTypesMod , only : ed_site_type use FatesConstantsMod , only : prescribed_p_uptake use FatesConstantsMod , only : prescribed_n_uptake @@ -1943,7 +1943,7 @@ subroutine UpdateFatesRMeansTStep(sites,bc_in) type(bc_in_type), intent(in) :: bc_in(:) type(ed_patch_type), pointer :: cpatch - type(ed_cohort_type), pointer :: ccohort + type(fates_cohort_type), pointer :: ccohort integer :: s, ifp, io_si do s = 1,size(sites,dim=1) diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 58156dd3fb..7cfe9d84e1 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -34,7 +34,7 @@ module FatesInventoryInitMod use FatesLitterMod , only : litter_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : ed_cohort_type + use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : area use EDTypesMod , only : leaves_on use EDTypesMod , only : leaves_off @@ -125,7 +125,7 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) ! Locals type(ed_site_type), pointer :: currentSite type(ed_patch_type), pointer :: currentpatch - type(ed_cohort_type), pointer :: currentcohort + type(fates_cohort_type), pointer :: currentcohort type(ed_patch_type), pointer :: newpatch type(ed_patch_type), pointer :: olderpatch type(ed_patch_type), pointer :: head_of_unsorted_patch_list @@ -904,7 +904,7 @@ subroutine set_inventory_edcohort_type1(csite,bc_in,css_file_unit,npatches, & integer,parameter :: rstatus = 0 ! recruit status type(ed_patch_type), pointer :: cpatch ! current patch pointer - type(ed_cohort_type), pointer :: temp_cohort ! temporary patch (needed for allom funcs) + type(fates_cohort_type), pointer :: temp_cohort ! temporary patch (needed for allom funcs) integer :: ipa ! patch idex integer :: iage integer :: el @@ -1193,7 +1193,7 @@ subroutine write_inventory_type1(currentSite) ! Locals type(ed_patch_type), pointer :: currentpatch - type(ed_cohort_type), pointer :: currentcohort + type(fates_cohort_type), pointer :: currentcohort character(len=128) :: pss_name_out ! output file string character(len=128) :: css_name_out ! output file string diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 4efe053627..beb3215dfa 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -1812,10 +1812,10 @@ subroutine set_restart_vectors(this,nc,nsites,sites) use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use FatesInterfaceTypesMod, only : numpft use EDTypesMod, only : ed_site_type - use EDTypesMod, only : ed_cohort_type + use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type - use EDTypesMod, only : maxSWb - use EDTypesMod, only : nclmax + use EDParamsMod, only : maxSWb + use EDParamsMod, only : nclmax use EDTypesMod, only : numWaterMem use EDTypesMod, only : num_vegtemp_mem use FatesInterfaceTypesMod, only : nlevdamage @@ -1885,7 +1885,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) type(fates_restart_variable_type) :: rvar type(ed_patch_type),pointer :: cpatch - type(ed_cohort_type),pointer :: ccohort + type(fates_cohort_type),pointer :: ccohort associate( rio_npatch_si => this%rvars(ir_npatch_si)%int1d, & @@ -2508,7 +2508,7 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) ! --------------------------------------------------------------------------------- use EDTypesMod, only : ed_site_type - use EDTypesMod, only : ed_cohort_type + use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type use EDTypesMod, only : maxSWb use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch @@ -2534,8 +2534,8 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) ! local variables type(ed_patch_type) , pointer :: newp - type(ed_cohort_type), pointer :: new_cohort - type(ed_cohort_type), pointer :: prev_cohort + type(fates_cohort_type), pointer :: new_cohort + type(fates_cohort_type), pointer :: prev_cohort integer :: cohortstatus integer :: s ! site index integer :: idx_pa ! local patch index @@ -2708,7 +2708,7 @@ end subroutine create_patchcohort_structure subroutine get_restart_vectors(this, nc, nsites, sites) use EDTypesMod, only : ed_site_type - use EDTypesMod, only : ed_cohort_type + use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type use EDTypesMod, only : maxSWb use EDTypesMod, only : nclmax @@ -2729,7 +2729,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) ! ---------------------------------------------------------------------------------- ! LL pointers type(ed_patch_type),pointer :: cpatch ! current patch - type(ed_cohort_type),pointer :: ccohort ! current cohort + type(fates_cohort_type),pointer :: ccohort ! current cohort type(litter_type), pointer :: litt ! litter object on the current patch ! loop indices integer :: s, i, j, k diff --git a/main/FatesSizeAgeTypeIndicesMod.F90 b/main/FatesSizeAgeTypeIndicesMod.F90 index 75eef6b6ad..7945bef035 100644 --- a/main/FatesSizeAgeTypeIndicesMod.F90 +++ b/main/FatesSizeAgeTypeIndicesMod.F90 @@ -6,7 +6,7 @@ module FatesSizeAgeTypeIndicesMod use FatesInterfaceTypesMod, only : nlevage use FatesInterfaceTypesMod, only : nlevheight use FatesInterfaceTypesMod, only : nlevcoage - use EDTypesMod, only : nclmax + use EDParamsMod, only : nclmax use FatesInterfaceTypesMod, only : nlevdamage use EDParamsMod, only : ED_val_history_sizeclass_bin_edges use EDParamsMod, only : ED_val_history_ageclass_bin_edges diff --git a/parteh/PRTAllometricCNPMod.F90 b/parteh/PRTAllometricCNPMod.F90 index 0f4b29b4b6..03acfd8a77 100644 --- a/parteh/PRTAllometricCNPMod.F90 +++ b/parteh/PRTAllometricCNPMod.F90 @@ -56,9 +56,8 @@ module PRTAllometricCNPMod use FatesConstantsMod , only : fates_unset_int use FatesConstantsMod , only : sec_per_day use PRTParametersMod , only : prt_params - use EDTypesMod , only : leaves_on,leaves_off - use EDTypesMod , only : p_uptake_mode - use EDTypesMod , only : n_uptake_mode + use FatesConstantsMod , only : leaves_on, leaves_off + use EDParamsMod , only : p_uptake_mode, n_uptake_mode use FatesConstantsMod , only : prescribed_p_uptake use FatesConstantsMod , only : prescribed_n_uptake use EDPftvarcon, only : EDPftvarcon_inst @@ -2438,6 +2437,4 @@ subroutine EstimateGrowthNC(this,target_c,target_dcdd,state_mask,avg_nc,avg_pc) return end subroutine EstimateGrowthNC - - end module PRTAllometricCNPMod diff --git a/parteh/PRTAllometricCarbonMod.F90 b/parteh/PRTAllometricCarbonMod.F90 index 9f34e39e9c..a52f69d8ee 100644 --- a/parteh/PRTAllometricCarbonMod.F90 +++ b/parteh/PRTAllometricCarbonMod.F90 @@ -1140,6 +1140,6 @@ subroutine FastPRTAllometricCarbon(this) return end subroutine FastPRTAllometricCarbon - + end module PRTAllometricCarbonMod From 6799bd1d23e8a5d1b4fcc414cba995f40b53c273 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 5 Apr 2023 14:19:59 -0600 Subject: [PATCH 016/125] more refactoring --- biogeochem/EDCanopyStructureMod.F90 | 9 ++--- biogeochem/EDCohortDynamicsMod.F90 | 35 +++++++++---------- biogeochem/EDMortalityFunctionsMod.F90 | 28 ++++++++++----- biogeochem/EDPatchDynamicsMod.F90 | 25 +++++++------ biogeochem/EDPhysiologyMod.F90 | 15 ++++---- biogeophys/FatesPlantHydraulicsMod.F90 | 10 +++--- biogeophys/FatesPlantRespPhotosynthMod.F90 | 8 ++--- .../parteh/f90src/FatesCohortWrapMod.F90 | 2 +- main/EDInitMod.F90 | 7 ++-- main/EDMainMod.F90 | 13 ++++--- main/EDTypesMod.F90 | 2 +- main/FatesHistoryInterfaceMod.F90 | 8 ++--- main/FatesInterfaceMod.F90 | 10 +++--- main/FatesInventoryInitMod.F90 | 3 +- main/FatesRestartInterfaceMod.F90 | 20 +++++------ 15 files changed, 105 insertions(+), 90 deletions(-) diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 692ffee47a..0c8178e4f3 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -17,7 +17,7 @@ module EDCanopyStructureMod use FatesAllometryMod , only : carea_allom use EDCohortDynamicsMod , only : copy_cohort, terminate_cohorts, terminate_cohort, fuse_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDCohortDynamicsMod , only : InitPRTBoundaryConditions + use EDTypesMod , only : InitPRTBoundaryConditions use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai use EDtypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type @@ -1499,7 +1499,8 @@ subroutine leaf_area_profile( currentSite ) ! !USES: - use EDtypesMod , only : area, dinc_vai, dlower_vai, hitemax, n_hite_bins + use EDtypesMod , only : area, hitemax, n_hite_bins + use EDParamsMod, only : dinc_vai, dlower_vai ! ! !ARGUMENTS @@ -2126,7 +2127,7 @@ subroutine UpdatePatchLAI(currentPatch) ! --------------------------------------------------------------------------------------------- ! Uses - use EDtypesMod, only : dlower_vai + use EDParamsMod, only : dlower_vai ! Arguments type(ed_patch_type),intent(inout), target :: currentPatch @@ -2175,7 +2176,7 @@ subroutine UpdateCohortLAI(currentCohort, canopy_layer_tlai, total_canopy_area) ! Update LAI and related variables for a given cohort ! Uses - use EDtypesMod, only : dlower_vai + use EDParamsMod, only : dlower_vai ! Arguments type(fates_cohort_type),intent(inout), target :: currentCohort diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 3d6296b6a7..f5b5bbe0a1 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -28,6 +28,7 @@ Module EDCohortDynamicsMod use FatesParameterDerivedMod, only : param_derived use EDTypesMod , only : ed_site_type, ed_patch_type use EDTypesMod , only : fates_cohort_type + use EDTypesMod , only : InitPRTBoundaryConditions use EDParamsMod , only : nclmax use PRTGenericMod , only : element_list use PRTGenericMod , only : StorageNutrientTarget @@ -38,12 +39,12 @@ Module EDCohortDynamicsMod use EDTypesMod , only : AREA use EDTypesMod , only : min_npm2, min_nppatch use EDTypesMod , only : min_n_safemath - use EDTypesMod , only : nlevleaf + use EDParamsMod , only : nlevleaf use PRTGenericMod , only : max_nleafage use EDTypesMod , only : ican_upper use EDTypesMod , only : site_fluxdiags_type use PRTGenericMod , only : num_elements - use EDTypesMod , only : leaves_on + use FatesConstantsMod , only : leaves_on use EDParamsMod , only : ED_val_cohort_age_fusion_tol use FatesInterfaceTypesMod , only : hlm_use_planthydro use FatesInterfaceTypesMod , only : hlm_parteh_mode @@ -116,7 +117,6 @@ Module EDCohortDynamicsMod private ! public :: create_cohort - public :: zero_cohort public :: terminate_cohorts public :: terminate_cohort public :: fuse_cohorts @@ -125,7 +125,6 @@ Module EDCohortDynamicsMod public :: copy_cohort public :: count_cohorts public :: InitPRTObject - public :: InitPRTBoundaryConditions public :: SendCohortToLitter public :: UpdateCohortBioPhysRates public :: DeallocateCohort @@ -200,6 +199,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & type(fates_cohort_type), pointer :: storebigcohort integer :: iage ! loop counter for leaf age classes real(r8) :: leaf_c ! total leaf carbon +real(r8) :: rmean_temp ! running mean temperature integer :: tnull,snull ! are the tallest and shortest cohorts allocate integer :: nlevrhiz ! number of rhizosphere layers @@ -207,7 +207,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & allocate(new_cohort) -new_cohort%init(prt) +call new_cohort%init(prt) !**********************/ ! Define cohort state variable @@ -215,9 +215,6 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & new_cohort%indexnumber = fates_unset_int ! Cohort indexing was not thread-safe, setting ! bogus value for the time being (RGK-012017) - -new_cohort%patchptr => patchptr - new_cohort%pft = pft new_cohort%crowndamage = crowndamage new_cohort%status_coh = status @@ -354,14 +351,15 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! available to be subsumed in the new plant tissues. ! So we go through the process of pre-initializing the hydraulic ! states in the temporary cohort, to calculate this new number density - - call ConstrainRecruitNumber(currentSite,new_cohort, bc_in) + rmean_temp = patchptr%tveg24%GetMean() + call ConstrainRecruitNumber(currentSite, new_cohort, patchptr, & + bc_in, rmean_temp) endif endif -call insert_cohort(new_cohort, patchptr%tallest, patchptr%shortest, tnull, snull, & +call insert_cohort(patchptr, new_cohort, patchptr%tallest, patchptr%shortest, tnull, snull, & storebigcohort, storesmallcohort) patchptr%tallest => storebigcohort @@ -1413,7 +1411,8 @@ subroutine sort_cohorts(patchptr) shortestc => current_c endif - call insert_cohort(current_c, tallestc, shortestc, tnull, snull, storebigcohort, storesmallcohort) + call insert_cohort(current_patch, current_c, tallestc, shortestc, & + tnull, snull, storebigcohort, storesmallcohort) current_patch%tallest => storebigcohort current_patch%shortest => storesmallcohort @@ -1424,7 +1423,7 @@ subroutine sort_cohorts(patchptr) end subroutine sort_cohorts !-------------------------------------------------------------------------------------! - subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, storesmallcohort) + subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebigcohort, storesmallcohort) ! ! !DESCRIPTION: ! Insert cohort into linked list @@ -1432,6 +1431,7 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store ! !USES: ! ! !ARGUMENTS + type(ed_patch_type), intent(inout), target :: currentPatch type(fates_cohort_type) , intent(inout), pointer :: pcc type(fates_cohort_type) , intent(inout), pointer :: ptall type(fates_cohort_type) , intent(inout), pointer :: pshort @@ -1441,7 +1441,7 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store type(fates_cohort_type) , intent(inout),pointer,optional :: storebigcohort ! storage of the largest cohort for insertion routine ! ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch + !type(ed_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: current type(fates_cohort_type), pointer :: tallptr, shortptr, icohort type(fates_cohort_type), pointer :: ptallest, pshortest @@ -1449,7 +1449,6 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store integer :: tallptrnull,exitloop !---------------------------------------------------------------------- - currentPatch => pcc%patchptr ptallest => ptall pshortest => pshort @@ -1498,7 +1497,7 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store storebigcohort => icohort end if currentPatch%tallest => icohort - icohort%patchptr%tallest => icohort + !icohort%patchptr%tallest => icohort !new cohort is not tallest else !next shorter cohort to new cohort is the next shorter cohort @@ -1519,7 +1518,7 @@ subroutine insert_cohort(pcc, ptall, pshort, tnull, snull, storebigcohort, store storesmallcohort => icohort end if currentPatch%shortest => icohort - icohort%patchptr%shortest => icohort + !icohort%patchptr%shortest => icohort else !new cohort is not shortest and becomes next taller cohort !to the cohort just below it as defined in the previous block @@ -1694,7 +1693,7 @@ subroutine copy_cohort( currentCohort,copyc ) !Pointers n%taller => NULL() ! pointer to next tallest cohort n%shorter => NULL() ! pointer to next shorter cohort - n%patchptr => o%patchptr ! pointer to patch that cohort is in + !n%patchptr => o%patchptr ! pointer to patch that cohort is in diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index c8c72f4de9..669ad376a7 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -12,6 +12,7 @@ module EDMortalityFunctionsMod use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type + use EDTypesMod , only : maxpft use FatesConstantsMod , only : itrue,ifalse use FatesAllometryMod , only : bleaf use FatesAllometryMod , only : storage_fraction_of_target @@ -50,7 +51,8 @@ module EDMortalityFunctionsMod - subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort,smort,asmort,dgmort ) + subroutine mortality_rates( cohort_in,bc_in,btran_ft, mean_temp, & + cmort,hmort,bmort, frmort,smort,asmort,dgmort ) ! ============================================================================ ! Calculate mortality rates from carbon storage, hydraulic cavitation, @@ -64,6 +66,8 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort,smort,asmor type (fates_cohort_type), intent(in) :: cohort_in type (bc_in_type), intent(in) :: bc_in + real(r8), intent(in) :: btran_ft(maxpft) + real(r8), intent(in) :: mean_temp real(r8),intent(out) :: bmort ! background mortality : Fraction per year real(r8),intent(out) :: cmort ! carbon starvation mortality real(r8),intent(out) :: hmort ! hydraulic failure mortality @@ -156,7 +160,7 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort,smort,asmor hmort = 0.0_r8 endif else - if(cohort_in%patchptr%btran_ft(cohort_in%pft) <= hf_sm_threshold)then + if(btran_ft(cohort_in%pft) <= hf_sm_threshold)then hmort = EDPftvarcon_inst%mort_scalar_hydrfailure(cohort_in%pft) else hmort = 0.0_r8 @@ -190,7 +194,7 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort,smort,asmor ! Eastern US carbon sink. Glob. Change Biol., 12, 2370-2390, ! doi: 10.1111/j.1365-2486.2006.01254.x - temp_in_C = cohort_in%patchptr%tveg24%GetMean() - tfrz + temp_in_C = mean_temp - tfrz temp_dep_fraction = max(0.0_r8, min(1.0_r8, 1.0_r8 - (temp_in_C - & EDPftvarcon_inst%freezetol(cohort_in%pft))/frost_mort_buffer) ) @@ -225,8 +229,9 @@ end subroutine mortality_rates ! ============================================================================ - subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_primary, & - harvestable_forest_c, harvest_tag) + subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, btran_ft, & + mean_temp, anthro_disturbance_label, age_since_anthro_disturbance, & + frac_site_primary, harvestable_forest_c, harvest_tag) ! ! !DESCRIPTION: @@ -241,7 +246,11 @@ subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_pr type(ed_site_type), intent(inout), target :: currentSite type(fates_cohort_type),intent(inout), target :: currentCohort type(bc_in_type), intent(in) :: bc_in - real(r8), intent(in) :: frac_site_primary + real(r8), intent(in) :: btran_ft(maxpft) + real(r8), intent(in) :: mean_temp + integer, intent(in) :: anthro_disturbance_label + real(r8), intent(in) :: age_since_anthro_disturbance + real(r8), intent(in) :: frac_site_primary real(r8), intent(in) :: harvestable_forest_c(:) ! total carbon available for logging, kgC site-1 integer, intent(out) :: harvest_tag(:) ! tag to record the harvest status @@ -268,7 +277,8 @@ subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_pr ! Mortality for trees in the understorey. !if trees are in the canopy, then their death is 'disturbance'. This probably needs a different terminology - call mortality_rates(currentCohort,bc_in,cmort,hmort,bmort,frmort,smort, asmort, dgmort) + call mortality_rates(currentCohort,bc_in,btran_ft, mean_temp, & + cmort,hmort,bmort,frmort, smort, asmort, dgmort) call LoggingMortality_frac(ipft, currentCohort%dbh, currentCohort%canopy_layer, & currentCohort%lmort_direct, & currentCohort%lmort_collateral, & @@ -277,8 +287,8 @@ subroutine Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_pr bc_in%hlm_harvest_rates, & bc_in%hlm_harvest_catnames, & bc_in%hlm_harvest_units, & - currentCohort%patchptr%anthro_disturbance_label, & - currentCohort%patchptr%age_since_anthro_disturbance, & + anthro_disturbance_label, & + age_since_anthro_disturbance, & frac_site_primary, harvestable_forest_c, harvest_tag) if (currentCohort%canopy_layer > 1)then diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index ad4b6e898f..77027d3dab 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -32,8 +32,8 @@ module EDPatchDynamicsMod use EDTypesMod , only : ican_upper use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list - use EDTypesMod , only : lg_sf - use EDTypesMod , only : dl_sf + use FatesLitterMod , only : lg_sf + use FatesLitterMod , only : dl_sf use EDTypesMod , only : dump_patch use EDTypesMod , only : N_DIST_TYPES use EDTypesMod , only : AREA_INV @@ -76,7 +76,7 @@ module EDPatchDynamicsMod use FatesConstantsMod , only : fates_unset_int use FatesConstantsMod , only : hlm_harvest_carbon use EDCohortDynamicsMod , only : InitPRTObject - use EDCohortDynamicsMod , only : InitPRTBoundaryConditions + use EDTypesMod , only : InitPRTBoundaryConditions use ChecksBalancesMod, only : SiteMassStock use PRTGenericMod, only : carbon12_element use PRTGenericMod, only : leaf_organ @@ -198,6 +198,7 @@ subroutine disturbance_rates( site_in, bc_in) real(r8) :: frac_site_primary real(r8) :: harvest_rate real(r8) :: tempsum + real(r8) :: mean_temp real(r8) :: harvestable_forest_c(hlm_num_lu_harvest_cats) integer :: harvest_tag(hlm_num_lu_harvest_cats) @@ -218,9 +219,10 @@ subroutine disturbance_rates( site_in, bc_in) currentCohort => currentPatch%shortest do while(associated(currentCohort)) ! Mortality for trees in the understorey. - currentCohort%patchptr => currentPatch - - call mortality_rates(currentCohort,bc_in,cmort,hmort,bmort,frmort,smort,asmort,dgmort) + !currentCohort%patchptr => currentPatch + mean_temp = currentPatch%tveg24%GetMean() + call mortality_rates(currentCohort,bc_in,currentPatch%btran_ft, & + mean_temp, cmort,hmort,bmort,frmort,smort,asmort,dgmort) currentCohort%dmort = cmort+hmort+bmort+frmort+smort+asmort+dgmort call carea_allom(currentCohort%dbh,currentCohort%n,site_in%spread,currentCohort%pft, & currentCohort%crowndamage,currentCohort%c_area) @@ -405,7 +407,7 @@ subroutine spawn_patches( currentSite, bc_in) ! !USES: use EDParamsMod , only : ED_val_understorey_death, logging_coll_under_frac - use EDCohortDynamicsMod , only : zero_cohort, copy_cohort, terminate_cohorts + use EDCohortDynamicsMod , only : copy_cohort, terminate_cohorts use FatesConstantsMod , only : rsnbl_math_prec ! @@ -1099,8 +1101,8 @@ subroutine spawn_patches( currentSite, bc_in) new_patch%shortest => nc nc%shorter => null() endif - nc%patchptr => new_patch - call insert_cohort(nc, new_patch%tallest, new_patch%shortest, & + !nc%patchptr => new_patch + call insert_cohort(new_patch, nc, new_patch%tallest, new_patch%shortest, & tnull, snull, storebigcohort, storesmallcohort) new_patch%tallest => storebigcohort @@ -2736,12 +2738,13 @@ subroutine fuse_2_patches(csite, dp, rp) rp%shortest => currentCohort endif - call insert_cohort(currentCohort, rp%tallest, rp%shortest, tnull, snull, storebigcohort, storesmallcohort) + call insert_cohort(rp, currentCohort, rp%tallest, rp%shortest, & + tnull, snull, storebigcohort, storesmallcohort) rp%tallest => storebigcohort rp%shortest => storesmallcohort - currentCohort%patchptr => rp + !currentCohort%patchptr => rp currentCohort => nextc diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 8c8632d5db..ecadf16c2a 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -29,10 +29,9 @@ module EDPhysiologyMod use EDPftvarcon , only : GetDecompyFrac use FatesInterfaceTypesMod, only : bc_in_type use FatesInterfaceTypesMod, only : bc_out_type - use EDCohortDynamicsMod , only : zero_cohort use EDCohortDynamicsMod , only : create_cohort, sort_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDCohortDynamicsMod , only : InitPRTBoundaryConditions + use EDTypesMod, only : InitPRTBoundaryConditions use EDCohortDynamicsMod , only : copy_cohort use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai @@ -42,7 +41,9 @@ module EDPhysiologyMod use EDTypesMod , only : site_massbal_type use EDTypesMod , only : numlevsoil_max use EDTypesMod , only : numWaterMem - use EDTypesMod , only : dl_sf, dinc_vai, dlower_vai, area_inv + use FatesLitterMod , only : dl_sf + use EDParamsMod , only : dinc_vai, dlower_vai + use EDTypesMod , only : area_inv use EDTypesMod , only : AREA use FatesLitterMod , only : ncwd use FatesLitterMod , only : ndcmpy @@ -55,8 +56,8 @@ module EDPhysiologyMod use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : maxpft use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type - use EDTypesMod , only : leaves_on - use EDTypesMod , only : leaves_off + use FatesConstantsMod , only : leaves_on + use FatesConstantsMod , only : leaves_off use EDTypesMod , only : min_n_safemath use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list @@ -272,7 +273,7 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) call InitPRTObject(ndcohort%prt) call InitPRTBoundaryConditions(ndcohort) - call zero_cohort(ndcohort) + call ndcohort%zero_values() ! nc_canopy_d is the new cohort that gets damaged call copy_cohort(ccohort, ndcohort) @@ -2026,7 +2027,7 @@ subroutine recruitment( currentSite, currentPatch, bc_in ) !---------------------------------------------------------------------- allocate(temp_cohort) ! create temporary cohort - call zero_cohort(temp_cohort) + call temp_cohort%zero_values() do ft = 1,numpft diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index 4846336c9f..9ed2ef630c 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -56,7 +56,7 @@ module FatesPlantHydraulicsMod use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : AREA_INV use EDTypesMod , only : AREA - use EDParamsMod , only : leaves_on + use FatesConstantsMod , only : leaves_on use FatesInterfaceTypesMod , only : bc_in_type use FatesInterfaceTypesMod , only : bc_out_type @@ -1925,7 +1925,7 @@ end subroutine RecruitWUptake !===================================================================================== -subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) +subroutine ConstrainRecruitNumber(csite,ccohort, cpatch, bc_in, mean_temp) ! --------------------------------------------------------------------------- ! This subroutine constrains the number of plants so that there is enought water @@ -1935,12 +1935,13 @@ subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) ! Arguments type(ed_site_type), intent(inout), target :: csite type(fates_cohort_type) , intent(inout), target :: ccohort + type(ed_patch_type), intent(inout), target :: cpatch type(bc_in_type) , intent(in) :: bc_in + real(r8), intent(in) :: mean_temp ! Locals type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr - type(ed_patch_type), pointer :: cpatch real(r8) :: tmp1 real(r8) :: watres_local ! minum water content [m3/m3] real(r8) :: total_water ! total water in rhizosphere at a specific layer (m^3 ha-1) @@ -1956,7 +1957,6 @@ subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) real(r8) :: leaf_m, store_m, sapw_m ! Element mass in organ tissues real(r8) :: fnrt_m, struct_m, repro_m ! Element mass in organ tissues - cpatch => ccohort%patchptr csite_hydr => csite%si_hydr ccohort_hydr =>ccohort%co_hydr recruitw = (sum(ccohort_hydr%th_ag(:)*ccohort_hydr%v_ag(:)) + & @@ -1990,7 +1990,7 @@ subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) end do ! Prevent recruitment when temperatures are freezing or below - if (cpatch%tveg24%GetMean() <= 273.15_r8) then + if (mean_temp <= 273.15_r8) then nmin = 0._r8 end if diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 74f93e67ce..44fd2abda3 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -39,8 +39,8 @@ module FATESPlantRespPhotosynthMod use FatesInterfaceTypesMod, only : numpft use FatesInterfaceTypesMod, only : nleafage use EDTypesMod, only : maxpft - use EDTypesMod, only : nlevleaf - use EDTypesMod, only : nclmax + use EDParamsMod, only : nlevleaf + use EDParamsMod, only : nclmax use PRTGenericMod, only : max_nleafage use EDTypesMod, only : do_fates_salinity use EDParamsMod, only : q10_mr @@ -130,8 +130,8 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : maxpft - use EDTypesMod , only : dinc_vai - use EDTypesMod , only : dlower_vai + use EDParamsMod , only : dinc_vai + use EDParamsMod , only : dlower_vai use FatesInterfaceTypesMod , only : bc_in_type use FatesInterfaceTypesMod , only : bc_out_type use EDCanopyStructureMod, only : calc_areaindex diff --git a/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 b/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 index 9f520593b3..4d5efcf241 100644 --- a/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 +++ b/functional_unit_testing/parteh/f90src/FatesCohortWrapMod.F90 @@ -69,7 +69,7 @@ module FatesCohortWrapMod use FatesConstantsMod , only : nearzero - use EDTypesMod , only : nclmax + use EDParamsMod , only : nclmax use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : fates_log diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index f02653ef5c..39d7222543 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -9,9 +9,9 @@ module EDInitMod use FatesConstantsMod , only : itrue use FatesConstantsMod , only : fates_unset_int use FatesConstantsMod , only : primaryforest - use FatesConstantsMod , only : nearzero + use FatesConstantsMod , only : nearzero use FatesGlobals , only : endrun => fates_endrun - use EDTypesMod , only : nclmax + use EDParamsMod , only : nclmax use FatesGlobals , only : fates_log use FatesInterfaceTypesMod , only : hlm_is_restart use EDPftvarcon , only : EDPftvarcon_inst @@ -30,8 +30,7 @@ module EDInitMod use EDTypesMod , only : AREA use EDTypesMod , only : init_spread_near_bare_ground use EDTypesMod , only : init_spread_inventory - use EDTypesMod , only : leaves_on - use EDTypesMod , only : leaves_off + use FatesConstantsMod , only : leaves_on, leaves_off use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list use EDTypesMod , only : phen_cstat_nevercold diff --git a/main/EDMainMod.F90 b/main/EDMainMod.F90 index 0912b05655..79ce7eca6a 100644 --- a/main/EDMainMod.F90 +++ b/main/EDMainMod.F90 @@ -335,11 +335,11 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) use PRTGenericMod , only : fnrt_organ use FatesInterfaceTypesMod, only : hlm_use_cohort_age_tracking use FatesConstantsMod, only : itrue - use EDCohortDynamicsMod , only : zero_cohort, copy_cohort, insert_cohort + use EDCohortDynamicsMod , only : copy_cohort, insert_cohort use EDCohortDynamicsMod , only : DeallocateCohort use FatesPlantHydraulicsMod, only : InitHydrCohort use EDCohortDynamicsMod , only : InitPRTObject - use EDCohortDynamicsMod , only : InitPRTBoundaryConditions + use EDTypesMod , only : InitPRTBoundaryConditions use FatesConstantsMod , only : nearzero use EDCanopyStructureMod , only : canopy_structure use PRTLossFluxesMod , only : PRTDamageRecoveryFluxes @@ -375,6 +375,7 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) logical :: is_drought ! logical for if the plant (site) is in a drought state real(r8) :: delta_dbh ! correction for dbh real(r8) :: delta_hite ! correction for hite + real(r8) :: mean_temp logical :: newly_recovered ! If the current loop is dealing with a newly created cohort, which ! was created because it is a clone of the previous cohort in @@ -478,8 +479,12 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) ! Calculate the mortality derivatives - call Mortality_Derivative( currentSite, currentCohort, bc_in, frac_site_primary, & - harvestable_forest_c, harvest_tag ) + mean_temp = currentPatch%tveg24%GetMean() + call Mortality_Derivative(currentSite, currentCohort, bc_in, & + currentPatch%btran_ft, mean_temp, & + currentPatch%anthro_disturbance_label, & + currentPatch%age_since_anthro_disturbance, frac_site_primary, & + harvestable_forest_c, harvest_tag) ! ----------------------------------------------------------------------------- ! Apply Plant Allocation and Reactive Transport diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index a7f7b25fa1..917efe66ab 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -860,7 +860,7 @@ module EDTypesMod public :: dump_site public :: dump_patch public :: dump_cohort_hydr - public :: CanUpperUnder + public :: InitPRTBoundaryConditions contains ! ===================================================================================== diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index f984ed8365..d6ff9ac0ea 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -12,7 +12,7 @@ module FatesHistoryInterfaceMod use FatesConstantsMod , only : t_water_freeze_k_1atm use FatesGlobals , only : fates_log use FatesGlobals , only : endrun => fates_endrun - use EDTypesMod , only : nclmax + use EDParamsMod , only : nclmax use EDTypesMod , only : ican_upper use PRTGenericMod , only : element_pos use PRTGenericMod , only : num_elements @@ -2103,7 +2103,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) ! --------------------------------------------------------------------------------- - use EDtypesMod , only : nfsc + use FatesLitterMod , only : nfsc use FatesLitterMod , only : ncwd use EDtypesMod , only : ican_upper use EDtypesMod , only : ican_ustory @@ -2118,7 +2118,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) use FatesSizeAgeTypeIndicesMod, only : get_cdamagesizepft_class_index use FatesSizeAgeTypeIndicesMod, only : coagetype_class_index - use EDTypesMod , only : nlevleaf + use EDParamsMod , only : nlevleaf use EDParamsMod , only : ED_val_history_height_bin_edges use FatesInterfaceTypesMod , only : nlevdamage @@ -4335,7 +4335,7 @@ subroutine update_history_hifrq(this,nc,nsites,sites,bc_in,dt_tstep) ! after rapid timescale productivity calculations (gpp and respiration). ! --------------------------------------------------------------------------------- - use EDTypesMod , only : nclmax, nlevleaf + use EDParamsMod , only : nclmax, nlevleaf ! ! Arguments class(fates_history_interface_type) :: this diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index f922b4ee36..b8fd42ca38 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -10,8 +10,8 @@ module FatesInterfaceMod ! ------------------------------------------------------------------------------------ use EDTypesMod , only : ed_site_type - use EDTypesMod , only : dinc_vai - use EDTypesMod , only : dlower_vai + use EDParamsMod , only : dinc_vai + use EDParamsMod , only : dlower_vai use EDParamsMod , only : ED_val_vai_top_bin_width use EDParamsMod , only : ED_val_vai_width_increase_factor use EDParamsMod , only : ED_val_history_damage_bin_edges @@ -1057,9 +1057,9 @@ end subroutine InitPARTEHGlobals subroutine fates_history_maps - use EDTypesMod, only : NFSC - use EDTypesMod, only : nclmax - use EDTypesMod, only : nlevleaf + use FatesLitterMod, only : NFSC + use EDParamsMod, only : nclmax + use EDParamsMod, only : nlevleaf use EDParamsMod, only : ED_val_history_sizeclass_bin_edges use EDParamsMod, only : ED_val_history_ageclass_bin_edges use EDParamsMod, only : ED_val_history_height_bin_edges diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 7cfe9d84e1..aba46250d6 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -36,8 +36,7 @@ module FatesInventoryInitMod use EDTypesMod , only : ed_patch_type use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : area - use EDTypesMod , only : leaves_on - use EDTypesMod , only : leaves_off + use FatesConstantsMod, only : leaves_on, leaves_off use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list use EDTypesMod , only : phen_cstat_nevercold diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index beb3215dfa..246f988409 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -32,17 +32,16 @@ module FatesRestartInterfaceMod use FatesPlantHydraulicsMod, only : UpdatePlantPsiFTCFromTheta use PRTGenericMod, only : prt_global use PRTGenericMod, only : prt_cnp_flex_allom_hyp - use EDCohortDynamicsMod, only : nan_cohort - use EDCohortDynamicsMod, only : zero_cohort use EDCohortDynamicsMod, only : InitPRTObject - use EDCohortDynamicsMod, only : InitPRTBoundaryConditions + use EDTypesMod, only : InitPRTBoundaryConditions use FatesPlantHydraulicsMod, only : InitHydrCohort use FatesInterfaceTypesMod, only : nlevsclass use FatesInterfaceTypesMod, only : nlevdamage use FatesLitterMod, only : litter_type - use FatesLitterMod, only : ncwd + use FatesLitterMod, only : ncwd, nfsc use FatesLitterMod, only : ndcmpy - use EDTypesMod, only : nfsc, nlevleaf, area + use EDTypesMod, only : area + use EDParamsMod, only : nlevleaf use PRTGenericMod, only : prt_global use PRTGenericMod, only : num_elements use FatesRunningMeanMod, only : rmean_type @@ -2510,7 +2509,7 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) use EDTypesMod, only : ed_site_type use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type - use EDTypesMod, only : maxSWb + use EDParamsMod, only : maxSWb use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use EDTypesMod, only : maxpft @@ -2616,9 +2615,8 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) do fto = 1, rio_ncohort_pa( io_idx_co_1st ) allocate(new_cohort) - call nan_cohort(new_cohort) - call zero_cohort(new_cohort) - new_cohort%patchptr => newp + call new_cohort%nan_values() + call new_cohort%zero_values() ! If this is the first in the list, it is tallest if (.not.associated(newp%tallest)) then @@ -2710,8 +2708,8 @@ subroutine get_restart_vectors(this, nc, nsites, sites) use EDTypesMod, only : ed_site_type use EDTypesMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type - use EDTypesMod, only : maxSWb - use EDTypesMod, only : nclmax + use EDParamsMod, only : maxSWb + use EDParamsMod, only : nclmax use FatesInterfaceTypesMod, only : numpft use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use EDTypesMod, only : numWaterMem From a182e1d58f9c5d77483fda5831f5477756131bdf Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 5 Apr 2023 16:07:53 -0600 Subject: [PATCH 017/125] moving parameters around --- biogeochem/EDPatchDynamicsMod.F90 | 2 +- main/EDTypesMod.F90 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 77027d3dab..d6c9c74591 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -687,7 +687,7 @@ subroutine spawn_patches( currentSite, bc_in) !allocate(nc%tveg_lpa) !call nc%tveg_lpa%InitRMean(ema_lpa,init_value=new_patch%tveg_lpa%GetMean()) - call zero_cohort(nc) + call nc%zero_values() ! nc is the new cohort that goes in the disturbed patch (new_patch)... currentCohort ! is the curent cohort that stays in the donor patch (currentPatch) diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 917efe66ab..f5cf325db1 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -1410,7 +1410,7 @@ subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) call check_var_real(currentCohort%n,'cohort%n',return_code) if(.not.(return_code.eq.0)) then call dump_patch(currentPatch) - call dump_cohort(currentCohort) + call currentCohort%dump() return end if currentCohort => currentCohort%taller @@ -1424,7 +1424,7 @@ subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) call check_var_real(currentCohort%dbh,'cohort%dbh',return_code) if(.not.(return_code.eq.0)) then call dump_patch(currentPatch) - call dump_cohort(currentCohort) + call currentCohort%dump() return end if currentCohort => currentCohort%taller From f8fd35fedb2aca445bd88d14cabef929929f8d84 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 6 Apr 2023 13:11:27 -0700 Subject: [PATCH 018/125] Update to xarray 0.19.0 This incorporates an update to handle a pandas deprication issue when using cftime objects. See https://github.com/pydata/xarray/pull/5359 --- tools/conda-luh2.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/conda-luh2.yml b/tools/conda-luh2.yml index 0be4e7b3b7..b87f1c800a 100644 --- a/tools/conda-luh2.yml +++ b/tools/conda-luh2.yml @@ -3,8 +3,8 @@ channels: - conda-forge - defaults dependencies: - - python=3.7.9 - - xarray + - python + - xarray=0.19.0 - netcdf4 - scipy - nco From 04907488948478d0d6882236603725250da5f17e Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 6 Apr 2023 16:29:47 -0700 Subject: [PATCH 019/125] Truncate to the yml file and update prep function Having too many of the dependencies in the yml file was causing issue with the dependency order and limiting xesmf to an older version. --- tools/conda-luh2.yml | 7 ++---- tools/luh2mod.py | 58 ++++++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/tools/conda-luh2.yml b/tools/conda-luh2.yml index b87f1c800a..4caf2e341b 100644 --- a/tools/conda-luh2.yml +++ b/tools/conda-luh2.yml @@ -3,11 +3,8 @@ channels: - conda-forge - defaults dependencies: - - python - - xarray=0.19.0 + - xesmf + # xarray which is autodownloaded as xesmf dependency, uses scipy, which needs netcdf4 to open datasets - netcdf4 - - scipy - - nco - pynco - - xesmf prefix: /home/glemieux/local/conda/miniconda3/envs/luh2 diff --git a/tools/luh2mod.py b/tools/luh2mod.py index f30116e5a0..78be603ac1 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -9,30 +9,40 @@ # Add version checking here in case environment.yml not used - - -# Primary function to regrid luh2 data -# -# Prepare the -def PrepDataSet(inputfile_luh2,inputfile_surface): +# Prepare the inputfile to be used for regridding +def PrepDataSet(inputfile,start,stop): # Import the data - ds_luh2 = ImportData(inputfile_luh2) - ds_surfdata = ImportData(inputfile_surface) + inputdataset = ImportData(inputfile) + + # Truncate the data to the user defined range + try: + inputdataset = inputdataset.sel(time=slice(start,stop)) + except TypeError as err: + print("TypeError:", err) + print("Input must be a string") # Correct the necessary variables for both datasets - ds_luh2 = BoundsVariableFixLUH2(ds_luh2) - ds_surfdata = DimensionFixSurfData(ds_surfdata) + PrepDataSet_ESMF(inputdataset) # Set dataset masks - ds_luh2 = SetMask(ds_luh2) - ds_surfdata = SetMask(ds_surfdata) + SetMask(inputdataset) - # Define the xESMF regridder if necessary - # regridder = RegridConservative(ds_luh2,ds_surfdata) + return(inputdataset) - # return(ds_luh2,ds_surfdata,regridder) - return(ds_luh2,ds_surfdata) +# Updating datasets to work with xESMF +def PrepDataSet_ESMF(inputdataset): + + # Check the dataset type + dsflag, dstype = CheckDataSet(inputdataset) + if (dsflag): + if(dstype == "LUH2"): + BoundsVariableFixLUH2(inputdataset) + elif(dstype == "Surface"): + DimensionFixSurfData(inputdataset) + print("data set updated for xESMF") + + return(inputdataset) # Import luh2 or surface data sets def ImportData(inputfile): @@ -101,31 +111,31 @@ def AttribUpdateLUH2(inputfile,output_append="modified"): def BoundsVariableFixLUH2(inputdataset): # Drop the old boundary names to avoid confusion - outputdataset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + # outputdataset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional_bounds array. # Future todo: is it possible to have xESMF recognize and use the original 2D array? - outputdataset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) - outputdataset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) + inputdataset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) + inputdataset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) print("LUH2 dataset lat/lon boundary variables formatted and added as new variable for xESMF") - return(outputdataset) + return(inputdataset) # The user will need to use a surface data set to regrid from, but the surface datasets # need to have their dimensions renamed to something recognizable by xESMF def DimensionFixSurfData(surfdataset): # Rename the surface dataset dimensions to something recognizable by xESMF. - outputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + inputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) # Populate the new surface dataset with the actual lat/lon values - outputdataset['longitude'] = outputdataset.LONGXY.isel(latitude=0) - outputdataset['latitude'] = outputdataset.LATIXY.isel(longitude=0) + inputdataset['longitude'] = outputdataset.LONGXY.isel(latitude=0) + inputdataset['latitude'] = outputdataset.LATIXY.isel(longitude=0) print("Surface dataset dimensions renamed for xESMF") - return(outputdataset) + return(inputdataset) def SetMask(inputdataset): From 91ef322e1f504ea753b43201f295b75e159c0113 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 6 Apr 2023 17:12:10 -0700 Subject: [PATCH 020/125] more intermediate updates --- tools/luh2mod.py | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 78be603ac1..3e074c19e8 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -import re +import argparse, os, re import numpy as np import xarray as xr import xesmf as xe @@ -9,6 +9,38 @@ # Add version checking here in case environment.yml not used +def main(): + + # Add argument parser - subfunction? Seperate common module? + # inputfiles and range should be the only arguments + # Allow variable input files (state and/or transitions and/or management) + # parser = argparse.ArgumentParser() + # args = parser.parse_args() + + # Prep the LUH2 data + ds_luh2 = PrepDataSet(args.luh2file,args.start,args.stop) + + # Prep the regrid target (assuming surface dataset) + ds_regridtarget= PrepDataSet(args.regridtargetfile,args.start,args.stop) + + # Build regridder + regridder = xe.Regridder(ds_luh2, ds_regridtarget, "conservative") + + # Regrid the dataset(s) + regrid_luh2 = regridder(ds_states) + + # Rename the dimensions for the output + regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) + regrid_luh2["LONGXY"] = ds_regridtarget["LONGXY"] + regrid_luh2["LATIXY"] = ds_regridtarget["LATIXY"] + + # Write the files + outputfile = os.path.join() + regrid_luh2.to_netcdf(outputfile) + +# write to netcdf +finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') + # Prepare the inputfile to be used for regridding def PrepDataSet(inputfile,start,stop): @@ -16,6 +48,8 @@ def PrepDataSet(inputfile,start,stop): inputdataset = ImportData(inputfile) # Truncate the data to the user defined range + # This might need some more error handling for when + # the start/stop is out of range try: inputdataset = inputdataset.sel(time=slice(start,stop)) except TypeError as err: @@ -183,11 +217,11 @@ def SetMaskSurfData(inputdataset): # return(outputdataset) return(inputdataset) -def RegridConservative(dataset_from,dataset_to): +# def RegridConservative(dataset_from,dataset_to): # define the regridder transformation - regridder = xe.Regridder(dataset_from, dataset_to, "conservative") + # regridder = xe.Regridder(dataset_from, dataset_to, "conservative") - return(regridder) + # return(regridder) # Apply regridder From 5b65edd86899403e4506a150f87080d4396780c6 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 7 Apr 2023 09:51:04 -0700 Subject: [PATCH 021/125] Add command line argument parsing --- tools/luh2mod.py | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 3e074c19e8..efb40ef752 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -14,17 +14,16 @@ def main(): # Add argument parser - subfunction? Seperate common module? # inputfiles and range should be the only arguments # Allow variable input files (state and/or transitions and/or management) - # parser = argparse.ArgumentParser() - # args = parser.parse_args() + args = CommandLineArgs() # Prep the LUH2 data - ds_luh2 = PrepDataSet(args.luh2file,args.start,args.stop) + ds_luh2 = PrepDataSet(args.luh2file,args.begin,args.end) # Prep the regrid target (assuming surface dataset) - ds_regridtarget= PrepDataSet(args.regridtargetfile,args.start,args.stop) + ds_regridtarget= PrepDataSet(args.regridtargetfile,args.begin,args.end) # Build regridder - regridder = xe.Regridder(ds_luh2, ds_regridtarget, "conservative") + regridder = RegridConservative(ds_luh2, ds_regridtarget, save=True) # Regrid the dataset(s) regrid_luh2 = regridder(ds_states) @@ -38,8 +37,30 @@ def main(): outputfile = os.path.join() regrid_luh2.to_netcdf(outputfile) -# write to netcdf -finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') + # Example of file naming scheme + # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') + +def CommandLineArgs(): + + parser = argparse.ArgumentParser(description="placeholder desc") + + # Required input luh2 datafile + # TO DO: using the checking function to report back if invalid file input + parser.add_argument("-l","--luh2file", require=True) + + # Provide mutually exlusive arguments for regridding input selection + # Currently assuming that if a target is provided that a regridder file will be saved + regridtarget = parser.add_mutually_exclusive_group(required=True) + regridtarget.add_argument("-rf","--regridderfile") # use previously save regridder file + regridtarget.add_argument("-rt","--regriddertarget") # use a dataset to regrid to + + # Optional input to subset the time range of the data + parser.add_argument("-b","--begin") + parser.add_argument("-e","--end") + + args = parser.parse_args() + + return(args) # Prepare the inputfile to be used for regridding def PrepDataSet(inputfile,start,stop): @@ -217,11 +238,17 @@ def SetMaskSurfData(inputdataset): # return(outputdataset) return(inputdataset) -# def RegridConservative(dataset_from,dataset_to): +def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): # define the regridder transformation - # regridder = xe.Regridder(dataset_from, dataset_to, "conservative") + regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") + + # If save flag is set, write regridder to a file + # TO DO: define a more useful name based on inputs + if(save): + filename = regridder.to_netcdf("regridder.nc") + print("regridder saved to file: ", filename) - # return(regridder) + return(regridder) # Apply regridder From 1171e824272da74ea2190ed4d5c818f7d2395067 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 7 Apr 2023 11:54:54 -0600 Subject: [PATCH 022/125] move cohort type into its own module --- biogeochem/EDCanopyStructureMod.F90 | 10 +- biogeochem/EDCohortDynamicsMod.F90 | 9 +- biogeochem/EDLoggingMortalityMod.F90 | 4 +- biogeochem/EDMortalityFunctionsMod.F90 | 2 +- biogeochem/EDPatchDynamicsMod.F90 | 8 +- biogeochem/EDPhysiologyMod.F90 | 6 +- biogeochem/FatesSoilBGCFluxMod.F90 | 2 +- biogeophys/EDAccumulateFluxesMod.F90 | 3 +- biogeophys/EDBtranMod.F90 | 2 +- biogeophys/FatesBstressMod.F90 | 2 +- biogeophys/FatesPlantHydraulicsMod.F90 | 2 +- biogeophys/FatesPlantRespPhotosynthMod.F90 | 8 +- fire/SFMainMod.F90 | 2 +- main/ChecksBalancesMod.F90 | 2 +- main/EDInitMod.F90 | 3 +- main/EDMainMod.F90 | 13 +- main/EDTypesMod.F90 | 721 +-------------------- main/FatesCohortMod.F90 | 693 ++++++++++++++++++++ main/FatesConstantsMod.F90 | 4 + main/FatesHistoryInterfaceMod.F90 | 8 +- main/FatesHydraulicsMemMod.F90 | 19 + main/FatesInterfaceMod.F90 | 2 +- main/FatesInventoryInitMod.F90 | 2 +- main/FatesRestartInterfaceMod.F90 | 9 +- 24 files changed, 760 insertions(+), 776 deletions(-) create mode 100644 main/FatesCohortMod.F90 diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 0c8178e4f3..09e53623a9 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -17,10 +17,10 @@ module EDCanopyStructureMod use FatesAllometryMod , only : carea_allom use EDCohortDynamicsMod , only : copy_cohort, terminate_cohorts, terminate_cohort, fuse_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDTypesMod , only : InitPRTBoundaryConditions use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai - use EDtypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type + use EDtypesMod , only : ed_site_type, ed_patch_type + use FatesCohortMod, only : fates_cohort_type use EDParamsMod , only : nclmax use EDParamsMod , only : nlevleaf use EDtypesMod , only : AREA @@ -683,7 +683,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) endif call copy_cohort(currentCohort, copyc) - call InitPRTBoundaryConditions(copyc) + call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_loss copyc%n = currentCohort%n*newarea/currentCohort%c_area @@ -1158,7 +1158,7 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) ! init_value=currentPatch%tveg_lpa%GetMean()) call copy_cohort(currentCohort, copyc) !makes an identical copy... - call InitPRTBoundaryConditions(copyc) + call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_gain !new area of existing cohort @@ -1802,7 +1802,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) ! to vegetation coverage to the host land model. ! ---------------------------------------------------------------------------------- - use EDTypesMod , only : ed_patch_type, fates_cohort_type, & + use EDTypesMod , only : ed_patch_type, & ed_site_type, AREA use FatesInterfaceTypesMod , only : bc_out_type diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index f5b5bbe0a1..e137441fc7 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -27,8 +27,7 @@ Module EDCohortDynamicsMod use PRTParametersMod , only : prt_params use FatesParameterDerivedMod, only : param_derived use EDTypesMod , only : ed_site_type, ed_patch_type - use EDTypesMod , only : fates_cohort_type - use EDTypesMod , only : InitPRTBoundaryConditions + use FatesCohortMod , only : fates_cohort_type use EDParamsMod , only : nclmax use PRTGenericMod , only : element_list use PRTGenericMod , only : StorageNutrientTarget @@ -41,7 +40,7 @@ Module EDCohortDynamicsMod use EDTypesMod , only : min_n_safemath use EDParamsMod , only : nlevleaf use PRTGenericMod , only : max_nleafage - use EDTypesMod , only : ican_upper + use FatesConstantsMod , only : ican_upper use EDTypesMod , only : site_fluxdiags_type use PRTGenericMod , only : num_elements use FatesConstantsMod , only : leaves_on @@ -367,7 +366,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & end subroutine create_cohort - ! ------------------------------------------------------------------------------------! +! ------------------------------------------------------------------------------------! subroutine InitPRTObject(prt) @@ -2095,7 +2094,7 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) ! correct boundary condition fields rcohort%prt => null() call InitPRTObject(rcohort%prt) - call InitPRTBoundaryConditions(rcohort) + call rcohort%InitPRTBoundaryConditions() call copy_cohort(ccohort, rcohort) rcohort%n = nplant_recover diff --git a/biogeochem/EDLoggingMortalityMod.F90 b/biogeochem/EDLoggingMortalityMod.F90 index 53aa3be4dd..36882b87fb 100644 --- a/biogeochem/EDLoggingMortalityMod.F90 +++ b/biogeochem/EDLoggingMortalityMod.F90 @@ -15,7 +15,7 @@ module EDLoggingMortalityMod use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : rsnbl_math_prec - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : ed_patch_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type @@ -717,7 +717,7 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site use EDtypesMod, only : area use EDtypesMod, only : ed_site_type use EDtypesMod, only : ed_patch_type - use EDtypesMod, only : fates_cohort_type + use FatesCohortMod, only : fates_cohort_type use FatesConstantsMod, only : rsnbl_math_prec use FatesAllometryMod, only : carea_allom diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index 669ad376a7..248064e367 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -9,7 +9,7 @@ module EDMortalityFunctionsMod use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : fates_log use EDPftvarcon , only : EDPftvarcon_inst - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type use EDTypesMod , only : maxpft diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index d6c9c74591..ea13822517 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -19,7 +19,8 @@ module EDPatchDynamicsMod use EDTypesMod , only : homogenize_seed_pfts use EDTypesMod , only : n_dbh_bins, area, patchfusion_dbhbin_loweredges use EDtypesMod , only : force_patchfuse_min_biomass - use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type use EDTypesMod , only : min_patch_area @@ -29,7 +30,7 @@ module EDPatchDynamicsMod use EDTypesMod , only : dtype_ifall use EDTypesMod , only : dtype_ilog use EDTypesMod , only : dtype_ifire - use EDTypesMod , only : ican_upper + use FatesConstantsMod , only : ican_upper use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list use FatesLitterMod , only : lg_sf @@ -76,7 +77,6 @@ module EDPatchDynamicsMod use FatesConstantsMod , only : fates_unset_int use FatesConstantsMod , only : hlm_harvest_carbon use EDCohortDynamicsMod , only : InitPRTObject - use EDTypesMod , only : InitPRTBoundaryConditions use ChecksBalancesMod, only : SiteMassStock use PRTGenericMod, only : carbon12_element use PRTGenericMod, only : leaf_organ @@ -680,7 +680,7 @@ subroutine spawn_patches( currentSite, bc_in) ! correct boundary condition fields nc%prt => null() call InitPRTObject(nc%prt) - call InitPRTBoundaryConditions(nc) + call nc%InitPRTBoundaryConditions() ! (Keeping as an example) ! Allocate running mean functions diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index ecadf16c2a..cd1ba0ee3a 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -31,7 +31,6 @@ module EDPhysiologyMod use FatesInterfaceTypesMod, only : bc_out_type use EDCohortDynamicsMod , only : create_cohort, sort_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDTypesMod, only : InitPRTBoundaryConditions use EDCohortDynamicsMod , only : copy_cohort use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai @@ -55,7 +54,8 @@ module EDPhysiologyMod use EDParamsMod , only : nlevleaf use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : maxpft - use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type + use FatesCohortMod, only : fates_cohort_type use FatesConstantsMod , only : leaves_on use FatesConstantsMod , only : leaves_off use EDTypesMod , only : min_n_safemath @@ -272,7 +272,7 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) ndcohort%prt => null() call InitPRTObject(ndcohort%prt) - call InitPRTBoundaryConditions(ndcohort) + call ndcohort%InitPRTBoundaryConditions() call ndcohort%zero_values() ! nc_canopy_d is the new cohort that gets damaged diff --git a/biogeochem/FatesSoilBGCFluxMod.F90 b/biogeochem/FatesSoilBGCFluxMod.F90 index e29a884fd2..937fe81bb7 100644 --- a/biogeochem/FatesSoilBGCFluxMod.F90 +++ b/biogeochem/FatesSoilBGCFluxMod.F90 @@ -45,7 +45,7 @@ module FatesSoilBGCFluxMod use EDParamsMod , only : n_uptake_mode use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA,AREA_INV use FatesInterfaceTypesMod, only : bc_in_type use FatesInterfaceTypesMod, only : bc_out_type diff --git a/biogeophys/EDAccumulateFluxesMod.F90 b/biogeophys/EDAccumulateFluxesMod.F90 index 3ef45ac742..071a1ad0a7 100644 --- a/biogeophys/EDAccumulateFluxesMod.F90 +++ b/biogeophys/EDAccumulateFluxesMod.F90 @@ -38,8 +38,9 @@ subroutine AccumulateFluxes_ED(nsites, sites, bc_in, bc_out, dt_time) ! ! !USES: - use EDTypesMod , only : ed_patch_type, fates_cohort_type, & + use EDTypesMod , only : ed_patch_type, & ed_site_type, AREA + use FatesCohortMod, only : fates_cohort_type use FatesInterfaceTypesMod , only : bc_in_type,bc_out_type ! diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index 89deb8c4d0..8063915ff3 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -11,8 +11,8 @@ module EDBtranMod use FatesConstantsMod , only : nocomp_bareground use EDTypesMod , only : ed_site_type, & ed_patch_type, & - fates_cohort_type, & maxpft + use FatesCohortMod, only : fates_cohort_type use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & bc_out_type, & diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 index f160612633..9beb3d5cd9 100644 --- a/biogeophys/FatesBstressMod.F90 +++ b/biogeophys/FatesBstressMod.F90 @@ -9,8 +9,8 @@ module FatesBstressMod use FatesConstantsMod , only : itrue,ifalse use EDTypesMod , only : ed_site_type, & ed_patch_type, & - fates_cohort_type, & maxpft + use FatesCohortMod , only : fates_cohort_type use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & bc_out_type, & diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index 9ed2ef630c..c008ae2f39 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -53,7 +53,7 @@ module FatesPlantHydraulicsMod use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA_INV use EDTypesMod , only : AREA use FatesConstantsMod , only : leaves_on diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 44fd2abda3..22c3b0c491 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -44,6 +44,8 @@ module FATESPlantRespPhotosynthMod use PRTGenericMod, only : max_nleafage use EDTypesMod, only : do_fates_salinity use EDParamsMod, only : q10_mr + use EDTypesMod, only : ed_patch_type + use FatesCohortMod, only : fates_cohort_type use EDParamsMod, only : maintresp_leaf_model use FatesConstantsMod, only : lmrmodel_ryan_1991 use FatesConstantsMod, only : lmrmodel_atkin_etal_2017 @@ -126,8 +128,6 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! !USES: use FatesSynchronizedParamsMod , only : FatesSynchronizedParamsInst - use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : maxpft use EDParamsMod , only : dinc_vai @@ -1891,10 +1891,6 @@ subroutine UpdateCanopyNCanNRadPresent(currentPatch) ! profile). ! --------------------------------------------------------------------------------- - - use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type - ! Arguments type(ed_patch_type), target :: currentPatch type(fates_cohort_type), pointer :: currentCohort diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 7090decc90..aa8716bf90 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -25,7 +25,7 @@ module SFMainMod use PRTGenericMod , only : element_pos use EDtypesMod , only : ed_site_type use EDtypesMod , only : ed_patch_type - use EDtypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDtypesMod , only : AREA use FatesLitterMod , only : DL_SF use FatesLitterMod , only : TW_SF diff --git a/main/ChecksBalancesMod.F90 b/main/ChecksBalancesMod.F90 index 8c867219b1..3d200a6f99 100644 --- a/main/ChecksBalancesMod.F90 +++ b/main/ChecksBalancesMod.F90 @@ -4,7 +4,7 @@ module ChecksBalancesMod use shr_const_mod, only : SHR_CONST_CDAY use EDtypesMod, only : ed_site_type use EDTypesMod, only : ed_patch_type - use EDTypesMod, only : fates_cohort_type + use FatesCohortMod, only : fates_cohort_type use EDTypesMod, only : AREA use EDTypesMod, only : site_massbal_type use PRTGenericMod, only : num_elements diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 39d7222543..18fa974c88 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -23,7 +23,8 @@ module EDInitMod use EDPhysiologyMod , only : assign_cohort_sp_properties use ChecksBalancesMod , only : SiteMassStock use FatesInterfaceTypesMod , only : hlm_day_of_year - use EDTypesMod , only : ed_site_type, ed_patch_type, fates_cohort_type + use EDTypesMod , only : ed_site_type, ed_patch_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : numWaterMem use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : maxpft diff --git a/main/EDMainMod.F90 b/main/EDMainMod.F90 index 79ce7eca6a..c9cb3a8c84 100644 --- a/main/EDMainMod.F90 +++ b/main/EDMainMod.F90 @@ -66,7 +66,7 @@ module EDMainMod use FatesLitterMod , only : ncwd use EDtypesMod , only : ed_site_type use EDtypesMod , only : ed_patch_type - use EDtypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA use EDTypesMod , only : site_massbal_type use PRTGenericMod , only : num_elements @@ -324,9 +324,6 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) ! ! !USES: use FatesInterfaceTypesMod, only : hlm_num_lu_harvest_cats - use FatesInterfaceTypesMod, only : nlevdamage - use FatesAllometryMod , only : bleaf - use FatesAllometryMod , only : carea_allom use PRTGenericMod , only : leaf_organ use PRTGenericMod , only : repro_organ use PRTGenericMod , only : sapw_organ @@ -335,16 +332,8 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) use PRTGenericMod , only : fnrt_organ use FatesInterfaceTypesMod, only : hlm_use_cohort_age_tracking use FatesConstantsMod, only : itrue - use EDCohortDynamicsMod , only : copy_cohort, insert_cohort - use EDCohortDynamicsMod , only : DeallocateCohort - use FatesPlantHydraulicsMod, only : InitHydrCohort - use EDCohortDynamicsMod , only : InitPRTObject - use EDTypesMod , only : InitPRTBoundaryConditions use FatesConstantsMod , only : nearzero use EDCanopyStructureMod , only : canopy_structure - use PRTLossFluxesMod , only : PRTDamageRecoveryFluxes - use PRTGenericMod , only : max_nleafage - use PRTGenericMod , only : prt_global ! !ARGUMENTS: diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index f5cf325db1..e9184cf40b 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -26,6 +26,7 @@ module EDTypesMod use FatesInterfaceTypesMod,only : bc_in_type use FatesInterfaceTypesMod,only : bc_out_type use FatesInterfaceTypesMod,only : hlm_parteh_mode + use FatesCohortMod, only : fates_cohort_type use EDParamsMod, only : maxSWb, nclmax, nlevleaf use shr_log_mod, only : errMsg => shr_log_errMsg @@ -48,13 +49,6 @@ module EDTypesMod ! this is ok for now. (RGK 04-2018) ! ------------------------------------------------------------------------------------- - - - integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy - integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers - ! (all layers that are not the top canopy layer) - - integer, parameter, public :: n_rad_stream_types = 2 ! The number of radiation streams used (direct/diffuse) integer, parameter, public :: idirect = 1 ! This is the array index for direct radiation @@ -140,228 +134,6 @@ module EDTypesMod logical, parameter, public :: homogenize_seed_pfts = .false. character(len=*), parameter, private :: sourcefile = __FILE__ - - type, public :: fates_cohort_type - - ! POINTERS - type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort - type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort - - !:.........................................................................: - - ! Multi-species, multi-organ Plant Reactive Transport (PRT) - ! Contains carbon and nutrient state variables for various plant organs - class(prt_vartypes), pointer :: prt - real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant - ! in carbon only simulationss, and is set by the - ! allom_l2fr_min parameter. In nutrient - ! enabled simulations, this is dynamic, will - ! vary between allom_l2fr_min and allom_l2fr_max - ! parameters, with a tendency driven by - ! nutrient storage) [kg root / kg leaf] - - !:.........................................................................: - - ! VEGETATION STRUCTURE - - integer :: pft ! pft index - real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) [/m2] - real(r8) :: dbh ! diameter at breast height [cm] - real(r8) :: coage ! age [years] - real(r8) :: hite ! height [m] - integer :: indexnumber ! unique number for each cohort (within clump?) - integer :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] - real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort [1 = canopy, 2 = understorey, etc.] - ! real to be conservative during fusion - integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] - real(r8) :: g_sb_laweight ! total conductance (stomata + boundary layer) of the cohort - ! weighted by its leaf area [m/s]*[m2] - real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] - real(r8) :: leaf_cost ! how much does it cost to maintain leaves [kgC/m2/year] - real(r8) :: excl_weight ! how much of this cohort is demoted each year, as a proportion of all cohorts - real(r8) :: prom_weight ! how much of this cohort is promoted each year, as a proportion of all cohorts - integer :: nv ! number of leaf layers - integer :: status_coh ! growth status of plant [2 = leaves on , 1 = leaves off] - real(r8) :: c_area ! areal extent of canopy [m2] - real(r8) :: treelai ! lai of an individual within cohort leaf area [m2 leaf area/m2 crown area] - real(r8) :: treesai ! stem area index of an individual within cohort [m2 stem area/m2 crown area] - logical :: isnew ! flag to signify a new cohort - new cohorts have not experienced - ! npp or mortality and should therefore not be fused or averaged - integer :: size_class ! index that indicates which diameter size bin the cohort currently resides in - ! this is used for history output. We maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_class ! index that indicates which age bin the cohort currently resides in - ! (used for history output) - integer :: size_by_pft_class ! index that indicates the cohorts position of the joint size-class x functional - ! type classification. We also maintain this in the main cohort memory - ! because we don't want to continually re-calculate the cohort's position when - ! performing size diagnostics at high-frequency calls - integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT - integer :: size_class_lasttimestep ! size class of the cohort at the last time step - - !:.........................................................................: - - ! CARBON AND NUTRIENT FLUXES - - ! -------------------------------------------------------------------------- - ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types* - ! - ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics - ! time-step (ie photosynthesis, sub-hourly) [kgC/indiv/timestep] - ! _acc: The accumulation of the _tstep variable from the beginning to ending of - ! the dynamics time-scale. This variable is zero'd during initialization and - ! after the dynamics call-sequence is completed. [kgC/indiv/day] - ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, - ! _acc_hold "holds" the integrated value until the next time dynamics is - ! called. This is necessary for restarts. This variable also has units - ! converted to a useful rate [kgC/indiv/yr] - ! -------------------------------------------------------------------------- - - real(r8) :: gpp_tstep ! Gross Primary Production (see above *) - real(r8) :: gpp_acc - real(r8) :: gpp_acc_hold - - real(r8) :: npp_tstep ! Net Primary Production (see above *) - real(r8) :: npp_acc - real(r8) :: npp_acc_hold - - real(r8) :: resp_tstep ! Autotrophic respiration (see above *) - real(r8) :: resp_acc - real(r8) :: resp_acc_hold - - real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon at each indiv/timestep [ppm] - real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon at each indiv/day - ! at the end of a day [ppm] - - ! The following four biophysical rates are assumed to be at the canopy top, at reference temp 25degC, - ! and based on the leaf age weighted average of the PFT parameterized values. - ! The last condition is why it is dynamic and tied to the cohort - - real(r8) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] - real(r8) :: jmax25top ! maximum electron transport rate at canopy top and 25degC [umol electrons/m2/s] - real(r8) :: tpu25top ! triose phosphate utilization rate at canopy top and 25degC [umol CO2/m2/s] - real(r8) :: kp25top ! initial slope of CO2 response curve (C4 plants) at 25C - - real(r8) :: ts_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/timestep] - real(r8) :: year_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/year] - - ! used for CNP - integer :: cnp_limiter ! which element is limiting growth [0 = none, 1 = C, 2 = N, 3 = P] - real(r8) :: cx_int ! time integration of the log of the relative carbon storage over relative nutrient - real(r8) :: ema_dcxdt ! derivative of the log of the relative carbon storage over relative nutrient - real(r8) :: cx0 ! value on the previous time-step of log of the relative carbon storage over - ! relative nutrient - real(r8) :: nc_repro ! N:C ratio of a new recruit, used also for defining reproductive stoich - real(r8) :: pc_repro ! P:C ratio of a new recruit - - ! Nutrient Fluxes (if N, P, etc. are turned on) - real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition - ! in soil [kgN/plant/day] - real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition - ! in soil [kgN/plant/day] - - real(r8) :: sym_nfix_daily ! accumulated symbiotic N fixation from the roots [kgN/indiv/day] - real(r8) :: sym_nfix_tstep ! symbiotic N fixation from the roots for the time-step [kgN/indiv/timestep] - - real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized NH4/NO3 in solution as well as - ! symbiotic fixation - real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition - ! in soil [kgP/plant/day] - - real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kgC/plant/day] - real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kgN/plant/day] - real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kgP/plant/day] - - real(r8) :: daily_n_demand ! daily amount of N demanded by the plant [kgN/plant/day] - real(r8) :: daily_p_demand ! daily amount of P demanded by the plant [kgN/plant/day] - - real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] - - !:.........................................................................: - - ! RESPIRATION COMPONENTS - real(r8) :: rdark ! dark respiration [kgC/indiv/s] - real(r8) :: resp_g_tstep ! growth respiration [kgC/indiv/timestep] - real(r8) :: resp_m ! maintenance respiration [kgC/indiv/timestep] - real(r8) :: resp_m_unreduced ! diagnostic-only unreduced maintenance respiration [kgC/indiv/timestep] - real(r8) :: resp_excess ! respiration of excess carbon [kgC/indiv/day] - real(r8) :: livestem_mr ! aboveground live stem maintenance respiration [kgC/indiv/s] - real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] - real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] - - !:.........................................................................: - - ! DAMAGE - real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] - - !:.........................................................................: - - ! MORTALITY - real(r8) :: dmort ! proportional mortality rate [/year] - - ! Mortality Rate Partitions - real(r8) :: bmort ! background mortality rate [indiv/year] - real(r8) :: cmort ! carbon starvation mortality rate [indiv/year] - real(r8) :: hmort ! hydraulic failure mortality rate [indiv/year] - real(r8) :: frmort ! freezing mortality rate [indiv/year] - real(r8) :: smort ! senesence mortality [indiv/year] - real(r8) :: asmort ! age senescence mortality [indiv/year] - real(r8) :: dgmort ! damage mortality [indiv/year] - - ! Logging Mortality Rate - ! Yi Xu & M. Huang - real(r8) :: lmort_direct ! directly logging rate [fraction/logging activity] - real(r8) :: lmort_collateral ! collaterally damaged rate [fraction/logging activity] - real(r8) :: lmort_infra ! mechanically damaged rate [fraction/logging activity] - real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation - ! (i.e. they are moved to newly-anthro-disturbed secondary - ! forest patch) [fraction/logging activity] - - !:.........................................................................: - - ! NITROGEN POOLS - ! -------------------------------------------------------------------------- - ! Nitrogen pools are not prognostic in the current implementation. - ! They are diagnosed during photosynthesis using a simple C2N parameter. - ! Local values are used in that routine. - ! -------------------------------------------------------------------------- - - !:.........................................................................: - - ! GROWTH DERIVIATIVES - real(r8) :: dndt ! time derivative of cohort size [n/year] - real(r8) :: dhdt ! time derivative of height [m/year] - real(r8) :: ddbhdt ! time derivative of dbh [cm/year] - real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] - - !:.........................................................................: - - ! FIRE - real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] - real(r8) :: cambial_mort ! probability that trees dies due to cambial charring [0-1] - ! (conditional on the tree being subjected to the fire) - real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1] - ! (conditional on the tree being subjected to the fire) - real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] - - !:.........................................................................: - - ! HYDRAULICS - type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 - - !:.........................................................................: - - contains - - procedure :: init - procedure :: dump - procedure :: nan_values - procedure :: zero_values - procedure :: CanUpperUnder - - end type fates_cohort_type - !************************************ !** Patch type structure ** !************************************ @@ -859,13 +631,7 @@ module EDTypesMod public :: val_check_ed_vars public :: dump_site public :: dump_patch - public :: dump_cohort_hydr - public :: InitPRTBoundaryConditions contains - - ! ===================================================================================== - - ! ===================================================================================== @@ -911,474 +677,9 @@ subroutine ZeroMassBalFlux(this) return end subroutine ZeroMassBalFlux - ! ===================================================================================== - - subroutine init(this, prt) - ! - ! DESCRIPTION: - ! Create new cohort and set default values for all variables - ! - - ! ARGUMENTS: - class(fates_cohort_type), intent(inout), target :: this - class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object - - call this%nan_values() ! make everything in the cohort not-a-number - call this%zero_values() ! zero things that need to be zeroed - - ! point to the PARTEH object - this%prt => prt - - ! The PARTEH cohort object should be allocated and already - ! initialized in this routine. - call this%prt%CheckInitialConditions() - - call InitPRTBoundaryConditions(this) - - ! new cohorts do not have mortality rates, nor have they moved any - ! carbon when they are created. They will bias our statistics - ! until they have experienced a full day. We need a newly recruited flag. - ! This flag will be set to false after it has experienced - ! growth, disturbance and mortality. - this%isnew = .true. - - end subroutine init - - !:.........................................................................: - - subroutine InitPRTBoundaryConditions(new_cohort) - - ! Set the boundary conditions that flow in an out of the PARTEH - ! allocation hypotheses. Each of these calls to "RegsterBC" are simply - ! setting pointers. - ! For instance, if the hypothesis wants to know what - ! the DBH of the plant is, then we pass in the dbh as an argument (new_cohort%dbh), - ! and also tell it which boundary condition we are talking about (which is - ! defined by an integer index (ac_bc_inout_id_dbh) - ! - ! Again, elaborated Example: - ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index - ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" - ! that is classified as input and output "inout". - ! See PRTAllometricCarbonMod.F90 to track its usage. - ! bc_rval is used as the optional argument identifyer to specify a real - ! value boundary condition. - ! bc_ival is used as the optional argument identifyer to specify an integer - ! value boundary condition. - - use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & - ac_bc_in_id_cdamage, ac_bc_in_id_pft, & - ac_bc_in_id_ctrim, ac_bc_in_id_lstat - use PRTAllometricCNPMod, only : acnp_bc_in_id_pft, acnp_bc_in_id_ctrim, & - acnp_bc_in_id_lstat, acnp_bc_in_id_netdc, & - acnp_bc_in_id_netdc, acnp_bc_in_id_nc_repro, & - acnp_bc_in_id_pc_repro, acnp_bc_in_id_cdamage, & - acnp_bc_inout_id_dbh, acnp_bc_inout_id_resp_excess, & - acnp_bc_inout_id_l2fr, acnp_bc_inout_id_cx_int, & - acnp_bc_inout_id_emadcxdt, acnp_bc_inout_id_cx0, & - acnp_bc_inout_id_netdn, acnp_bc_inout_id_netdp, & - acnp_bc_out_id_cefflux, acnp_bc_out_id_nefflux, & - acnp_bc_out_id_pefflux, acnp_bc_out_id_limiter - - type(fates_cohort_type), intent(inout), target :: new_cohort - - select case(hlm_parteh_mode) - case (prt_carbon_allom_hyp) - - ! Register boundary conditions for the Carbon Only Allometric Hypothesis - - call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_dbh,bc_rval = new_cohort%dbh) - call new_cohort%prt%RegisterBCInOut(ac_bc_inout_id_netdc,bc_rval = new_cohort%npp_acc) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_pft,bc_ival = new_cohort%pft) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) - call new_cohort%prt%RegisterBCIn(ac_bc_in_id_lstat,bc_ival = new_cohort%status_coh) - - case (prt_cnp_flex_allom_hyp) - - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pft,bc_ival = new_cohort%pft) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_ctrim,bc_rval = new_cohort%canopy_trim) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_lstat,bc_ival = new_cohort%status_coh) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval = new_cohort%npp_acc) - - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_nc_repro,bc_rval = new_cohort%nc_repro) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_pc_repro,bc_rval = new_cohort%pc_repro) - call new_cohort%prt%RegisterBCIn(acnp_bc_in_id_cdamage,bc_ival = new_cohort%crowndamage) - - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_dbh,bc_rval = new_cohort%dbh) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess,bc_rval = new_cohort%resp_excess) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr,bc_rval = new_cohort%l2fr) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int,bc_rval = new_cohort%cx_int) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt,bc_rval = new_cohort%ema_dcxdt) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_cx0,bc_rval = new_cohort%cx0) - - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval = new_cohort%daily_n_gain) - call new_cohort%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval = new_cohort%daily_p_gain) - - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval = new_cohort%daily_c_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval = new_cohort%daily_n_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval = new_cohort%daily_p_efflux) - call new_cohort%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival = new_cohort%cnp_limiter) - - case DEFAULT - - write(fates_log(),*) 'You specified an unknown PRT module' - write(fates_log(),*) 'Aborting' - call endrun(msg=errMsg(sourcefile, __LINE__)) - - end select - - - end subroutine InitPRTBoundaryConditions - - - subroutine nan_values(this) - ! - ! DESCRIPTION: - ! make all the cohort variables NaN or unset so they aren't used before defined - ! - - ! USES: - use FatesConstantsMod, only : fates_unset_int - use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) - - ! ARGUMENTS: - class(fates_cohort_type), intent(inout) :: this - - ! set pointers to null - this%taller => null() - this%shorter => null() - this%prt => null() - this%co_hydr => null() - nullify(this%taller) - nullify(this%shorter) - nullify(this%prt) - nullify(this%co_hydr) - - ! VEGETATION STRUCTURE - this%l2fr = nan - this%pft = fates_unset_int - this%n = nan - this%dbh = nan - this%coage = nan - this%hite = nan - this%indexnumber = fates_unset_int - this%canopy_layer = fates_unset_int - this%canopy_layer_yesterday = nan - this%crowndamage = fates_unset_int - this%g_sb_laweight = nan - this%canopy_trim = nan - this%leaf_cost = nan - this%excl_weight = nan - this%prom_weight = nan - this%nv = fates_unset_int - this%status_coh = fates_unset_int - this%c_area = nan - this%treelai = nan - this%treesai = nan - this%isnew = .false. - this%size_class = fates_unset_int - this%coage_class = fates_unset_int - this%size_by_pft_class = fates_unset_int - this%coage_by_pft_class = fates_unset_int - this%size_class_lasttimestep = fates_unset_int - - ! CARBON AND NUTRIENT FLUXES - this%gpp_tstep = nan - this%gpp_acc = nan - this%gpp_acc_hold = nan - this%npp_tstep = nan - this%npp_acc = nan - this%npp_acc_hold = nan - this%resp_tstep = nan - this%resp_acc = nan - this%resp_acc_hold = nan - this%c13disc_clm = nan - this%c13disc_acc = nan - this%vcmax25top = nan - this%jmax25top = nan - this%tpu25top = nan - this%kp25top = nan - this%year_net_uptake(:) = nan - this%ts_net_uptake(:) = nan - this%cnp_limiter = fates_unset_int - this%cx_int = nan - this%ema_dcxdt = nan - this%cx0 = nan - this%nc_repro = nan - this%pc_repro = nan - this%daily_nh4_uptake = nan - this%daily_no3_uptake = nan - this%sym_nfix_daily = nan - this%sym_nfix_tstep = nan - this%daily_n_gain = nan - this%daily_p_gain = nan - this%daily_c_efflux = nan - this%daily_n_efflux = nan - this%daily_p_efflux = nan - this%daily_n_demand = nan - this%daily_p_demand = nan - this%seed_prod = nan - - ! RESPIRATION COMPONENTS - this%rdark = nan - this%resp_g_tstep = nan - this%resp_m = nan - this%resp_m_unreduced = nan - this%resp_excess = nan - this%livestem_mr = nan - this%livecroot_mr = nan - this%froot_mr = nan - - ! DAMAGE - this%branch_frac = nan - - ! MORTALITY - this%dmort = nan - this%bmort = nan - this%cmort = nan - this%frmort = nan - this%smort = nan - this%asmort = nan - this%dgmort = nan - this%lmort_direct = nan - this%lmort_collateral = nan - this%lmort_infra = nan - this%l_degrad = nan - - ! GROWTH DERIVATIVES - this%dndt = nan - this%dhdt = nan - this%ddbhdt = nan - this%dbdeaddt = nan - - ! FIRE - this%fraction_crown_burned = nan - this%cambial_mort = nan - this%crownfire_mort = nan - this%fire_mort = nan - - end subroutine nan_values - - !:.........................................................................: - - subroutine zero_values(this) - ! - ! DESCRIPTION: - ! Zero variables that need to be accounted for if this cohort is altered - ! before they are defined. - ! - ! ARGUMENTS - class(fates_cohort_type), intent(inout) :: this - - !this%l2fr - !this%pft - !this%n - !this%dbh - !this%coage - !this%hite - !this%indexnumber - !this%canopy_layer - !this%canopy_layer_yesterday - !this%crowndamage - this%g_sb_laweight = 0._r8 - !this%canopy_trim - this%leaf_cost = 0._r8 - this%excl_weight = 0._r8 - this%prom_weight = 0._r8 - this%nv = 0 - this%status_coh = 0 - !this%c_area - !this%treelai - this%treesai = 0._r8 - this%size_class = 1 - this%coage_class = 1 - !this%size_by_pft_class - !this%coage_by_pft_class - this%size_class_lasttimestep = 0 - this%gpp_tstep = 0._r8 - this%gpp_acc = 0._r8 - this%gpp_acc_hold = 0._r8 - this%npp_tstep = 0._r8 - this%npp_acc = 0._r8 - this%npp_acc_hold = 0._r8 - this%resp_tstep = 0._r8 - this%resp_acc = 0._r8 - this%resp_acc_hold = 0._r8 - this%c13disc_clm = 0._r8 - this%c13disc_acc = 0._r8 - !this%vcmax25top - !this%jmax25top - !this%tpu25top - !this%kp25top - this%ts_net_uptake(:) = 0._r8 - this%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. - !this%cnp_limiter - !this%cx_int - !this%ema_dcxdt - !this%cx0 - !this%nc_repro - !this%pc_repro - this%daily_nh4_uptake = 0._r8 - this%daily_no3_uptake = 0._r8 - - ! fixation is also integrated over the course of the day and must be - ! zeroed upon creation and after plant resource allocation - this%sym_nfix_daily = 0._r8 - this%daily_n_gain = 0._r8 - this%daily_p_gain = 0._r8 - - ! daily nutrient fluxes are INTEGRATED over the course of the day. - ! These variables MUST be zerod upon creation AND after allocation. - ! These variables exist in carbon-only mode but are not used. - this%daily_c_efflux = 0._r8 - this%daily_n_efflux = 0._r8 - this%daily_p_efflux = 0._r8 - - ! initialize these as negative - this%daily_n_demand = -9._r8 - this%daily_p_demand = -9._r8 - this%seed_prod = 0._r8 - this%rdark = 0._r8 - this%resp_g_tstep = 0._r8 - this%resp_m = 0._r8 - this%resp_m_unreduced = 0._r8 - this%resp_excess = 0._r8 - this%livestem_mr = 0._r8 - this%livecroot_mr = 0._r8 - this%froot_mr = 0._r8 - !this%branch_frac - this%dmort = 0._r8 - this%lmort_direct = 0._r8 - this%lmort_collateral = 0._r8 - this%lmort_infra = 0._r8 - this%l_degrad = 0._r8 - this%fraction_crown_burned = 0._r8 - this%cambial_mort = 0._r8 - this%crownfire_mort = 0._r8 - this%fire_mort = 0._r8 - - end subroutine zero_values - - !:.........................................................................: - - function CanUpperUnder(this) result(can_position) - ! - ! DESCRIPTION: - ! This simple function is used to determine if a cohort's crown position - ! is in the upper portion (ie the canopy) or the understory. This - ! differentiation is only used for diagnostic purposes. Functionally, - ! the model uses the canopy layer position, which may have more than - ! two layers at any given time. Utlimately, every plant that is not in - ! the top layer (canopy), is considered understory. - ! - - ! ARGUMENTS: - class(fates_cohort_type) :: this ! current cohort of interest - integer :: can_position ! canopy position - - if (this%canopy_layer == 1)then - can_position = ican_upper - else - can_position = ican_ustory - end if - - end function CanUpperUnder - - !:.........................................................................: - - subroutine dump(this) - ! - ! DESCRIPTION: - ! Print out attributes of a cohort - ! - - ! ARGUMENTS: - class(fates_cohort_type), intent(in), target :: this - - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) ' Dumping Cohort Information ' - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'co%pft = ', this%pft - write(fates_log(),*) 'co%n = ', this%n - write(fates_log(),*) 'co%dbh = ', this%dbh - write(fates_log(),*) 'co%hite = ', this%hite - write(fates_log(),*) 'co%crowndamage = ', this%crowndamage - write(fates_log(),*) 'co%coage = ', this%coage - write(fates_log(),*) 'co%l2fr = ', this%l2fr - write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) - write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) - write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) - write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) - write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) - write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) - write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight - write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost - write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer - write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday - write(fates_log(),*) 'co%nv = ', this%nv - write(fates_log(),*) 'co%status_coh = ', this%status_coh - write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim - write(fates_log(),*) 'co%excl_weight = ', this%excl_weight - write(fates_log(),*) 'co%prom_weight = ', this%prom_weight - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class - write(fates_log(),*) 'co%coage_class = ', this%coage_class - write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class - write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold - write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc - write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep - write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold - write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep - write(fates_log(),*) 'co%npp_acc = ', this%npp_acc - write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep - write(fates_log(),*) 'co%resp_acc = ', this%resp_acc - write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold - write(fates_log(),*) 'co%rdark = ', this%rdark - write(fates_log(),*) 'co%resp_m = ', this%resp_m - write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep - write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr - write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr - write(fates_log(),*) 'co%froot_mr = ', this%froot_mr - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%treelai = ', this%treelai - write(fates_log(),*) 'co%treesai = ', this%treesai - write(fates_log(),*) 'co%c_area = ', this%c_area - write(fates_log(),*) 'co%cmort = ', this%cmort - write(fates_log(),*) 'co%bmort = ', this%bmort - write(fates_log(),*) 'co%smort = ', this%smort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%hmort = ', this%hmort - write(fates_log(),*) 'co%frmort = ', this%frmort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct - write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral - write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra - write(fates_log(),*) 'co%isnew = ', this%isnew - write(fates_log(),*) 'co%dndt = ', this%dndt - write(fates_log(),*) 'co%dhdt = ', this%dhdt - write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt - write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt - write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned - write(fates_log(),*) 'co%fire_mort = ', this%fire_mort - write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort - write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class - - if (associated(this%co_hydr)) call dump_cohort_hydr(this) - - write(fates_log(),*) '----------------------------------------' - - return - -end subroutine dump - -!:...........................................................................: - + subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) ! ---------------------------------------------------------------------------------- @@ -1512,24 +813,6 @@ end subroutine dump_patch ! ===================================================================================== - - - ! ===================================================================================== - subroutine dump_cohort_hydr(ccohort) - - - type(fates_cohort_type),intent(in),target :: ccohort - type(ed_cohort_hydr_type), pointer :: ccohort_hydr - ccohort_hydr => ccohort%co_hydr - - write(fates_log(),*) '--------------------------------------------' - write(fates_log(),*) ' Dumping Cohort Plant Hydraulic Information ' - write(fates_log(),*) 'ccohort_hydr%th_aroot(:) = ', ccohort_hydr%th_aroot(:) - write(fates_log(),*) 'ccohort_hydr%v_aroot_layer_init(:) = ', ccohort_hydr%v_aroot_layer_init(:) - write(fates_log(),*) 'ccohort_hydr%v_aroot_layer(:) = ', ccohort_hydr%v_aroot_layer(:) - write(fates_log(),*) '--------------------------------------------' - return - end subroutine dump_cohort_hydr end module EDTypesMod diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 new file mode 100644 index 0000000000..9c7a1f5865 --- /dev/null +++ b/main/FatesCohortMod.F90 @@ -0,0 +1,693 @@ +module FatesCohortMod + + use FatesConstantsMod, only : r8 => fates_r8 + use FatesConstantsMod, only : fates_unset_int + use FatesConstantsMod, only : ican_upper, ican_ustory + use EDParamsMod, only : nlevleaf + use FatesGlobals, only : endrun => fates_endrun + use FatesGlobals, only : fates_log + use PRTGenericMod, only : prt_vartypes + use PRTGenericMod, only : prt_carbon_allom_hyp + use PRTGenericMod, only : prt_cnp_flex_allom_hyp + use PRTGenericMod, only : leaf_organ, fnrt_organ, sapw_organ + use PRTGenericMod, only : repro_organ, store_organ, struct_organ + use PRTGenericMod, only : carbon12_element + use FatesHydraulicsMemMod, only : ed_cohort_hydr_type + use FatesInterfaceTypesMod, only : hlm_parteh_mode + use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & + ac_bc_in_id_cdamage, ac_bc_in_id_pft, & + ac_bc_in_id_ctrim, ac_bc_in_id_lstat + use PRTAllometricCNPMod, only : acnp_bc_in_id_pft, acnp_bc_in_id_ctrim, & + acnp_bc_in_id_lstat, acnp_bc_in_id_netdc, & + acnp_bc_in_id_netdc, acnp_bc_in_id_nc_repro, & + acnp_bc_in_id_pc_repro, acnp_bc_in_id_cdamage, & + acnp_bc_inout_id_dbh, acnp_bc_inout_id_resp_excess, & + acnp_bc_inout_id_l2fr, acnp_bc_inout_id_cx_int, & + acnp_bc_inout_id_emadcxdt, acnp_bc_inout_id_cx0, & + acnp_bc_inout_id_netdn, acnp_bc_inout_id_netdp, & + acnp_bc_out_id_cefflux, acnp_bc_out_id_nefflux, & + acnp_bc_out_id_pefflux, acnp_bc_out_id_limiter + + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + use shr_log_mod, only : errMsg => shr_log_errMsg + + implicit none + private + + ! PARAMETERS + character(len=*), parameter, private :: sourcefile = __FILE__ + + ! FATES COHORT TYPE + type, public :: fates_cohort_type + + ! POINTERS + type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort + type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort + + !:.........................................................................: + + ! Multi-species, multi-organ Plant Reactive Transport (PRT) + ! Contains carbon and nutrient state variables for various plant organs + class(prt_vartypes), pointer :: prt + real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant + ! in carbon only simulationss, and is set by the + ! allom_l2fr_min parameter. In nutrient + ! enabled simulations, this is dynamic, will + ! vary between allom_l2fr_min and allom_l2fr_max + ! parameters, with a tendency driven by + ! nutrient storage) [kg root / kg leaf] + + !:.........................................................................: + + ! VEGETATION STRUCTURE + + integer :: pft ! pft index + real(r8) :: n ! number of individuals in cohort per 'area' (10000m2 default) [/m2] + real(r8) :: dbh ! diameter at breast height [cm] + real(r8) :: coage ! age [years] + real(r8) :: hite ! height [m] + integer :: indexnumber ! unique number for each cohort (within clump?) + integer :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] + real(r8) :: canopy_layer_yesterday ! recent canopy status of cohort [1 = canopy, 2 = understorey, etc.] + ! real to be conservative during fusion + integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] + real(r8) :: g_sb_laweight ! total conductance (stomata + boundary layer) of the cohort + ! weighted by its leaf area [m/s]*[m2] + real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] + real(r8) :: leaf_cost ! how much does it cost to maintain leaves [kgC/m2/year] + real(r8) :: excl_weight ! how much of this cohort is demoted each year, as a proportion of all cohorts + real(r8) :: prom_weight ! how much of this cohort is promoted each year, as a proportion of all cohorts + integer :: nv ! number of leaf layers + integer :: status_coh ! growth status of plant [2 = leaves on , 1 = leaves off] + real(r8) :: c_area ! areal extent of canopy [m2] + real(r8) :: treelai ! lai of an individual within cohort leaf area [m2 leaf area/m2 crown area] + real(r8) :: treesai ! stem area index of an individual within cohort [m2 stem area/m2 crown area] + logical :: isnew ! flag to signify a new cohort - new cohorts have not experienced + ! npp or mortality and should therefore not be fused or averaged + integer :: size_class ! index that indicates which diameter size bin the cohort currently resides in + ! this is used for history output. We maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_class ! index that indicates which age bin the cohort currently resides in + ! (used for history output) + integer :: size_by_pft_class ! index that indicates the cohorts position of the joint size-class x functional + ! type classification. We also maintain this in the main cohort memory + ! because we don't want to continually re-calculate the cohort's position when + ! performing size diagnostics at high-frequency calls + integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT + integer :: size_class_lasttimestep ! size class of the cohort at the last time step + + !:.........................................................................: + + ! CARBON AND NUTRIENT FLUXES + + ! -------------------------------------------------------------------------- + ! NPP, GPP and RESP: Instantaneous, accumulated and accumulated-hold types* + ! + ! _tstep: The instantaneous estimate that is calculated at each rapid plant biophysics + ! time-step (ie photosynthesis, sub-hourly) [kgC/indiv/timestep] + ! _acc: The accumulation of the _tstep variable from the beginning to ending of + ! the dynamics time-scale. This variable is zero'd during initialization and + ! after the dynamics call-sequence is completed. [kgC/indiv/day] + ! _acc_hold: While _acc is zero'd after the dynamics call sequence and then integrated, + ! _acc_hold "holds" the integrated value until the next time dynamics is + ! called. This is necessary for restarts. This variable also has units + ! converted to a useful rate [kgC/indiv/yr] + ! -------------------------------------------------------------------------- + + real(r8) :: gpp_tstep ! Gross Primary Production (see above *) + real(r8) :: gpp_acc + real(r8) :: gpp_acc_hold + + real(r8) :: npp_tstep ! Net Primary Production (see above *) + real(r8) :: npp_acc + real(r8) :: npp_acc_hold + + real(r8) :: resp_tstep ! Autotrophic respiration (see above *) + real(r8) :: resp_acc + real(r8) :: resp_acc_hold + + real(r8) :: c13disc_clm ! carbon 13 discrimination in new synthesized carbon at each indiv/timestep [ppm] + real(r8) :: c13disc_acc ! carbon 13 discrimination in new synthesized carbon at each indiv/day + ! at the end of a day [ppm] + + ! The following four biophysical rates are assumed to be at the canopy top, at reference temp 25degC, + ! and based on the leaf age weighted average of the PFT parameterized values. + ! The last condition is why it is dynamic and tied to the cohort + + real(r8) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: jmax25top ! maximum electron transport rate at canopy top and 25degC [umol electrons/m2/s] + real(r8) :: tpu25top ! triose phosphate utilization rate at canopy top and 25degC [umol CO2/m2/s] + real(r8) :: kp25top ! initial slope of CO2 response curve (C4 plants) at 25C + + real(r8) :: ts_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/timestep] + real(r8) :: year_net_uptake(nlevleaf) ! net uptake of leaf layers [kgC/m2/year] + + ! used for CNP + integer :: cnp_limiter ! which element is limiting growth [0 = none, 1 = C, 2 = N, 3 = P] + real(r8) :: cx_int ! time integration of the log of the relative carbon storage over relative nutrient + real(r8) :: ema_dcxdt ! derivative of the log of the relative carbon storage over relative nutrient + real(r8) :: cx0 ! value on the previous time-step of log of the relative carbon storage over + ! relative nutrient + real(r8) :: nc_repro ! N:C ratio of a new recruit, used also for defining reproductive stoich + real(r8) :: pc_repro ! P:C ratio of a new recruit + + ! Nutrient Fluxes (if N, P, etc. are turned on) + real(r8) :: daily_nh4_uptake ! integrated daily uptake of mineralized ammonium through competitive acquisition + ! in soil [kgN/plant/day] + real(r8) :: daily_no3_uptake ! integrated daily uptake of mineralized nitrate through competitive acquisition + ! in soil [kgN/plant/day] + + real(r8) :: sym_nfix_daily ! accumulated symbiotic N fixation from the roots [kgN/indiv/day] + real(r8) :: sym_nfix_tstep ! symbiotic N fixation from the roots for the time-step [kgN/indiv/timestep] + + real(r8) :: daily_n_gain ! sum of fixation and uptake of mineralized NH4/NO3 in solution as well as + ! symbiotic fixation + real(r8) :: daily_p_gain ! integrated daily uptake of mineralized P through competitive acquisition + ! in soil [kgP/plant/day] + + real(r8) :: daily_c_efflux ! daily mean efflux of excess carbon from roots into labile pool [kgC/plant/day] + real(r8) :: daily_n_efflux ! daily mean efflux of excess nitrogen from roots into labile pool [kgN/plant/day] + real(r8) :: daily_p_efflux ! daily mean efflux of excess phophorus from roots into labile pool [kgP/plant/day] + + real(r8) :: daily_n_demand ! daily amount of N demanded by the plant [kgN/plant/day] + real(r8) :: daily_p_demand ! daily amount of P demanded by the plant [kgN/plant/day] + + real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] + + !:.........................................................................: + + ! RESPIRATION COMPONENTS + real(r8) :: rdark ! dark respiration [kgC/indiv/s] + real(r8) :: resp_g_tstep ! growth respiration [kgC/indiv/timestep] + real(r8) :: resp_m ! maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_m_unreduced ! diagnostic-only unreduced maintenance respiration [kgC/indiv/timestep] + real(r8) :: resp_excess ! respiration of excess carbon [kgC/indiv/day] + real(r8) :: livestem_mr ! aboveground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] + real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] + + !:.........................................................................: + + ! DAMAGE + real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] + + !:.........................................................................: + + ! MORTALITY + real(r8) :: dmort ! proportional mortality rate [/year] + + ! Mortality Rate Partitions + real(r8) :: bmort ! background mortality rate [indiv/year] + real(r8) :: cmort ! carbon starvation mortality rate [indiv/year] + real(r8) :: hmort ! hydraulic failure mortality rate [indiv/year] + real(r8) :: frmort ! freezing mortality rate [indiv/year] + real(r8) :: smort ! senesence mortality [indiv/year] + real(r8) :: asmort ! age senescence mortality [indiv/year] + real(r8) :: dgmort ! damage mortality [indiv/year] + + ! Logging Mortality Rate + ! Yi Xu & M. Huang + real(r8) :: lmort_direct ! directly logging rate [fraction/logging activity] + real(r8) :: lmort_collateral ! collaterally damaged rate [fraction/logging activity] + real(r8) :: lmort_infra ! mechanically damaged rate [fraction/logging activity] + real(r8) :: l_degrad ! rate of trees that are not killed but suffer from forest degradation + ! (i.e. they are moved to newly-anthro-disturbed secondary + ! forest patch) [fraction/logging activity] + + !:.........................................................................: + + ! NITROGEN POOLS + ! -------------------------------------------------------------------------- + ! Nitrogen pools are not prognostic in the current implementation. + ! They are diagnosed during photosynthesis using a simple C2N parameter. + ! Local values are used in that routine. + ! -------------------------------------------------------------------------- + + !:.........................................................................: + + ! GROWTH DERIVIATIVES + real(r8) :: dndt ! time derivative of cohort size [n/year] + real(r8) :: dhdt ! time derivative of height [m/year] + real(r8) :: ddbhdt ! time derivative of dbh [cm/year] + real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] + + !:.........................................................................: + + ! FIRE + real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] + real(r8) :: cambial_mort ! probability that trees dies due to cambial charring [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: crownfire_mort ! probability of tree post-fire mortality from crown scorch [0-1] + ! (conditional on the tree being subjected to the fire) + real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] + + !:.........................................................................: + + ! HYDRAULICS + type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 + + !:.........................................................................: + + contains + + procedure :: init + procedure :: dump + procedure :: nan_values + procedure :: zero_values + procedure :: CanUpperUnder + procedure :: InitPRTBoundaryConditions + + end type fates_cohort_type + + contains + + subroutine init(this, prt) + ! + ! DESCRIPTION: + ! Create new cohort and set default values for all variables + ! + + ! ARGUMENTS: + class(fates_cohort_type), intent(inout), target :: this + class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object + + call this%nan_values() ! make everything in the cohort not-a-number + call this%zero_values() ! zero things that need to be zeroed + + ! point to the PARTEH object + this%prt => prt + + ! The PARTEH cohort object should be allocated and already + ! initialized in this routine. + call this%prt%CheckInitialConditions() + + call this%InitPRTBoundaryConditions() + + ! new cohorts do not have mortality rates, nor have they moved any + ! carbon when they are created. They will bias our statistics + ! until they have experienced a full day. We need a newly recruited flag. + ! This flag will be set to false after it has experienced + ! growth, disturbance and mortality. + this%isnew = .true. + + end subroutine init + + !:.........................................................................: + + subroutine nan_values(this) + ! + ! DESCRIPTION: + ! make all the cohort variables NaN or unset so they aren't used before defined + ! + + ! ARGUMENTS: + class(fates_cohort_type), intent(inout) :: this + + ! set pointers to null + this%taller => null() + this%shorter => null() + this%prt => null() + this%co_hydr => null() + nullify(this%taller) + nullify(this%shorter) + nullify(this%prt) + nullify(this%co_hydr) + + ! VEGETATION STRUCTURE + this%l2fr = nan + this%pft = fates_unset_int + this%n = nan + this%dbh = nan + this%coage = nan + this%hite = nan + this%indexnumber = fates_unset_int + this%canopy_layer = fates_unset_int + this%canopy_layer_yesterday = nan + this%crowndamage = fates_unset_int + this%g_sb_laweight = nan + this%canopy_trim = nan + this%leaf_cost = nan + this%excl_weight = nan + this%prom_weight = nan + this%nv = fates_unset_int + this%status_coh = fates_unset_int + this%c_area = nan + this%treelai = nan + this%treesai = nan + this%isnew = .false. + this%size_class = fates_unset_int + this%coage_class = fates_unset_int + this%size_by_pft_class = fates_unset_int + this%coage_by_pft_class = fates_unset_int + this%size_class_lasttimestep = fates_unset_int + + ! CARBON AND NUTRIENT FLUXES + this%gpp_tstep = nan + this%gpp_acc = nan + this%gpp_acc_hold = nan + this%npp_tstep = nan + this%npp_acc = nan + this%npp_acc_hold = nan + this%resp_tstep = nan + this%resp_acc = nan + this%resp_acc_hold = nan + this%c13disc_clm = nan + this%c13disc_acc = nan + this%vcmax25top = nan + this%jmax25top = nan + this%tpu25top = nan + this%kp25top = nan + this%year_net_uptake(:) = nan + this%ts_net_uptake(:) = nan + this%cnp_limiter = fates_unset_int + this%cx_int = nan + this%ema_dcxdt = nan + this%cx0 = nan + this%nc_repro = nan + this%pc_repro = nan + this%daily_nh4_uptake = nan + this%daily_no3_uptake = nan + this%sym_nfix_daily = nan + this%sym_nfix_tstep = nan + this%daily_n_gain = nan + this%daily_p_gain = nan + this%daily_c_efflux = nan + this%daily_n_efflux = nan + this%daily_p_efflux = nan + this%daily_n_demand = nan + this%daily_p_demand = nan + this%seed_prod = nan + + ! RESPIRATION COMPONENTS + this%rdark = nan + this%resp_g_tstep = nan + this%resp_m = nan + this%resp_m_unreduced = nan + this%resp_excess = nan + this%livestem_mr = nan + this%livecroot_mr = nan + this%froot_mr = nan + + ! DAMAGE + this%branch_frac = nan + + ! MORTALITY + this%dmort = nan + this%bmort = nan + this%cmort = nan + this%frmort = nan + this%smort = nan + this%asmort = nan + this%dgmort = nan + this%lmort_direct = nan + this%lmort_collateral = nan + this%lmort_infra = nan + this%l_degrad = nan + + ! GROWTH DERIVATIVES + this%dndt = nan + this%dhdt = nan + this%ddbhdt = nan + this%dbdeaddt = nan + + ! FIRE + this%fraction_crown_burned = nan + this%cambial_mort = nan + this%crownfire_mort = nan + this%fire_mort = nan + + end subroutine nan_values + + !:.........................................................................: + + subroutine zero_values(this) + ! + ! DESCRIPTION: + ! Zero variables that need to be accounted for if this cohort is altered + ! before they are defined. + ! + ! ARGUMENTS + class(fates_cohort_type), intent(inout) :: this + + this%g_sb_laweight = 0._r8 + + this%leaf_cost = 0._r8 + this%excl_weight = 0._r8 + this%prom_weight = 0._r8 + this%nv = 0 + this%status_coh = 0 + + this%treesai = 0._r8 + this%size_class = 1 + this%coage_class = 1 + + this%size_class_lasttimestep = 0 + this%gpp_tstep = 0._r8 + this%gpp_acc = 0._r8 + this%gpp_acc_hold = 0._r8 + this%npp_tstep = 0._r8 + this%npp_acc = 0._r8 + this%npp_acc_hold = 0._r8 + this%resp_tstep = 0._r8 + this%resp_acc = 0._r8 + this%resp_acc_hold = 0._r8 + this%c13disc_clm = 0._r8 + this%c13disc_acc = 0._r8 + + this%ts_net_uptake(:) = 0._r8 + this%year_net_uptake(:) = 999._r8 ! this needs to be 999, or trimming of new cohorts will break. + + this%daily_nh4_uptake = 0._r8 + this%daily_no3_uptake = 0._r8 + + ! fixation is also integrated over the course of the day and must be + ! zeroed upon creation and after plant resource allocation + this%sym_nfix_daily = 0._r8 + this%daily_n_gain = 0._r8 + this%daily_p_gain = 0._r8 + + ! daily nutrient fluxes are INTEGRATED over the course of the day. + ! These variables MUST be zerod upon creation AND after allocation. + ! These variables exist in carbon-only mode but are not used. + this%daily_c_efflux = 0._r8 + this%daily_n_efflux = 0._r8 + this%daily_p_efflux = 0._r8 + + ! initialize these as negative + this%daily_n_demand = -9._r8 + this%daily_p_demand = -9._r8 + this%seed_prod = 0._r8 + this%rdark = 0._r8 + this%resp_g_tstep = 0._r8 + this%resp_m = 0._r8 + this%resp_m_unreduced = 0._r8 + this%resp_excess = 0._r8 + this%livestem_mr = 0._r8 + this%livecroot_mr = 0._r8 + this%froot_mr = 0._r8 + + this%dmort = 0._r8 + this%lmort_direct = 0._r8 + this%lmort_collateral = 0._r8 + this%lmort_infra = 0._r8 + this%l_degrad = 0._r8 + this%fraction_crown_burned = 0._r8 + this%cambial_mort = 0._r8 + this%crownfire_mort = 0._r8 + this%fire_mort = 0._r8 + + end subroutine zero_values + + !:.........................................................................: + + subroutine InitPRTBoundaryConditions(this) + + ! Set the boundary conditions that flow in an out of the PARTEH + ! allocation hypotheses. Each of these calls to "RegsterBC" are simply + ! setting pointers. + ! For instance, if the hypothesis wants to know what + ! the DBH of the plant is, then we pass in the dbh as an argument (new_cohort%dbh), + ! and also tell it which boundary condition we are talking about (which is + ! defined by an integer index (ac_bc_inout_id_dbh) + ! + ! Again, elaborated Example: + ! "ac_bc_inout_id_dbh" is the unique integer that defines the object index + ! for the allometric carbon "ac" boundary condition "bc" for DBH "dbh" + ! that is classified as input and output "inout". + ! See PRTAllometricCarbonMod.F90 to track its usage. + ! bc_rval is used as the optional argument identifyer to specify a real + ! value boundary condition. + ! bc_ival is used as the optional argument identifyer to specify an integer + ! value boundary condition. + + class(fates_cohort_type), intent(inout) :: this + + select case(hlm_parteh_mode) + case (prt_carbon_allom_hyp) + + ! Register boundary conditions for the Carbon Only Allometric Hypothesis + + call this%prt%RegisterBCInOut(ac_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(ac_bc_inout_id_netdc, bc_rval=this%npp_acc) + call this%prt%RegisterBCIn(ac_bc_in_id_cdamage, bc_ival=this%crowndamage) + call this%prt%RegisterBCIn(ac_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(ac_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(ac_bc_in_id_lstat, bc_ival=this%status_coh) + + case (prt_cnp_flex_allom_hyp) + + ! Register boundary conditions for the CNP Allometric Hypothesis + + call this%prt%RegisterBCIn(acnp_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(acnp_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(acnp_bc_in_id_lstat, bc_ival=this%status_coh) + call this%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval=this%npp_acc) + + call this%prt%RegisterBCIn(acnp_bc_in_id_nc_repro, bc_rval=this%nc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_pc_repro, bc_rval=this%pc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_cdamage, bc_ival=this%crowndamage) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess, bc_rval=this%resp_excess) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr, bc_rval=this%l2fr) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int, bc_rval=this%cx_int) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt, bc_rval=this%ema_dcxdt) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx0, bc_rval=this%cx0) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval=this%daily_n_gain) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval=this%daily_p_gain) + + call this%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval=this%daily_c_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval=this%daily_n_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval=this%daily_p_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival=this%cnp_limiter) + + case DEFAULT + + write(fates_log(),*) 'You specified an unknown PRT module' + write(fates_log(),*) 'Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) + + end select + + end subroutine InitPRTBoundaryConditions + + !:.........................................................................: + + function CanUpperUnder(this) result(can_position) + ! + ! DESCRIPTION: + ! This simple function is used to determine if a cohort's crown position + ! is in the upper portion (ie the canopy) or the understory. This + ! differentiation is only used for diagnostic purposes. Functionally, + ! the model uses the canopy layer position, which may have more than + ! two layers at any given time. Utlimately, every plant that is not in + ! the top layer (canopy), is considered understory. + ! + + ! ARGUMENTS: + class(fates_cohort_type) :: this ! current cohort of interest + integer :: can_position ! canopy position + + if (this%canopy_layer == 1)then + can_position = ican_upper + else + can_position = ican_ustory + end if + + end function CanUpperUnder + + !:.........................................................................: + + subroutine dump(this) + ! + ! DESCRIPTION: + ! Print out attributes of a cohort + ! + + ! ARGUMENTS: + class(fates_cohort_type), intent(in), target :: this + + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) ' Dumping Cohort Information ' + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) 'co%pft = ', this%pft + write(fates_log(),*) 'co%n = ', this%n + write(fates_log(),*) 'co%dbh = ', this%dbh + write(fates_log(),*) 'co%hite = ', this%hite + write(fates_log(),*) 'co%crowndamage = ', this%crowndamage + write(fates_log(),*) 'co%coage = ', this%coage + write(fates_log(),*) 'co%l2fr = ', this%l2fr + write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) + write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) + write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) + write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) + write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) + write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) + write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight + write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost + write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer + write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday + write(fates_log(),*) 'co%nv = ', this%nv + write(fates_log(),*) 'co%status_coh = ', this%status_coh + write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim + write(fates_log(),*) 'co%excl_weight = ', this%excl_weight + write(fates_log(),*) 'co%prom_weight = ', this%prom_weight + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'co%coage_class = ', this%coage_class + write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class + write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold + write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc + write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep + write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold + write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep + write(fates_log(),*) 'co%npp_acc = ', this%npp_acc + write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep + write(fates_log(),*) 'co%resp_acc = ', this%resp_acc + write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold + write(fates_log(),*) 'co%rdark = ', this%rdark + write(fates_log(),*) 'co%resp_m = ', this%resp_m + write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep + write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr + write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr + write(fates_log(),*) 'co%froot_mr = ', this%froot_mr + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%treelai = ', this%treelai + write(fates_log(),*) 'co%treesai = ', this%treesai + write(fates_log(),*) 'co%c_area = ', this%c_area + write(fates_log(),*) 'co%cmort = ', this%cmort + write(fates_log(),*) 'co%bmort = ', this%bmort + write(fates_log(),*) 'co%smort = ', this%smort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%dgmort = ', this%dgmort + write(fates_log(),*) 'co%hmort = ', this%hmort + write(fates_log(),*) 'co%frmort = ', this%frmort + write(fates_log(),*) 'co%asmort = ', this%asmort + write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct + write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral + write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra + write(fates_log(),*) 'co%isnew = ', this%isnew + write(fates_log(),*) 'co%dndt = ', this%dndt + write(fates_log(),*) 'co%dhdt = ', this%dhdt + write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt + write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt + write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned + write(fates_log(),*) 'co%fire_mort = ', this%fire_mort + write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort + write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort + write(fates_log(),*) 'co%size_class = ', this%size_class + write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + + if (associated(this%co_hydr)) call this%co_hydr%dump() + + write(fates_log(),*) '----------------------------------------' + + return + + end subroutine dump + + !:.........................................................................: + +end module FatesCohortMod \ No newline at end of file diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index d865187294..a6bc033027 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -42,6 +42,10 @@ module FatesConstantsMod ! its leaves and should not be trying to allocate ! towards any growth. + integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy + integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers + ! (all layers that are not the top canopy layer) + ! Bareground label for no competition mode integer, parameter, public :: nocomp_bareground = 0 diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 79026ec3af..77af891d91 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -13,13 +13,13 @@ module FatesHistoryInterfaceMod use FatesGlobals , only : fates_log use FatesGlobals , only : endrun => fates_endrun use EDParamsMod , only : nclmax - use EDTypesMod , only : ican_upper + use FatesConstantsMod , only : ican_upper use PRTGenericMod , only : element_pos use PRTGenericMod , only : num_elements use PRTGenericMod , only : prt_cnp_flex_allom_hyp use EDTypesMod , only : site_fluxdiags_type use EDtypesMod , only : ed_site_type - use EDtypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDtypesMod , only : ed_patch_type use EDtypesMod , only : AREA use EDtypesMod , only : AREA_INV @@ -2105,8 +2105,8 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) use FatesLitterMod , only : nfsc use FatesLitterMod , only : ncwd - use EDtypesMod , only : ican_upper - use EDtypesMod , only : ican_ustory + use FatesConstantsMod , only : ican_upper + use FatesConstantsMod , only : ican_ustory use FatesSizeAgeTypeIndicesMod, only : get_sizeage_class_index use FatesSizeAgeTypeIndicesMod, only : get_sizeagepft_class_index use FatesSizeAgeTypeIndicesMod, only : get_agepft_class_index diff --git a/main/FatesHydraulicsMemMod.F90 b/main/FatesHydraulicsMemMod.F90 index 23f3f75482..22ade5f9b6 100644 --- a/main/FatesHydraulicsMemMod.F90 +++ b/main/FatesHydraulicsMemMod.F90 @@ -2,6 +2,7 @@ module FatesHydraulicsMemMod use FatesConstantsMod, only : r8 => fates_r8 use FatesConstantsMod, only : fates_unset_r8 + use FatesGlobals, only : fates_log use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) use FatesConstantsMod, only : itrue,ifalse use FatesHydroWTFMod, only : wrf_arr_type @@ -314,6 +315,7 @@ module FatesHydraulicsMemMod procedure :: AllocateHydrCohortArrays procedure :: DeallocateHydrCohortArrays + procedure :: dump end type ed_cohort_hydr_type @@ -363,6 +365,23 @@ end subroutine DeallocateHydrCohortArrays ! =================================================================================== + subroutine dump(this) + + class(ed_cohort_hydr_type), intent(in) :: this + + write(fates_log(),*) '--------------------------------------------' + write(fates_log(),*) ' Dumping Cohort Plant Hydraulic Information ' + write(fates_log(),*) 'ccohort_hydr%th_aroot(:) = ', this%th_aroot(:) + write(fates_log(),*) 'ccohort_hydr%v_aroot_layer_init(:) = ', this%v_aroot_layer_init(:) + write(fates_log(),*) 'ccohort_hydr%v_aroot_layer(:) = ', this%v_aroot_layer(:) + write(fates_log(),*) '--------------------------------------------' + + return + + end subroutine dump + + !:..........................................................................: + subroutine InitHydrSite(this,numpft,numlevsclass,hydr_solver_type,nlevsoil) ! Arguments diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index a51ea560c0..00d46563ab 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -30,7 +30,7 @@ module FatesInterfaceMod use EDTypesMod , only : numlevsoil_max use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : area_inv use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : itrue,ifalse diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index aba46250d6..a703958734 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -34,7 +34,7 @@ module FatesInventoryInitMod use FatesLitterMod , only : litter_type use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : fates_cohort_type + use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : area use FatesConstantsMod, only : leaves_on, leaves_off use PRTGenericMod , only : num_elements diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 246f988409..345bfde3f2 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -33,7 +33,6 @@ module FatesRestartInterfaceMod use PRTGenericMod, only : prt_global use PRTGenericMod, only : prt_cnp_flex_allom_hyp use EDCohortDynamicsMod, only : InitPRTObject - use EDTypesMod, only : InitPRTBoundaryConditions use FatesPlantHydraulicsMod, only : InitHydrCohort use FatesInterfaceTypesMod, only : nlevsclass use FatesInterfaceTypesMod, only : nlevdamage @@ -1811,7 +1810,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use FatesInterfaceTypesMod, only : numpft use EDTypesMod, only : ed_site_type - use EDTypesMod, only : fates_cohort_type + use FatesCohortMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type use EDParamsMod, only : maxSWb use EDParamsMod, only : nclmax @@ -2507,7 +2506,7 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) ! --------------------------------------------------------------------------------- use EDTypesMod, only : ed_site_type - use EDTypesMod, only : fates_cohort_type + use FatesCohortMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type use EDParamsMod, only : maxSWb use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch @@ -2706,7 +2705,7 @@ end subroutine create_patchcohort_structure subroutine get_restart_vectors(this, nc, nsites, sites) use EDTypesMod, only : ed_site_type - use EDTypesMod, only : fates_cohort_type + use FatesCohortMod, only : fates_cohort_type use EDTypesMod, only : ed_patch_type use EDParamsMod, only : maxSWb use EDParamsMod, only : nclmax @@ -3064,7 +3063,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) ccohort%status_coh = rio_status_co(io_idx_co) ccohort%isnew = ( rio_isnew_co(io_idx_co) .eq. new_cohort ) - call InitPRTBoundaryConditions(ccohort) + call ccohort%InitPRTBoundaryConditions() call UpdateCohortBioPhysRates(ccohort) ! Initialize Plant Hydraulics From a186683b3442d7fbe57e2f80ebdc7124fa949a50 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 7 Apr 2023 14:07:45 -0600 Subject: [PATCH 023/125] remove unused dependencies --- biogeochem/EDCanopyStructureMod.F90 | 4 ---- biogeochem/EDMortalityFunctionsMod.F90 | 3 +-- biogeochem/EDPatchDynamicsMod.F90 | 2 +- biogeochem/EDPhysiologyMod.F90 | 2 -- biogeochem/FatesSoilBGCFluxMod.F90 | 1 - biogeophys/EDSurfaceAlbedoMod.F90 | 1 - biogeophys/FatesPlantRespPhotosynthMod.F90 | 2 -- main/EDPftvarcon.F90 | 4 ++-- main/FatesInventoryInitMod.F90 | 1 - main/FatesRestartInterfaceMod.F90 | 1 - parteh/PRTAllometricCNPMod.F90 | 3 --- 11 files changed, 4 insertions(+), 20 deletions(-) diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 09e53623a9..39c4c1c1d4 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -337,7 +337,6 @@ end subroutine canopy_structure subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) use EDParamsMod, only : ED_val_comp_excln - use SFParamsMod, only : SF_val_CWD_frac ! !ARGUMENTS type(ed_site_type), intent(inout) :: currentSite @@ -2126,9 +2125,6 @@ subroutine UpdatePatchLAI(currentPatch) ! and related variables ! --------------------------------------------------------------------------------------------- - ! Uses - use EDParamsMod, only : dlower_vai - ! Arguments type(ed_patch_type),intent(inout), target :: currentPatch diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index 248064e367..4fb2907305 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -59,8 +59,7 @@ subroutine mortality_rates( cohort_in,bc_in,btran_ft, mean_temp, & ! background and freezing and size and age dependent senescence ! ============================================================================ - use FatesConstantsMod, only : tfrz => t_water_freeze_k_1atm - use FatesInterfaceTypesMod , only : hlm_hio_ignore_val + use FatesConstantsMod, only : tfrz => t_water_freeze_k_1atm use FatesConstantsMod, only : fates_check_param_set use DamageMainMod, only : GetDamageMortality diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index ea13822517..6ba8877a12 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -2071,7 +2071,7 @@ end subroutine mortality_litter_fluxes subroutine create_patch(currentSite, new_patch, age, areap, label,nocomp_pft) - use FatesInterfaceTypesMod, only : hlm_current_tod,hlm_current_date,hlm_reference_date + use FatesInterfaceTypesMod, only : hlm_current_tod ! ! !DESCRIPTION: diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index cd1ba0ee3a..35def81bc0 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -2652,8 +2652,6 @@ subroutine fragmentation_scaler( currentPatch, bc_in) ! currentPatch%fragmentation_scaler ! ! !USES: - - use FatesSynchronizedParamsMod , only : FatesSynchronizedParamsInst use FatesConstantsMod, only : tfrz => t_water_freeze_k_1atm use FatesConstantsMod, only : pi => pi_const ! diff --git a/biogeochem/FatesSoilBGCFluxMod.F90 b/biogeochem/FatesSoilBGCFluxMod.F90 index 937fe81bb7..67efc87aae 100644 --- a/biogeochem/FatesSoilBGCFluxMod.F90 +++ b/biogeochem/FatesSoilBGCFluxMod.F90 @@ -616,7 +616,6 @@ subroutine FluxIntoLitterPools(csite, bc_in, bc_out) use FatesInterfaceTypesMod, only : bc_in_type, bc_out_type - use FatesInterfaceTypesMod, only : hlm_use_vertsoilc use FatesConstantsMod, only : itrue use FatesGlobals, only : endrun => fates_endrun use EDParamsMod , only : ED_val_cwd_flig, ED_val_cwd_fcel diff --git a/biogeophys/EDSurfaceAlbedoMod.F90 b/biogeophys/EDSurfaceAlbedoMod.F90 index 360abf38cd..fb800ef80b 100644 --- a/biogeophys/EDSurfaceAlbedoMod.F90 +++ b/biogeophys/EDSurfaceAlbedoMod.F90 @@ -68,7 +68,6 @@ subroutine ED_Norman_Radiation (nsites, sites, bc_in, bc_out ) ! ! !USES: - use EDPftvarcon , only : EDPftvarcon_inst use EDtypesMod , only : ed_patch_type use EDTypesMod , only : ed_site_type diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 22c3b0c491..7f27bc6107 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -126,8 +126,6 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! !USES: - - use FatesSynchronizedParamsMod , only : FatesSynchronizedParamsInst use EDTypesMod , only : ed_site_type use EDTypesMod , only : maxpft use EDParamsMod , only : dinc_vai diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90 index 5d28d29ca2..ad6c87c38c 100644 --- a/main/EDPftvarcon.F90 +++ b/main/EDPftvarcon.F90 @@ -1542,8 +1542,8 @@ subroutine FatesCheckParams(is_master) use FatesConstantsMod , only : fates_check_param_set use FatesConstantsMod , only : itrue, ifalse use EDParamsMod , only : logging_mechanical_frac, logging_collateral_frac - use EDParamsMod , only : logging_direct_frac,logging_export_frac - use FatesInterfaceTypesMod, only : hlm_use_fixed_biogeog,hlm_use_sp, hlm_name + use EDParamsMod , only : logging_direct_frac + use FatesInterfaceTypesMod, only : hlm_use_fixed_biogeog use FatesInterfaceTypesMod, only : hlm_use_inventory_init ! Argument diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index a703958734..f62bccdff7 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -751,7 +751,6 @@ subroutine set_inventory_edpatch_type1(newpatch,pss_file_unit,ipa,ios,patch_name use FatesSizeAgeTypeIndicesMod, only: get_age_class_index use EDtypesMod, only: AREA - use SFParamsMod , only : SF_val_CWD_frac ! Arguments type(ed_patch_type),intent(inout), target :: newpatch ! Patch structure diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 345bfde3f2..17de63ca3b 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -2517,7 +2517,6 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) use EDInitMod, only : zero_site use EDInitMod, only : init_site_vars use EDPatchDynamicsMod, only : create_patch - use EDPftvarcon, only : EDPftvarcon_inst use FatesAllometryMod, only : h2d_allom diff --git a/parteh/PRTAllometricCNPMod.F90 b/parteh/PRTAllometricCNPMod.F90 index 03acfd8a77..d959d14b90 100644 --- a/parteh/PRTAllometricCNPMod.F90 +++ b/parteh/PRTAllometricCNPMod.F90 @@ -707,9 +707,6 @@ end function SafeLog subroutine CNPAdjustFRootTargets(this, target_c, target_dcdd) - use FatesInterfaceTypesMod , only : hlm_day_of_year - use FatesInterfaceTypesMod , only : hlm_current_year - class(cnp_allom_prt_vartypes) :: this real(r8) :: target_c(:) real(r8) :: target_dcdd(:) From f1dcd483cbe4533910d8e441d682e43d46b10c43 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 7 Apr 2023 15:36:31 -0600 Subject: [PATCH 024/125] move more subroutines to cohort type --- biogeochem/EDCohortDynamicsMod.F90 | 88 +------------ main/FatesCohortMod.F90 | 196 ++++++++++++++++++++++++++++- 2 files changed, 194 insertions(+), 90 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index e137441fc7..5a1983aded 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -196,98 +196,16 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & type(fates_cohort_type), pointer :: new_cohort ! Pointer to New Cohort structure. type(fates_cohort_type), pointer :: storesmallcohort type(fates_cohort_type), pointer :: storebigcohort -integer :: iage ! loop counter for leaf age classes -real(r8) :: leaf_c ! total leaf carbon real(r8) :: rmean_temp ! running mean temperature integer :: tnull,snull ! are the tallest and shortest cohorts allocate integer :: nlevrhiz ! number of rhizosphere layers !---------------------------------------------------------------------- +! create new cohort allocate(new_cohort) - -call new_cohort%init(prt) - -!**********************/ -! Define cohort state variable -!**********************/ - -new_cohort%indexnumber = fates_unset_int ! Cohort indexing was not thread-safe, setting - ! bogus value for the time being (RGK-012017) -new_cohort%pft = pft -new_cohort%crowndamage = crowndamage -new_cohort%status_coh = status -new_cohort%n = nn -new_cohort%hite = hite -new_cohort%dbh = dbh -new_cohort%coage = coage -new_cohort%canopy_trim = ctrim -new_cohort%canopy_layer = clayer -new_cohort%canopy_layer_yesterday = real(clayer, r8) - -! Initialize the leaf to fineroot biomass ratio -! for C-only, this will stay constant, for nutrient enabled -! this will be dynamic. In both cases, new cohorts are -! initialized with the minimum. This works in the nutrient -! enabled case, because cohorts are also initialized with -! full stores, which match with minimum fr biomass - -new_cohort%l2fr = prt_params%allom_l2fr(pft) - -if(hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then - new_cohort%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt - new_cohort%cnp_limiter = 0 ! Assume limitations are unknown -end if - -! This sets things like vcmax25top, that depend on the -! leaf age fractions (which are defined by PARTEH) -call UpdateCohortBioPhysRates(new_cohort) - -call sizetype_class_index(new_cohort%dbh, new_cohort%pft, & - new_cohort%size_class,new_cohort%size_by_pft_class) - -! If cohort age trackign is off we call this here once -! just so everythin is in the first bin - -! this makes it easier to copy and terminate cohorts later -! we don't need to update this ever if cohort age tracking is off -call coagetype_class_index(new_cohort%coage, new_cohort%pft, & - new_cohort%coage_class,new_cohort%coage_by_pft_class) - -! This routine may be called during restarts, and at this point in the call sequence -! the actual cohort data is unknown, as this is really only used for allocation -! In these cases, testing if things like biomass are reasonable is pre-mature -! However, in this part of the code, we will pass in nominal values for size, number and type - -if (new_cohort%dbh <= 0._r8 .or. new_cohort%n == 0._r8 .or. new_cohort%pft == 0 ) then - write(fates_log(),*) 'ED: something is zero in create_cohort', & - new_cohort%dbh,new_cohort%n, & - new_cohort%pft - call endrun(msg=errMsg(sourcefile, __LINE__)) -endif - -! Assign canopy extent and depth -if(hlm_use_sp.eq.ifalse)then - call carea_allom(new_cohort%dbh,new_cohort%n,spread,new_cohort%pft, & - new_cohort%crowndamage,new_cohort%c_area) -else - new_cohort%c_area = carea ! set this from previously precision-controlled value in SP mode -endif -! Query PARTEH for the leaf carbon [kg] -leaf_c = new_cohort%prt%GetState(leaf_organ,carbon12_element) - -new_cohort%treelai = tree_lai(leaf_c, new_cohort%pft, new_cohort%c_area, & - new_cohort%n, new_cohort%canopy_layer, & - patchptr%canopy_layer_tlai,new_cohort%vcmax25top ) - -if(hlm_use_sp.eq.ifalse)then - new_cohort%treesai = tree_sai(new_cohort%pft, new_cohort%dbh, & - new_cohort%crowndamage, new_cohort%canopy_trim, & - new_cohort%c_area, new_cohort%n, new_cohort%canopy_layer, & - patchptr%canopy_layer_tlai, new_cohort%treelai,new_cohort%vcmax25top,2 ) -end if - +call new_cohort%create(pft, prt, nn, hite, coage, dbh, status, ctrim, carea, & + clayer, crowndamage, spread, patchptr%canopy_layer_tlai) ! Put cohort at the right place in the linked list storebigcohort => patchptr%tallest diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 index 9c7a1f5865..714181a16f 100644 --- a/main/FatesCohortMod.F90 +++ b/main/FatesCohortMod.F90 @@ -6,14 +6,19 @@ module FatesCohortMod use EDParamsMod, only : nlevleaf use FatesGlobals, only : endrun => fates_endrun use FatesGlobals, only : fates_log + use PRTGenericMod, only : max_nleafage use PRTGenericMod, only : prt_vartypes use PRTGenericMod, only : prt_carbon_allom_hyp use PRTGenericMod, only : prt_cnp_flex_allom_hyp use PRTGenericMod, only : leaf_organ, fnrt_organ, sapw_organ use PRTGenericMod, only : repro_organ, store_organ, struct_organ use PRTGenericMod, only : carbon12_element + use PRTParametersMod, only : prt_params use FatesHydraulicsMemMod, only : ed_cohort_hydr_type use FatesInterfaceTypesMod, only : hlm_parteh_mode + use FatesInterfaceTypesMod, only : hlm_use_sp + use FatesInterfaceTypesMod, only : nleafage + use FatesAllometryMod, only : carea_allom, tree_lai, tree_sai use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & ac_bc_in_id_cdamage, ac_bc_in_id_pft, & ac_bc_in_id_ctrim, ac_bc_in_id_lstat @@ -255,8 +260,10 @@ module FatesCohortMod procedure :: dump procedure :: nan_values procedure :: zero_values + procedure :: create procedure :: CanUpperUnder procedure :: InitPRTBoundaryConditions + procedure :: UpdateCohortBioPhysRates end type fates_cohort_type @@ -281,7 +288,6 @@ subroutine init(this, prt) ! The PARTEH cohort object should be allocated and already ! initialized in this routine. call this%prt%CheckInitialConditions() - call this%InitPRTBoundaryConditions() ! new cohorts do not have mortality rates, nor have they moved any @@ -501,8 +507,115 @@ end subroutine zero_values !:.........................................................................: - subroutine InitPRTBoundaryConditions(this) + subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & + ctrim, carea, clayer, crowndamage, spread, can_tlai) + ! + ! DESCRIPTION: + ! set up values for a newly created cohort + + ! ARGUMENTS + class(fates_cohort_type), intent(inout) :: this ! cohort object + class(prt_vartypes), intent(inout), pointer :: prt ! The allocated PARTEH object + integer, intent(in) :: pft ! cohort Plant Functional Type + integer, intent(in) :: crowndamage ! cohort damage class + integer, intent(in) :: clayer ! canopy status of cohort [canopy/understory] + integer, intent(in) :: status ! growth status of cohort [leaves on/off] + real(r8), intent(in) :: nn ! number of individuals in cohort [/m2] + real(r8), intent(in) :: hite ! cohort height [m] + real(r8), intent(in) :: coage ! cohort age [yr] + real(r8), intent(in) :: dbh ! cohort diameter at breat height [cm] + real(r8), intent(in) :: ctrim ! fraction of the maximum leaf biomass + real(r8), intent(in) :: spread ! how spread crowns are in horizontal space + real(r8), intent(in) :: carea ! area of cohort, for SP mode [m2] + real(r8), intent(in) :: can_tlai(nclmax) ! patch-level total LAI of each leaf layer + + ! LOCAL VARIABLES: + integer :: iage ! loop counter for leaf age classes + real(r8) :: leaf_c ! total leaf carbon [kgC] + + ! initialize cohort + call this%init(prt) + + ! set values + this%pft = pft + this%crowndamage = crowndamage + this%canopy_layer = clayer + this%canopy_layer_yesterday = real(clayer, r8) + this%status_coh = status + this%n = nn + this%hite = hite + this%dbh = dbh + this%coage = coage + this%canopy_trim = ctrim + + ! This routine may be called during restarts, and at this point in the call sequence + ! the actual cohort data is unknown, as this is really only used for allocation + ! In these cases, testing if things like biomass are reasonable is premature + ! However, in this part of the code, we will pass in nominal values for size, number and type + if (this%dbh <= 0._r8 .or. this%n == 0._r8 .or. this%pft == 0) then + write(fates_log(),*) 'FATES: something is zero in cohort%create', & + this%dbh, this%n, this%pft + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + + ! Initialize the leaf to fineroot biomass ratio. + ! For C-only, this will stay constant, for nutrient-enabled this will be + ! dynamic. In both cases, new cohorts are initialized with the minimum. + ! This works in the nutrient enabled case because cohorts are also + ! initialized with full stores, which match with minimum fineroot biomass + new_cohort%l2fr = prt_params%allom_l2fr(pft) + + if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then + new_cohort%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + new_cohort%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + new_cohort%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt + new_cohort%cnp_limiter = 0 ! Assume limitations are unknown + end if + + ! This sets things like vcmax25top, that depend on the leaf age fractions + ! (which are defined by PARTEH) + call this%UpdateCohortBioPhysRates() + + ! calculate size classes + call sizetype_class_index(this%dbh, this%pft, this%size_class, & + this%size_by_pft_class) + + ! If cohort age tracking is off we call this here once, just so everything + ! is in the first bin. This makes it easier to copy and terminate cohorts + ! later. + ! We don't need to update this ever if cohort age tracking is off + call coagetype_class_index(this%coage, this%pft, this%coage_class, & + this%coage_by_pft_class) + + ! asssign or calculate canopy extent and depth + if (hlm_use_sp .eq. ifalse) then + call carea_allom(this%dbh, this%n, spread, this%pft, this%crowndamage, & + this%c_area) + else + ! set this from previously precision-controlled value in SP mode + this%c_area = carea + endif + + ! Query PARTEH for the leaf carbon [kg] + leaf_c = this%prt%GetState(leaf_organ, carbon12_element) + + ! calculate tree lai + this%treelai = tree_lai(leaf_c, this%pft, this%c_area, this%n, & + this%canopy_layer, can_tlai, this%vcmax25top) + + if (hlm_use_sp .eq. ifalse) then + this%treesai = tree_sai(this%pft, this%dbh, this%crowndamage, & + this%canopy_trim, this%c_area, this%n, this%canopy_layer, can_tlai, & + this%treelai,this%vcmax25top, 2) + end if + + end subroutine create + + !:.........................................................................: + subroutine InitPRTBoundaryConditions(this) + ! + ! DESCRIPTION: ! Set the boundary conditions that flow in an out of the PARTEH ! allocation hypotheses. Each of these calls to "RegsterBC" are simply ! setting pointers. @@ -520,7 +633,8 @@ subroutine InitPRTBoundaryConditions(this) ! value boundary condition. ! bc_ival is used as the optional argument identifyer to specify an integer ! value boundary condition. - + + ! ARGUMENTS: class(fates_cohort_type), intent(inout) :: this select case(hlm_parteh_mode) @@ -574,7 +688,79 @@ subroutine InitPRTBoundaryConditions(this) end subroutine InitPRTBoundaryConditions !:.........................................................................: - + + subroutine UpdateCohortBioPhysRates(this) + ! + ! DESCRIPTION: + ! Update the four key biophysical rates of leaves based on the changes + ! in a cohort's leaf age proportions. + ! + ! This should be called after growth. Growth occurs + ! after turnover and damage states are applied to the tree. + ! Therefore, following growth, the leaf mass fractions + ! of different age classes are unchanged until the next day. + + ! ARGUMENTS + class(fates_cohort_type), intent(inout) :: this ! cohort object + + ! LOCAL VARIABLES + real(r8) :: frac_leaf_aclass(max_nleafage) ! fraction of leaves in each age-class + integer :: iage ! loop index for leaf ages + integer :: ipft ! plant functional type index + + ! First, calculate the fraction of leaves in each age class + ! It is assumed that each class has the same proportion across leaf layers + do iage = 1, nleafage + frac_leaf_aclass(iage) = this%prt%GetState(leaf_organ, & + carbon12_element, iage) + end do + + ! If there are leaves, then perform proportional weighting on the four rates + ! We assume that leaf age does not effect the specific leaf area, so the mass + ! fractions are applicable to these rates + + ipft = currentCohort%pft + + if (sum(frac_leaf_aclass(1:nleafage)) > nearzero .and. & + hlm_use_sp .eq. ifalse) then + + frac_leaf_aclass(1:nleafage) = frac_leaf_aclass(1:nleafage)/ & + sum(frac_leaf_aclass(1:nleafage)) + + this%vcmax25top = sum(EDPftvarcon_inst%vcmax25top(ipft, 1:nleafage)* & + frac_leaf_aclass(1:nleafage)) + + this%jmax25top = sum(param_derived%jmax25top(ipft, 1:nleafage)* & + frac_leaf_aclass(1:nleafage)) + + this%tpu25top = sum(param_derived%tpu25top(ipft, 1:nleafage)* & + frac_leaf_aclass(1:nleafage)) + + this%kp25top = sum(param_derived%kp25top(ipft, 1:nleafage)* & + frac_leaf_aclass(1:nleafage)) + + else if (hlm_use_sp .eq. itrue) then + + this%vcmax25top = EDPftvarcon_inst%vcmax25top(ipft, 1) + this%jmax25top = param_derived%jmax25top(ipft, 1) + this%tpu25top = param_derived%tpu25top(ipft, 1) + this%kp25top = param_derived%kp25top(ipft, 1) + + else + + this%vcmax25top = 0._r8 + this%jmax25top = 0._r8 + this%tpu25top = 0._r8 + this%kp25top = 0._r8 + + end if + + return + + end subroutine UpdateCohortBioPhysRates + + !:.........................................................................: + function CanUpperUnder(this) result(can_position) ! ! DESCRIPTION: @@ -588,7 +774,7 @@ function CanUpperUnder(this) result(can_position) ! ARGUMENTS: class(fates_cohort_type) :: this ! current cohort of interest - integer :: can_position ! canopy position + integer :: can_position ! canopy position if (this%canopy_layer == 1)then can_position = ican_upper From 443075b37e5871fac828045b023306c574c50e38 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 7 Apr 2023 15:57:45 -0600 Subject: [PATCH 025/125] move more methods to cohort type --- biogeochem/EDCohortDynamicsMod.F90 | 80 +----------------------------- main/EDMainMod.F90 | 3 +- main/EDTypesMod.F90 | 1 - main/FatesCohortMod.F90 | 69 ++++++++++++++------------ main/FatesRestartInterfaceMod.F90 | 3 +- 5 files changed, 42 insertions(+), 114 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 5a1983aded..a790ad1edb 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -125,7 +125,6 @@ Module EDCohortDynamicsMod public :: count_cohorts public :: InitPRTObject public :: SendCohortToLitter - public :: UpdateCohortBioPhysRates public :: DeallocateCohort public :: EvaluateAndCorrectDBH public :: DamageRecovery @@ -204,7 +203,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! create new cohort allocate(new_cohort) -call new_cohort%create(pft, prt, nn, hite, coage, dbh, status, ctrim, carea, & +call new_cohort%create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & clayer, crowndamage, spread, patchptr%canopy_layer_tlai) ! Put cohort at the right place in the linked list @@ -891,7 +890,7 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in) ! Leaf biophysical rates (use leaf mass weighting) ! ----------------------------------------------------------------- - call UpdateCohortBioPhysRates(currentCohort) + call currentCohort%UpdateCohortBioPhysRates() currentCohort%l2fr = (currentCohort%n*currentCohort%l2fr & + nextc%n*nextc%l2fr)/newn @@ -1658,81 +1657,6 @@ end subroutine count_cohorts ! =================================================================================== - subroutine UpdateCohortBioPhysRates(currentCohort) - - ! -------------------------------------------------------------------------------- - ! This routine updates the four key biophysical rates of leaves - ! based on the changes in a cohort's leaf age proportions - ! - ! This should be called after growth. Growth occurs - ! after turnover and damage states are applied to the tree. - ! Therefore, following growth, the leaf mass fractions - ! of different age classes are unchanged until the next day. - ! -------------------------------------------------------------------------------- - - type(fates_cohort_type),intent(inout) :: currentCohort - - - real(r8) :: frac_leaf_aclass(max_nleafage) ! Fraction of leaves in each age-class - integer :: iage ! loop index for leaf ages - integer :: ipft ! plant functional type index - - ! First, calculate the fraction of leaves in each age class - ! It is assumed that each class has the same proportion - ! across leaf layers - - do iage = 1, nleafage - frac_leaf_aclass(iage) = & - currentCohort%prt%GetState(leaf_organ, carbon12_element,iage) - end do - - ! If there are leaves, then perform proportional weighting on the four rates - ! We assume that leaf age does not effect the specific leaf area, so the mass - ! fractions are applicable to these rates - - ipft = currentCohort%pft - - if(sum(frac_leaf_aclass(1:nleafage))>nearzero .and. hlm_use_sp .eq. ifalse) then - - - frac_leaf_aclass(1:nleafage) = frac_leaf_aclass(1:nleafage) / & - sum(frac_leaf_aclass(1:nleafage)) - - currentCohort%vcmax25top = sum(EDPftvarcon_inst%vcmax25top(ipft,1:nleafage) * & - frac_leaf_aclass(1:nleafage)) - - currentCohort%jmax25top = sum(param_derived%jmax25top(ipft,1:nleafage) * & - frac_leaf_aclass(1:nleafage)) - - currentCohort%tpu25top = sum(param_derived%tpu25top(ipft,1:nleafage) * & - frac_leaf_aclass(1:nleafage)) - - currentCohort%kp25top = sum(param_derived%kp25top(ipft,1:nleafage) * & - frac_leaf_aclass(1:nleafage)) - - elseif (hlm_use_sp .eq. itrue) then - - currentCohort%vcmax25top = EDPftvarcon_inst%vcmax25top(ipft,1) - currentCohort%jmax25top = param_derived%jmax25top(ipft,1) - currentCohort%tpu25top = param_derived%tpu25top(ipft,1) - currentCohort%kp25top = param_derived%kp25top(ipft,1) - - else - - currentCohort%vcmax25top = 0._r8 - currentCohort%jmax25top = 0._r8 - currentCohort%tpu25top = 0._r8 - currentCohort%kp25top = 0._r8 - - end if - - - return - end subroutine UpdateCohortBioPhysRates - - - ! ============================================================================ - subroutine EvaluateAndCorrectDBH(currentCohort,delta_dbh,delta_hite) diff --git a/main/EDMainMod.F90 b/main/EDMainMod.F90 index c9cb3a8c84..386f788db8 100644 --- a/main/EDMainMod.F90 +++ b/main/EDMainMod.F90 @@ -56,7 +56,6 @@ module EDMainMod use EDPhysiologyMod , only : GenerateDamageAndLitterFluxes use FatesSoilBGCFluxMod , only : FluxIntoLitterPools use FatesSoilBGCFluxMod , only : EffluxIntoLitterPools - use EDCohortDynamicsMod , only : UpdateCohortBioPhysRates use FatesSoilBGCFluxMod , only : PrepNutrientAquisitionBCs use FatesSoilBGCFluxMod , only : PrepCH4BCs use SFMainMod , only : fire_model @@ -636,7 +635,7 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) ! mass in the different leaf age classes. Following growth ! and turnover, these proportions won't change again. This ! routine is also called following fusion - call UpdateCohortBioPhysRates(currentCohort) + call currentCohort%UpdateCohortBioPhysRates() ! This cohort has grown, it is no longer "new" currentCohort%isnew = .false. diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index e9184cf40b..9db76ff895 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -30,7 +30,6 @@ module EDTypesMod use EDParamsMod, only : maxSWb, nclmax, nlevleaf use shr_log_mod, only : errMsg => shr_log_errMsg - implicit none private ! By default everything is private save diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 index 714181a16f..8073d70527 100644 --- a/main/FatesCohortMod.F90 +++ b/main/FatesCohortMod.F90 @@ -1,28 +1,35 @@ module FatesCohortMod - use FatesConstantsMod, only : r8 => fates_r8 - use FatesConstantsMod, only : fates_unset_int - use FatesConstantsMod, only : ican_upper, ican_ustory - use EDParamsMod, only : nlevleaf - use FatesGlobals, only : endrun => fates_endrun - use FatesGlobals, only : fates_log - use PRTGenericMod, only : max_nleafage - use PRTGenericMod, only : prt_vartypes - use PRTGenericMod, only : prt_carbon_allom_hyp - use PRTGenericMod, only : prt_cnp_flex_allom_hyp - use PRTGenericMod, only : leaf_organ, fnrt_organ, sapw_organ - use PRTGenericMod, only : repro_organ, store_organ, struct_organ - use PRTGenericMod, only : carbon12_element - use PRTParametersMod, only : prt_params - use FatesHydraulicsMemMod, only : ed_cohort_hydr_type - use FatesInterfaceTypesMod, only : hlm_parteh_mode - use FatesInterfaceTypesMod, only : hlm_use_sp - use FatesInterfaceTypesMod, only : nleafage - use FatesAllometryMod, only : carea_allom, tree_lai, tree_sai - use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & - ac_bc_in_id_cdamage, ac_bc_in_id_pft, & - ac_bc_in_id_ctrim, ac_bc_in_id_lstat - use PRTAllometricCNPMod, only : acnp_bc_in_id_pft, acnp_bc_in_id_ctrim, & + use FatesConstantsMod, only : r8 => fates_r8 + use FatesConstantsMod, only : fates_unset_int + use FatesConstantsMod, only : ifalse, itrue + use FatesConstantsMod, only : nearzero + use FatesConstantsMod, only : ican_upper, ican_ustory + use EDParamsMod, only : nlevleaf + use EDParamsMod, only : nclmax + use FatesGlobals, only : endrun => fates_endrun + use FatesGlobals, only : fates_log + use PRTGenericMod, only : max_nleafage + use PRTGenericMod, only : prt_vartypes + use PRTGenericMod, only : prt_carbon_allom_hyp + use PRTGenericMod, only : prt_cnp_flex_allom_hyp + use PRTGenericMod, only : leaf_organ, fnrt_organ, sapw_organ + use PRTGenericMod, only : repro_organ, store_organ, struct_organ + use PRTGenericMod, only : carbon12_element + use PRTParametersMod, only : prt_params + use FatesParameterDerivedMod, only : param_derived + use FatesHydraulicsMemMod, only : ed_cohort_hydr_type + use FatesInterfaceTypesMod, only : hlm_parteh_mode + use FatesInterfaceTypesMod, only : hlm_use_sp + use FatesInterfaceTypesMod, only : nleafage + use EDPftvarcon, only : EDPftvarcon_inst + use FatesSizeAgeTypeIndicesMod, only : sizetype_class_index + use FatesSizeAgeTypeIndicesMod, only : coagetype_class_index + use FatesAllometryMod, only : carea_allom, tree_lai, tree_sai + use PRTAllometricCarbonMod, only : ac_bc_inout_id_dbh, ac_bc_inout_id_netdc, & + ac_bc_in_id_cdamage, ac_bc_in_id_pft, & + ac_bc_in_id_ctrim, ac_bc_in_id_lstat + use PRTAllometricCNPMod, only : acnp_bc_in_id_pft, acnp_bc_in_id_ctrim, & acnp_bc_in_id_lstat, acnp_bc_in_id_netdc, & acnp_bc_in_id_netdc, acnp_bc_in_id_nc_repro, & acnp_bc_in_id_pc_repro, acnp_bc_in_id_cdamage, & @@ -33,8 +40,8 @@ module FatesCohortMod acnp_bc_out_id_cefflux, acnp_bc_out_id_nefflux, & acnp_bc_out_id_pefflux, acnp_bc_out_id_limiter - use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) - use shr_log_mod, only : errMsg => shr_log_errMsg + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + use shr_log_mod, only : errMsg => shr_log_errMsg implicit none private @@ -563,13 +570,13 @@ subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & ! dynamic. In both cases, new cohorts are initialized with the minimum. ! This works in the nutrient enabled case because cohorts are also ! initialized with full stores, which match with minimum fineroot biomass - new_cohort%l2fr = prt_params%allom_l2fr(pft) + this%l2fr = prt_params%allom_l2fr(pft) if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then - new_cohort%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 - new_cohort%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt - new_cohort%cnp_limiter = 0 ! Assume limitations are unknown + this%cx_int = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + this%cx0 = 0._r8 ! Assume balanced N,P/C stores ie log(1) = 0 + this%ema_dcxdt = 0._r8 ! Assume unchanged dCX/dt + this%cnp_limiter = 0 ! Assume limitations are unknown end if ! This sets things like vcmax25top, that depend on the leaf age fractions @@ -719,7 +726,7 @@ subroutine UpdateCohortBioPhysRates(this) ! We assume that leaf age does not effect the specific leaf area, so the mass ! fractions are applicable to these rates - ipft = currentCohort%pft + ipft = this%pft if (sum(frac_leaf_aclass(1:nleafage)) > nearzero .and. & hlm_use_sp .eq. ifalse) then diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 17de63ca3b..f9669b4c8a 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -24,7 +24,6 @@ module FatesRestartInterfaceMod use FatesInterfaceTypesMod, only : hlm_use_nocomp, hlm_use_fixed_biogeog use FatesInterfaceTypesMod, only : fates_maxElementsPerSite use FatesInterfaceTypesMod, only : hlm_use_tree_damage - use EDCohortDynamicsMod, only : UpdateCohortBioPhysRates use FatesHydraulicsMemMod, only : nshell use FatesHydraulicsMemMod, only : n_hypool_ag use FatesHydraulicsMemMod, only : n_hypool_troot @@ -3063,7 +3062,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) ccohort%isnew = ( rio_isnew_co(io_idx_co) .eq. new_cohort ) call ccohort%InitPRTBoundaryConditions() - call UpdateCohortBioPhysRates(ccohort) + call ccohort%UpdateCohortBioPhysRates() ! Initialize Plant Hydraulics From 72d3a1406f47952a26d139cdbfb8b1617aec559b Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 10 Apr 2023 12:32:20 -0600 Subject: [PATCH 026/125] move patch type to its own module --- biogeochem/EDCanopyStructureMod.F90 | 29 +-- biogeochem/EDCohortDynamicsMod.F90 | 28 ++- biogeochem/EDLoggingMortalityMod.F90 | 9 +- biogeochem/EDMortalityFunctionsMod.F90 | 5 +- biogeochem/EDPatchDynamicsMod.F90 | 75 +++---- biogeochem/EDPhysiologyMod.F90 | 39 ++-- biogeochem/FatesPatchMod.F90 | 184 +++++++++++++++++ biogeochem/FatesSoilBGCFluxMod.F90 | 12 +- biogeophys/EDAccumulateFluxesMod.F90 | 6 +- biogeophys/EDBtranMod.F90 | 8 +- biogeophys/EDSurfaceAlbedoMod.F90 | 15 +- biogeophys/FatesBstressMod.F90 | 8 +- biogeophys/FatesPlantHydraulicsMod.F90 | 20 +- biogeophys/FatesPlantRespPhotosynthMod.F90 | 10 +- fire/SFMainMod.F90 | 24 +-- main/ChecksBalancesMod.F90 | 8 +- main/EDInitMod.F90 | 12 +- main/EDMainMod.F90 | 12 +- main/EDTypesMod.F90 | 221 +-------------------- main/FatesConstantsMod.F90 | 12 ++ main/FatesHistoryInterfaceMod.F90 | 14 +- main/FatesInterfaceMod.F90 | 6 +- main/FatesInventoryInitMod.F90 | 20 +- main/FatesRestartInterfaceMod.F90 | 18 +- 24 files changed, 391 insertions(+), 404 deletions(-) create mode 100644 biogeochem/FatesPatchMod.F90 diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 39c4c1c1d4..144dd14781 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -19,7 +19,8 @@ module EDCanopyStructureMod use EDCohortDynamicsMod , only : InitPRTObject use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai - use EDtypesMod , only : ed_site_type, ed_patch_type + use EDtypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type use EDParamsMod , only : nclmax use EDParamsMod , only : nlevleaf @@ -136,7 +137,7 @@ subroutine canopy_structure( currentSite , bc_in ) ! ! !LOCAL VARIABLES: - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort integer :: i_lyr ! current layer index integer :: z ! Current number of canopy layers. (1= canopy, 2 = understorey) @@ -340,7 +341,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) ! !ARGUMENTS type(ed_site_type), intent(inout) :: currentSite - type(ed_patch_type), intent(inout) :: currentPatch + type(fates_patch_type), intent(inout) :: currentPatch integer, intent(in) :: i_lyr ! Current canopy layer of interest type(bc_in_type), intent(in) :: bc_in @@ -796,7 +797,7 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type), intent(inout), target :: currentPatch + type(fates_patch_type), intent(inout), target :: currentPatch integer, intent(in) :: i_lyr ! Current canopy layer of interest ! !LOCAL VARIABLES: @@ -1243,7 +1244,7 @@ subroutine canopy_spread( currentSite ) ! ! !LOCAL VARIABLES: type (fates_cohort_type), pointer :: currentCohort - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch real(r8) :: sitelevel_canopyarea ! Amount of canopy in top layer at the site level real(r8) :: inc ! Arbitrary daily incremental change in canopy area integer :: z @@ -1307,7 +1308,7 @@ subroutine canopy_summarization( nsites, sites, bc_in ) type(bc_in_type) , intent(in) :: bc_in(nsites) ! ! !LOCAL VARIABLES: - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch type (fates_cohort_type) , pointer :: currentCohort integer :: s integer :: ft ! plant functional type @@ -1508,7 +1509,7 @@ subroutine leaf_area_profile( currentSite ) ! ! !LOCAL VARIABLES: - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch type (fates_cohort_type) , pointer :: currentCohort real(r8) :: remainder !Thickness of layer at bottom of canopy. real(r8) :: fleaf ! fraction of cohort incepting area that is leaves. @@ -1801,8 +1802,8 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) ! to vegetation coverage to the host land model. ! ---------------------------------------------------------------------------------- - use EDTypesMod , only : ed_patch_type, & - ed_site_type, AREA + use EDTypesMod , only : ed_site_type, AREA + use FatesPatchMod, only : fates_patch_type use FatesInterfaceTypesMod , only : bc_out_type ! @@ -1815,7 +1816,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) ! Locals type (fates_cohort_type) , pointer :: currentCohort integer :: s, ifp, c, p - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch real(r8) :: bare_frac_area real(r8) :: total_patch_area real(r8) :: total_canopy_area @@ -2031,7 +2032,7 @@ function calc_areaindex(cpatch,ai_type) result(ai) ! ---------------------------------------------------------------------------------- ! Arguments - type(ed_patch_type),intent(in), target :: cpatch + type(fates_patch_type),intent(in), target :: cpatch character(len=*),intent(in) :: ai_type integer :: cl,ft @@ -2095,7 +2096,7 @@ subroutine CanopyLayerArea(currentPatch,site_spread,layer_index,layer_area) ! --------------------------------------------------------------------------------------------- ! Arguments - type(ed_patch_type),intent(inout), target :: currentPatch + type(fates_patch_type),intent(inout), target :: currentPatch real(r8),intent(in) :: site_spread integer,intent(in) :: layer_index real(r8),intent(inout) :: layer_area @@ -2126,7 +2127,7 @@ subroutine UpdatePatchLAI(currentPatch) ! --------------------------------------------------------------------------------------------- ! Arguments - type(ed_patch_type),intent(inout), target :: currentPatch + type(fates_patch_type),intent(inout), target :: currentPatch ! Local Variables type(fates_cohort_type), pointer :: currentCohort @@ -2217,7 +2218,7 @@ function NumPotentialCanopyLayers(currentPatch,site_spread,include_substory) res ! the understory in the event the understory has reached maximum allowable area. ! -------------------------------------------------------------------------------------------- - type(ed_patch_type),target :: currentPatch + type(fates_patch_type),target :: currentPatch real(r8),intent(in) :: site_spread logical :: include_substory diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index a790ad1edb..7ed68711f1 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -26,7 +26,8 @@ Module EDCohortDynamicsMod use EDPftvarcon , only : GetDecompyFrac use PRTParametersMod , only : prt_params use FatesParameterDerivedMod, only : param_derived - use EDTypesMod , only : ed_site_type, ed_patch_type + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDParamsMod , only : nclmax use PRTGenericMod , only : element_list @@ -165,7 +166,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite -type(ed_patch_type), intent(inout), pointer :: patchptr +type(fates_patch_type), intent(inout), pointer :: patchptr integer, intent(in) :: pft ! Cohort Plant Functional Type integer, intent(in) :: crowndamage ! Cohort damage class @@ -349,7 +350,7 @@ subroutine terminate_cohorts( currentSite, currentPatch, level , call_index, bc_ ! ! !ARGUMENTS type (ed_site_type) , intent(inout) :: currentSite - type (ed_patch_type), intent(inout) :: currentPatch + type (fates_patch_type), intent(inout) :: currentPatch integer , intent(in) :: level integer :: call_index type(bc_in_type), intent(in) :: bc_in @@ -466,7 +467,7 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) ! ! !ARGUMENTS type (ed_site_type) , intent(inout), target :: currentSite - type (ed_patch_type) , intent(inout), target :: currentPatch + type (fates_patch_type) , intent(inout), target :: currentPatch type (fates_cohort_type), intent(inout), target :: currentCohort type(bc_in_type), intent(in) :: bc_in @@ -572,7 +573,7 @@ subroutine SendCohortToLitter(csite,cpatch,ccohort,nplant,bc_in) ! Arguments type (ed_site_type) , target :: csite - type (ed_patch_type) , target :: cpatch + type (fates_patch_type) , target :: cpatch type (fates_cohort_type) , target :: ccohort real(r8) :: nplant ! Number (absolute) ! of plants to transfer @@ -679,11 +680,8 @@ subroutine SendCohortToLitter(csite,cpatch,ccohort,nplant,bc_in) return end subroutine SendCohortToLitter - !-------------------------------------------------------------------------------------- - - subroutine DeallocateCohort(currentCohort) ! ---------------------------------------------------------------------------------- @@ -730,7 +728,7 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in) ! ! !ARGUMENTS type (ed_site_type), intent(inout) :: currentSite - type (ed_patch_type), intent(inout), pointer :: currentPatch + type (fates_patch_type), intent(inout), pointer :: currentPatch type (bc_in_type), intent(in) :: bc_in ! @@ -1293,9 +1291,9 @@ subroutine sort_cohorts(patchptr) ! sort cohorts into the correct order DO NOT CHANGE THIS IT WILL BREAK ! ============================================================================ - type(ed_patch_type) , intent(inout), target :: patchptr + type(fates_patch_type) , intent(inout), target :: patchptr - type(ed_patch_type) , pointer :: current_patch + type(fates_patch_type) , pointer :: current_patch type(fates_cohort_type), pointer :: current_c, next_c type(fates_cohort_type), pointer :: shortestc, tallestc type(fates_cohort_type), pointer :: storesmallcohort @@ -1347,7 +1345,7 @@ subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebi ! !USES: ! ! !ARGUMENTS - type(ed_patch_type), intent(inout), target :: currentPatch + type(fates_patch_type), intent(inout), target :: currentPatch type(fates_cohort_type) , intent(inout), pointer :: pcc type(fates_cohort_type) , intent(inout), pointer :: ptall type(fates_cohort_type) , intent(inout), pointer :: pshort @@ -1357,7 +1355,7 @@ subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebi type(fates_cohort_type) , intent(inout),pointer,optional :: storebigcohort ! storage of the largest cohort for insertion routine ! ! !LOCAL VARIABLES: - !type(ed_patch_type), pointer :: currentPatch + !type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: current type(fates_cohort_type), pointer :: tallptr, shortptr, icohort type(fates_cohort_type), pointer :: ptallest, pshortest @@ -1624,7 +1622,7 @@ subroutine count_cohorts( currentPatch ) ! !USES: ! ! !ARGUMENTS - type(ed_patch_type), intent(inout), target :: currentPatch !new site + type(fates_patch_type), intent(inout), target :: currentPatch !new site ! ! !LOCAL VARIABLES: type(fates_cohort_type), pointer :: currentCohort !new patch @@ -1764,7 +1762,7 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) ! -------------------------------------------------------------------------- type(ed_site_type) :: csite ! Site of the current cohort - type(ed_patch_type) :: cpatch ! patch of the current cohort + type(fates_patch_type) :: cpatch ! patch of the current cohort type(fates_cohort_type),pointer :: ccohort ! Current (damaged) cohort logical :: newly_recovered ! true if we create a new cohort diff --git a/biogeochem/EDLoggingMortalityMod.F90 b/biogeochem/EDLoggingMortalityMod.F90 index 36882b87fb..b971d96270 100644 --- a/biogeochem/EDLoggingMortalityMod.F90 +++ b/biogeochem/EDLoggingMortalityMod.F90 @@ -16,7 +16,7 @@ module EDLoggingMortalityMod use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : rsnbl_math_prec use FatesCohortMod , only : fates_cohort_type - use EDTypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type use FatesLitterMod , only : ncwd @@ -460,7 +460,7 @@ subroutine get_harvestable_carbon (csite, site_area, hlm_harvest_catnames, harve real(r8), intent(out) :: harvestable_forest_c(hlm_num_lu_harvest_cats) ! Local Variables - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: harvestable_patch_c ! patch level total carbon available for harvest, kgC site-1 real(r8) :: harvestable_cohort_c ! cohort level total carbon available for harvest, kgC site-1 @@ -716,7 +716,6 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site use SFParamsMod, only : SF_val_cwd_frac use EDtypesMod, only : area use EDtypesMod, only : ed_site_type - use EDtypesMod, only : ed_patch_type use FatesCohortMod, only : fates_cohort_type use FatesConstantsMod, only : rsnbl_math_prec use FatesAllometryMod, only : carea_allom @@ -724,8 +723,8 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site ! !ARGUMENTS: type(ed_site_type) , intent(inout), target :: currentSite - type(ed_patch_type) , intent(inout), target :: currentPatch - type(ed_patch_type) , intent(inout), target :: newPatch + type(fates_patch_type) , intent(inout), target :: currentPatch + type(fates_patch_type) , intent(inout), target :: newPatch real(r8) , intent(in) :: patch_site_areadis type(bc_in_type) , intent(in) :: bc_in diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index 4fb2907305..b8977e1b30 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -11,8 +11,7 @@ module EDMortalityFunctionsMod use EDPftvarcon , only : EDPftvarcon_inst use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type - use EDTypesMod , only : maxpft + use FatesConstantsMod, only : maxpft use FatesConstantsMod , only : itrue,ifalse use FatesAllometryMod , only : bleaf use FatesAllometryMod , only : storage_fraction_of_target @@ -49,8 +48,6 @@ module EDMortalityFunctionsMod contains - - subroutine mortality_rates( cohort_in,bc_in,btran_ft, mean_temp, & cmort,hmort,bmort, frmort,smort,asmort,dgmort ) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 6ba8877a12..2934948aab 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -16,17 +16,18 @@ module EDPatchDynamicsMod use FatesLitterMod , only : ncwd use FatesLitterMod , only : ndcmpy use FatesLitterMod , only : litter_type + use FatesConstantsMod, only : n_dbh_bins use EDTypesMod , only : homogenize_seed_pfts - use EDTypesMod , only : n_dbh_bins, area, patchfusion_dbhbin_loweredges + use EDTypesMod , only : area, patchfusion_dbhbin_loweredges use EDtypesMod , only : force_patchfuse_min_biomass - use EDTypesMod , only : ed_site_type, ed_patch_type + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : site_massbal_type use EDTypesMod , only : site_fluxdiags_type use EDTypesMod , only : min_patch_area use EDTypesMod , only : min_patch_area_forced - use EDParamsMod , only : nclmax - use EDTypesMod , only : maxpft + use EDParamsMod , only : nclmax use EDTypesMod , only : dtype_ifall use EDTypesMod , only : dtype_ilog use EDTypesMod , only : dtype_ifire @@ -36,7 +37,7 @@ module EDPatchDynamicsMod use FatesLitterMod , only : lg_sf use FatesLitterMod , only : dl_sf use EDTypesMod , only : dump_patch - use EDTypesMod , only : N_DIST_TYPES + use FatesConstantsMod , only : N_DIST_TYPES use EDTypesMod , only : AREA_INV use FatesConstantsMod , only : rsnbl_math_prec use FatesConstantsMod , only : fates_tiny @@ -174,7 +175,7 @@ subroutine disturbance_rates( site_in, bc_in) type(bc_in_type) , intent(in) :: bc_in ! ! !LOCAL VARIABLES: - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch type (fates_cohort_type), pointer :: currentCohort real(r8) :: cmort @@ -416,10 +417,10 @@ subroutine spawn_patches( currentSite, bc_in) type (bc_in_type), intent(in) :: bc_in ! ! !LOCAL VARIABLES: - type (ed_patch_type) , pointer :: new_patch - type (ed_patch_type) , pointer :: new_patch_primary - type (ed_patch_type) , pointer :: new_patch_secondary - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: new_patch + type (fates_patch_type) , pointer :: new_patch_primary + type (fates_patch_type) , pointer :: new_patch_secondary + type (fates_patch_type) , pointer :: currentPatch type (fates_cohort_type), pointer :: currentCohort type (fates_cohort_type), pointer :: nc type (fates_cohort_type), pointer :: storesmallcohort @@ -1257,8 +1258,8 @@ subroutine check_patch_area( currentSite ) ! ! !LOCAL VARIABLES: real(r8) :: areatot - type(ed_patch_type), pointer :: currentPatch - type(ed_patch_type), pointer :: largestPatch + type(fates_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: largestPatch real(r8) :: largest_area integer :: el real(r8) :: live_stock @@ -1328,7 +1329,7 @@ subroutine set_patchno( currentSite ) type(ed_site_type),intent(in) :: currentSite ! ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch integer patchno !--------------------------------------------------------------------- @@ -1408,8 +1409,8 @@ subroutine TransLitterNewPatch(currentSite, & ! ! !ARGUMENTS: type(ed_site_type) , intent(in) :: currentSite ! site - type(ed_patch_type) , intent(in) :: currentPatch ! Donor patch - type(ed_patch_type) , intent(inout) :: newPatch ! New patch + type(fates_patch_type) , intent(in) :: currentPatch ! Donor patch + type(fates_patch_type) , intent(inout) :: newPatch ! New patch real(r8) , intent(in) :: patch_site_areadis ! Area being donated ! by current patch @@ -1621,8 +1622,8 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, & ! ! !ARGUMENTS: type(ed_site_type) , intent(inout), target :: currentSite - type(ed_patch_type) , intent(inout), target :: currentPatch ! Donor Patch - type(ed_patch_type) , intent(inout), target :: newPatch ! New Patch + type(fates_patch_type) , intent(inout), target :: currentPatch ! Donor Patch + type(fates_patch_type) , intent(inout), target :: newPatch ! New Patch real(r8) , intent(in) :: patch_site_areadis ! Area being donated type(bc_in_type) , intent(in) :: bc_in @@ -1859,8 +1860,8 @@ subroutine mortality_litter_fluxes(currentSite, currentPatch, & ! ! !ARGUMENTS: type(ed_site_type) , intent(inout), target :: currentSite - type(ed_patch_type) , intent(inout), target :: currentPatch - type(ed_patch_type) , intent(inout), target :: newPatch + type(fates_patch_type) , intent(inout), target :: currentPatch + type(fates_patch_type) , intent(inout), target :: newPatch real(r8) , intent(in) :: patch_site_areadis type(bc_in_type) , intent(in) :: bc_in ! @@ -2081,7 +2082,7 @@ subroutine create_patch(currentSite, new_patch, age, areap, label,nocomp_pft) ! ! !ARGUMENTS: type(ed_site_type) , intent(inout), target :: currentSite - type(ed_patch_type), intent(inout), target :: new_patch + type(fates_patch_type), intent(inout), target :: new_patch real(r8), intent(in) :: age ! notional age of this patch in years real(r8), intent(in) :: areap ! initial area of this patch in m2. integer, intent(in) :: label ! anthropogenic disturbance label @@ -2204,10 +2205,10 @@ subroutine zero_patch(cp_p) ! !USES: ! ! !ARGUMENTS: - type(ed_patch_type), intent(inout), target :: cp_p + type(fates_patch_type), intent(inout), target :: cp_p ! ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch !--------------------------------------------------------------------- currentPatch => cp_p @@ -2330,7 +2331,7 @@ subroutine fuse_patches( csite, bc_in ) ! ! !LOCAL VARIABLES: type(ed_site_type) , pointer :: currentSite - type(ed_patch_type), pointer :: currentPatch,tpp,tmpptr + type(fates_patch_type), pointer :: currentPatch,tpp,tmpptr integer :: ft,z !counters for pft and height class real(r8) :: norm !normalized difference between biomass profiles real(r8) :: profiletol !tolerance of patch fusion routine. Starts off high and is reduced if there are too many patches. @@ -2637,8 +2638,8 @@ subroutine fuse_2_patches(csite, dp, rp) ! ! !ARGUMENTS: type (ed_site_type), intent(inout),target :: csite ! Current site - type (ed_patch_type) , pointer :: dp ! Donor Patch - type (ed_patch_type) , target, intent(inout) :: rp ! Recipient Patch + type (fates_patch_type) , pointer :: dp ! Donor Patch + type (fates_patch_type) , target, intent(inout) :: rp ! Recipient Patch ! ! !LOCAL VARIABLES: @@ -2649,8 +2650,8 @@ subroutine fuse_2_patches(csite, dp, rp) integer :: c,p !counters for pft and litter size class. integer :: tnull,snull ! are the tallest and shortest cohorts associated? integer :: el ! loop counting index for elements - type(ed_patch_type), pointer :: youngerp ! pointer to the patch younger than donor - type(ed_patch_type), pointer :: olderp ! pointer to the patch older than donor + type(fates_patch_type), pointer :: youngerp ! pointer to the patch younger than donor + type(fates_patch_type), pointer :: olderp ! pointer to the patch older than donor real(r8) :: inv_sum_area ! Inverse of the sum of the two patches areas !----------------------------------------------------------------------------------------------- @@ -2819,10 +2820,10 @@ subroutine terminate_patches(currentSite) type(ed_site_type), target, intent(inout) :: currentSite ! ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch - type(ed_patch_type), pointer :: olderPatch - type(ed_patch_type), pointer :: youngerPatch - type(ed_patch_type), pointer :: patchpointer + type(fates_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: olderPatch + type(fates_patch_type), pointer :: youngerPatch + type(fates_patch_type), pointer :: patchpointer integer, parameter :: max_cycles = 10 ! After 10 loops through ! You should had fused integer :: count_cycles @@ -2988,7 +2989,7 @@ subroutine DistributeSeeds(currentSite,seed_mass,el,pft) integer, intent(in) :: pft ! pft index ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(litter_type), pointer :: litt @@ -3018,7 +3019,7 @@ subroutine dealloc_patch(cpatch) ! to via the patch structure. This subroutine DOES NOT deallocate the patch ! structure itself. - type(ed_patch_type) :: cpatch + type(fates_patch_type) :: cpatch type(fates_cohort_type), pointer :: ccohort ! current type(fates_cohort_type), pointer :: ncohort ! next @@ -3096,10 +3097,10 @@ subroutine patch_pft_size_profile(cp_pnt) ! !USES: ! ! !ARGUMENTS: - type(ed_patch_type), target, intent(inout) :: cp_pnt + type(fates_patch_type), target, intent(inout) :: cp_pnt ! ! !LOCAL VARIABLES: - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: mind(N_DBH_BINS) ! Bottom of DBH bin real(r8) :: maxd(N_DBH_BINS) ! Top of DBH bin @@ -3156,7 +3157,7 @@ function countPatches( nsites, sites ) result ( totNumPatches ) type(ed_site_type) , intent(inout), target :: sites(nsites) ! ! !LOCAL VARIABLES: - type (ed_patch_type), pointer :: currentPatch + type (fates_patch_type), pointer :: currentPatch integer :: totNumPatches ! total number of patches. integer :: s !--------------------------------------------------------------------- @@ -3189,7 +3190,7 @@ subroutine get_frac_site_primary(site_in, frac_site_primary) real(r8) , intent(out) :: frac_site_primary ! !LOCAL VARIABLES: - type (ed_patch_type), pointer :: currentPatch + type (fates_patch_type), pointer :: currentPatch frac_site_primary = 0._r8 currentPatch => site_in%oldest_patch diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 35def81bc0..b1500736e8 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -51,10 +51,11 @@ module EDPhysiologyMod use FatesLitterMod , only : icellulose use EDParamsMod , only : nclmax use EDTypesMod , only : AREA,AREA_INV - use EDParamsMod , only : nlevleaf + use EDParamsMod , only : nlevleaf use EDTypesMod , only : num_vegtemp_mem - use EDTypesMod , only : maxpft - use EDTypesMod , only : ed_site_type, ed_patch_type + use FatesConstantsMod , only : maxpft + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type use FatesConstantsMod , only : leaves_on use FatesConstantsMod , only : leaves_off @@ -164,7 +165,7 @@ subroutine ZeroLitterFluxes( currentSite ) ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch integer :: el @@ -186,7 +187,7 @@ subroutine ZeroAllocationRates( currentSite ) ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%youngest_patch @@ -212,7 +213,7 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) ! Arguments type(ed_site_type) :: csite - type(ed_patch_type) :: cpatch + type(fates_patch_type) :: cpatch type(bc_in_type), intent(in) :: bc_in @@ -399,7 +400,7 @@ subroutine PreDisturbanceLitterFluxes( currentSite, currentPatch, bc_in ) ! !ARGUMENTS type(ed_site_type), intent(inout) :: currentSite - type(ed_patch_type), intent(inout) :: currentPatch + type(fates_patch_type), intent(inout) :: currentPatch type(bc_in_type), intent(in) :: bc_in ! @@ -476,7 +477,7 @@ subroutine PreDisturbanceIntegrateLitter(currentPatch) ! ----------------------------------------------------------------------------------- ! Arguments - type(ed_patch_type),intent(inout),target :: currentPatch + type(fates_patch_type),intent(inout),target :: currentPatch ! Locals @@ -560,7 +561,7 @@ subroutine trim_canopy( currentSite ) ! ! !LOCAL VARIABLES: type (fates_cohort_type) , pointer :: currentCohort - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch integer :: z ! leaf layer integer :: ipft ! pft index @@ -881,7 +882,7 @@ subroutine phenology( currentSite, bc_in ) ! ! !LOCAL VARIABLES: - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch integer :: model_day_int ! integer model day 1 - inf integer :: ncolddays ! no days underneath the threshold for leaf drop integer :: i_wmem ! Loop counter for water mem days @@ -1255,7 +1256,7 @@ subroutine phenology_leafonoff(currentSite) type(ed_site_type), intent(inout), target :: currentSite ! ! !LOCAL VARIABLES: - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: leaf_c ! leaf carbon [kg] @@ -1515,7 +1516,7 @@ subroutine satellite_phenology(currentSite, bc_in) class(prt_vartypes), pointer :: prt ! !LOCAL VARIABLES: - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: spread ! dummy value of canopy spread to estimate c_area @@ -1761,7 +1762,7 @@ subroutine SeedIn( currentSite, bc_in ) type(ed_site_type), intent(inout), target :: currentSite type(bc_in_type), intent(in) :: bc_in - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(litter_type), pointer :: litt type(fates_cohort_type), pointer :: currentCohort type(site_massbal_type), pointer :: site_mass @@ -1987,7 +1988,7 @@ subroutine recruitment( currentSite, currentPatch, bc_in ) ! ! !ARGUMENTS type(ed_site_type), intent(inout) :: currentSite - type(ed_patch_type), intent(inout),pointer :: currentPatch + type(fates_patch_type), intent(inout),pointer :: currentPatch type(bc_in_type), intent(in) :: bc_in ! ! !LOCAL VARIABLES: @@ -2314,7 +2315,7 @@ subroutine CWDInput( currentSite, currentPatch, litt, bc_in) ! ! !ARGUMENTS type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type),intent(inout), target :: currentPatch + type(fates_patch_type),intent(inout), target :: currentPatch type(litter_type),intent(inout),target :: litt type(bc_in_type),intent(in) :: bc_in @@ -2656,7 +2657,7 @@ subroutine fragmentation_scaler( currentPatch, bc_in) use FatesConstantsMod, only : pi => pi_const ! ! !ARGUMENTS - type(ed_patch_type), intent(inout) :: currentPatch + type(fates_patch_type), intent(inout) :: currentPatch type(bc_in_type), intent(in) :: bc_in ! @@ -2788,7 +2789,7 @@ subroutine UpdateRecruitL2FR(csite) ! and less than the max_count cohort. type(ed_site_type) :: csite - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch type(fates_cohort_type), pointer :: ccohort real(r8) :: rec_n(maxpft,nclmax) ! plant count @@ -2856,7 +2857,7 @@ end subroutine UpdateRecruitL2FR subroutine UpdateRecruitStoich(csite) type(ed_site_type) :: csite - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch type(fates_cohort_type), pointer :: ccohort integer :: ft ! functional type index integer :: cl ! canopy layer index @@ -2899,7 +2900,7 @@ subroutine SetRecruitL2FR(csite) type(ed_site_type) :: csite - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch type(fates_cohort_type), pointer :: ccohort integer :: ft,cl diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 new file mode 100644 index 0000000000..8374324db4 --- /dev/null +++ b/biogeochem/FatesPatchMod.F90 @@ -0,0 +1,184 @@ +module FatesPatchMod + + use FatesConstantsMod, only : r8 => fates_r8 + use FatesCohortMod, only : fates_cohort_type + use FatesRunningMeanMod, only : rmean_type + use FatesLitterMod, only : nfsc + use FatesLitterMod, only : litter_type + use EDParamsMod, only : maxSWb, nlevleaf, nclmax + use FatesConstantsMod, only : n_dbh_bins, maxpft, n_dist_types + use FatesConstantsMod, only : n_rad_stream_types + + implicit none + private + + type, public :: fates_patch_type + + ! POINTERS + type (fates_cohort_type), pointer :: tallest => null() ! pointer to patch's tallest cohort + type (fates_cohort_type), pointer :: shortest => null() ! pointer to patch's shortest cohort + type (fates_patch_type), pointer :: older => null() ! pointer to next older patch + type (fates_patch_type), pointer :: younger => null() ! pointer to next younger patch + + !:.........................................................................: + + ! INDICES + integer :: patchno ! unique number given to each new patch created for tracking + integer :: nocomp_pft_label ! when nocomp is active, use this label for patch ID + ! each patch ID corresponds to a pft number since each + ! patch has only one pft. Bareground patches are given + ! a zero integer as a label. If nocomp is not active this + ! is set to unset. This is set in patch%create as an argument + ! to that procedure. + + !:.........................................................................: + + ! PATCH INFO + real(r8) :: age ! average patch age [years] + integer :: age_class ! age class of the patch for history binning purposes + real(r8) :: area ! patch area [m2] + integer :: countcohorts ! number of cohorts in patch + integer :: ncl_p ! number of occupied canopy layers + integer :: anthro_disturbance_label ! patch label for anthropogenic disturbance classification + real(r8) :: age_since_anthro_disturbance ! average age for secondary forest since last anthropogenic disturbance [years] + + !:.........................................................................: + + ! RUNNING MEANS + !class(rmean_type), pointer :: t2m ! place-holder for 2m air temperature (variable window-size) + class(rmean_type), pointer :: tveg24 ! 24-hour mean vegetation temperature [K] + class(rmean_type), pointer :: tveg_lpa ! running mean of vegetation temperature at the + ! leaf photosynthesis acclimation timescale [K] + class(rmean_type), pointer :: tveg_longterm ! long-term running mean of vegetation temperature at the + ! leaf photosynthesis acclimation timescale [K] (i.e T_home) + + !:.........................................................................: + + ! LEAF ORGANIZATION + real(r8) :: pft_agb_profile(maxpft,n_dbh_bins) ! binned aboveground biomass, for patch fusion [kgC/m2] + real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer [m2 veg/m2 canopy area] + ! (patch without bare ground) + ! used to determine attenuation of parameters during photosynthesis + real(r8) :: total_canopy_area ! area that is covered by vegetation [m2] + real(r8) :: total_tree_area ! area that is covered by woody vegetation [m2] + real(r8) :: zstar ! height of smallest canopy tree, only meaningful in "strict PPA" mode [m] + real(r8) :: elai_profile(nclmax,maxpft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8) :: esai_profile(nclmax,maxpft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8) :: tlai_profile(nclmax,maxpft,nlevleaf) + real(r8) :: tsai_profile(nclmax,maxpft,nlevleaf) + real(r8) :: canopy_area_profile(nclmax,maxpft,nlevleaf) ! fraction of crown area per canopy area in each layer + ! they will sum to 1.0 in the fully closed canopy layers + ! but only in leaf-layers that contain contributions + ! from all cohorts that donate to canopy_area + integer :: canopy_mask(nclmax,maxpft) ! is there any of this pft in this canopy layer? + integer :: nrad(nclmax,maxpft) ! number of exposed leaf layers for each canopy layer and pft + integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft + real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] + real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] + real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) + + !:.........................................................................: + + real(r8) :: psn_z(nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf) + real(r8) :: nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf) + + !:.........................................................................: + + ! RADIATION + real(r8) :: radiation_error ! radiation error [W/m2] + real(r8) :: fcansno ! fraction of canopy covered in snow [0-1] + logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) + real(r8) :: solar_zenith_angle ! solar zenith angle [radians] + real(r8) :: gnd_alb_dif(maxSWb) ! ground albedo for diffuse rad, both bands [0-1] + real(r8) :: gnd_alb_dir(maxSWb) ! ground albedo for direct rad, both bands [0-1] + + ! organized by canopy layer, pft, and leaf layer + real(r8) :: fabd_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of direct light absorbed [0-1] + real(r8) :: fabd_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of direct light absorbed [0-1] + real(r8) :: fabi_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of indirect light absorbed [0-1] + real(r8) :: fabi_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of indirect light absorbed [0-1] + real(r8) :: ed_parsun_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the sun [W/m2] + real(r8) :: ed_parsha_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the shade [W/m2] + real(r8) :: ed_laisun_z(nclmax,maxpft,nlevleaf) + real(r8) :: ed_laisha_z(nclmax,maxpft,nlevleaf) + real(r8) :: f_sun(nclmax,maxpft,nlevleaf) ! fraction of leaves in the sun [0-1] + + ! radiation profiles for comparison against observations + real(r8) :: parprof_pft_dir_z(nclmax,maxpft,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8) :: parprof_pft_dif_z(nclmax,maxpft,nlevleaf) ! diffuse PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8) :: parprof_dir_z(nclmax,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, leaf level [W/m2] + real(r8) :: parprof_dif_z(nclmax,nlevleaf) ! diffuse PAR profile through canopy, by canopy, leaf level [W/m2] + + real(r8), allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation transmitted to the soil as direct, by numSWB [0-1] + real(r8), allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy + real(r8), allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + + !:.........................................................................: + + ! ROOTS + real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT + real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT + + !:.........................................................................: + + ! EXTERNAL SEED RAIN + real(r8) :: nitr_repro_stoich(maxpft) ! The NC ratio of a new recruit in this patch + real(r8) :: phos_repro_stoich(maxpft) ! The PC ratio of a new recruit in this patch + + !:.........................................................................: + + ! DISTURBANCE + real(r8) :: disturbance_rates(n_dist_types) ! disturbance rate [0-1/day] from 1) mortality + ! 2) fire + ! 3) logging mortatliy + real(r8) :: fract_ldist_not_harvested ! fraction of logged area that is canopy trees that weren't harvested [0-1] + + !:.........................................................................: + + ! LITTER AND COARSE WOODY DEBRIS + type(litter_type), pointer :: litter(:) ! litter (leaf,fnrt,CWD and seeds) for different elements + real(r8), allocatable :: fragmentation_scaler(:) ! scale rate of litter fragmentation based on soil layer [0-1] + + !:.........................................................................: + + ! FUELS AND FIRE + ! fuel characteristics + real(r8) :: sum_fuel ! total ground fuel related to ROS (omits 1000 hr fuels) [kgC/m2] + real(r8) :: fuel_frac(nfsc) ! fraction of each litter class in the ros_fuel [0-1] + real(r8) :: livegrass ! total aboveground grass biomass in patch [kgC/m2] + real(r8) :: fuel_bulkd ! average fuel bulk density of the ground fuel. [kg/m3] + ! (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_sav ! average surface area to volume ratio of the ground fuel [cm-1] + ! (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_mef ! average moisture of extinction factor + ! of the ground fuel (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_eff_moist ! effective avearage fuel moisture content of the ground fuel + ! (incl. live grasses. omits 1000hr fuels) + real(r8) :: litter_moisture(nfsc) ! moisture of litter [m3/m3] + + ! fire spread + real(r8) :: ros_front ! rate of forward spread of fire [m/min] + real(r8) :: ros_back ! rate of backward spread of fire [m/min] + real(r8) :: effect_wspeed ! windspeed modified by fraction of relative grass and tree cover [m/min] + real(r8) :: tau_l ! duration of lethal heating [min] + real(r8) :: fi ! average fire intensity of flaming front [kJ/m/s] or [kW/m] + integer :: fire ! is there a fire? [1=yes; 0=no] + real(r8) :: fd ! fire duration [min] + + ! fire effects + real(r8) :: scorch_ht(maxpft) ! scorch height [m] + real(r8) :: frac_burnt ! fraction burnt [0-1/day] + real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] + real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] + + end type fates_patch_type + +end module FatesPatchMod \ No newline at end of file diff --git a/biogeochem/FatesSoilBGCFluxMod.F90 b/biogeochem/FatesSoilBGCFluxMod.F90 index 67efc87aae..50e7461395 100644 --- a/biogeochem/FatesSoilBGCFluxMod.F90 +++ b/biogeochem/FatesSoilBGCFluxMod.F90 @@ -44,7 +44,7 @@ module FatesSoilBGCFluxMod use EDParamsMod , only : p_uptake_mode use EDParamsMod , only : n_uptake_mode use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA,AREA_INV use FatesInterfaceTypesMod, only : bc_in_type @@ -126,7 +126,7 @@ subroutine UnPackNutrientAquisitionBCs(sites, bc_in) integer :: icomp ! competitor index integer :: id ! decomp layer index integer :: pft ! pft index - type(ed_patch_type), pointer :: cpatch ! current patch pointer + type(fates_patch_type), pointer :: cpatch ! current patch pointer type(fates_cohort_type), pointer :: ccohort ! current cohort pointer real(r8) :: fnrt_c ! fine-root carbon [kg] @@ -249,7 +249,7 @@ subroutine PrepCH4BCs(csite,bc_in,bc_out) type(bc_out_type), intent(inout) :: bc_out type(bc_in_type), intent(in) :: bc_in - type(ed_patch_type), pointer :: cpatch ! current patch pointer + type(fates_patch_type), pointer :: cpatch ! current patch pointer type(fates_cohort_type), pointer :: ccohort ! current cohort pointer integer :: pft ! plant functional type integer :: fp ! patch index of the site @@ -419,7 +419,7 @@ subroutine PrepNutrientAquisitionBCs(csite, bc_in, bc_out) integer :: j ! soil layer index integer :: id ! decomp index (might == j) integer :: pft ! plant functional type - type(ed_patch_type), pointer :: cpatch ! current patch pointer + type(fates_patch_type), pointer :: cpatch ! current patch pointer type(fates_cohort_type), pointer :: ccohort ! current cohort pointer real(r8) :: fnrt_c ! fine-root carbon [kg] real(r8) :: veg_rootc ! fine root carbon in each layer [g/m3] @@ -532,7 +532,7 @@ subroutine EffluxIntoLitterPools(csite, cpatch, ccohort, bc_in ) ! Arguments type(ed_site_type), intent(inout) :: csite - type(ed_patch_type), intent(inout) :: cpatch + type(fates_patch_type), intent(inout) :: cpatch type(fates_cohort_type), intent(inout),target :: ccohort type(bc_in_type), intent(in) :: bc_in @@ -630,7 +630,7 @@ subroutine FluxIntoLitterPools(csite, bc_in, bc_out) type(bc_out_type) , intent(inout),target :: bc_out ! !LOCAL VARIABLES: - type (ed_patch_type), pointer :: currentPatch + type (fates_patch_type), pointer :: currentPatch type (fates_cohort_type), pointer :: ccohort real(r8), pointer :: flux_cel_si(:) real(r8), pointer :: flux_lab_si(:) diff --git a/biogeophys/EDAccumulateFluxesMod.F90 b/biogeophys/EDAccumulateFluxesMod.F90 index 071a1ad0a7..f32a2f0e6e 100644 --- a/biogeophys/EDAccumulateFluxesMod.F90 +++ b/biogeophys/EDAccumulateFluxesMod.F90 @@ -38,8 +38,8 @@ subroutine AccumulateFluxes_ED(nsites, sites, bc_in, bc_out, dt_time) ! ! !USES: - use EDTypesMod , only : ed_patch_type, & - ed_site_type, AREA + use EDTypesMod , only : ed_site_type, AREA + use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type use FatesInterfaceTypesMod , only : bc_in_type,bc_out_type @@ -53,7 +53,7 @@ subroutine AccumulateFluxes_ED(nsites, sites, bc_in, bc_out, dt_time) ! ! !LOCAL VARIABLES: type(fates_cohort_type), pointer :: ccohort ! current cohort - type(ed_patch_type) , pointer :: cpatch ! current patch + type(fates_patch_type) , pointer :: cpatch ! current patch integer :: iv !leaf layer integer :: c ! clm/alm column integer :: s ! ed site diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index 8063915ff3..ecdc1bb0c1 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -9,9 +9,9 @@ module EDBtranMod use FatesConstantsMod , only : tfrz => t_water_freeze_k_1atm use FatesConstantsMod , only : itrue,ifalse,nearzero use FatesConstantsMod , only : nocomp_bareground - use EDTypesMod , only : ed_site_type, & - ed_patch_type, & - maxpft + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type + use FatesConstantsMod, only : maxpft use FatesCohortMod, only : fates_cohort_type use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & @@ -110,7 +110,7 @@ subroutine btran_ed( nsites, sites, bc_in, bc_out) ! ! !LOCAL VARIABLES: - type(ed_patch_type),pointer :: cpatch ! Current Patch Pointer + type(fates_patch_type),pointer :: cpatch ! Current Patch Pointer type(fates_cohort_type),pointer :: ccohort ! Current cohort pointer integer :: s ! site integer :: j ! soil layer diff --git a/biogeophys/EDSurfaceAlbedoMod.F90 b/biogeophys/EDSurfaceAlbedoMod.F90 index fb800ef80b..267d130c17 100644 --- a/biogeophys/EDSurfaceAlbedoMod.F90 +++ b/biogeophys/EDSurfaceAlbedoMod.F90 @@ -10,8 +10,9 @@ module EDSurfaceRadiationMod #include "shr_assert.h" - use EDTypesMod , only : ed_patch_type, ed_site_type - use EDTypesMod , only : maxpft + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type + use FatesConstantsMod, only : maxpft use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : itrue use FatesConstantsMod , only : pi_const @@ -68,7 +69,7 @@ subroutine ED_Norman_Radiation (nsites, sites, bc_in, bc_out ) ! ! !USES: - use EDtypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use EDTypesMod , only : ed_site_type @@ -84,7 +85,7 @@ subroutine ED_Norman_Radiation (nsites, sites, bc_in, bc_out ) integer :: s ! site loop counter integer :: ifp ! patch loop counter integer :: ib ! radiation broad band counter - type(ed_patch_type), pointer :: currentPatch ! patch pointer + type(fates_patch_type), pointer :: currentPatch ! patch pointer !----------------------------------------------------------------------- ! ------------------------------------------------------------------------------- @@ -196,13 +197,13 @@ subroutine PatchNormanRadiation (currentPatch, & ! ! !USES: use EDPftvarcon , only : EDPftvarcon_inst - use EDtypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type ! ----------------------------------------------------------------------------------- ! !ARGUMENTS: ! ----------------------------------------------------------------------------------- - type(ed_patch_type), intent(inout), target :: currentPatch + type(fates_patch_type), intent(inout), target :: currentPatch real(r8), intent(inout) :: albd_parb_out(hlm_numSWb) real(r8), intent(inout) :: albi_parb_out(hlm_numSWb) real(r8), intent(inout) :: fabd_parb_out(hlm_numSWb) @@ -1130,7 +1131,7 @@ subroutine ED_SunShadeFracs(nsites, sites,bc_in,bc_out) ! locals - type (ed_patch_type),pointer :: cpatch ! c"urrent" patch + type (fates_patch_type),pointer :: cpatch ! c"urrent" patch real(r8) :: sunlai real(r8) :: shalai real(r8) :: elai diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 index 9beb3d5cd9..825a886011 100644 --- a/biogeophys/FatesBstressMod.F90 +++ b/biogeophys/FatesBstressMod.F90 @@ -7,9 +7,9 @@ module FatesBstressMod ! use FatesConstantsMod , only : tfrz => t_water_freeze_k_1atm use FatesConstantsMod , only : itrue,ifalse - use EDTypesMod , only : ed_site_type, & - ed_patch_type, & - maxpft + use FatesConstantsMod, only : maxpft + use EDTypesMod , only : ed_site_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & @@ -48,7 +48,7 @@ subroutine btran_sal_stress_fates( nsites, sites, bc_in) ! ! !LOCAL VARIABLES: - type(ed_patch_type),pointer :: cpatch ! Current Patch Pointer + type(fates_patch_type),pointer :: cpatch ! Current Patch Pointer type(fates_cohort_type),pointer :: ccohort ! Current cohort pointer integer :: s ! site integer :: j ! soil layer diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index c008ae2f39..4b52cea541 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -52,7 +52,7 @@ module FatesPlantHydraulicsMod use EDParamsMod , only : hydr_solver use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA_INV use EDTypesMod , only : AREA @@ -336,8 +336,8 @@ subroutine RestartHydrStates(sites,nsites,bc_in,bc_out) ! locals ! ---------------------------------------------------------------------------------- ! LL pointers - type(ed_patch_type),pointer :: cpatch ! current patch - type(fates_cohort_type),pointer :: ccohort ! current cohort + type(fates_patch_type),pointer :: cpatch ! current patch + type(fates_cohort_type),pointer :: ccohort ! current cohort type(ed_cohort_hydr_type),pointer :: ccohort_hydr type(ed_site_hydr_type),pointer :: csite_hydr integer :: s ! site loop counter @@ -1777,7 +1777,7 @@ subroutine UpdateH2OVeg(csite,bc_out,prev_site_h2o,icall) ! Locals type(fates_cohort_type), pointer :: currentCohort - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr integer :: s @@ -1860,7 +1860,7 @@ subroutine RecruitWUptake(nsites,sites,bc_in,dtime,recruitflag) ! Locals type(fates_cohort_type), pointer :: currentCohort - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr integer :: s, j, ft @@ -1935,7 +1935,7 @@ subroutine ConstrainRecruitNumber(csite,ccohort, cpatch, bc_in, mean_temp) ! Arguments type(ed_site_type), intent(inout), target :: csite type(fates_cohort_type) , intent(inout), target :: ccohort - type(ed_patch_type), intent(inout), target :: cpatch + type(fates_patch_type), intent(inout), target :: cpatch type(bc_in_type) , intent(in) :: bc_in real(r8), intent(in) :: mean_temp @@ -2060,7 +2060,7 @@ subroutine UpdateSizeDepRhizVolLenCon(currentSite, bc_in) ! ! !LOCAL VARIABLES: type(ed_site_hydr_type), pointer :: csite_hydr - type(ed_patch_type) , pointer :: cPatch + type(fates_patch_type) , pointer :: cPatch type(fates_cohort_type) , pointer :: cCohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr real(r8) :: hksat_s ! hksat converted to units of 10^6sec @@ -2197,7 +2197,7 @@ subroutine BTranForHLMDiagnosticsFromCohortHydr(nsites,sites,bc_out) integer :: s integer :: ifp real(r8) :: balive_patch - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort do s = 1,nsites @@ -2427,7 +2427,7 @@ subroutine hydraulics_bc ( nsites, sites, bc_in, bc_out, dtime) !---------------------------------------------------------------------- - type (ed_patch_type), pointer :: cpatch ! current patch pointer + type (fates_patch_type), pointer :: cpatch ! current patch pointer type (fates_cohort_type), pointer :: ccohort ! current cohort pointer type(ed_site_hydr_type), pointer :: csite_hydr ! site hydraulics pointer type(ed_cohort_hydr_type), pointer :: ccohort_hydr ! cohort hydraulics pointer @@ -4346,7 +4346,7 @@ subroutine RecruitWaterStorage(nsites,sites,bc_out) ! Locals type(fates_cohort_type), pointer :: currentCohort - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: csite_hydr integer :: s diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 7f27bc6107..09814b0c0a 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -38,13 +38,13 @@ module FATESPlantRespPhotosynthMod use FatesInterfaceTypesMod, only : hlm_parteh_mode use FatesInterfaceTypesMod, only : numpft use FatesInterfaceTypesMod, only : nleafage - use EDTypesMod, only : maxpft + use FatesConstantsMod, only : maxpft use EDParamsMod, only : nlevleaf use EDParamsMod, only : nclmax use PRTGenericMod, only : max_nleafage use EDTypesMod, only : do_fates_salinity use EDParamsMod, only : q10_mr - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type use EDParamsMod, only : maintresp_leaf_model use FatesConstantsMod, only : lmrmodel_ryan_1991 @@ -127,7 +127,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! !USES: use EDTypesMod , only : ed_site_type - use EDTypesMod , only : maxpft + use FatesConstantsMod , only : maxpft use EDParamsMod , only : dinc_vai use EDParamsMod , only : dlower_vai use FatesInterfaceTypesMod , only : bc_in_type @@ -158,7 +158,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! LOCAL VARIABLES: ! ----------------------------------------------------------------------------------- - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch type (fates_cohort_type), pointer :: currentCohort ! ----------------------------------------------------------------------------------- @@ -1890,7 +1890,7 @@ subroutine UpdateCanopyNCanNRadPresent(currentPatch) ! --------------------------------------------------------------------------------- ! Arguments - type(ed_patch_type), target :: currentPatch + type(fates_patch_type), target :: currentPatch type(fates_cohort_type), pointer :: currentCohort ! Locals diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index aa8716bf90..797ca859b8 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -24,7 +24,7 @@ module SFMainMod use PRTGenericMod , only : element_pos use EDtypesMod , only : ed_site_type - use EDtypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDtypesMod , only : AREA use FatesLitterMod , only : DL_SF @@ -85,7 +85,7 @@ subroutine fire_model( currentSite, bc_in) type(bc_in_type) , intent(in) :: bc_in - type (ed_patch_type), pointer :: currentPatch + type (fates_patch_type), pointer :: currentPatch !zero fire things currentPatch => currentSite%youngest_patch @@ -127,7 +127,7 @@ subroutine fire_danger_index ( currentSite, bc_in) type(ed_site_type) , intent(inout), target :: currentSite type(bc_in_type) , intent(in) :: bc_in - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch real(r8) :: temp_in_C ! daily averaged temperature in celcius real(r8) :: rainfall ! daily precip in mm/day @@ -181,7 +181,7 @@ subroutine charecteristics_of_fuel ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort type(litter_type), pointer :: litt_c @@ -357,7 +357,7 @@ subroutine wind_effect ( currentSite, bc_in) type(ed_site_type) , intent(inout), target :: currentSite type(bc_in_type) , intent(in) :: bc_in - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: total_grass_area ! per patch,in m2 @@ -458,7 +458,7 @@ subroutine rate_of_spread ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch ! Rothermal fire spread model parameters. real(r8) beta,beta_op ! weighted average of packing ratio (unitless) @@ -601,7 +601,7 @@ subroutine ground_fuel_consumption ( currentSite ) SF_val_mid_moisture_Coeff, SF_val_mid_moisture_Slope type(ed_site_type) , intent(in), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(litter_type), pointer :: litt_c ! carbon 12 litter pool real(r8) :: moist !effective fuel moisture @@ -703,7 +703,7 @@ subroutine area_burnt_intensity ( currentSite, bc_in ) SF_val_max_durat, SF_val_durat_slope, SF_val_fire_threshold type(ed_site_type), intent(inout), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(bc_in_type), intent(in) :: bc_in real(r8) ROS !m/s @@ -895,7 +895,7 @@ subroutine crown_scorching ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: tree_ag_biomass ! total amount of above-ground tree biomass in patch. kgC/m2 @@ -959,7 +959,7 @@ subroutine crown_damage ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: crown_depth ! Depth of crown in meters @@ -1026,7 +1026,7 @@ subroutine cambial_damage_kill ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: tau_c !critical time taken to kill cambium (minutes) @@ -1082,7 +1082,7 @@ subroutine post_fire_mortality ( currentSite ) type(ed_site_type), intent(in), target :: currentSite - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%oldest_patch diff --git a/main/ChecksBalancesMod.F90 b/main/ChecksBalancesMod.F90 index 3d200a6f99..aa81b4fbae 100644 --- a/main/ChecksBalancesMod.F90 +++ b/main/ChecksBalancesMod.F90 @@ -3,7 +3,7 @@ module ChecksBalancesMod use shr_kind_mod, only : r8 => shr_kind_r8 use shr_const_mod, only : SHR_CONST_CDAY use EDtypesMod, only : ed_site_type - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type use EDTypesMod, only : AREA use EDTypesMod, only : site_massbal_type @@ -48,7 +48,7 @@ subroutine SiteMassStock(currentSite,el,total_stock,biomass_stock,litter_stock,s real(r8),intent(out) :: litter_stock ! kg real(r8),intent(out) :: biomass_stock ! kg real(r8),intent(out) :: seed_stock ! kg - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort real(r8) :: patch_biomass ! kg real(r8) :: patch_seed ! kg @@ -81,7 +81,7 @@ subroutine PatchMassStock(currentPatch,el,live_stock,seed_stock,litter_stock) ! --------------------------------------------------------------------------------- ! Sum up the mass of the different stocks on a patch for each element ! --------------------------------------------------------------------------------- - type(ed_patch_type),intent(inout),target :: currentPatch + type(fates_patch_type),intent(inout),target :: currentPatch integer,intent(in) :: el real(r8),intent(out) :: live_stock real(r8),intent(out) :: seed_stock @@ -146,7 +146,7 @@ subroutine CheckLitterPools(currentSite,bc_in) type(bc_in_type), intent(in) :: bc_in ! Local variables - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(litter_type), pointer :: litt ! Litter object integer :: el ! Litter element loop index integer :: element_id ! parteh consistent litter index diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 18fa974c88..e9c6ea06d1 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -23,11 +23,11 @@ module EDInitMod use EDPhysiologyMod , only : assign_cohort_sp_properties use ChecksBalancesMod , only : SiteMassStock use FatesInterfaceTypesMod , only : hlm_day_of_year - use EDTypesMod , only : ed_site_type, ed_patch_type + use EDTypesMod , only : ed_site_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : numWaterMem use EDTypesMod , only : num_vegtemp_mem - use EDTypesMod , only : maxpft use EDTypesMod , only : AREA use EDTypesMod , only : init_spread_near_bare_ground use EDTypesMod , only : init_spread_inventory @@ -525,9 +525,9 @@ subroutine init_patches( nsites, sites, bc_in) integer :: is_first_patch type(ed_site_type), pointer :: sitep - type(ed_patch_type), pointer :: newppft(:) - type(ed_patch_type), pointer :: newp - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: newppft(:) + type(fates_patch_type), pointer :: newp + type(fates_patch_type), pointer :: currentPatch ! List out some nominal patch values that are used for Near Bear Ground initializations ! as well as initializing inventory @@ -744,7 +744,7 @@ subroutine init_cohorts( site_in, patch_in, bc_in) ! ! !ARGUMENTS type(ed_site_type), intent(inout), pointer :: site_in - type(ed_patch_type), intent(inout), pointer :: patch_in + type(fates_patch_type), intent(inout), pointer :: patch_in type(bc_in_type), intent(in) :: bc_in ! ! !LOCAL VARIABLES: diff --git a/main/EDMainMod.F90 b/main/EDMainMod.F90 index 386f788db8..d5b2dcc687 100644 --- a/main/EDMainMod.F90 +++ b/main/EDMainMod.F90 @@ -64,7 +64,7 @@ module EDMainMod use FatesLitterMod , only : litter_type use FatesLitterMod , only : ncwd use EDtypesMod , only : ed_site_type - use EDtypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : AREA use EDTypesMod , only : site_massbal_type @@ -149,7 +149,7 @@ subroutine ed_ecosystem_dynamics(currentSite, bc_in, bc_out) type(bc_out_type) , intent(inout) :: bc_out ! ! !LOCAL VARIABLES: - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch integer :: el ! Loop counter for variables integer :: do_patch_dynamics ! for some modes, we turn off patch dynamics @@ -343,7 +343,7 @@ subroutine ed_integrate_state_variables(currentSite, bc_in, bc_out ) ! ! !LOCAL VARIABLES: type(site_massbal_type), pointer :: site_cmass - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type) , pointer :: currentCohort type(fates_cohort_type) , pointer :: nc type(fates_cohort_type) , pointer :: storesmallcohort @@ -780,7 +780,7 @@ subroutine ed_update_site( currentSite, bc_in, bc_out ) type(bc_out_type) , intent(inout) :: bc_out ! ! !LOCAL VARIABLES: - type (ed_patch_type) , pointer :: currentPatch + type (fates_patch_type) , pointer :: currentPatch !----------------------------------------------------------------------- if(hlm_use_sp.eq.ifalse)then call canopy_spread(currentSite) @@ -879,7 +879,7 @@ subroutine TotalBalanceCheck (currentSite, call_index ) ! Also, the carbon pools are per site/gridcell, so that ! we can account for the changing areas of patches. - type(ed_patch_type) , pointer :: currentPatch + type(fates_patch_type) , pointer :: currentPatch type(fates_cohort_type) , pointer :: currentCohort type(litter_type), pointer :: litt logical, parameter :: print_cohorts = .true. ! Set to true if you want @@ -1034,7 +1034,7 @@ subroutine bypass_dynamics(currentSite) type(ed_site_type) , intent(inout), target :: currentSite ! Locals - type(ed_patch_type), pointer :: currentPatch + type(fates_patch_type), pointer :: currentPatch type(fates_cohort_type), pointer :: currentCohort currentPatch => currentSite%youngest_patch diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 9db76ff895..2394944368 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -27,18 +27,16 @@ module EDTypesMod use FatesInterfaceTypesMod,only : bc_out_type use FatesInterfaceTypesMod,only : hlm_parteh_mode use FatesCohortMod, only : fates_cohort_type + use FatesPatchMod, only : fates_patch_type use EDParamsMod, only : maxSWb, nclmax, nlevleaf + use FatesConstantsMod, only : maxpft + use FatesConstantsMod, only : n_dbh_bins, n_dist_types use shr_log_mod, only : errMsg => shr_log_errMsg implicit none private ! By default everything is private save - - integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed - ! the parameter file may determine that fewer - ! are used, but this helps allocate scratch - ! space and output arrays. - + real(r8), parameter, public :: init_recruit_trim = 0.8_r8 ! This is the initial trimming value that ! new recruits start with @@ -87,7 +85,6 @@ module EDTypesMod ! BIOLOGY/BIOGEOCHEMISTRY integer , parameter, public :: num_vegtemp_mem = 10 ! Window of time over which we track temp for cold sensecence (days) - integer , parameter, public :: N_DIST_TYPES = 3 ! Disturbance Modes 1) tree-fall, 2) fire, 3) logging integer , parameter, public :: dtype_ifall = 1 ! index for naturally occuring tree-fall generated event integer , parameter, public :: dtype_ifire = 2 ! index for fire generated disturbance event integer , parameter, public :: dtype_ilog = 3 ! index for logging generated disturbance event @@ -106,7 +103,6 @@ module EDTypesMod ! PATCH FUSION real(r8), parameter, public :: force_patchfuse_min_biomass = 0.005_r8 ! min biomass (kg / m2 patch area) below which to force-fuse patches - integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches real(r8), parameter, public :: patchfusion_dbhbin_loweredges(N_DBH_BINS) = & (/0._r8, 5._r8, 20._r8, 50._r8, 100._r8, 150._r8/) ! array of bin lower edges for comparing patches real(r8), parameter, public :: patch_fusion_tolerance_relaxation_increment = 1.1_r8 ! amount by which to increment patch fusion threshold @@ -133,205 +129,6 @@ module EDTypesMod logical, parameter, public :: homogenize_seed_pfts = .false. character(len=*), parameter, private :: sourcefile = __FILE__ - !************************************ - !** Patch type structure ** - !************************************ - - type, public :: ed_patch_type - - ! POINTERS - type (fates_cohort_type), pointer :: tallest => null() ! pointer to patch's tallest cohort - type (fates_cohort_type), pointer :: shortest => null() ! pointer to patch's shortest cohort - type (ed_patch_type), pointer :: older => null() ! pointer to next older patch - type (ed_patch_type), pointer :: younger => null() ! pointer to next younger patch - - !INDICES - integer :: patchno ! unique number given to each new patch created for tracking - - ! PATCH INFO - real(r8) :: age ! average patch age: years - integer :: age_class ! age class of the patch for history binning purposes - real(r8) :: area ! patch area: m2 - integer :: countcohorts ! Number of cohorts in patch - integer :: ncl_p ! Number of occupied canopy layers - integer :: anthro_disturbance_label ! patch label for anthropogenic disturbance classification - real(r8) :: age_since_anthro_disturbance ! average age for secondary forest since last anthropogenic disturbance - - - ! Running means - !class(rmean_type), pointer :: t2m ! Place-holder for 2m air temperature (variable window-size) - class(rmean_type), pointer :: tveg24 ! 24-hour mean vegetation temperature (K) - class(rmean_type), pointer :: tveg_lpa ! Running mean of vegetation temperature at the - ! leaf photosynthesis acclimation timescale [K] - class(rmean_type), pointer :: tveg_longterm ! Long-Term Running mean of vegetation temperature at the - ! leaf photosynthesis acclimation timescale [K] (i.e T_home) - - integer :: nocomp_pft_label ! Where nocomp is active, use this label for patch ID. - ! Each patch ID corresponds to a pft number since each - ! patch has only one pft. Bareground patches are given - ! a zero integer as a label. - ! If nocomp is not active this is set to unset. - ! This is set in create_patch as an argument - ! to that procedure. - - - ! LEAF ORGANIZATION - real(r8) :: pft_agb_profile(maxpft,n_dbh_bins) ! binned above ground biomass, for patch fusion: KgC/m2 - real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer - ! used to determine attenuation of parameters during - ! photosynthesis m2 veg / m2 of canopy area (patch without bare ground) - real(r8) :: total_canopy_area ! area that is covered by vegetation : m2 - real(r8) :: total_tree_area ! area that is covered by woody vegetation : m2 - real(r8) :: zstar ! height of smallest canopy tree -- only meaningful in "strict PPA" mode - - real(r8) :: c_stomata ! Mean stomatal conductance of all leaves in the patch [umol/m2/s] - real(r8) :: c_lblayer ! Mean boundary layer conductance of all leaves in the patch [umol/m2/s] - - ! UNITS for the ai profiles - ! [ m2 leaf / m2 contributing crown footprints] - real(r8) :: tlai_profile(nclmax,maxpft,nlevleaf) ! total leaf area in each canopy layer, pft, and leaf layer. - real(r8) :: elai_profile(nclmax,maxpft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer - real(r8) :: tsai_profile(nclmax,maxpft,nlevleaf) ! total stem area in each canopy layer, pft, and leaf layer - real(r8) :: esai_profile(nclmax,maxpft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer - real(r8) :: radiation_error ! radiation error (w/m2) - real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) - real(r8) :: canopy_area_profile(nclmax,maxpft,nlevleaf) ! fraction of crown area per canopy area in each layer - ! they will sum to 1.0 in the fully closed canopy layers - ! but only in leaf-layers that contain contributions - ! from all cohorts that donate to canopy_area - - - ! layer, pft, and leaf layer:- - integer :: canopy_mask(nclmax,maxpft) ! is there any of this pft in this canopy layer? - integer :: nrad(nclmax,maxpft) ! number of exposed leaf layers for each canopy layer and pft - integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft - - !RADIATION FLUXES - real(r8) :: fcansno ! Fraction of canopy covered in snow - - logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) - real(r8) :: solar_zenith_angle ! solar zenith angle (radians) - - real(r8) :: gnd_alb_dif(maxSWb) ! ground albedo for diffuse rad, both bands (fraction) - real(r8) :: gnd_alb_dir(maxSWb) ! ground albedo for direct rad, both bands (fraction) - - real(r8) :: fabd_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of direct light absorbed by each canopy - ! layer, pft, and leaf layer:- - real(r8) :: fabd_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of direct light absorbed by each canopy - ! layer, pft, and leaf layer:- - real(r8) :: fabi_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of indirect light absorbed by each canopy - ! layer, pft, and leaf layer:- - real(r8) :: fabi_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of indirect light absorbed by each canopy - ! layer, pft, and leaf layer:- - - real(r8) :: ed_laisun_z(nclmax,maxpft,nlevleaf) ! amount of LAI in the sun in each canopy layer, - ! pft, and leaf layer. m2/m2 - real(r8) :: ed_laisha_z(nclmax,maxpft,nlevleaf) ! amount of LAI in the shade in each canopy layer, - real(r8) :: ed_parsun_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the sun in each canopy layer, - real(r8) :: ed_parsha_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the shade in each canopy layer, - real(r8) :: f_sun(nclmax,maxpft,nlevleaf) ! fraction of leaves in the sun in each canopy layer, pft, - - ! radiation profiles for comparison against observations - - ! normalized direct photosynthetically active radiation profiles by - ! incident type (direct/diffuse at top of canopy),leaf,pft,leaf (unitless) - real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) - - ! normalized diffuse photosynthetically active radiation profiles by - ! incident type (direct/diffuse at top of canopy),leaf,pft,leaf (unitless) - real(r8) :: nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) - - ! normalized direct photosynthetically active radiation profiles by - ! incident type (direct/diffuse at top of canopy),leaf,leaf (unitless) - real(r8) :: nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf) - - ! normalized diffuse photosynthetically active radiation profiles by - ! incident type (direct/diffuse at top of canopy),leaf,leaf (unitless) - real(r8) :: nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf) - - real(r8) :: parprof_pft_dir_z(nclmax,maxpft,nlevleaf) ! direct-beam PAR profile through canopy, by canopy,PFT,leaf level (w/m2) - real(r8) :: parprof_pft_dif_z(nclmax,maxpft,nlevleaf) ! diffuse PAR profile through canopy, by canopy,PFT,leaf level (w/m2) - real(r8) :: parprof_dir_z(nclmax,nlevleaf) ! direct-beam PAR profile through canopy, by canopy,leaf level (w/m2) - real(r8) :: parprof_dif_z(nclmax,nlevleaf) ! diffuse PAR profile through canopy, by canopy,leaf level (w/m2) - - ! and leaf layer. m2/m2 - real(r8),allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation that (cm_numSWb) - ! is transmitted to the soil as direct - real(r8),allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that - ! is transmitted to the soil as diffuse - real(r8),allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that - ! is transmitted to the soil as diffuse - real(r8),allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy - real(r8),allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8),allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy - real(r8),allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8),allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy - - - ! PHOTOSYNTHESIS - - real(r8) :: psn_z(nclmax,maxpft,nlevleaf) ! carbon assimilation in each canopy layer, pft, and leaf layer. umolC/m2/s - - ! ROOTS - real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT:- - real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT:- - - - ! These two variables are only used for external seed rain currently. - real(r8) :: nitr_repro_stoich(maxpft) ! The NC ratio of a new recruit in this patch - real(r8) :: phos_repro_stoich(maxpft) ! The PC ratio of a new recruit in this patch - - - ! DISTURBANCE - real(r8) :: disturbance_rates(n_dist_types) ! disturbance rate from 1) mortality - ! 2) fire: fraction/day - ! 3) logging mortatliy - real(r8) :: fract_ldist_not_harvested ! fraction of logged area that is canopy trees that weren't harvested - - - ! Litter and Coarse Woody Debris - - type(litter_type), pointer :: litter(:) ! Litter (leaf,fnrt,CWD and seeds) for different elements - - real(r8),allocatable :: fragmentation_scaler(:) ! Scale rate of litter fragmentation based on soil layer. 0 to 1. - - !FUEL CHARECTERISTICS - real(r8) :: sum_fuel ! total ground fuel related to ros (omits 1000hr fuels): KgC/m2 - real(r8) :: fuel_frac(nfsc) ! fraction of each litter class in the ros_fuel:-. - real(r8) :: livegrass ! total aboveground grass biomass in patch. KgC/m2 - real(r8) :: fuel_bulkd ! average fuel bulk density of the ground fuel. kgBiomass/m3 - ! (incl. live grasses. omits 1000hr fuels). KgC/m3 - real(r8) :: fuel_sav ! average surface area to volume ratio of the ground fuel. cm-1 - ! (incl. live grasses. omits 1000hr fuels). - real(r8) :: fuel_mef ! average moisture of extinction factor - ! of the ground fuel (incl. live grasses. omits 1000hr fuels). - real(r8) :: fuel_eff_moist ! effective avearage fuel moisture content of the ground fuel - ! (incl. live grasses. omits 1000hr fuels) - real(r8) :: litter_moisture(nfsc) - - ! FIRE SPREAD - real(r8) :: ros_front ! rate of forward spread of fire: m/min - real(r8) :: ros_back ! rate of backward spread of fire: m/min - real(r8) :: effect_wspeed ! windspeed modified by fraction of relative grass and tree cover: m/min - real(r8) :: tau_l ! Duration of lethal heating: mins - real(r8) :: fi ! average fire intensity of flaming front: kj/m/s or kw/m - integer :: fire ! Is there a fire? 1=yes 0=no - real(r8) :: fd ! fire duration: mins - - ! FIRE EFFECTS - real(r8) :: scorch_ht(maxpft) ! scorch height: m - real(r8) :: frac_burnt ! fraction burnt: frac patch/day - real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks. KgC/m2 of burned ground/day - real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned - - - ! PLANT HYDRAULICS (not currently used in hydraulics RGK 03-2018) - ! type(ed_patch_hydr_type) , pointer :: pa_hydr ! All patch hydraulics data, see FatesHydraulicsMemMod.F90 - - - end type ed_patch_type - - !************************************ !** Resources management type ** ! YX @@ -436,8 +233,8 @@ module EDTypesMod type, public :: ed_site_type ! POINTERS - type (ed_patch_type), pointer :: oldest_patch => null() ! pointer to oldest patch at the site - type (ed_patch_type), pointer :: youngest_patch => null() ! pointer to yngest patch at the site + type (fates_patch_type), pointer :: oldest_patch => null() ! pointer to oldest patch at the site + type (fates_patch_type), pointer :: youngest_patch => null() ! pointer to yngest patch at the site ! Resource management type (ed_resources_management_type) :: resources_management ! resources_management at the site @@ -691,7 +488,7 @@ subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) use FatesUtilsMod,only : check_var_real ! Arguments - type(ed_patch_type),intent(in), target :: currentPatch + type(fates_patch_type),intent(in), target :: currentPatch character(len=*),intent(in) :: var_aliases integer,intent(out) :: return_code ! return 0 for all fine ! return 1 if a nan detected @@ -769,7 +566,7 @@ end subroutine dump_site subroutine dump_patch(cpatch) - type(ed_patch_type),intent(in),target :: cpatch + type(fates_patch_type),intent(in),target :: cpatch ! locals integer :: el ! element loop counting index @@ -812,6 +609,4 @@ end subroutine dump_patch ! ===================================================================================== - - end module EDTypesMod diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index a6bc033027..925e29d967 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -30,6 +30,18 @@ module FatesConstantsMod ! Integer equivalent of false (in case come compilers dont auto convert) integer, parameter, public :: ifalse = 0 + integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches + + integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed + ! the parameter file may determine that fewer + ! are used, but this helps allocate scratch + ! space and output arrays. + + integer, parameter, public :: n_rad_stream_types = 2 ! The number of radiation streams used (direct/diffuse) + + + integer , parameter, public :: N_DIST_TYPES = 3 ! Disturbance Modes 1) tree-fall, 2) fire, 3) logging + ! Labels for patch disturbance history integer, parameter, public :: n_anthro_disturbance_categories = 2 integer, parameter, public :: primaryforest = 1 diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 77af891d91..9f7f9dd9e7 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -20,14 +20,14 @@ module FatesHistoryInterfaceMod use EDTypesMod , only : site_fluxdiags_type use EDtypesMod , only : ed_site_type use FatesCohortMod , only : fates_cohort_type - use EDtypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use EDtypesMod , only : AREA use EDtypesMod , only : AREA_INV use EDTypesMod , only : numWaterMem use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : site_massbal_type use PRTGenericMod , only : element_list - use EDTypesMod , only : N_DIST_TYPES + use FatesConstantsMod , only : N_DIST_TYPES, maxpft use EDTypesMod , only : dtype_ifall use EDTypesMod , only : dtype_ifire use EDTypesMod , only : dtype_ilog @@ -1918,7 +1918,7 @@ subroutine update_history_nutrflux(this,csite) class(fates_history_interface_type) :: this type(ed_site_type), intent(in) :: csite - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch type(fates_cohort_type), pointer :: ccohort integer :: iclscpf ! layer x size x pft class index integer :: iscpf ! Size x pft class index @@ -2204,7 +2204,7 @@ subroutine update_history_dyn(this,nc,nsites,sites,bc_in) integer :: return_code - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort real(r8), parameter :: reallytalltrees = 1000. ! some large number (m) @@ -4365,7 +4365,7 @@ subroutine update_history_hifrq(this,nc,nsites,sites,bc_in,dt_tstep) real(r8) :: site_area_veg ! area of the site that is not bare-ground integer :: ipa2 ! patch incrementer integer :: cnlfpft_indx, cnlf_indx, ipft, ican, ileaf ! more iterators and indices - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort real(r8) :: per_dt_tstep ! Time step in frequency units (/s) @@ -4812,8 +4812,6 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,bc_in,dt_tstep) use FatesHydraulicsMemMod, only : ed_cohort_hydr_type, nshell use FatesHydraulicsMemMod, only : ed_site_hydr_type - use EDTypesMod , only : maxpft - ! Arguments class(fates_history_interface_type) :: this @@ -4857,7 +4855,7 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,bc_in,dt_tstep) real(r8) :: psi ! matric potential of soil layer real(r8) :: depth_frac ! fraction of rhizosphere layer depth occupied by current soil layer character(2) :: fmt_char - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort type(ed_cohort_hydr_type), pointer :: ccohort_hydr type(ed_site_hydr_type), pointer :: site_hydr diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index 00d46563ab..41ae7798d0 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -24,12 +24,12 @@ module FatesInterfaceMod use EDParamsMod , only : inir use EDParamsMod , only : nclmax use EDParamsMod , only : nlevleaf - use EDTypesMod , only : maxpft + use FatesConstantsMod , only : maxpft use EDTypesMod , only : do_fates_salinity use EDTypesMod , only : numWaterMem use EDTypesMod , only : numlevsoil_max use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : area_inv use FatesConstantsMod , only : r8 => fates_r8 @@ -1942,7 +1942,7 @@ subroutine UpdateFatesRMeansTStep(sites,bc_in) type(ed_site_type), intent(inout) :: sites(:) type(bc_in_type), intent(in) :: bc_in(:) - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch type(fates_cohort_type), pointer :: ccohort integer :: s, ifp, io_si diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index f62bccdff7..55b8ed3ed6 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -33,7 +33,7 @@ module FatesInventoryInitMod use FatesInterfaceTypesMod, only : nleafage use FatesLitterMod , only : litter_type use EDTypesMod , only : ed_site_type - use EDTypesMod , only : ed_patch_type + use FatesPatchMod , only : fates_patch_type use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : area use FatesConstantsMod, only : leaves_on, leaves_off @@ -75,7 +75,7 @@ module FatesInventoryInitMod ! with a patch. BY having a vector of patch pointers that lines up with the string ! identifier array, this can be done quickly. type pp_array - type(ed_patch_type), pointer :: cpatch + type(fates_patch_type), pointer :: cpatch end type pp_array character(len=*), parameter, private :: sourcefile = __FILE__ @@ -123,12 +123,12 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) ! Locals type(ed_site_type), pointer :: currentSite - type(ed_patch_type), pointer :: currentpatch + type(fates_patch_type), pointer :: currentpatch type(fates_cohort_type), pointer :: currentcohort - type(ed_patch_type), pointer :: newpatch - type(ed_patch_type), pointer :: olderpatch - type(ed_patch_type), pointer :: head_of_unsorted_patch_list - type(ed_patch_type), pointer :: next_in_unsorted_patch_list + type(fates_patch_type), pointer :: newpatch + type(fates_patch_type), pointer :: olderpatch + type(fates_patch_type), pointer :: head_of_unsorted_patch_list + type(fates_patch_type), pointer :: next_in_unsorted_patch_list integer :: sitelist_file_unit ! fortran file unit for site list integer :: pss_file_unit ! fortran file unit for the pss file integer :: css_file_unit ! fortran file unit for the css file @@ -753,7 +753,7 @@ subroutine set_inventory_edpatch_type1(newpatch,pss_file_unit,ipa,ios,patch_name use EDtypesMod, only: AREA ! Arguments - type(ed_patch_type),intent(inout), target :: newpatch ! Patch structure + type(fates_patch_type),intent(inout), target :: newpatch ! Patch structure integer,intent(in) :: pss_file_unit ! Self explanatory integer,intent(in) :: ipa ! Patch index (line number) integer,intent(out) :: ios ! Return flag @@ -901,7 +901,7 @@ subroutine set_inventory_edcohort_type1(csite,bc_in,css_file_unit,npatches, & integer :: cstatus ! cohort status integer,parameter :: rstatus = 0 ! recruit status - type(ed_patch_type), pointer :: cpatch ! current patch pointer + type(fates_patch_type), pointer :: cpatch ! current patch pointer type(fates_cohort_type), pointer :: temp_cohort ! temporary patch (needed for allom funcs) integer :: ipa ! patch idex integer :: iage @@ -1190,7 +1190,7 @@ subroutine write_inventory_type1(currentSite) type(ed_site_type), target :: currentSite ! Locals - type(ed_patch_type), pointer :: currentpatch + type(fates_patch_type), pointer :: currentpatch type(fates_cohort_type), pointer :: currentcohort character(len=128) :: pss_name_out ! output file string diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index f9669b4c8a..efb13c4a80 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -1810,7 +1810,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) use FatesInterfaceTypesMod, only : numpft use EDTypesMod, only : ed_site_type use FatesCohortMod, only : fates_cohort_type - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use EDParamsMod, only : maxSWb use EDParamsMod, only : nclmax use EDTypesMod, only : numWaterMem @@ -1881,7 +1881,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) integer :: icdj ! loop counter for damage type(fates_restart_variable_type) :: rvar - type(ed_patch_type),pointer :: cpatch + type(fates_patch_type),pointer :: cpatch type(fates_cohort_type),pointer :: ccohort @@ -2506,11 +2506,11 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) use EDTypesMod, only : ed_site_type use FatesCohortMod, only : fates_cohort_type - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use EDParamsMod, only : maxSWb use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch - use EDTypesMod, only : maxpft + use FatesConstantsMod, only : maxpft use EDTypesMod, only : area use EDPatchDynamicsMod, only : zero_patch use EDInitMod, only : zero_site @@ -2529,7 +2529,7 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) ! local variables - type(ed_patch_type) , pointer :: newp + type(fates_patch_type) , pointer :: newp type(fates_cohort_type), pointer :: new_cohort type(fates_cohort_type), pointer :: prev_cohort integer :: cohortstatus @@ -2704,7 +2704,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) use EDTypesMod, only : ed_site_type use FatesCohortMod, only : fates_cohort_type - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use EDParamsMod, only : maxSWb use EDParamsMod, only : nclmax use FatesInterfaceTypesMod, only : numpft @@ -2723,7 +2723,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) ! locals ! ---------------------------------------------------------------------------------- ! LL pointers - type(ed_patch_type),pointer :: cpatch ! current patch + type(fates_patch_type),pointer :: cpatch ! current patch type(fates_cohort_type),pointer :: ccohort ! current cohort type(litter_type), pointer :: litt ! litter object on the current patch ! loop indices @@ -3386,7 +3386,7 @@ subroutine update_3dpatch_radiation(this, nsites, sites, bc_out) ! ------------------------------------------------------------------------- use EDTypesMod, only : ed_site_type - use EDTypesMod, only : ed_patch_type + use FatesPatchMod, only : fates_patch_type use EDSurfaceRadiationMod, only : PatchNormanRadiation use FatesInterfaceTypesMod, only : hlm_numSWb @@ -3398,7 +3398,7 @@ subroutine update_3dpatch_radiation(this, nsites, sites, bc_out) ! locals ! ---------------------------------------------------------------------------------- - type(ed_patch_type),pointer :: currentPatch ! current patch + type(fates_patch_type),pointer :: currentPatch ! current patch integer :: s ! site counter integer :: ib ! radiation band counter integer :: ifp ! patch counter From 9ec7d625c63d5871e3b35ad8cb9b6974053e665e Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 10 Apr 2023 16:03:45 -0600 Subject: [PATCH 027/125] move create methods to patch type --- biogeochem/EDPatchDynamicsMod.F90 | 268 +----------------------- biogeochem/FatesPatchMod.F90 | 328 +++++++++++++++++++++++++++++- main/EDInitMod.F90 | 7 +- main/FatesInventoryInitMod.F90 | 18 +- main/FatesRestartInterfaceMod.F90 | 7 +- 5 files changed, 355 insertions(+), 273 deletions(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 2934948aab..aa6014f710 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -5,7 +5,8 @@ module EDPatchDynamicsMod ! ============================================================================ use FatesGlobals , only : fates_log use FatesGlobals , only : FatesWarn,N2S,A2S - use FatesInterfaceTypesMod , only : hlm_freq_day + use FatesInterfaceTypesMod, only : hlm_freq_day + use FatesInterfaceTypesMod, only : hlm_current_tod use EDPftvarcon , only : EDPftvarcon_inst use EDPftvarcon , only : GetDecompyFrac use PRTParametersMod , only : prt_params @@ -105,10 +106,8 @@ module EDPatchDynamicsMod ! implicit none private - ! - public :: create_patch + public :: spawn_patches - public :: zero_patch public :: fuse_patches public :: terminate_patches public :: patch_pft_size_profile @@ -540,9 +539,9 @@ subroutine spawn_patches( currentSite, bc_in) ! first create patch to receive primary forest area if ( site_areadis_primary .gt. nearzero ) then allocate(new_patch_primary) - - call create_patch(currentSite, new_patch_primary, age, & - site_areadis_primary, primaryforest, i_nocomp_pft) + call new_patch_primary%create(age, site_areadis_primary, & + primaryforest, i_nocomp_pft, hlm_numSWb, numpft, & + currentSite%nlevsoil, hlm_current_tod) ! Initialize the litter pools to zero, these ! pools will be populated by looping over the existing patches @@ -561,10 +560,10 @@ subroutine spawn_patches( currentSite, bc_in) endif ! next create patch to receive secondary forest area - if ( site_areadis_secondary .gt. nearzero) then - allocate(new_patch_secondary) - call create_patch(currentSite, new_patch_secondary, age, & - site_areadis_secondary, secondaryforest,i_nocomp_pft) + if (site_areadis_secondary .gt. nearzero) then + call new_patch_secondary%create(age, site_areadis_secondary, & + secondaryforest, i_nocomp_pft, hlm_numSWb, numpft, & + currentSite%nlevsoil, hlm_current_tod) ! Initialize the litter pools to zero, these ! pools will be populated by looping over the existing patches @@ -2069,252 +2068,7 @@ subroutine mortality_litter_fluxes(currentSite, currentPatch, & end subroutine mortality_litter_fluxes ! ============================================================================ - - subroutine create_patch(currentSite, new_patch, age, areap, label,nocomp_pft) - - use FatesInterfaceTypesMod, only : hlm_current_tod - - ! - ! !DESCRIPTION: - ! Set default values for creating a new patch - ! - ! !USES: - ! - ! !ARGUMENTS: - type(ed_site_type) , intent(inout), target :: currentSite - type(fates_patch_type), intent(inout), target :: new_patch - real(r8), intent(in) :: age ! notional age of this patch in years - real(r8), intent(in) :: areap ! initial area of this patch in m2. - integer, intent(in) :: label ! anthropogenic disturbance label - integer, intent(in) :: nocomp_pft ! no competition mode pft label - - - ! Until bc's are pointed to by sites give veg a default temp [K] - real(r8), parameter :: temp_init_veg = 15._r8+t_water_freeze_k_1atm - - - ! !LOCAL VARIABLES: - !--------------------------------------------------------------------- - integer :: el ! element loop index - - - allocate(new_patch%tr_soil_dir(hlm_numSWb)) - allocate(new_patch%tr_soil_dif(hlm_numSWb)) - allocate(new_patch%tr_soil_dir_dif(hlm_numSWb)) - allocate(new_patch%fab(hlm_numSWb)) - allocate(new_patch%fabd(hlm_numSWb)) - allocate(new_patch%fabi(hlm_numSWb)) - allocate(new_patch%sabs_dir(hlm_numSWb)) - allocate(new_patch%sabs_dif(hlm_numSWb)) - allocate(new_patch%fragmentation_scaler(currentSite%nlevsoil)) - - allocate(new_patch%tveg24) - call new_patch%tveg24%InitRMean(fixed_24hr,init_value=temp_init_veg,init_offset=real(hlm_current_tod,r8) ) - allocate(new_patch%tveg_lpa) - call new_patch%tveg_lpa%InitRmean(ema_lpa,init_value=temp_init_veg) - allocate(new_patch%tveg_longterm) - call new_patch%tveg_longterm%InitRmean(ema_longterm,init_value=temp_init_veg) - - ! Litter - ! Allocate, Zero Fluxes, and Initialize to "unset" values - - allocate(new_patch%litter(num_elements)) - do el=1,num_elements - call new_patch%litter(el)%InitAllocate(numpft,currentSite%nlevsoil,element_list(el)) - call new_patch%litter(el)%ZeroFlux() - call new_patch%litter(el)%InitConditions(init_leaf_fines = fates_unset_r8, & - init_root_fines = fates_unset_r8, & - init_ag_cwd = fates_unset_r8, & - init_bg_cwd = fates_unset_r8, & - init_seed = fates_unset_r8, & - init_seed_germ = fates_unset_r8) - end do - - call zero_patch(new_patch) !The nan value in here is not working?? - - new_patch%tallest => null() ! pointer to patch's tallest cohort - new_patch%shortest => null() ! pointer to patch's shortest cohort - new_patch%older => null() ! pointer to next older patch - new_patch%younger => null() ! pointer to next shorter patch - - ! assign known patch attributes - - new_patch%age = age - new_patch%age_class = 1 - new_patch%area = areap - - ! assign anthropgenic disturbance category and label - new_patch%anthro_disturbance_label = label - if (label .eq. secondaryforest) then - new_patch%age_since_anthro_disturbance = age - else - new_patch%age_since_anthro_disturbance = fates_unset_r8 - endif - new_patch%nocomp_pft_label = nocomp_pft - - ! This new value will be generated when the calculate disturbance - ! rates routine is called. This does not need to be remembered or in the restart file. - - new_patch%f_sun = 0._r8 - new_patch%ed_laisun_z(:,:,:) = 0._r8 - new_patch%ed_laisha_z(:,:,:) = 0._r8 - new_patch%ed_parsun_z(:,:,:) = 0._r8 - new_patch%ed_parsha_z(:,:,:) = 0._r8 - new_patch%fabi = 0._r8 - new_patch%fabd = 0._r8 - new_patch%tr_soil_dir(:) = 1._r8 - new_patch%tr_soil_dif(:) = 1._r8 - new_patch%tr_soil_dir_dif(:) = 0._r8 - new_patch%fabd_sun_z(:,:,:) = 0._r8 - new_patch%fabd_sha_z(:,:,:) = 0._r8 - new_patch%fabi_sun_z(:,:,:) = 0._r8 - new_patch%fabi_sha_z(:,:,:) = 0._r8 - new_patch%scorch_ht(:) = 0._r8 - new_patch%frac_burnt = 0._r8 - new_patch%litter_moisture(:) = 0._r8 - new_patch%fuel_eff_moist = 0._r8 - new_patch%livegrass = 0._r8 - new_patch%sum_fuel = 0._r8 - new_patch%fuel_bulkd = 0._r8 - new_patch%fuel_sav = 0._r8 - new_patch%fuel_mef = 0._r8 - new_patch%ros_front = 0._r8 - new_patch%effect_wspeed = 0._r8 - new_patch%tau_l = 0._r8 - new_patch%fuel_frac(:) = 0._r8 - new_patch%tfc_ros = 0._r8 - new_patch%fi = 0._r8 - new_patch%fd = 0._r8 - new_patch%ros_back = 0._r8 - new_patch%scorch_ht(:) = 0._r8 - new_patch%burnt_frac_litter(:) = 0._r8 - new_patch%total_tree_area = 0.0_r8 - new_patch%NCL_p = 1 - - - return - end subroutine create_patch - - ! ============================================================================ - subroutine zero_patch(cp_p) - ! - ! !DESCRIPTION: - ! Sets all the variables in the patch to nan or zero - ! (this needs to be two seperate routines, one for nan & one for zero - ! - ! !USES: - ! - ! !ARGUMENTS: - type(fates_patch_type), intent(inout), target :: cp_p - ! - ! !LOCAL VARIABLES: - type(fates_patch_type), pointer :: currentPatch - !--------------------------------------------------------------------- - - currentPatch => cp_p - - currentPatch%tallest => null() - currentPatch%shortest => null() - currentPatch%older => null() - currentPatch%younger => null() - - currentPatch%patchno = 999 - - currentPatch%age = nan - currentPatch%age_class = 1 - currentPatch%area = nan - currentPatch%canopy_layer_tlai(:) = nan - currentPatch%total_canopy_area = nan - - currentPatch%tlai_profile(:,:,:) = nan - currentPatch%elai_profile(:,:,:) = 0._r8 - currentPatch%tsai_profile(:,:,:) = nan - currentPatch%esai_profile(:,:,:) = nan - currentPatch%canopy_area_profile(:,:,:) = nan - - currentPatch%fabd_sun_z(:,:,:) = nan - currentPatch%fabd_sha_z(:,:,:) = nan - currentPatch%fabi_sun_z(:,:,:) = nan - currentPatch%fabi_sha_z(:,:,:) = nan - - currentPatch%ed_laisun_z(:,:,:) = nan - currentPatch%ed_laisha_z(:,:,:) = nan - currentPatch%ed_parsun_z(:,:,:) = nan - currentPatch%ed_parsha_z(:,:,:) = nan - currentPatch%psn_z(:,:,:) = 0._r8 - - currentPatch%f_sun(:,:,:) = nan - currentPatch%tr_soil_dir(:) = nan ! fraction of incoming direct radiation that is transmitted to the soil as direct - currentPatch%tr_soil_dif(:) = nan ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse - currentPatch%tr_soil_dir_dif(:) = nan ! fraction of incoming direct radiation that is transmitted to the soil as diffuse - currentPatch%fabd(:) = nan ! fraction of incoming direct radiation that is absorbed by the canopy - currentPatch%fabi(:) = nan ! fraction of incoming diffuse radiation that is absorbed by the canopy - - currentPatch%canopy_mask(:,:) = 999 ! is there any of this pft in this layer? - currentPatch%nrad(:,:) = 999 ! number of exposed leaf layers for each canopy layer and pft - currentPatch%ncan(:,:) = 999 ! number of total leaf layers for each canopy layer and pft - currentPatch%pft_agb_profile(:,:) = nan - - ! DISTURBANCE - currentPatch%disturbance_rates(:) = 0._r8 - currentPatch%fract_ldist_not_harvested = 0._r8 - - - ! FIRE - currentPatch%litter_moisture(:) = nan ! litter moisture - currentPatch%fuel_eff_moist = nan ! average fuel moisture content of the ground fuel - ! (incl. live grasses. omits 1000hr fuels) - currentPatch%livegrass = nan ! total ag grass biomass in patch. 1=c3 grass, 2=c4 grass. gc/m2 - currentPatch%sum_fuel = nan ! total ground fuel related to ros (omits 1000hr fuels). gc/m2 - currentPatch%fuel_bulkd = nan ! average fuel bulk density of the ground fuel - ! (incl. live grasses. omits 1000hr fuels). kgc/m3 - currentPatch%fuel_sav = nan ! average surface area to volume ratio of the ground fuel - ! (incl. live grasses. omits 1000hr fuels). - currentPatch%fuel_mef = nan ! average moisture of extinction factor of the ground fuel - ! (incl. live grasses. omits 1000hr fuels). - currentPatch%ros_front = nan ! average rate of forward spread of each fire in the patch. m/min. - currentPatch%effect_wspeed = nan ! dailywind modified by fraction of relative grass and tree cover. m/min. - currentPatch%tau_l = nan ! mins p&r(1986) - currentPatch%fuel_frac(:) = nan ! fraction of each litter class in the sum_fuel - !- for purposes of calculating weighted averages. - currentPatch%tfc_ros = nan ! used in fi calc - currentPatch%fi = nan ! average fire intensity of flaming front during day. - ! backward ros plays no role. kj/m/s or kw/m. - currentPatch%fire = 999 ! sr decide_fire.1=fire hot enough to proceed. 0=stop everything- no fires today - currentPatch%fd = nan ! fire duration (mins) - currentPatch%ros_back = nan ! backward ros (m/min) - currentPatch%scorch_ht(:) = nan ! scorch height of flames on a given PFT - currentPatch%frac_burnt = nan ! fraction burnt daily - currentPatch%burnt_frac_litter(:) = nan - currentPatch%btran_ft(:) = 0.0_r8 - - currentPatch%canopy_layer_tlai(:) = 0.0_r8 - - currentPatch%fab(:) = 0.0_r8 - currentPatch%sabs_dir(:) = 0.0_r8 - currentPatch%sabs_dif(:) = 0.0_r8 - currentPatch%zstar = 0.0_r8 - currentPatch%c_stomata = 0.0_r8 ! This is calculated immediately before use - currentPatch%c_lblayer = 0.0_r8 - currentPatch%fragmentation_scaler(:) = 0.0_r8 - currentPatch%radiation_error = 0.0_r8 - - ! diagnostic radiation profiles - currentPatch%nrmlzd_parprof_pft_dir_z(:,:,:,:) = 0._r8 - currentPatch%nrmlzd_parprof_pft_dif_z(:,:,:,:) = 0._r8 - currentPatch%nrmlzd_parprof_dir_z(:,:,:) = 0._r8 - currentPatch%nrmlzd_parprof_dif_z(:,:,:) = 0._r8 - - currentPatch%solar_zenith_flag = .false. - currentPatch%solar_zenith_angle = nan - currentPatch%fcansno = nan - - currentPatch%gnd_alb_dir(:) = nan - currentPatch%gnd_alb_dif(:) = nan - - end subroutine zero_patch - - ! ============================================================================ + subroutine fuse_patches( csite, bc_in ) ! ! !DESCRIPTION: diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 8374324db4..00b43bd436 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -1,13 +1,22 @@ module FatesPatchMod use FatesConstantsMod, only : r8 => fates_r8 + use FatesConstantsMod, only : fates_unset_r8 + use FatesConstantsMod, only : fates_unset_int + use FatesConstantsMod, only : primaryforest, secondaryforest use FatesCohortMod, only : fates_cohort_type use FatesRunningMeanMod, only : rmean_type use FatesLitterMod, only : nfsc use FatesLitterMod, only : litter_type + use PRTGenericMod, only : num_elements + use PRTGenericMod, only : element_list use EDParamsMod, only : maxSWb, nlevleaf, nclmax use FatesConstantsMod, only : n_dbh_bins, maxpft, n_dist_types use FatesConstantsMod, only : n_rad_stream_types + use FatesConstantsMod, only : t_water_freeze_k_1atm + use FatesRunningMeanMod, only : ema_24hr, fixed_24hr, ema_lpa, ema_longterm + + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) implicit none private @@ -75,10 +84,9 @@ module FatesPatchMod integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] - real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) - !:.........................................................................: + real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) real(r8) :: psn_z(nclmax,maxpft,nlevleaf) real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) real(r8) :: nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) @@ -179,6 +187,322 @@ module FatesPatchMod real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] + !:.........................................................................: + + ! PLANT HYDRAULICS (not currently used in hydraulics RGK 03-2018) + ! type(ed_patch_hydr_type), pointer :: pa_hydr ! All patch hydraulics data, see FatesHydraulicsMemMod.F90 + + contains + + procedure :: init + procedure :: nan_values + procedure :: zero_values + procedure :: create + end type fates_patch_type + contains + + subroutine init(this, numSWb, numpft, nlevsoil, current_tod) + ! + ! DESCRIPTION: + ! Initialize a new patch + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this ! patch object + integer, intent(in) :: numSWb ! number of shortwave broad-bands to track + integer, intent(in) :: numpft ! number of pfts to simulate + integer, intent(in) :: nlevsoil ! number of soil layers + integer, intent(in) :: current_tod ! time of day [seconds past 0Z] + + ! LOCAL VARIABLES: + integer :: el ! element loop index + + ! Until bc's are pointed to by sites give veg a default temp [K] + real(r8), parameter :: temp_init_veg = 15._r8 + t_water_freeze_k_1atm + + ! allocate arrays + allocate(this%tr_soil_dir(numSWb)) + allocate(this%tr_soil_dif(numSWb)) + allocate(this%tr_soil_dir_dif(numSWb)) + allocate(this%fab(numSWb)) + allocate(this%fabd(numSWb)) + allocate(this%fabi(numSWb)) + allocate(this%sabs_dir(numSWb)) + allocate(this%sabs_dif(numSWb)) + allocate(this%fragmentation_scaler(nlevsoil)) + allocate(this%tveg24) + allocate(this%tveg_lpa) + allocate(this%tveg_longterm) + allocate(this%litter(num_elements)) + + ! initialize values to nan + call this%nan_values() + + ! zero values that should be zeroed + call this%zero_values() + + ! set initial values for running means + call this%tveg24%InitRMean(fixed_24hr, init_value=temp_init_veg, & + init_offset=real(current_tod, r8)) + call this%tveg_lpa%InitRmean(ema_lpa, init_value=temp_init_veg) + call this%tveg_longterm%InitRmean(ema_longterm, init_value=temp_init_veg) + + ! set initial values for litter + do el = 1, num_elements + call this%litter(el)%InitAllocate(numpft, nlevsoil, element_list(el)) + call this%litter(el)%ZeroFlux() + call this%litter(el)%InitConditions(init_leaf_fines=fates_unset_r8, & + init_root_fines=fates_unset_r8, init_ag_cwd=fates_unset_r8, & + init_bg_cwd=fates_unset_r8, init_seed=fates_unset_r8, & + init_seed_germ=fates_unset_r8) + end do + + end subroutine init + + !:.........................................................................: + + subroutine nan_values(this) + ! + ! DESCRIPTION: + ! Sets all values in patch to nan + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this ! patch object + + ! set pointers to null + this%tallest => null() + this%shortest => null() + this%older => null() + this%younger => null() + nullify(this%tallest) + nullify(this%shortest) + nullify(this%older) + nullify(this%younger) + + ! INDICES + this%patchno = fates_unset_int + this%nocomp_pft_label = fates_unset_int + + ! PATCH INFO + this%age = nan + this%age_class = fates_unset_int + this%area = nan + this%countcohorts = fates_unset_int + this%ncl_p = fates_unset_int + this%anthro_disturbance_label = fates_unset_int + this%age_since_anthro_disturbance = nan + + ! LEAF ORGANIZATION + this%pft_agb_profile(:,:) = nan + this%canopy_layer_tlai(:) = nan + this%total_canopy_area = nan + this%total_tree_area = nan + this%zstar = nan + this%elai_profile(:,:,:) = nan + this%esai_profile(:,:,:) = nan + this%tlai_profile(:,:,:) = nan + this%tsai_profile(:,:,:) = nan + this%canopy_area_profile(:,:,:) = nan + this%canopy_mask(:,:) = fates_unset_int + this%nrad(:,:) = fates_unset_int + this%ncan(:,:) = fates_unset_int + this%c_stomata = nan + this%c_lblayer = nan + this%layer_height_profile(:,:,:) = nan + + this%psn_z(:,:,:) = nan + this%nrmlzd_parprof_pft_dir_z(:,:,:,:) = nan + this%nrmlzd_parprof_pft_dif_z(:,:,:,:) = nan + this%nrmlzd_parprof_dir_z(:,:,:) = nan + this%nrmlzd_parprof_dir_z(:,:,:) = nan + + ! RADIATION + this%radiation_error = nan + this%fcansno = nan + this%solar_zenith_flag = .false. + this%solar_zenith_angle = nan + this%gnd_alb_dif(:) = nan + this%gnd_alb_dir(:) = nan + this%fabd_sun_z(:,:,:) = nan + this%fabd_sha_z(:,:,:) = nan + this%fabi_sun_z(:,:,:) = nan + this%fabi_sha_z(:,:,:) = nan + this%ed_laisun_z(:,:,:) = nan + this%ed_laisha_z(:,:,:) = nan + this%ed_parsun_z(:,:,:) = nan + this%ed_parsha_z(:,:,:) = nan + this%f_sun(:,:,:) = nan + this%parprof_pft_dir_z(:,:,:) = nan + this%parprof_pft_dif_z(:,:,:) = nan + this%parprof_dir_z(:,:) = nan + this%parprof_dif_z(:,:) = nan + this%tr_soil_dir(:) = nan + this%tr_soil_dif(:) = nan + this%tr_soil_dir_dif(:) = nan + this%fab(:) = nan + this%fabd(:) = nan + this%fabi(:) = nan + this%sabs_dir(:) = nan + this%sabs_dif(:) = nan + + ! ROOTS + this%btran_ft(:) = nan + this%bstress_sal_ft(:) = nan + + ! EXTERNAL SEED RAIN + this%nitr_repro_stoich(:) = nan + this%phos_repro_stoich(:) = nan + + ! DISTURBANCE + this%disturbance_rates(:) = nan + this%fract_ldist_not_harvested = nan + + ! LITTER AND COARSE WOODY DEBRIS + this%fragmentation_scaler(:) = nan + + ! FUELS AND FIRE + this%sum_fuel = nan + this%fuel_frac(:) = nan + this%livegrass = nan + this%fuel_bulkd = nan + this%fuel_sav = nan + this%fuel_mef = nan + this%fuel_eff_moist = nan + this%litter_moisture(:) = nan + this%ros_front = nan + this%ros_back = nan + this%effect_wspeed = nan + this%tau_l = nan + this%fi = nan + this%fire = fates_unset_int + this%fd = nan + this%scorch_ht(:) = nan + this%frac_burnt = nan + this%tfc_ros = nan + this%burnt_frac_litter(:) = nan + + end subroutine nan_values + + !:.........................................................................: + + subroutine zero_values(this) + ! + ! DESCRIPTION: + ! sets specific variables in patch to zero + ! these should only be values that are incremented, so that we can + ! catch all other uninitialized variables with nans + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this + + ! LEAF ORGANIZATION + this%canopy_layer_tlai(:) = 0.0_r8 + this%total_tree_area = 0.0_r8 + this%zstar = 0.0_r8 + this%elai_profile(:,:,:) = 0.0_r8 + this%c_stomata = 0.0_r8 + this%c_lblayer = 0.0_r8 + this%psn_z(:,:,:) = 0.0_r8 + this%nrmlzd_parprof_pft_dir_z(:,:,:,:) = 0.0_r8 + this%nrmlzd_parprof_pft_dif_z(:,:,:,:) = 0.0_r8 + this%nrmlzd_parprof_dir_z(:,:,:) = 0.0_r8 + this%nrmlzd_parprof_dif_z(:,:,:) = 0.0_r8 + + ! RADIATION + this%radiation_error = 0.0_r8 + this%fabd_sun_z(:,:,:) = 0.0_r8 + this%fabd_sha_z(:,:,:) = 0.0_r8 + this%fabi_sun_z(:,:,:) = 0.0_r8 + this%fabi_sha_z(:,:,:) = 0.0_r8 + this%ed_parsun_z(:,:,:) = 0.0_r8 + this%ed_parsha_z(:,:,:) = 0.0_r8 + this%ed_laisun_z(:,:,:) = 0.0_r8 + this%ed_laisha_z(:,:,:) = 0.0_r8 + this%f_sun = 0.0_r8 + this%tr_soil_dir_dif(:) = 0.0_r8 + this%fab(:) = 0.0_r8 + this%fabi(:) = 0.0_r8 + this%fabd(:) = 0.0_r8 + this%sabs_dir(:) = 0.0_r8 + this%sabs_dif(:) = 0.0_r8 + + ! ROOTS + this%btran_ft(:) = 0.0_r8 + + ! DISTURBANCE + this%disturbance_rates(:) = 0.0_r8 + this%fract_ldist_not_harvested = 0.0_r8 + + ! LITTER AND COARSE WOODY DEBRIS + this%fragmentation_scaler(:) = 0.0_r8 + + ! FIRE + this%sum_fuel = 0.0_r8 + this%fuel_frac(:) = 0.0_r8 + this%livegrass = 0.0_r8 + this%fuel_bulkd = 0.0_r8 + this%fuel_sav = 0.0_r8 + this%fuel_mef = 0.0_r8 + this%fuel_eff_moist = 0.0_r8 + this%litter_moisture(:) = 0.0_r8 + this%ros_front = 0.0_r8 + this%ros_back = 0.0_r8 + this%effect_wspeed = 0.0_r8 + this%tau_l = 0.0_r8 + this%fi = 0.0_r8 + this%fd = 0.0_r8 + this%scorch_ht(:) = 0.0_r8 + this%frac_burnt = 0.0_r8 + this%tfc_ros = 0.0_r8 + this%burnt_frac_litter(:) = 0.0_r8 + + end subroutine zero_values + + !:.........................................................................: + + subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & + nlevsoil, current_tod) + ! + ! DESCRIPTION: + ! create a new patch with input and default values + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this ! patch object + real(r8), intent(in) :: age ! notional age of this patch in years + real(r8), intent(in) :: areap ! initial area of this patch in m2. + integer, intent(in) :: label ! anthropogenic disturbance label + integer, intent(in) :: nocomp_pft ! no-competition mode pft label + integer, intent(in) :: numSWb ! number of shortwave broad-bands to track + integer, intent(in) :: numpft ! number of pfts to simulate + integer, intent(in) :: nlevsoil ! number of soil layers + integer, intent(in) :: current_tod ! time of day [seconds past 0Z] + + ! initialize patch + ! also sets all values to nan, then some values to zero + call this%init(numSWb, numpft, nlevsoil, current_tod) + + ! assign known patch attributes + this%age = age + this%age_class = 1 + this%area = areap + + ! assign anthropgenic disturbance category and label + this%anthro_disturbance_label = label + if (label .eq. secondaryforest) then + this%age_since_anthro_disturbance = age + else + this%age_since_anthro_disturbance = fates_unset_r8 + endif + this%nocomp_pft_label = nocomp_pft + + this%tr_soil_dir(:) = 1.0_r8 + this%tr_soil_dif(:) = 1.0_r8 + this%NCL_p = 1 + + end subroutine create + end module FatesPatchMod \ No newline at end of file diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index e9c6ea06d1..8dd15a9a8d 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -14,11 +14,12 @@ module EDInitMod use EDParamsMod , only : nclmax use FatesGlobals , only : fates_log use FatesInterfaceTypesMod , only : hlm_is_restart + use FatesInterfaceTypesMod , only : hlm_current_tod + use FatesInterfaceTypesMod , only : hlm_numSWb use EDPftvarcon , only : EDPftvarcon_inst use PRTParametersMod , only : prt_params use EDCohortDynamicsMod , only : create_cohort, fuse_cohorts, sort_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDPatchDynamicsMod , only : create_patch use EDPatchDynamicsMod , only : set_patchno use EDPhysiologyMod , only : assign_cohort_sp_properties use ChecksBalancesMod , only : SiteMassStock @@ -610,8 +611,8 @@ subroutine init_patches( nsites, sites, bc_in) if(newparea.gt.0._r8)then ! Stop patches being initilialized when PFT not present in nocomop mode allocate(newp) - - call create_patch(sites(s), newp, age, newparea, primaryforest, nocomp_pft) + call newp%create(age, newparea, primaryforest, nocomp_pft, & + hlm_numSWb, numpft, sites(s)%nlevsoil, hlm_current_tod) if(is_first_patch.eq.itrue)then !is this the first patch? ! set poointers for first patch (or only patch, if nocomp is false) diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 55b8ed3ed6..1c9b0f9449 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -31,6 +31,9 @@ module FatesInventoryInitMod use FatesInterfaceTypesMod, only : bc_in_type use FatesInterfaceTypesMod, only : hlm_inventory_ctrl_file use FatesInterfaceTypesMod, only : nleafage + use FatesInterfaceTypesMod, only : hlm_current_tod + use FatesInterfaceTypesMod, only : hlm_numSWb + use FatesInterfaceTypesMod, only : numpft use FatesLitterMod , only : litter_type use EDTypesMod , only : ed_site_type use FatesPatchMod , only : fates_patch_type @@ -109,7 +112,6 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) use shr_file_mod, only : shr_file_getUnit use shr_file_mod, only : shr_file_freeUnit use FatesConstantsMod, only : nearzero - use EDPatchDynamicsMod, only : create_patch use EDPatchDynamicsMod, only : fuse_patches use EDCohortDynamicsMod, only : fuse_cohorts use EDCohortDynamicsMod, only : sort_cohorts @@ -266,12 +268,6 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) do ipa=1,npatches - allocate(newpatch) - - newpatch%patchno = ipa - newpatch%younger => null() - newpatch%older => null() - ! This call doesn't do much asside from initializing the patch with ! nominal values, NaNs, zero's and allocating some vectors. We should ! be able to get the following values from the patch files. But on @@ -279,8 +275,14 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) age_init = 0.0_r8 area_init = 0.0_r8 + allocate(newpatch) + call newpatch%create(age_init, area_init, primaryforest, & + fates_unset_int, hlm_numSWb, numpft, sites(s)%nlevsoil, & + hlm_current_tod) - call create_patch(sites(s), newpatch, age_init, area_init, primaryforest, fates_unset_int ) + newpatch%patchno = ipa + newpatch%younger => null() + newpatch%older => null() if( inv_format_list(invsite) == 1 ) then diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index efb13c4a80..a1a07b225d 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -2509,13 +2509,12 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) use FatesPatchMod, only : fates_patch_type use EDParamsMod, only : maxSWb use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch + use FatesInterfaceTypesMod, only : hlm_current_tod, hlm_numSWb, numpft use FatesConstantsMod, only : maxpft use EDTypesMod, only : area - use EDPatchDynamicsMod, only : zero_patch use EDInitMod, only : zero_site use EDInitMod, only : init_site_vars - use EDPatchDynamicsMod, only : create_patch use FatesAllometryMod, only : h2d_allom @@ -2582,7 +2581,9 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) nocomp_pft = fates_unset_int ! the nocomp_pft label is set after patch creation has occured in 'get_restart_vectors' ! make new patch - call create_patch(sites(s), newp, fates_unset_r8, fates_unset_r8, primaryforest, nocomp_pft ) + call newp%create(fates_unset_r8, fates_unset_r8, primaryforest, & + nocomp_pft, hlm_numSWb, numpft, sites(s)%nlevsoil, & + hlm_current_tod) ! Initialize the litter pools to zero, these ! pools will be populated by looping over the existing patches From cfb5fb09f36a566a96680bcc6dcb243e681fea92 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 10 Apr 2023 16:30:10 -0600 Subject: [PATCH 028/125] move more methods to patch type --- biogeochem/DamageMainMod.F90 | 1 - biogeochem/EDPatchDynamicsMod.F90 | 3 +- biogeochem/FatesPatchMod.F90 | 117 ++++++++++++++++++++++++- main/EDTypesMod.F90 | 140 +++--------------------------- 4 files changed, 128 insertions(+), 133 deletions(-) diff --git a/biogeochem/DamageMainMod.F90 b/biogeochem/DamageMainMod.F90 index f59b43d94d..11de5d1799 100644 --- a/biogeochem/DamageMainMod.F90 +++ b/biogeochem/DamageMainMod.F90 @@ -11,7 +11,6 @@ module DamageMainMod use EDPftvarcon , only : EDPftvarcon_inst use EDParamsMod , only : damage_event_code use EDParamsMod , only : ED_val_history_damage_bin_edges - ! use EDTypesMod , only : ed_site_type use FatesInterfaceTypesMod, only : hlm_current_day use FatesInterfaceTypesMod, only : hlm_current_month use FatesInterfaceTypesMod, only : hlm_current_year diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index aa6014f710..16d090af7f 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -37,7 +37,6 @@ module EDPatchDynamicsMod use PRTGenericMod , only : element_list use FatesLitterMod , only : lg_sf use FatesLitterMod , only : dl_sf - use EDTypesMod , only : dump_patch use FatesConstantsMod , only : N_DIST_TYPES use EDTypesMod , only : AREA_INV use FatesConstantsMod , only : rsnbl_math_prec @@ -487,7 +486,7 @@ subroutine spawn_patches( currentSite, bc_in) if(disturbance_rate > (1.0_r8 + rsnbl_math_prec)) then write(fates_log(),*) 'patch disturbance rate > 1 ?',disturbance_rate - call dump_patch(currentPatch) + call currentPatch%dump() call endrun(msg=errMsg(sourcefile, __LINE__)) end if diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 00b43bd436..90dd592ad1 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -4,6 +4,9 @@ module FatesPatchMod use FatesConstantsMod, only : fates_unset_r8 use FatesConstantsMod, only : fates_unset_int use FatesConstantsMod, only : primaryforest, secondaryforest + use FatesGlobals, only : fates_log + use FatesUtilsMod, only : check_hlm_list + use FatesUtilsMod, only : check_var_real use FatesCohortMod, only : fates_cohort_type use FatesRunningMeanMod, only : rmean_type use FatesLitterMod, only : nfsc @@ -16,7 +19,7 @@ module FatesPatchMod use FatesConstantsMod, only : t_water_freeze_k_1atm use FatesRunningMeanMod, only : ema_24hr, fixed_24hr, ema_lpa, ema_longterm - use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) implicit none private @@ -198,6 +201,8 @@ module FatesPatchMod procedure :: nan_values procedure :: zero_values procedure :: create + procedure :: dump + procedure :: check_vars end type fates_patch_type @@ -503,6 +508,114 @@ subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & this%tr_soil_dif(:) = 1.0_r8 this%NCL_p = 1 - end subroutine create + end subroutine create + + !:.........................................................................: + + subroutine dump(this) + ! + ! DESCRIPTION: + ! print attributes of a patch + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(in) :: this ! patch object + + ! LOCALS: + integer :: el ! element loop counting index + + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) ' Dumping Patch Information ' + write(fates_log(),*) ' (omitting arrays) ' + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) 'pa%patchno = ',this%patchno + write(fates_log(),*) 'pa%age = ',this%age + write(fates_log(),*) 'pa%age_class = ',this%age_class + write(fates_log(),*) 'pa%area = ',this%area + write(fates_log(),*) 'pa%countcohorts = ',this%countcohorts + write(fates_log(),*) 'pa%ncl_p = ',this%ncl_p + write(fates_log(),*) 'pa%total_canopy_area = ',this%total_canopy_area + write(fates_log(),*) 'pa%total_tree_area = ',this%total_tree_area + write(fates_log(),*) 'pa%zstar = ',this%zstar + write(fates_log(),*) 'pa%solar_zenith_flag = ',this%solar_zenith_flag + write(fates_log(),*) 'pa%solar_zenith_angle = ',this%solar_zenith_angle + write(fates_log(),*) 'pa%gnd_alb_dif = ',this%gnd_alb_dif(:) + write(fates_log(),*) 'pa%gnd_alb_dir = ',this%gnd_alb_dir(:) + write(fates_log(),*) 'pa%c_stomata = ',this%c_stomata + write(fates_log(),*) 'pa%c_lblayer = ',this%c_lblayer + write(fates_log(),*) 'pa%disturbance_rates = ',this%disturbance_rates(:) + write(fates_log(),*) 'pa%anthro_disturbance_label = ',this%anthro_disturbance_label + write(fates_log(),*) '----------------------------------------' + + do el = 1, num_elements + write(fates_log(),*) 'element id: ',element_list(el) + write(fates_log(),*) 'seed mass: ',sum(this%litter(el)%seed) + write(fates_log(),*) 'seed germ mass: ',sum(this%litter(el)%seed_germ) + write(fates_log(),*) 'leaf fines(pft): ',sum(this%litter(el)%leaf_fines) + write(fates_log(),*) 'root fines(pft,sl): ',sum(this%litter(el)%root_fines) + write(fates_log(),*) 'ag_cwd(c): ',sum(this%litter(el)%ag_cwd) + write(fates_log(),*) 'bg_cwd(c,sl): ',sum(this%litter(el)%bg_cwd) + end do + + end subroutine dump + + !:.........................................................................: + + subroutine check_vars(this, var_aliases, return_code) + ! + ! DESCRIPTION: + ! perform numerical checks on patch variables of interest + ! The input string is of the form: 'VAR1_NAME:VAR2_NAME:VAR3_NAME' + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(in) :: this ! patch object + character(len=*), intent(in) :: var_aliases + integer, intent(out) :: return_code ! return 0 for all fine + ! return 1 if a nan detected + ! return 10+ if an overflow + ! return 100% if an underflow + ! LOCALS: + type(fates_cohort_type), pointer :: currentCohort + + ! Check through a registry of variables to check + + if (check_hlm_list(trim(var_aliases), 'co_n')) then + currentCohort => this%shortest + do while(associated(currentCohort)) + call check_var_real(currentCohort%n, 'cohort%n', return_code) + if (.not.(return_code .eq. 0)) then + call this%dump() + call currentCohort%dump() + return + end if + currentCohort => currentCohort%taller + end do + end if + if (check_hlm_list(trim(var_aliases), 'co_dbh')) then + currentCohort => this%shortest + do while(associated(currentCohort)) + call check_var_real(currentCohort%dbh, 'cohort%dbh', return_code) + if (.not. (return_code .eq. 0)) then + call this%dump() + call currentCohort%dump() + return + end if + currentCohort => currentCohort%taller + end do + end if + + if (check_hlm_list(trim(var_aliases), 'pa_area')) then + call check_var_real(this%area, 'patch%area', return_code) + if (.not. (return_code .eq. 0)) then + call this%dump() + return + end if + end if + +end subroutine check_vars + +!:.........................................................................: + end module FatesPatchMod \ No newline at end of file diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 2394944368..8e29ca3363 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -424,9 +424,8 @@ module EDTypesMod end type ed_site_type ! Make public necessary subroutines and functions - public :: val_check_ed_vars public :: dump_site - public :: dump_patch + contains ! ===================================================================================== @@ -474,139 +473,24 @@ subroutine ZeroMassBalFlux(this) return end subroutine ZeroMassBalFlux - ! ===================================================================================== - - subroutine val_check_ed_vars(currentPatch,var_aliases,return_code) - - ! ---------------------------------------------------------------------------------- - ! Perform numerical checks on variables of interest. - ! The input string is of the form: 'VAR1_NAME:VAR2_NAME:VAR3_NAME' - ! ---------------------------------------------------------------------------------- - - - use FatesUtilsMod,only : check_hlm_list - use FatesUtilsMod,only : check_var_real - - ! Arguments - type(fates_patch_type),intent(in), target :: currentPatch - character(len=*),intent(in) :: var_aliases - integer,intent(out) :: return_code ! return 0 for all fine - ! return 1 if a nan detected - ! return 10+ if an overflow - ! return 100% if an underflow - ! Locals - type(fates_cohort_type), pointer :: currentCohort - - - ! Check through a registry of variables to check - - if ( check_hlm_list(trim(var_aliases),'co_n') ) then - - currentCohort => currentPatch%shortest - do while(associated(currentCohort)) - call check_var_real(currentCohort%n,'cohort%n',return_code) - if(.not.(return_code.eq.0)) then - call dump_patch(currentPatch) - call currentCohort%dump() - return - end if - currentCohort => currentCohort%taller - end do - end if - - if ( check_hlm_list(trim(var_aliases),'co_dbh') ) then - - currentCohort => currentPatch%shortest - do while(associated(currentCohort)) - call check_var_real(currentCohort%dbh,'cohort%dbh',return_code) - if(.not.(return_code.eq.0)) then - call dump_patch(currentPatch) - call currentCohort%dump() - return - end if - currentCohort => currentCohort%taller - end do - end if - - if ( check_hlm_list(trim(var_aliases),'pa_area') ) then - - call check_var_real(currentPatch%area,'patch%area',return_code) - if(.not.(return_code.eq.0)) then - call dump_patch(currentPatch) - return - end if - end if - - - - return - end subroutine val_check_ed_vars - ! ===================================================================================== subroutine dump_site(csite) - type(ed_site_type),intent(in),target :: csite - + type(ed_site_type),intent(in),target :: csite - ! EDTypes is - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) ' Site Coordinates ' - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'latitude = ', csite%lat - write(fates_log(),*) 'longitude = ', csite%lon - write(fates_log(),*) '----------------------------------------' - return + ! EDTypes is - end subroutine dump_site + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) ' Site Coordinates ' + write(fates_log(),*) '----------------------------------------' + write(fates_log(),*) 'latitude = ', csite%lat + write(fates_log(),*) 'longitude = ', csite%lon + write(fates_log(),*) '----------------------------------------' + return - ! ===================================================================================== - - - subroutine dump_patch(cpatch) - - type(fates_patch_type),intent(in),target :: cpatch - - ! locals - integer :: el ! element loop counting index - - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) ' Dumping Patch Information ' - write(fates_log(),*) ' (omitting arrays) ' - write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'pa%patchno = ',cpatch%patchno - write(fates_log(),*) 'pa%age = ',cpatch%age - write(fates_log(),*) 'pa%age_class = ',cpatch%age_class - write(fates_log(),*) 'pa%area = ',cpatch%area - write(fates_log(),*) 'pa%countcohorts = ',cpatch%countcohorts - write(fates_log(),*) 'pa%ncl_p = ',cpatch%ncl_p - write(fates_log(),*) 'pa%total_canopy_area = ',cpatch%total_canopy_area - write(fates_log(),*) 'pa%total_tree_area = ',cpatch%total_tree_area - write(fates_log(),*) 'pa%zstar = ',cpatch%zstar - write(fates_log(),*) 'pa%solar_zenith_flag = ',cpatch%solar_zenith_flag - write(fates_log(),*) 'pa%solar_zenith_angle = ',cpatch%solar_zenith_angle - write(fates_log(),*) 'pa%gnd_alb_dif = ',cpatch%gnd_alb_dif(:) - write(fates_log(),*) 'pa%gnd_alb_dir = ',cpatch%gnd_alb_dir(:) - write(fates_log(),*) 'pa%c_stomata = ',cpatch%c_stomata - write(fates_log(),*) 'pa%c_lblayer = ',cpatch%c_lblayer - write(fates_log(),*) 'pa%disturbance_rates = ',cpatch%disturbance_rates(:) - write(fates_log(),*) 'pa%anthro_disturbance_label = ',cpatch%anthro_disturbance_label - write(fates_log(),*) '----------------------------------------' - do el = 1,num_elements - write(fates_log(),*) 'element id: ',element_list(el) - write(fates_log(),*) 'seed mass: ',sum(cpatch%litter(el)%seed) - write(fates_log(),*) 'seed germ mass: ',sum(cpatch%litter(el)%seed_germ) - write(fates_log(),*) 'leaf fines(pft): ',sum(cpatch%litter(el)%leaf_fines) - write(fates_log(),*) 'root fines(pft,sl): ',sum(cpatch%litter(el)%root_fines) - write(fates_log(),*) 'ag_cwd(c): ',sum(cpatch%litter(el)%ag_cwd) - write(fates_log(),*) 'bg_cwd(c,sl): ',sum(cpatch%litter(el)%bg_cwd) - end do - - return - - end subroutine dump_patch - - ! ===================================================================================== +end subroutine dump_site + end module EDTypesMod From 3a391a72826423c83315687a4ffbdc0e56d6a75f Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 06:44:32 -0600 Subject: [PATCH 029/125] add allocate statement --- biogeochem/EDPatchDynamicsMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 16d090af7f..5674857236 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -560,6 +560,7 @@ subroutine spawn_patches( currentSite, bc_in) ! next create patch to receive secondary forest area if (site_areadis_secondary .gt. nearzero) then + allocate(new_patch_secondary) call new_patch_secondary%create(age, site_areadis_secondary, & secondaryforest, i_nocomp_pft, hlm_numSWb, numpft, & currentSite%nlevsoil, hlm_current_tod) From 2b06387f680ea156544713e0f187c26eaac29350 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 10:01:54 -0600 Subject: [PATCH 030/125] add unit testing folder --- unit_testing/FatesUnitTestIOMod.F90 | 312 ++++++++++++ unit_testing/FatesUnitTestOrbitalMod.F90 | 581 +++++++++++++++++++++++ unit_testing/test_norman.f90 | 81 ++++ 3 files changed, 974 insertions(+) create mode 100644 unit_testing/FatesUnitTestIOMod.F90 create mode 100644 unit_testing/FatesUnitTestOrbitalMod.F90 create mode 100644 unit_testing/test_norman.f90 diff --git a/unit_testing/FatesUnitTestIOMod.F90 b/unit_testing/FatesUnitTestIOMod.F90 new file mode 100644 index 0000000000..200517388e --- /dev/null +++ b/unit_testing/FatesUnitTestIOMod.F90 @@ -0,0 +1,312 @@ +module FatesUnitTestIOMod + use FatesConstantsMod, only : fates_r8 => r8 + use netcdf + + implicit none + +! LOCALS +integer, parameter :: BASE_UNIT = 10 ! Base unit for files the first time unit_number is called +integer, parameter :: MAX_PATH = 256 ! Maximum path length +integer, parameter :: MAX_CHAR = 80 ! Maximum length for messages +integer :: logf ! Unit number for output log file + +contains + + integer function unit_number() +! +! DESCRIPTION: +! Generates a unit number to be used in opening files +! The first time the function is called, it returns BASE_UNIT +! +! LOCALS: +integer :: iunit ! File unit (increments after first call) +logical :: first = .true. ! First time this has been called? +save + +if (first) then + ! Set first to false and iunit to base unit on first call + iunit = BASE_UNIT + first = .false. +else + ! Otherwise, increment + iunit = iunit + 1 +endif + +! Set to output +unit_number = iunit + + end function unit_number + + !:...........................................................................: + + integer function open_file(filename, mode) + ! + ! DESCRIPTION: + ! Opens the file filename if it can, returns a unit number for it. + ! The first time the function is called, it returns BASE_UNIT + + ! ARGUMENTS: + character(len = *), intent(in) :: filename ! Name of file to open + character(len = *), intent(in), optional :: mode ! Optional mode ('r', 'w', 'rw') + + ! LOCALS: + character(len = 9) :: fmode ! File open mode + logical :: file_exists ! Does the file exist? + character(len = MAX_PATH) :: fname ! Local filename (trimmed) + character(len = MAX_CHAR) :: message ! Error message + integer :: i ! Looping index + integer :: ios ! I/O status + integer :: iunit = BASE_UNIT ! File unit number + integer, dimension(MAX_PATH) :: farray ! Array of characters of file name + + ! Get mode of open (read, write, or read/write) + ! Defaults to read/write + if (present(mode)) then + select case(mode) + case ('r', 'R') + fmode = 'read' + case ('w', 'W') + fmode = 'write' + case ('rw', 'RW', 'wr', 'WR') + fmode = 'readwrite' + case DEFAULT + fmode = 'readwrite' + end select + else + fmode = 'readwrite' + endif + + ! trim filename of whitespace + fname = trim(adjustl(filename)) + + if (fmode == 'read' .or. fmode == 'readwrite') then + ! Check for valid name of file + farray = 0 + do i = 1, len_trim(fname) + farray(i) = ichar(fname(i:i)) + enddo + if (any(farray > 126)) then + write(*,*) "Invalid filename" + stop "Stopped" + endif + endif + + ! Does the file exist? + inquire(file = fname, exist = file_exists) + + ! Open file if conditions are correct + if (file_exists .and. fmode == 'write') then + write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & + " exists. Cannot open write only." + write(*,*) message + stop "Stopped" + else if (.not. file_exists .and. fmode == 'read') then + write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & + " does not exist. Can't read." + write(*,*) message + stop "Stopped" + else + iunit = unit_number() + open(iunit, file = fname, action = fmode, iostat = ios) + if (ios /= 0) then + write(message, '(A,A,A,I6)') "Problem opening", & + fname(1:len_trim(fname)), " ios: ", ios + write(*,*) message + stop "Stopped" + endif + endif + + open_file = iunit + + end function open_file + + !:...........................................................................: + + subroutine write_radiation_data(file, kdir, declin) + character(len=100), intent(in) :: file ! output file name + real(r8), intent(in) :: kdir(num_pft, 48) ! direct beam extinction coefficient + real(r8), intent(in) :: declin(48) + + integer :: ncid + integer :: pft_dimid, time_dimid + integer :: kdir_id, declin_id + integer :: dimids(2) + + ! Create the netCDF file. The nf90_clobber parameter tells netCDF to + ! overwrite this file, if it already exists. + call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) + + ! define dimensions + call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) + call check(nf90_def_dim(ncid, "time", 48, time_dimid)) + + ! define the variables + dimids = (/ pft_dimid, time_dimid/) + call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) + call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write to file. + call check(nf90_put_var(ncid, kdir_id, kdir)) + call check(nf90_put_var(ncid, declin_id, declin)) + + ! close the file. + call check(nf90_close(ncid)) + + end subroutine write_radiation_data + + !:...........................................................................: + + subroutine check(status) + ! + ! DESCRIPTION: + ! Checks status of netcdf operations + + ! ARGUMENTS: + integer, intent (in) :: status ! return status code from a netcdf procedure + + if (status /= nf90_noerr) then + print *, trim(nf90_strerror(status)) + stop "Stopped" + end if + + end subroutine check + + !:...........................................................................: + + subroutine read_patch_data(file, canopy_area, elai, esai, nrad) + ! + ! DESCRIPTION: + ! Reads and return patch data + + ! ARGUMENTS: + character(len=100), intent(in) :: file ! patch file name + real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile + real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile + real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile + real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers + + ! Data dictionary: declare variable types, definitions, and units + real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers + integer :: fidA, varID + + ! open file + call check(nf90_open(trim(file), 0, fidA)) + + ! read patch data values + call check(nf90_inq_varid(fidA, "can_area", varID)) + call check(nf90_get_var(fidA, varID, canopy_area)) + + call check(nf90_inq_varid(fidA, "elai", varID)) + call check(nf90_get_var(fidA, varID, elai)) + + call check(nf90_inq_varid(fidA, "esai", varID)) + call check(nf90_get_var(fidA, varID, esai)) + + call check(nf90_inq_varid(fidA, "nrad", varID)) + call check(nf90_get_var(fidA, varID, nrad)) + + end subroutine read_patch_data + + !:...........................................................................: + + subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) + ! + ! Purpose: + ! Returns parameter values + ! + ! Record of revisions: + ! Date Programmer Description of change + ! ======== ============= ===================== + ! 03/20/23 A. C. Foster Original code + ! + + ! Data dictionary: declare calling parameter types & definitions + character(len=100), intent(in) :: file ! parameter file name + real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance + real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance + real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance + real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance + real(r8), intent(out) :: xl(num_pft) ! leaf orientation index + real(r8), intent(out) :: ci(num_pft) ! clumping index + + ! read in all parameters + call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & + taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) + + end subroutine get_parameters + + !:...........................................................................: + + subroutine read_param_netcdf(file, rholvis, rholnir, rhosvis, rhosnir, & + taulvis, taulnir, tausvis, tausnir, xl, ci) + ! + ! Purpose: + ! Reads a FATES netcdf parameter file + ! + ! Record of revisions: + ! Date Programmer Description of change + ! ======== ============= ===================== + ! 03/20/23 A. C. Foster Original code + ! + + ! Data dictionary: declare calling parameter types & definitions + character(len=100), intent(in) :: file ! parameter file name + real(r8), intent(out) :: rholvis(num_pft) ! vis leaf reflectance + real(r8), intent(out) :: rholnir(num_pft) ! nir leaf reflectance + real(r8), intent(out) :: rhosvis(num_pft) ! vis stem reflectance + real(r8), intent(out) :: rhosnir(num_pft) ! nir stem reflectance + real(r8), intent(out) :: taulvis(num_pft) ! vis leaf transmittance + real(r8), intent(out) :: taulnir(num_pft) ! nir leaf transmittance + real(r8), intent(out) :: tausvis(num_pft) ! vis stem transmittance + real(r8), intent(out) :: tausnir(num_pft) ! nir stem transmittance + real(r8), intent(out) :: xl(num_pft) ! leaf orientation index + real(r8), intent(out) :: ci(num_pft) ! clumping index + + ! Data dictionary: declare variable types, definitions, and units + integer :: fidA, paramID + + ! open file + call check(nf90_open(trim(file), 0, fidA)) + + ! read parameter values + call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhovis", paramID)) + call check(nf90_get_var(fidA, paramID, rholvis)) + + call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhonir", paramID)) + call check(nf90_get_var(fidA, paramID, rholnir)) + + call check(nf90_inq_varid(fidA, "fates_rad_stem_rhovis", paramID)) + call check(nf90_get_var(fidA, paramID, rhosvis)) + + call check(nf90_inq_varid(fidA, "fates_rad_stem_rhonir", paramID)) + call check(nf90_get_var(fidA, paramID, rhosnir)) + + call check(nf90_inq_varid(fidA, "fates_rad_leaf_tauvis", paramID)) + call check(nf90_get_var(fidA, paramID, taulvis)) + + call check(nf90_inq_varid(fidA, "fates_rad_leaf_taunir", paramID)) + call check(nf90_get_var(fidA, paramID, taulnir)) + + call check(nf90_inq_varid(fidA, "fates_rad_stem_tauvis", paramID)) + call check(nf90_get_var(fidA, paramID, tausvis)) + + call check(nf90_inq_varid(fidA, "fates_rad_stem_taunir", paramID)) + call check(nf90_get_var(fidA, paramID, tausnir)) + + call check(nf90_inq_varid(fidA, "fates_rad_leaf_xl", paramID)) + call check(nf90_get_var(fidA, paramID, xl)) + + call check(nf90_inq_varid(fidA, "fates_rad_leaf_clumping_index", paramID)) + call check(nf90_get_var(fidA, paramID, ci)) + + ! close file + call check(nf90_close(fidA)) + + end subroutine read_param_netcdf + + !:...........................................................................: + +end module FatesUnitTestIOMod \ No newline at end of file diff --git a/unit_testing/FatesUnitTestOrbitalMod.F90 b/unit_testing/FatesUnitTestOrbitalMod.F90 new file mode 100644 index 0000000000..545baf398c --- /dev/null +++ b/unit_testing/FatesUnitTestOrbitalMod.F90 @@ -0,0 +1,581 @@ +module OrbitalValsMod + ! + ! DESCRIPTION: + ! Helper procedures for getting orbital values + ! Copied from shr_orb_mod from https://github.com/ESCOMP/CESM_share + ! + ! + + use IOMod + + implicit none + + integer, parameter :: SHR_KIND_R8 = selected_real_kind(12) ! 8 byte real + integer, parameter :: SHR_KIND_IN = kind(1) ! native integer + real(SHR_KIND_R8), parameter :: pi = 3.14159265358979323846_SHR_KIND_R8 + real(SHR_KIND_R8), parameter :: SHR_ORB_ECCEN_MIN = 0.0_SHR_KIND_R8 ! min value for eccen + real(SHR_KIND_R8), parameter :: SHR_ORB_ECCEN_MAX = 0.1_SHR_KIND_R8 ! max value for eccen + real(SHR_KIND_R8), parameter :: SHR_ORB_OBLIQ_MIN = -90.0_SHR_KIND_R8 ! min value for obliq + real(SHR_KIND_R8), parameter :: SHR_ORB_OBLIQ_MAX = +90.0_SHR_KIND_R8 ! max value for obliq + real(SHR_KIND_R8), parameter :: SHR_ORB_MVELP_MIN = 0.0_SHR_KIND_R8 ! min value for mvelp + real(SHR_KIND_R8), parameter :: SHR_ORB_MVELP_MAX = 360.0_SHR_KIND_R8 ! max value for mvelp + integer(SHR_KIND_IN), parameter :: SHR_ORB_UNDEF_INT = 2000000000 ! undefined int + real(SHR_KIND_R8), parameter :: SHR_ORB_UNDEF_REAL = 1.e36_SHR_KIND_R8 ! undefined real + + contains + + subroutine get_orbital_vals(iyear_AD, s_logunit, eccen, mvelp, obliqr, & + lambm0, mvelpp) + ! + ! Gets orbital values for a specific day + ! + + ! Data dictionary: calling arguments + integer(SHR_KIND_IN), intent(in) :: iyear_AD ! Year to calculate orbit for + integer, intent(in) :: s_logunit ! log file unit number + real(SHR_KIND_R8), intent(out) :: eccen ! orbital eccentricity + real(SHR_KIND_R8), intent(out) :: mvelp ! moving vernal equinox long + real(SHR_KIND_R8), intent(out) :: obliqr ! Earths obliquity in rad + real(SHR_KIND_R8), intent(out) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) + real(SHR_KIND_R8), intent(out) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) + + real(SHR_KIND_R8) :: obliq ! obliquity in degrees + + obliq = SHR_ORB_UNDEF_REAL + eccen = SHR_ORB_UNDEF_REAL + mvelp = SHR_ORB_UNDEF_REAL + + call shr_orb_params(iyear_AD, eccen, obliq, mvelp, obliqr, lambm0, & + mvelpp, s_logunit) + + end subroutine get_orbital_vals + + !:.........................................................................: + + subroutine shr_orb_params(iyear_AD, eccen, obliq, mvelp, & + obliqr, lambm0, mvelpp, s_logunit) + + !--------------------------------------------------------------------------- + ! + ! Calculate earths orbital parameters using Dave Threshers formula which + ! came from Berger, Andre. 1978 "A Simple Algorithm to Compute Long-Term + ! Variations of Daily Insolation". Contribution 18, Institute of Astronomy + ! and Geophysics, Universite Catholique de Louvain, Louvain-la-Neuve, Belgium + ! + !------------------------------Code history--------------------------------- + ! + ! Original Author: Erik Kluzek + ! Date: Oct/97 + ! + !--------------------------------------------------------------------------- + + !----------------------------- Arguments ------------------------------------ + integer(SHR_KIND_IN), intent(in) :: iyear_AD ! Year to calculate orbit for + real(SHR_KIND_R8), intent(inout) :: eccen ! orbital eccentricity + real(SHR_KIND_R8), intent(inout) :: obliq ! obliquity in degrees + real(SHR_KIND_R8), intent(inout) :: mvelp ! moving vernal equinox long + real(SHR_KIND_R8), intent(out) :: obliqr ! Earths obliquity in rad + real(SHR_KIND_R8), intent(out) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) + real(SHR_KIND_R8), intent(out) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) + integer, intent(in) :: s_logunit ! log file unit number + + !------------------------------ Parameters ---------------------------------- + integer(SHR_KIND_IN), parameter :: poblen = 47 ! # of elements in series wrt obliquity + integer(SHR_KIND_IN), parameter :: pecclen = 19 ! # of elements in series wrt eccentricity + integer(SHR_KIND_IN), parameter :: pmvelen = 78 ! # of elements in series wrt vernal equinox + real(SHR_KIND_R8), parameter :: psecdeg = 1.0_SHR_KIND_R8/3600.0_SHR_KIND_R8 ! arc sec to deg conversion + + real(SHR_KIND_R8) :: degrad = pi/180._SHR_KIND_R8 ! degree to radian conversion factor + real(SHR_KIND_R8) :: yb4_1950AD ! number of years before 1950 AD + + ! Cosine series data for computation of obliquity: amplitude (arc seconds), + ! rate (arc seconds/year), phase (degrees). + + real (SHR_KIND_R8), parameter :: obamp(poblen) = & ! amplitudes for obliquity cos series + & (/ -2462.2214466_SHR_KIND_R8, -857.3232075_SHR_KIND_R8, -629.3231835_SHR_KIND_R8, & + & -414.2804924_SHR_KIND_R8, -311.7632587_SHR_KIND_R8, 308.9408604_SHR_KIND_R8, & + & -162.5533601_SHR_KIND_R8, -116.1077911_SHR_KIND_R8, 101.1189923_SHR_KIND_R8, & + & -67.6856209_SHR_KIND_R8, 24.9079067_SHR_KIND_R8, 22.5811241_SHR_KIND_R8, & + & -21.1648355_SHR_KIND_R8, -15.6549876_SHR_KIND_R8, 15.3936813_SHR_KIND_R8, & + & 14.6660938_SHR_KIND_R8, -11.7273029_SHR_KIND_R8, 10.2742696_SHR_KIND_R8, & + & 6.4914588_SHR_KIND_R8, 5.8539148_SHR_KIND_R8, -5.4872205_SHR_KIND_R8, & + & -5.4290191_SHR_KIND_R8, 5.1609570_SHR_KIND_R8, 5.0786314_SHR_KIND_R8, & + & -4.0735782_SHR_KIND_R8, 3.7227167_SHR_KIND_R8, 3.3971932_SHR_KIND_R8, & + & -2.8347004_SHR_KIND_R8, -2.6550721_SHR_KIND_R8, -2.5717867_SHR_KIND_R8, & + & -2.4712188_SHR_KIND_R8, 2.4625410_SHR_KIND_R8, 2.2464112_SHR_KIND_R8, & + & -2.0755511_SHR_KIND_R8, -1.9713669_SHR_KIND_R8, -1.8813061_SHR_KIND_R8, & + & -1.8468785_SHR_KIND_R8, 1.8186742_SHR_KIND_R8, 1.7601888_SHR_KIND_R8, & + & -1.5428851_SHR_KIND_R8, 1.4738838_SHR_KIND_R8, -1.4593669_SHR_KIND_R8, & + & 1.4192259_SHR_KIND_R8, -1.1818980_SHR_KIND_R8, 1.1756474_SHR_KIND_R8, & + & -1.1316126_SHR_KIND_R8, 1.0896928_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: obrate(poblen) = & ! rates for obliquity cosine series + & (/ 31.609974_SHR_KIND_R8, 32.620504_SHR_KIND_R8, 24.172203_SHR_KIND_R8, & + & 31.983787_SHR_KIND_R8, 44.828336_SHR_KIND_R8, 30.973257_SHR_KIND_R8, & + & 43.668246_SHR_KIND_R8, 32.246691_SHR_KIND_R8, 30.599444_SHR_KIND_R8, & + & 42.681324_SHR_KIND_R8, 43.836462_SHR_KIND_R8, 47.439436_SHR_KIND_R8, & + & 63.219948_SHR_KIND_R8, 64.230478_SHR_KIND_R8, 1.010530_SHR_KIND_R8, & + & 7.437771_SHR_KIND_R8, 55.782177_SHR_KIND_R8, 0.373813_SHR_KIND_R8, & + & 13.218362_SHR_KIND_R8, 62.583231_SHR_KIND_R8, 63.593761_SHR_KIND_R8, & + & 76.438310_SHR_KIND_R8, 45.815258_SHR_KIND_R8, 8.448301_SHR_KIND_R8, & + & 56.792707_SHR_KIND_R8, 49.747842_SHR_KIND_R8, 12.058272_SHR_KIND_R8, & + & 75.278220_SHR_KIND_R8, 65.241008_SHR_KIND_R8, 64.604291_SHR_KIND_R8, & + & 1.647247_SHR_KIND_R8, 7.811584_SHR_KIND_R8, 12.207832_SHR_KIND_R8, & + & 63.856665_SHR_KIND_R8, 56.155990_SHR_KIND_R8, 77.448840_SHR_KIND_R8, & + & 6.801054_SHR_KIND_R8, 62.209418_SHR_KIND_R8, 20.656133_SHR_KIND_R8, & + & 48.344406_SHR_KIND_R8, 55.145460_SHR_KIND_R8, 69.000539_SHR_KIND_R8, & + & 11.071350_SHR_KIND_R8, 74.291298_SHR_KIND_R8, 11.047742_SHR_KIND_R8, & + & 0.636717_SHR_KIND_R8, 12.844549_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: obphas(poblen) = & ! phases for obliquity cosine series + & (/ 251.9025_SHR_KIND_R8, 280.8325_SHR_KIND_R8, 128.3057_SHR_KIND_R8, & + & 292.7252_SHR_KIND_R8, 15.3747_SHR_KIND_R8, 263.7951_SHR_KIND_R8, & + & 308.4258_SHR_KIND_R8, 240.0099_SHR_KIND_R8, 222.9725_SHR_KIND_R8, & + & 268.7809_SHR_KIND_R8, 316.7998_SHR_KIND_R8, 319.6024_SHR_KIND_R8, & + & 143.8050_SHR_KIND_R8, 172.7351_SHR_KIND_R8, 28.9300_SHR_KIND_R8, & + & 123.5968_SHR_KIND_R8, 20.2082_SHR_KIND_R8, 40.8226_SHR_KIND_R8, & + & 123.4722_SHR_KIND_R8, 155.6977_SHR_KIND_R8, 184.6277_SHR_KIND_R8, & + & 267.2772_SHR_KIND_R8, 55.0196_SHR_KIND_R8, 152.5268_SHR_KIND_R8, & + & 49.1382_SHR_KIND_R8, 204.6609_SHR_KIND_R8, 56.5233_SHR_KIND_R8, & + & 200.3284_SHR_KIND_R8, 201.6651_SHR_KIND_R8, 213.5577_SHR_KIND_R8, & + & 17.0374_SHR_KIND_R8, 164.4194_SHR_KIND_R8, 94.5422_SHR_KIND_R8, & + & 131.9124_SHR_KIND_R8, 61.0309_SHR_KIND_R8, 296.2073_SHR_KIND_R8, & + & 135.4894_SHR_KIND_R8, 114.8750_SHR_KIND_R8, 247.0691_SHR_KIND_R8, & + & 256.6114_SHR_KIND_R8, 32.1008_SHR_KIND_R8, 143.6804_SHR_KIND_R8, & + & 16.8784_SHR_KIND_R8, 160.6835_SHR_KIND_R8, 27.5932_SHR_KIND_R8, & + & 348.1074_SHR_KIND_R8, 82.6496_SHR_KIND_R8/) + + ! Cosine/sine series data for computation of eccentricity and fixed vernal + ! equinox longitude of perihelion (fvelp): amplitude, + ! rate (arc seconds/year), phase (degrees). + + real (SHR_KIND_R8), parameter :: ecamp (pecclen) = & ! ampl for eccen/fvelp cos/sin series + & (/ 0.01860798_SHR_KIND_R8, 0.01627522_SHR_KIND_R8, -0.01300660_SHR_KIND_R8, & + & 0.00988829_SHR_KIND_R8, -0.00336700_SHR_KIND_R8, 0.00333077_SHR_KIND_R8, & + & -0.00235400_SHR_KIND_R8, 0.00140015_SHR_KIND_R8, 0.00100700_SHR_KIND_R8, & + & 0.00085700_SHR_KIND_R8, 0.00064990_SHR_KIND_R8, 0.00059900_SHR_KIND_R8, & + & 0.00037800_SHR_KIND_R8, -0.00033700_SHR_KIND_R8, 0.00027600_SHR_KIND_R8, & + & 0.00018200_SHR_KIND_R8, -0.00017400_SHR_KIND_R8, -0.00012400_SHR_KIND_R8, & + & 0.00001250_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: ecrate(pecclen) = & ! rates for eccen/fvelp cos/sin series + & (/ 4.2072050_SHR_KIND_R8, 7.3460910_SHR_KIND_R8, 17.8572630_SHR_KIND_R8, & + & 17.2205460_SHR_KIND_R8, 16.8467330_SHR_KIND_R8, 5.1990790_SHR_KIND_R8, & + & 18.2310760_SHR_KIND_R8, 26.2167580_SHR_KIND_R8, 6.3591690_SHR_KIND_R8, & + & 16.2100160_SHR_KIND_R8, 3.0651810_SHR_KIND_R8, 16.5838290_SHR_KIND_R8, & + & 18.4939800_SHR_KIND_R8, 6.1909530_SHR_KIND_R8, 18.8677930_SHR_KIND_R8, & + & 17.4255670_SHR_KIND_R8, 6.1860010_SHR_KIND_R8, 18.4174410_SHR_KIND_R8, & + & 0.6678630_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: ecphas(pecclen) = & ! phases for eccen/fvelp cos/sin series + & (/ 28.620089_SHR_KIND_R8, 193.788772_SHR_KIND_R8, 308.307024_SHR_KIND_R8, & + & 320.199637_SHR_KIND_R8, 279.376984_SHR_KIND_R8, 87.195000_SHR_KIND_R8, & + & 349.129677_SHR_KIND_R8, 128.443387_SHR_KIND_R8, 154.143880_SHR_KIND_R8, & + & 291.269597_SHR_KIND_R8, 114.860583_SHR_KIND_R8, 332.092251_SHR_KIND_R8, & + & 296.414411_SHR_KIND_R8, 145.769910_SHR_KIND_R8, 337.237063_SHR_KIND_R8, & + & 152.092288_SHR_KIND_R8, 126.839891_SHR_KIND_R8, 210.667199_SHR_KIND_R8, & + & 72.108838_SHR_KIND_R8/) + + ! Sine series data for computation of moving vernal equinox longitude of + ! perihelion: amplitude (arc seconds), rate (arc sec/year), phase (degrees). + + real (SHR_KIND_R8), parameter :: mvamp (pmvelen) = & ! amplitudes for mvelp sine series + & (/ 7391.0225890_SHR_KIND_R8, 2555.1526947_SHR_KIND_R8, 2022.7629188_SHR_KIND_R8, & + & -1973.6517951_SHR_KIND_R8, 1240.2321818_SHR_KIND_R8, 953.8679112_SHR_KIND_R8, & + & -931.7537108_SHR_KIND_R8, 872.3795383_SHR_KIND_R8, 606.3544732_SHR_KIND_R8, & + & -496.0274038_SHR_KIND_R8, 456.9608039_SHR_KIND_R8, 346.9462320_SHR_KIND_R8, & + & -305.8412902_SHR_KIND_R8, 249.6173246_SHR_KIND_R8, -199.1027200_SHR_KIND_R8, & + & 191.0560889_SHR_KIND_R8, -175.2936572_SHR_KIND_R8, 165.9068833_SHR_KIND_R8, & + & 161.1285917_SHR_KIND_R8, 139.7878093_SHR_KIND_R8, -133.5228399_SHR_KIND_R8, & + & 117.0673811_SHR_KIND_R8, 104.6907281_SHR_KIND_R8, 95.3227476_SHR_KIND_R8, & + & 86.7824524_SHR_KIND_R8, 86.0857729_SHR_KIND_R8, 70.5893698_SHR_KIND_R8, & + & -69.9719343_SHR_KIND_R8, -62.5817473_SHR_KIND_R8, 61.5450059_SHR_KIND_R8, & + & -57.9364011_SHR_KIND_R8, 57.1899832_SHR_KIND_R8, -57.0236109_SHR_KIND_R8, & + & -54.2119253_SHR_KIND_R8, 53.2834147_SHR_KIND_R8, 52.1223575_SHR_KIND_R8, & + & -49.0059908_SHR_KIND_R8, -48.3118757_SHR_KIND_R8, -45.4191685_SHR_KIND_R8, & + & -42.2357920_SHR_KIND_R8, -34.7971099_SHR_KIND_R8, 34.4623613_SHR_KIND_R8, & + & -33.8356643_SHR_KIND_R8, 33.6689362_SHR_KIND_R8, -31.2521586_SHR_KIND_R8, & + & -30.8798701_SHR_KIND_R8, 28.4640769_SHR_KIND_R8, -27.1960802_SHR_KIND_R8, & + & 27.0860736_SHR_KIND_R8, -26.3437456_SHR_KIND_R8, 24.7253740_SHR_KIND_R8, & + & 24.6732126_SHR_KIND_R8, 24.4272733_SHR_KIND_R8, 24.0127327_SHR_KIND_R8, & + & 21.7150294_SHR_KIND_R8, -21.5375347_SHR_KIND_R8, 18.1148363_SHR_KIND_R8, & + & -16.9603104_SHR_KIND_R8, -16.1765215_SHR_KIND_R8, 15.5567653_SHR_KIND_R8, & + & 15.4846529_SHR_KIND_R8, 15.2150632_SHR_KIND_R8, 14.5047426_SHR_KIND_R8, & + & -14.3873316_SHR_KIND_R8, 13.1351419_SHR_KIND_R8, 12.8776311_SHR_KIND_R8, & + & 11.9867234_SHR_KIND_R8, 11.9385578_SHR_KIND_R8, 11.7030822_SHR_KIND_R8, & + & 11.6018181_SHR_KIND_R8, -11.2617293_SHR_KIND_R8, -10.4664199_SHR_KIND_R8, & + & 10.4333970_SHR_KIND_R8, -10.2377466_SHR_KIND_R8, 10.1934446_SHR_KIND_R8, & + & -10.1280191_SHR_KIND_R8, 10.0289441_SHR_KIND_R8, -10.0034259_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: mvrate(pmvelen) = & ! rates for mvelp sine series + & (/ 31.609974_SHR_KIND_R8, 32.620504_SHR_KIND_R8, 24.172203_SHR_KIND_R8, & + & 0.636717_SHR_KIND_R8, 31.983787_SHR_KIND_R8, 3.138886_SHR_KIND_R8, & + & 30.973257_SHR_KIND_R8, 44.828336_SHR_KIND_R8, 0.991874_SHR_KIND_R8, & + & 0.373813_SHR_KIND_R8, 43.668246_SHR_KIND_R8, 32.246691_SHR_KIND_R8, & + & 30.599444_SHR_KIND_R8, 2.147012_SHR_KIND_R8, 10.511172_SHR_KIND_R8, & + & 42.681324_SHR_KIND_R8, 13.650058_SHR_KIND_R8, 0.986922_SHR_KIND_R8, & + & 9.874455_SHR_KIND_R8, 13.013341_SHR_KIND_R8, 0.262904_SHR_KIND_R8, & + & 0.004952_SHR_KIND_R8, 1.142024_SHR_KIND_R8, 63.219948_SHR_KIND_R8, & + & 0.205021_SHR_KIND_R8, 2.151964_SHR_KIND_R8, 64.230478_SHR_KIND_R8, & + & 43.836462_SHR_KIND_R8, 47.439436_SHR_KIND_R8, 1.384343_SHR_KIND_R8, & + & 7.437771_SHR_KIND_R8, 18.829299_SHR_KIND_R8, 9.500642_SHR_KIND_R8, & + & 0.431696_SHR_KIND_R8, 1.160090_SHR_KIND_R8, 55.782177_SHR_KIND_R8, & + & 12.639528_SHR_KIND_R8, 1.155138_SHR_KIND_R8, 0.168216_SHR_KIND_R8, & + & 1.647247_SHR_KIND_R8, 10.884985_SHR_KIND_R8, 5.610937_SHR_KIND_R8, & + & 12.658184_SHR_KIND_R8, 1.010530_SHR_KIND_R8, 1.983748_SHR_KIND_R8, & + & 14.023871_SHR_KIND_R8, 0.560178_SHR_KIND_R8, 1.273434_SHR_KIND_R8, & + & 12.021467_SHR_KIND_R8, 62.583231_SHR_KIND_R8, 63.593761_SHR_KIND_R8, & + & 76.438310_SHR_KIND_R8, 4.280910_SHR_KIND_R8, 13.218362_SHR_KIND_R8, & + & 17.818769_SHR_KIND_R8, 8.359495_SHR_KIND_R8, 56.792707_SHR_KIND_R8, & + & 8.448301_SHR_KIND_R8, 1.978796_SHR_KIND_R8, 8.863925_SHR_KIND_R8, & + & 0.186365_SHR_KIND_R8, 8.996212_SHR_KIND_R8, 6.771027_SHR_KIND_R8, & + & 45.815258_SHR_KIND_R8, 12.002811_SHR_KIND_R8, 75.278220_SHR_KIND_R8, & + & 65.241008_SHR_KIND_R8, 18.870667_SHR_KIND_R8, 22.009553_SHR_KIND_R8, & + & 64.604291_SHR_KIND_R8, 11.498094_SHR_KIND_R8, 0.578834_SHR_KIND_R8, & + & 9.237738_SHR_KIND_R8, 49.747842_SHR_KIND_R8, 2.147012_SHR_KIND_R8, & + & 1.196895_SHR_KIND_R8, 2.133898_SHR_KIND_R8, 0.173168_SHR_KIND_R8/) + + real (SHR_KIND_R8), parameter :: mvphas(pmvelen) = & ! phases for mvelp sine series + & (/ 251.9025_SHR_KIND_R8, 280.8325_SHR_KIND_R8, 128.3057_SHR_KIND_R8, & + & 348.1074_SHR_KIND_R8, 292.7252_SHR_KIND_R8, 165.1686_SHR_KIND_R8, & + & 263.7951_SHR_KIND_R8, 15.3747_SHR_KIND_R8, 58.5749_SHR_KIND_R8, & + & 40.8226_SHR_KIND_R8, 308.4258_SHR_KIND_R8, 240.0099_SHR_KIND_R8, & + & 222.9725_SHR_KIND_R8, 106.5937_SHR_KIND_R8, 114.5182_SHR_KIND_R8, & + & 268.7809_SHR_KIND_R8, 279.6869_SHR_KIND_R8, 39.6448_SHR_KIND_R8, & + & 126.4108_SHR_KIND_R8, 291.5795_SHR_KIND_R8, 307.2848_SHR_KIND_R8, & + & 18.9300_SHR_KIND_R8, 273.7596_SHR_KIND_R8, 143.8050_SHR_KIND_R8, & + & 191.8927_SHR_KIND_R8, 125.5237_SHR_KIND_R8, 172.7351_SHR_KIND_R8, & + & 316.7998_SHR_KIND_R8, 319.6024_SHR_KIND_R8, 69.7526_SHR_KIND_R8, & + & 123.5968_SHR_KIND_R8, 217.6432_SHR_KIND_R8, 85.5882_SHR_KIND_R8, & + & 156.2147_SHR_KIND_R8, 66.9489_SHR_KIND_R8, 20.2082_SHR_KIND_R8, & + & 250.7568_SHR_KIND_R8, 48.0188_SHR_KIND_R8, 8.3739_SHR_KIND_R8, & + & 17.0374_SHR_KIND_R8, 155.3409_SHR_KIND_R8, 94.1709_SHR_KIND_R8, & + & 221.1120_SHR_KIND_R8, 28.9300_SHR_KIND_R8, 117.1498_SHR_KIND_R8, & + & 320.5095_SHR_KIND_R8, 262.3602_SHR_KIND_R8, 336.2148_SHR_KIND_R8, & + & 233.0046_SHR_KIND_R8, 155.6977_SHR_KIND_R8, 184.6277_SHR_KIND_R8, & + & 267.2772_SHR_KIND_R8, 78.9281_SHR_KIND_R8, 123.4722_SHR_KIND_R8, & + & 188.7132_SHR_KIND_R8, 180.1364_SHR_KIND_R8, 49.1382_SHR_KIND_R8, & + & 152.5268_SHR_KIND_R8, 98.2198_SHR_KIND_R8, 97.4808_SHR_KIND_R8, & + & 221.5376_SHR_KIND_R8, 168.2438_SHR_KIND_R8, 161.1199_SHR_KIND_R8, & + & 55.0196_SHR_KIND_R8, 262.6495_SHR_KIND_R8, 200.3284_SHR_KIND_R8, & + & 201.6651_SHR_KIND_R8, 294.6547_SHR_KIND_R8, 99.8233_SHR_KIND_R8, & + & 213.5577_SHR_KIND_R8, 154.1631_SHR_KIND_R8, 232.7153_SHR_KIND_R8, & + & 138.3034_SHR_KIND_R8, 204.6609_SHR_KIND_R8, 106.5938_SHR_KIND_R8, & + & 250.4676_SHR_KIND_R8, 332.3345_SHR_KIND_R8, 27.3039_SHR_KIND_R8/) + + !---------------------------Local variables---------------------------------- + integer(SHR_KIND_IN) :: i ! Index for series summations + real (SHR_KIND_R8) :: obsum ! Obliquity series summation + real (SHR_KIND_R8) :: cossum ! Cos series summation for eccentricity/fvelp + real (SHR_KIND_R8) :: sinsum ! Sin series summation for eccentricity/fvelp + real (SHR_KIND_R8) :: fvelp ! Fixed vernal equinox long of perihelion + real (SHR_KIND_R8) :: mvsum ! mvelp series summation + real (SHR_KIND_R8) :: beta ! Intermediate argument for lambm0 + real (SHR_KIND_R8) :: years ! Years to time of interest ( pos <=> future) + real (SHR_KIND_R8) :: eccen2 ! eccentricity squared + real (SHR_KIND_R8) :: eccen3 ! eccentricity cubed + + !-------------------------- Formats ----------------------------------------- + character(len=*),parameter :: F00 = "('(shr_orb_params) ',4a)" + character(len=*),parameter :: F01 = "('(shr_orb_params) ',a,i9)" + character(len=*),parameter :: F02 = "('(shr_orb_params) ',a,f6.3)" + character(len=*),parameter :: F03 = "('(shr_orb_params) ',a,es14.6)" + + !---------------------------------------------------------------------------- + ! radinp and algorithms below will need a degree to radian conversion factor + + ! Check for flag to use input orbit parameters + + IF ( iyear_AD == SHR_ORB_UNDEF_INT ) THEN + + ! Check input obliq, eccen, and mvelp to ensure reasonable + + if( obliq == SHR_ORB_UNDEF_REAL )then + write(s_logunit,F00) ' Have to specify orbital parameters:' + write(s_logunit,F00) 'Either set: iyear_AD, OR [obliq, eccen, and mvelp]:' + write(s_logunit,F00) 'iyear_AD is the year to simulate orbit for (ie. 1950): ' + write(s_logunit,F00) 'obliq, eccen, mvelp specify the orbit directly:' + write(s_logunit,F00) 'The AMIP II settings (for a 1995 orbit) are: ' + write(s_logunit,F00) ' obliq = 23.4441' + write(s_logunit,F00) ' eccen = 0.016715' + write(s_logunit,F00) ' mvelp = 102.7' + stop "Stopped" + end if + if( (obliq < SHR_ORB_OBLIQ_MIN).or.(obliq > SHR_ORB_OBLIQ_MAX) ) then + write(s_logunit,F03) 'Input obliquity unreasonable: ', obliq + stop "Stopped" + end if + if( (eccen < SHR_ORB_ECCEN_MIN).or.(eccen > SHR_ORB_ECCEN_MAX) ) then + write(s_logunit,F03) 'Input eccentricity unreasonable: ', eccen + stop "Stopped" + end if + if( (mvelp < SHR_ORB_MVELP_MIN).or.(mvelp > SHR_ORB_MVELP_MAX) ) then + write(s_logunit,F03) 'Input mvelp unreasonable: ' , mvelp + stop "Stopped" + end if + eccen2 = eccen*eccen + eccen3 = eccen2*eccen + + ELSE ! Otherwise calculate based on years before present + + yb4_1950AD = 1950.0_SHR_KIND_R8 - real(iyear_AD,SHR_KIND_R8) + if ( abs(yb4_1950AD) .gt. 1000000.0_SHR_KIND_R8 )then + write(s_logunit,F00) 'orbit only valid for years+-1000000' + write(s_logunit,F00) 'Relative to 1950 AD' + write(s_logunit,F03) '# of years before 1950: ',yb4_1950AD + write(s_logunit,F01) 'Year to simulate was : ',iyear_AD + stop "Stopped" + end if + + ! The following calculates the earths obliquity, orbital eccentricity + ! (and various powers of it) and vernal equinox mean longitude of + ! perihelion for years in the past (future = negative of years past), + ! using constants (see parameter section) given in the program of: + ! + ! Berger, Andre. 1978 A Simple Algorithm to Compute Long-Term Variations + ! of Daily Insolation. Contribution 18, Institute of Astronomy and + ! Geophysics, Universite Catholique de Louvain, Louvain-la-Neuve, Belgium. + ! + ! and formulas given in the paper (where less precise constants are also + ! given): + ! + ! Berger, Andre. 1978. Long-Term Variations of Daily Insolation and + ! Quaternary Climatic Changes. J. of the Atmo. Sci. 35:2362-2367 + ! + ! The algorithm is valid only to 1,000,000 years past or hence. + ! For a solution valid to 5-10 million years past see the above author. + ! Algorithm below is better for years closer to present than is the + ! 5-10 million year solution. + ! + ! Years to time of interest must be negative of years before present + ! (1950) in formulas that follow. + + years = - yb4_1950AD + + ! In the summations below, cosine or sine arguments, which end up in + ! degrees, must be converted to radians via multiplication by degrad. + ! + ! Summation of cosine series for obliquity (epsilon in Berger 1978) in + ! degrees. Convert the amplitudes and rates, which are in arc secs, into + ! degrees via multiplication by psecdeg (arc seconds to degrees conversion + ! factor). For obliq, first term is Berger 1978 epsilon star; second + ! term is series summation in degrees. + + obsum = 0.0_SHR_KIND_R8 + do i = 1, poblen + obsum = obsum + obamp(i)*psecdeg*cos((obrate(i)*psecdeg*years + & + & obphas(i))*degrad) + end do + obliq = 23.320556_SHR_KIND_R8 + obsum + + ! Summation of cosine and sine series for computation of eccentricity + ! (eccen; e in Berger 1978) and fixed vernal equinox longitude of + ! perihelion (fvelp; pi in Berger 1978), which is used for computation + ! of moving vernal equinox longitude of perihelion. Convert the rates, + ! which are in arc seconds, into degrees via multiplication by psecdeg. + + cossum = 0.0_SHR_KIND_R8 + do i = 1, pecclen + cossum = cossum+ecamp(i)*cos((ecrate(i)*psecdeg*years+ecphas(i))*degrad) + end do + + sinsum = 0.0_SHR_KIND_R8 + do i = 1, pecclen + sinsum = sinsum+ecamp(i)*sin((ecrate(i)*psecdeg*years+ecphas(i))*degrad) + end do + + ! Use summations to calculate eccentricity + + eccen2 = cossum*cossum + sinsum*sinsum + eccen = sqrt(eccen2) + eccen3 = eccen2*eccen + + ! A series of cases for fvelp, which is in radians. + if (abs(cossum) .le. 1.0E-8_SHR_KIND_R8) then + if (sinsum .eq. 0.0_SHR_KIND_R8) then + fvelp = 0.0_SHR_KIND_R8 + else if (sinsum .lt. 0.0_SHR_KIND_R8) then + fvelp = 1.5_SHR_KIND_R8*pi + else if (sinsum .gt. 0.0_SHR_KIND_R8) then + fvelp = .5_SHR_KIND_R8*pi + endif + else if (cossum .lt. 0.0_SHR_KIND_R8) then + fvelp = atan(sinsum/cossum) + pi + else ! cossum > 1.0e-8 + if (sinsum .lt. 0.0_SHR_KIND_R8) then + fvelp = atan(sinsum/cossum) + 2.0_SHR_KIND_R8*pi + else + fvelp = atan(sinsum/cossum) + endif + endif + + ! Summation of sin series for computation of moving vernal equinox long + ! of perihelion (mvelp; omega bar in Berger 1978) in degrees. For mvelp, + ! first term is fvelp in degrees; second term is Berger 1978 psi bar + ! times years and in degrees; third term is Berger 1978 zeta; fourth + ! term is series summation in degrees. Convert the amplitudes and rates, + ! which are in arc seconds, into degrees via multiplication by psecdeg. + ! Series summation plus second and third terms constitute Berger 1978 + ! psi, which is the general precession. + + mvsum = 0.0_SHR_KIND_R8 + do i = 1, pmvelen + mvsum = mvsum + mvamp(i)*psecdeg*sin((mvrate(i)*psecdeg*years + & + & mvphas(i))*degrad) + end do + mvelp = fvelp/degrad + 50.439273_SHR_KIND_R8*psecdeg*years + 3.392506_SHR_KIND_R8 + mvsum + + ! Cases to make sure mvelp is between 0 and 360. + + do while (mvelp .lt. 0.0_SHR_KIND_R8) + mvelp = mvelp + 360.0_SHR_KIND_R8 + end do + do while (mvelp .ge. 360.0_SHR_KIND_R8) + mvelp = mvelp - 360.0_SHR_KIND_R8 + end do + + END IF ! end of test on whether to calculate or use input orbital params + + ! Orbit needs the obliquity in radians + + obliqr = obliq*degrad + + ! 180 degrees must be added to mvelp since observations are made from the + ! earth and the sun is considered (wrongly for the algorithm) to go around + ! the earth. For a more graphic explanation see Appendix B in: + ! + ! A. Berger, M. Loutre and C. Tricot. 1993. Insolation and Earth Orbital + ! Periods. J. of Geophysical Research 98:10,341-10,362. + ! + ! Additionally, orbit will need this value in radians. So mvelp becomes + ! mvelpp (mvelp plus pi) + + mvelpp = (mvelp + 180._SHR_KIND_R8)*degrad + + ! Set up an argument used several times in lambm0 calculation ahead. + + beta = sqrt(1._SHR_KIND_R8 - eccen2) + + ! The mean longitude at the vernal equinox (lambda m nought in Berger + ! 1978; in radians) is calculated from the following formula given in + ! Berger 1978. At the vernal equinox the true longitude (lambda in Berger + ! 1978) is 0. + + lambm0 = 2._SHR_KIND_R8*((.5_SHR_KIND_R8*eccen + .125_SHR_KIND_R8*eccen3)*(1._SHR_KIND_R8 + beta)*sin(mvelpp) & + & - .250_SHR_KIND_R8*eccen2*(.5_SHR_KIND_R8 + beta)*sin(2._SHR_KIND_R8*mvelpp) & + & + .125_SHR_KIND_R8*eccen3*(1._SHR_KIND_R8/3._SHR_KIND_R8 + beta)*sin(3._SHR_KIND_R8*mvelpp)) + + end subroutine shr_orb_params + + !:..........................................................................: + + subroutine shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, delta, eccf) + + !------------------------------------------------------------------------- + ! + ! Compute earth/orbit parameters using formula suggested by + ! Duane Thresher. + ! + !---------------------------Code history---------------------------------- + ! + ! Original version: Erik Kluzek + ! Date: Oct/1997 + ! + !------------------------------------------------------------------------- + + !------------------------------Arguments-------------------------------- + real(SHR_KIND_R8), intent(in) :: calday ! Calendar day, including fraction + real(SHR_KIND_R8), intent(in) :: eccen ! Eccentricity + real(SHR_KIND_R8), intent(in) :: obliqr ! Earths obliquity in radians + real(SHR_KIND_R8), intent(in) :: lambm0 ! Mean long of perihelion at the vernal equinox (radians) + real(SHR_KIND_R8), intent(in) :: mvelpp ! moving vernal equinox longitude of perihelion plus pi (radians) + real(SHR_KIND_R8), intent(out) :: delta ! Solar declination angle in rad + real(SHR_KIND_R8), intent(out) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) + + !---------------------------Local variables----------------------------- + real(SHR_KIND_R8), parameter :: dayspy = 365.0_SHR_KIND_R8 ! days per year + real(SHR_KIND_R8), parameter :: ve = 80.5_SHR_KIND_R8 ! Calday of vernal equinox assumes Jan 1 = calday 1 + + real(SHR_KIND_R8) :: lambm ! Lambda m, mean long of perihelion (rad) + real(SHR_KIND_R8) :: lmm ! Intermediate argument involving lambm + real(SHR_KIND_R8) :: lamb ! Lambda, the earths long of perihelion + real(SHR_KIND_R8) :: invrho ! Inverse normalized sun/earth distance + real(SHR_KIND_R8) :: sinl ! Sine of lmm + + ! Compute eccentricity factor and solar declination using + ! day value where a round day (such as 213.0) refers to 0z at + ! Greenwich longitude. + ! + ! Use formulas from Berger, Andre 1978: Long-Term Variations of Daily + ! Insolation and Quaternary Climatic Changes. J. of the Atmo. Sci. + ! 35:2362-2367. + ! + ! To get the earths true longitude (position in orbit; lambda in Berger + ! 1978) which is necessary to find the eccentricity factor and declination, + ! must first calculate the mean longitude (lambda m in Berger 1978) at + ! the present day. This is done by adding to lambm0 (the mean longitude + ! at the vernal equinox, set as March 21 at noon, when lambda=0; in radians) + ! an increment (delta lambda m in Berger 1978) that is the number of + ! days past or before (a negative increment) the vernal equinox divided by + ! the days in a model year times the 2*pi radians in a complete orbit. + + lambm = lambm0 + (calday - ve)*2._SHR_KIND_R8*pi/dayspy + lmm = lambm - mvelpp + + ! The earths true longitude, in radians, is then found from + ! the formula in Berger 1978: + + sinl = sin(lmm) + lamb = lambm + eccen*(2._SHR_KIND_R8*sinl + & + eccen*(1.25_SHR_KIND_R8*sin(2._SHR_KIND_R8*lmm) + & + eccen*((13.0_SHR_KIND_R8/12.0_SHR_KIND_R8)* & + sin(3._SHR_KIND_R8*lmm) - 0.25_SHR_KIND_R8*sinl))) + + ! Using the obliquity, eccentricity, moving vernal equinox longitude of + ! perihelion (plus), and earths true longitude, the declination (delta) + ! and the normalized earth/sun distance (rho in Berger 1978; actually inverse + ! rho will be used), and thus the eccentricity factor (eccf), can be + ! calculated from formulas given in Berger 1978. + + invrho = (1._SHR_KIND_R8 + eccen*cos(lamb - mvelpp))/ & + (1._SHR_KIND_R8 - eccen*eccen) + + ! Set solar declination and eccentricity factor + + delta = asin(sin(obliqr)*sin(lamb)) + eccf = invrho*invrho + + return + + end subroutine shr_orb_decl + + !:---------------------------------------------------------------------------- + + real(SHR_KIND_R8) pure function shr_orb_cosz(jday, lat, lon, declin) + + !------------------------------------------------------------------------- + ! + ! FUNCTION to return the cosine of the solar zenith angle. + ! Assumes 365.0 days/year. + ! + !--------------- Code History -------------------------------------------- + ! + ! Original Author: Brian Kauffman + ! Date: Jan/98 + ! History: adapted from statement FUNCTION in share/orb_cosz.h + ! + !------------------------------------------------------------------------- + + real(SHR_KIND_R8), intent(in) :: jday ! Julian cal day (1.xx to 365.xx) + real(SHR_KIND_R8), intent(in) :: lat ! Centered latitude (radians) + real(SHR_KIND_R8), intent(in) :: lon ! Centered longitude (radians) + real(SHR_KIND_R8), intent(in) :: declin ! Solar declination (radians) + + !------------------------------------------------------------------------- + + shr_orb_cosz = sin(lat)*sin(declin) - cos(lat)*cos(declin) * & + cos((jday-floor(jday))*2.0_SHR_KIND_R8*pi + lon) + + end function shr_orb_cosz + +end module OrbitalValsMod \ No newline at end of file diff --git a/unit_testing/test_norman.f90 b/unit_testing/test_norman.f90 new file mode 100644 index 0000000000..ab14f737bd --- /dev/null +++ b/unit_testing/test_norman.f90 @@ -0,0 +1,81 @@ +program test_norman + ! + ! DESCRIPTION: + ! Test the FATES radiation schemes + ! + + use IOMod + use OrbitalValsMod, only : SHR_KIND_R8, get_orbital_vals, shr_orb_cosz, & + shr_orb_decl + + implicit none + + ! Data dictionary: declare variable types, definitions, and units + real(r8) :: rhol(num_pft,num_swb) ! leaf reflectance (0-1) + real(r8) :: rhos(num_pft,num_swb) ! stem reflectance (0-1) + real(r8) :: taul(num_pft,num_swb) ! leaf transmittance (0-1) + real(r8) :: taus(num_pft,num_swb) ! stem transmittance (0-1) + real(r8) :: xl(num_pft) ! leaf/stem orientation index (-1-1) + real(r8) :: clumping_index(num_pft) ! clumping index (0-1) + real(r8) :: fcansno ! fraction of canopy covered by snow + real(r8) :: canopy_area_profile(num_can,num_pft,nlevleaf) ! fraction of crown area per canopy area in each layer + real(r8) :: elai_profile(num_can,num_pft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer + real(r8) :: esai_profile(num_can,num_pft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer + real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft + integer :: nrad(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft + real(r8) :: k_dir(num_pft,48) ! direct beam extinction coefficient + real(SHR_KIND_R8) :: eccen ! orbital eccentricity + real(SHR_KIND_R8) :: mvelp ! moving vernal equinox long + real(SHR_KIND_R8) :: obliqr ! Earths obliquity in rad + real(SHR_KIND_R8) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) + real(SHR_KIND_R8) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) + real(SHR_KIND_R8) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) + real(SHR_KIND_R8) :: calday ! calendar day (including fraction) + real(SHR_KIND_R8) :: declin ! solar declination (radians) + real(SHR_KIND_R8) :: cosz(48) ! cosine of solar zenith angle (radians) + real(r8) :: lat, lon + integer :: jday ! julian day + integer :: year ! year + integer :: i ! looping index + character(len=100) :: file_in, patch_file, out_file + + ! file_names + file_in = "fates_params.nc" + patch_file = "patch_data.nc" + out_file = "nrad_out.nc" + logf = open_file("log.txt") + + ! set julian day, year, and lat/lon here + jday = 165 + year = 2000 + lat = 45.76_r8*pi_const/180.0_r8 + lon = 237.67_r8*pi_const/180.0_r8 + fcansno = 0.0_r8 + + ! get patch and parameter values, as well as orbital parameters + call get_parameters(file_in, rhol, rhos, taul, taus, xl, clumping_index) + call read_patch_data(patch_file, canopy_area_profile, elai_profile, & + esai_profile, nrad_r) + nrad = int(nrad_r) + call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) + + cosz(:) = 0.0 + k_dir(:,:) = 0.0 + + ! for each half-hourly time step in the day + do i = 0, 47 + calday = jday + i*0.02083333_SHR_KIND_R8 + call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) + cosz(i) = shr_orb_cosz(calday, lat, lon, declin) + + if (cosz(i) > 0.0_r8) then + ! call norman radiation scheme + call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & + canopy_area_profile, elai_profile, esai_profile, fcansno, & + cosz(i), nrad, 2, k_dir(:,i)) + end if + end do + + call write_radiation_data(out_file, k_dir, cosz) + +end program test_norman \ No newline at end of file From a1b971cc6c6cbb4401a24229e73a4b59ceb5e5e6 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 10:46:02 -0600 Subject: [PATCH 031/125] update io methods for unit testing --- unit_testing/FatesUnitTestIOMod.F90 | 391 ++++++++++++----------- unit_testing/FatesUnitTestOrbitalMod.F90 | 4 +- unit_testing/FatesUnitTestRadiation.F90 | 145 +++++++++ unit_testing/test_norman.f90 | 81 ----- 4 files changed, 347 insertions(+), 274 deletions(-) create mode 100644 unit_testing/FatesUnitTestRadiation.F90 delete mode 100644 unit_testing/test_norman.f90 diff --git a/unit_testing/FatesUnitTestIOMod.F90 b/unit_testing/FatesUnitTestIOMod.F90 index 200517388e..899942a282 100644 --- a/unit_testing/FatesUnitTestIOMod.F90 +++ b/unit_testing/FatesUnitTestIOMod.F90 @@ -4,189 +4,198 @@ module FatesUnitTestIOMod implicit none -! LOCALS -integer, parameter :: BASE_UNIT = 10 ! Base unit for files the first time unit_number is called -integer, parameter :: MAX_PATH = 256 ! Maximum path length -integer, parameter :: MAX_CHAR = 80 ! Maximum length for messages -integer :: logf ! Unit number for output log file - -contains - - integer function unit_number() -! -! DESCRIPTION: -! Generates a unit number to be used in opening files -! The first time the function is called, it returns BASE_UNIT -! -! LOCALS: -integer :: iunit ! File unit (increments after first call) -logical :: first = .true. ! First time this has been called? -save - -if (first) then - ! Set first to false and iunit to base unit on first call - iunit = BASE_UNIT - first = .false. -else - ! Otherwise, increment - iunit = iunit + 1 -endif - -! Set to output -unit_number = iunit - - end function unit_number + ! LOCALS + integer, parameter :: BASE_UNIT = 10 ! Base unit for files the first time unit_number is called + integer, parameter :: MAX_PATH = 256 ! Maximum path length + integer, parameter :: MAX_CHAR = 80 ! Maximum length for messages + integer :: logf ! Unit number for output log file + + contains - !:...........................................................................: + integer function unit_number() + ! + ! DESCRIPTION: + ! Generates a unit number to be used in opening files + ! The first time the function is called, it returns BASE_UNIT + ! + ! LOCALS: + integer :: iunit ! File unit (increments after first call) + logical :: first = .true. ! First time this has been called? + save - integer function open_file(filename, mode) - ! - ! DESCRIPTION: - ! Opens the file filename if it can, returns a unit number for it. - ! The first time the function is called, it returns BASE_UNIT - - ! ARGUMENTS: - character(len = *), intent(in) :: filename ! Name of file to open - character(len = *), intent(in), optional :: mode ! Optional mode ('r', 'w', 'rw') - - ! LOCALS: - character(len = 9) :: fmode ! File open mode - logical :: file_exists ! Does the file exist? - character(len = MAX_PATH) :: fname ! Local filename (trimmed) - character(len = MAX_CHAR) :: message ! Error message - integer :: i ! Looping index - integer :: ios ! I/O status - integer :: iunit = BASE_UNIT ! File unit number - integer, dimension(MAX_PATH) :: farray ! Array of characters of file name - - ! Get mode of open (read, write, or read/write) - ! Defaults to read/write - if (present(mode)) then - select case(mode) - case ('r', 'R') - fmode = 'read' - case ('w', 'W') - fmode = 'write' - case ('rw', 'RW', 'wr', 'WR') - fmode = 'readwrite' - case DEFAULT - fmode = 'readwrite' - end select - else - fmode = 'readwrite' - endif - - ! trim filename of whitespace - fname = trim(adjustl(filename)) - - if (fmode == 'read' .or. fmode == 'readwrite') then - ! Check for valid name of file - farray = 0 - do i = 1, len_trim(fname) - farray(i) = ichar(fname(i:i)) - enddo - if (any(farray > 126)) then - write(*,*) "Invalid filename" - stop "Stopped" - endif - endif - - ! Does the file exist? - inquire(file = fname, exist = file_exists) - - ! Open file if conditions are correct - if (file_exists .and. fmode == 'write') then - write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & - " exists. Cannot open write only." - write(*,*) message - stop "Stopped" - else if (.not. file_exists .and. fmode == 'read') then - write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & - " does not exist. Can't read." - write(*,*) message - stop "Stopped" - else - iunit = unit_number() - open(iunit, file = fname, action = fmode, iostat = ios) - if (ios /= 0) then - write(message, '(A,A,A,I6)') "Problem opening", & - fname(1:len_trim(fname)), " ios: ", ios - write(*,*) message - stop "Stopped" - endif - endif + if (first) then + ! Set first to false and iunit to base unit on first call + iunit = BASE_UNIT + first = .false. + else + ! Otherwise, increment + iunit = iunit + 1 + endif - open_file = iunit + ! Set to output + unit_number = iunit - end function open_file + end function unit_number - !:...........................................................................: + !:.........................................................................: - subroutine write_radiation_data(file, kdir, declin) - character(len=100), intent(in) :: file ! output file name - real(r8), intent(in) :: kdir(num_pft, 48) ! direct beam extinction coefficient - real(r8), intent(in) :: declin(48) + integer function open_file(filename, mode) + ! + ! DESCRIPTION: + ! Opens the file filename if it can, returns a unit number for it. + ! The first time the function is called, it returns BASE_UNIT + ! - integer :: ncid - integer :: pft_dimid, time_dimid - integer :: kdir_id, declin_id - integer :: dimids(2) + ! ARGUMENTS: + character(len = *), intent(in) :: filename ! Name of file to open + character(len = *), intent(in), optional :: mode ! Optional mode ('r', 'w', 'rw') + + ! LOCALS: + character(len = 9) :: fmode ! File open mode + logical :: file_exists ! Does the file exist? + character(len = MAX_PATH) :: fname ! Local filename (trimmed) + character(len = MAX_CHAR) :: message ! Error message + integer :: i ! Looping index + integer :: ios ! I/O status + integer :: iunit = BASE_UNIT ! File unit number + integer, dimension(MAX_PATH) :: farray ! Array of characters of file name + + ! Get mode of open (read, write, or read/write) + ! Defaults to read/write + if (present(mode)) then + select case(mode) + case ('r', 'R') + fmode = 'read' + case ('w', 'W') + fmode = 'write' + case ('rw', 'RW', 'wr', 'WR') + fmode = 'readwrite' + case DEFAULT + fmode = 'readwrite' + end select + else + fmode = 'readwrite' + endif + + ! trim filename of whitespace + fname = trim(adjustl(filename)) + + if (fmode == 'read' .or. fmode == 'readwrite') then + ! Check for valid name of file + farray = 0 + do i = 1, len_trim(fname) + farray(i) = ichar(fname(i:i)) + enddo + if (any(farray > 126)) then + write(*,*) "Invalid filename" + stop "Stopped" + endif + endif + + ! Does the file exist? + inquire(file = fname, exist = file_exists) + + ! Open file if conditions are correct + if (file_exists .and. fmode == 'write') then + write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & + " exists. Cannot open write only." + write(*,*) message + stop "Stopped" + else if (.not. file_exists .and. fmode == 'read') then + write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & + " does not exist. Can't read." + write(*,*) message + stop "Stopped" + else + iunit = unit_number() + open(iunit, file=fname, action=fmode, iostat=ios) + if (ios /= 0) then + write(message, '(A,A,A,I6)') "Problem opening", & + fname(1:len_trim(fname)), " ios: ", ios + write(*,*) message + stop "Stopped" + endif + endif + + open_file = iunit + + end function open_file + + !:.........................................................................: + + subroutine write_radiation_data(file, kdir, declin) + ! + ! DESCRIPTION: + ! Opens the file filename if it can, returns a unit number for it. + ! The first time the function is called, it returns BASE_UNIT + ! + + ! ARGUMENTS: + character(len=MAX_PATH), intent(in) :: file ! output file name + real(r8), intent(in) :: kdir(num_pft,48) ! direct beam extinction coefficient + real(r8), intent(in) :: declin(48) - ! Create the netCDF file. The nf90_clobber parameter tells netCDF to - ! overwrite this file, if it already exists. - call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) + ! LOCALS: + integer :: ncid + integer :: pft_dimid, time_dimid + integer :: kdir_id, declin_id + integer :: dimids(2) - ! define dimensions - call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) - call check(nf90_def_dim(ncid, "time", 48, time_dimid)) + ! Create the netCDF file. The nf90_clobber parameter tells netCDF to + ! overwrite this file, if it already exists. + call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) - ! define the variables - dimids = (/ pft_dimid, time_dimid/) - call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) - call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) + ! define dimensions + call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) + call check(nf90_def_dim(ncid, "time", 48, time_dimid)) - ! end define mode - call check(nf90_enddef(ncid)) + ! define the variables + dimids = (/ pft_dimid, time_dimid/) + call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) + call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) - ! write to file. - call check(nf90_put_var(ncid, kdir_id, kdir)) - call check(nf90_put_var(ncid, declin_id, declin)) + ! end define mode + call check(nf90_enddef(ncid)) - ! close the file. - call check(nf90_close(ncid)) + ! write to file. + call check(nf90_put_var(ncid, kdir_id, kdir)) + call check(nf90_put_var(ncid, declin_id, declin)) - end subroutine write_radiation_data + ! close the file. + call check(nf90_close(ncid)) - !:...........................................................................: + end subroutine write_radiation_data - subroutine check(status) - ! - ! DESCRIPTION: - ! Checks status of netcdf operations - - ! ARGUMENTS: - integer, intent (in) :: status ! return status code from a netcdf procedure + !:.........................................................................: + + subroutine check(status) + ! + ! DESCRIPTION: + ! Checks status of netcdf operations - if (status /= nf90_noerr) then - print *, trim(nf90_strerror(status)) - stop "Stopped" - end if + ! ARGUMENTS: + integer, intent (in) :: status ! return status code from a netcdf procedure + + if (status /= nf90_noerr) then + print *, trim(nf90_strerror(status)) + stop "Stopped" + end if - end subroutine check + end subroutine check - !:...........................................................................: + !:.........................................................................: subroutine read_patch_data(file, canopy_area, elai, esai, nrad) - ! - ! DESCRIPTION: - ! Reads and return patch data - - ! ARGUMENTS: - character(len=100), intent(in) :: file ! patch file name - real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile - real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile - real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile - real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers + ! + ! DESCRIPTION: + ! Reads and return patch data + + ! ARGUMENTS: + character(len=MAX_PATH), intent(in) :: file ! patch file name + real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile + real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile + real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile + real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers ! Data dictionary: declare variable types, definitions, and units real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers @@ -208,35 +217,35 @@ subroutine read_patch_data(file, canopy_area, elai, esai, nrad) call check(nf90_inq_varid(fidA, "nrad", varID)) call check(nf90_get_var(fidA, varID, nrad)) - end subroutine read_patch_data - - !:...........................................................................: - - subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) - ! - ! Purpose: - ! Returns parameter values - ! - ! Record of revisions: - ! Date Programmer Description of change - ! ======== ============= ===================== - ! 03/20/23 A. C. Foster Original code - ! - - ! Data dictionary: declare calling parameter types & definitions - character(len=100), intent(in) :: file ! parameter file name - real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance - real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance - real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance - real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance - real(r8), intent(out) :: xl(num_pft) ! leaf orientation index - real(r8), intent(out) :: ci(num_pft) ! clumping index - - ! read in all parameters - call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & - taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) - - end subroutine get_parameters + end subroutine read_patch_data + + !:.........................................................................: + + subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) + ! + ! Purpose: + ! Returns parameter values + ! + ! Record of revisions: + ! Date Programmer Description of change + ! ======== ============= ===================== + ! 03/20/23 A. C. Foster Original code + ! + + ! Data dictionary: declare calling parameter types & definitions + character(len=100), intent(in) :: file ! parameter file name + real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance + real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance + real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance + real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance + real(r8), intent(out) :: xl(num_pft) ! leaf orientation index + real(r8), intent(out) :: ci(num_pft) ! clumping index + + ! read in all parameters + call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & + taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) + + end subroutine get_parameters !:...........................................................................: diff --git a/unit_testing/FatesUnitTestOrbitalMod.F90 b/unit_testing/FatesUnitTestOrbitalMod.F90 index 545baf398c..b1e55591af 100644 --- a/unit_testing/FatesUnitTestOrbitalMod.F90 +++ b/unit_testing/FatesUnitTestOrbitalMod.F90 @@ -1,4 +1,4 @@ -module OrbitalValsMod +module FatesUnitTestOrbitalMod ! ! DESCRIPTION: ! Helper procedures for getting orbital values @@ -578,4 +578,4 @@ real(SHR_KIND_R8) pure function shr_orb_cosz(jday, lat, lon, declin) end function shr_orb_cosz -end module OrbitalValsMod \ No newline at end of file +end module FatesUnitTestOrbitalMod \ No newline at end of file diff --git a/unit_testing/FatesUnitTestRadiation.F90 b/unit_testing/FatesUnitTestRadiation.F90 new file mode 100644 index 0000000000..c260081198 --- /dev/null +++ b/unit_testing/FatesUnitTestRadiation.F90 @@ -0,0 +1,145 @@ +program FatesUnitTestRadiation + ! + ! DESCRIPTION: + ! Test the FATES radiation schemes + ! + + use FatesUnitTestIOMod, only : logf, MAX_PATH + use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 + use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz + use FatesUnitTestOrbitalMod, only : shr_orb_decl + use EDParamsMod, only : nlevleaf, nclmax + + implicit none + + ! LOCALS: + character(len=MAX_PATH) :: param_file, patch_file, out_file ! file names + integer :: numpft, numSWb + ! real(r8) :: rhol(num_pft,num_swb) ! leaf reflectance (0-1) + ! real(r8) :: rhos(num_pft,num_swb) ! stem reflectance (0-1) + ! real(r8) :: taul(num_pft,num_swb) ! leaf transmittance (0-1) + ! real(r8) :: taus(num_pft,num_swb) ! stem transmittance (0-1) + ! real(r8) :: xl(num_pft) ! leaf/stem orientation index (-1-1) + ! real(r8) :: clumping_index(num_pft) ! clumping index (0-1) + ! real(r8) :: fcansno ! fraction of canopy covered by snow + ! real(r8) :: canopy_area_profile(num_can,num_pft,nlevleaf) ! fraction of crown area per canopy area in each layer + ! real(r8) :: elai_profile(num_can,num_pft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer + ! real(r8) :: esai_profile(num_can,num_pft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer + ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft + ! integer :: nrad(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft + ! real(r8) :: k_dir(num_pft,48) ! direct beam extinction coefficient + ! real(SHR_KIND_R8) :: eccen ! orbital eccentricity + ! real(SHR_KIND_R8) :: mvelp ! moving vernal equinox long + ! real(SHR_KIND_R8) :: obliqr ! Earths obliquity in rad + ! real(SHR_KIND_R8) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) + ! real(SHR_KIND_R8) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) + ! real(SHR_KIND_R8) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) + ! real(SHR_KIND_R8) :: calday ! calendar day (including fraction) + ! real(SHR_KIND_R8) :: declin ! solar declination (radians) + ! real(SHR_KIND_R8) :: cosz(48) ! cosine of solar zenith angle (radians) + ! real(r8) :: lat, lon + ! integer :: jday ! julian day + ! integer :: year ! year + ! integer :: i ! looping index + + interface + + subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & + out_file) + + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file + + implicit none + + character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names + integer, intent(out) :: numpft, numSWb + + + end subroutine read_radiation_namelist + + end interface + + ! file_names + ! logf = open_file("log.txt") + + ! ! set julian day, year, and lat/lon here + ! jday = 165 + ! year = 2000 + ! lat = 45.76_r8*pi_const/180.0_r8 + ! lon = 237.67_r8*pi_const/180.0_r8 + ! fcansno = 0.0_r8 + + ! ! get patch and parameter values, as well as orbital parameters + ! call get_parameters(file_in, rhol, rhos, taul, taus, xl, clumping_index) + ! call read_patch_data(patch_file, canopy_area_profile, elai_profile, & + ! esai_profile, nrad_r) + ! nrad = int(nrad_r) + ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) + + ! cosz(:) = 0.0 + ! k_dir(:,:) = 0.0 + + ! ! for each half-hourly time step in the day + ! do i = 0, 47 + ! calday = jday + i*0.02083333_SHR_KIND_R8 + ! call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) + ! cosz(i) = shr_orb_cosz(calday, lat, lon, declin) + + ! if (cosz(i) > 0.0_r8) then + ! ! call norman radiation scheme + ! call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & + ! canopy_area_profile, elai_profile, esai_profile, fcansno, & + ! cosz(i), nrad, 2, k_dir(:,i)) + ! end if + ! end do + + ! call write_radiation_data(out_file, k_dir, cosz) + +end program FatesUnitTestRadiation + +!:.............................................................................: + +subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & + out_file) + + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file + + implicit none + + ! + ! DESCRIPTION: + ! read in the namelist associated with the radiation unit tests and + ! initialize values + ! + + ! ARGUMENTS: + character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names + integer, intent(out) :: numpft, numSWb + + ! LOCALS: + character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name + character(len=MAX_CHAR) :: message ! Error message + character(len=MAX_CHAR) :: msg ! I/O Error message + integer :: rad_nl_file ! unit number for namelist + integer :: ios ! I/O status + + + ! Namelist of radiation parameters + namelist /radiation/ numpft, numSWb, param_file, patch_file, out_file + + + ! Now read parameters namelist + rad_nl_file = open_file(trim(rad_nl), 'r') + read(rad_nl_file, radiation, iostat=ios, iomsg=msg) + + if (ios /= 0) then + ! Problem reading file - tell user. + write(message, '(A, I6, A, A)') "Error reading radiation namelist file", & + ios, "IOMSG: ", msg + write(*,*) message + stop "Stopped" + end if + + close(rad_nl_file) + +end subroutine read_radiation_namelist \ No newline at end of file diff --git a/unit_testing/test_norman.f90 b/unit_testing/test_norman.f90 deleted file mode 100644 index ab14f737bd..0000000000 --- a/unit_testing/test_norman.f90 +++ /dev/null @@ -1,81 +0,0 @@ -program test_norman - ! - ! DESCRIPTION: - ! Test the FATES radiation schemes - ! - - use IOMod - use OrbitalValsMod, only : SHR_KIND_R8, get_orbital_vals, shr_orb_cosz, & - shr_orb_decl - - implicit none - - ! Data dictionary: declare variable types, definitions, and units - real(r8) :: rhol(num_pft,num_swb) ! leaf reflectance (0-1) - real(r8) :: rhos(num_pft,num_swb) ! stem reflectance (0-1) - real(r8) :: taul(num_pft,num_swb) ! leaf transmittance (0-1) - real(r8) :: taus(num_pft,num_swb) ! stem transmittance (0-1) - real(r8) :: xl(num_pft) ! leaf/stem orientation index (-1-1) - real(r8) :: clumping_index(num_pft) ! clumping index (0-1) - real(r8) :: fcansno ! fraction of canopy covered by snow - real(r8) :: canopy_area_profile(num_can,num_pft,nlevleaf) ! fraction of crown area per canopy area in each layer - real(r8) :: elai_profile(num_can,num_pft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer - real(r8) :: esai_profile(num_can,num_pft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer - real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft - integer :: nrad(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft - real(r8) :: k_dir(num_pft,48) ! direct beam extinction coefficient - real(SHR_KIND_R8) :: eccen ! orbital eccentricity - real(SHR_KIND_R8) :: mvelp ! moving vernal equinox long - real(SHR_KIND_R8) :: obliqr ! Earths obliquity in rad - real(SHR_KIND_R8) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) - real(SHR_KIND_R8) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) - real(SHR_KIND_R8) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) - real(SHR_KIND_R8) :: calday ! calendar day (including fraction) - real(SHR_KIND_R8) :: declin ! solar declination (radians) - real(SHR_KIND_R8) :: cosz(48) ! cosine of solar zenith angle (radians) - real(r8) :: lat, lon - integer :: jday ! julian day - integer :: year ! year - integer :: i ! looping index - character(len=100) :: file_in, patch_file, out_file - - ! file_names - file_in = "fates_params.nc" - patch_file = "patch_data.nc" - out_file = "nrad_out.nc" - logf = open_file("log.txt") - - ! set julian day, year, and lat/lon here - jday = 165 - year = 2000 - lat = 45.76_r8*pi_const/180.0_r8 - lon = 237.67_r8*pi_const/180.0_r8 - fcansno = 0.0_r8 - - ! get patch and parameter values, as well as orbital parameters - call get_parameters(file_in, rhol, rhos, taul, taus, xl, clumping_index) - call read_patch_data(patch_file, canopy_area_profile, elai_profile, & - esai_profile, nrad_r) - nrad = int(nrad_r) - call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) - - cosz(:) = 0.0 - k_dir(:,:) = 0.0 - - ! for each half-hourly time step in the day - do i = 0, 47 - calday = jday + i*0.02083333_SHR_KIND_R8 - call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) - cosz(i) = shr_orb_cosz(calday, lat, lon, declin) - - if (cosz(i) > 0.0_r8) then - ! call norman radiation scheme - call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & - canopy_area_profile, elai_profile, esai_profile, fcansno, & - cosz(i), nrad, 2, k_dir(:,i)) - end if - end do - - call write_radiation_data(out_file, k_dir, cosz) - -end program test_norman \ No newline at end of file From 2d58d2433e3a9c0a203ca2e26a5289660cf50ed8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 11:33:51 -0600 Subject: [PATCH 032/125] adding makefile --- unit_testing/FatesUnitTestRadiation.F90 | 2 + unit_testing/Makefile | 64 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 unit_testing/Makefile diff --git a/unit_testing/FatesUnitTestRadiation.F90 b/unit_testing/FatesUnitTestRadiation.F90 index c260081198..56ce2d75ee 100644 --- a/unit_testing/FatesUnitTestRadiation.F90 +++ b/unit_testing/FatesUnitTestRadiation.F90 @@ -58,6 +58,8 @@ subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & end subroutine read_radiation_namelist end interface + + print *, 'Hello, unit test' ! file_names ! logf = open_file("log.txt") diff --git a/unit_testing/Makefile b/unit_testing/Makefile new file mode 100644 index 0000000000..5b9473ee1c --- /dev/null +++ b/unit_testing/Makefile @@ -0,0 +1,64 @@ +PROG = test_norman + +SRCS = FatesConstantsMod.F90 FatesGlobals.F90 log_mod.f90 \ + FatesHydraulicsMemMod.F90 FatesHydroWTFMod.F90 FatesLitterMod.F90 \ + CohortModule.f90 FatesRunningMeanMod.F90 PatchModule.f90 \ + PRTGenericMod.F90 PRTParametersMod.F90 norman_constants.f90 \ + IOMod.f90 norman_radiation.f90 test_norman.f90 OrbitalValsMod.f90 + + +OBJS = FatesConstantsMod.o FatesGlobals.o log_mod.o \ + FatesHydraulicsMemMod.o FatesHydroWTFMod.o FatesLitterMod.o \ + CohortModule.o FatesRunningMeanMod.o PatchModule.o \ + PRTGenericMod.o PRTParametersMod.o norman_constants.o \ + IOMod.o norman_radiation.o test_norman.o OrbitalValsMod.o + +## need both +LIBS = -L/usr/local/Cellar/netcdf/4.9.2/lib -lnetcdf -L/usr/local/Cellar/netcdf-fortran/4.6.0/lib -lnetcdff -lnetcdf + +INCLUDES = -I/usr/local/Cellar/netcdf-fortran/4.6.0/include + +F90 = gfortran + +##DBG = -g -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,denormal + +##OPT = -O2 -axcore-avx2 -xavx -align array64byte -ipo + +F90FLAGS = $(DBG) $(OPT) + +all: $(PROG) + +## link objects into a library (don't need includes?) +$(PROG): $(OBJS) + $(F90) -o $@ $(OBJS) $(LIBS) + +.PHONY: clean +clean: + rm -f $(PROG) $(OBJS) *.mod + +.SUFFIXES: $(SUFFIXES) .f90 .F90 .f95 .f + +# percent can stand for anything XX.o depends on XX.mod +%.o: %.mod + +# for each .o file, make it from a +.f90.o .f95.o .F90.o: + $(F90) $(F90FLAGS) $(INCLUDES) -c $< + +# dependencies (:) - if norman_constants.o gets updated, remake parameter_mod, etc. +FatesGlobals.o: FatesConstantsMod.o +FatesHydraulicsMemMod.o: FatesConstantsMod.o FatesHydroWTFMod.o norman_constants.o +FatesHydroWTFMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o +FatesLitterMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o +CohortModule.o: FatesConstantsMod.o PRTGenericMod.o FatesHydraulicsMemMod.o +FatesRunningMeanMod.o: FatesConstantsMod.o log_mod.o FatesGlobals.o norman_constants.o +PatchModule.o: CohortModule.o FatesLitterMod.o FatesRunningMeanMod.o FatesConstantsMod.o PRTGenericMod.o norman_constants.o +PRTGenericMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o PRTParametersMod.o +PRTParametersMod.o: FatesConstantsMod.o +IOMod.o: norman_constants.o +OrbitalValsMod.o: IOMod.o +norman_radiation.o: norman_constants.o +norman_constants.o: FatesConstantsMod.o +test_norman.o: norman_radiation.o norman_constants.o IOmod.o PatchModule.o OrbitalValsMod.o + + From 87ebac6d6d0d3f248b30e0d12259cf4860054c21 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 12:06:25 -0600 Subject: [PATCH 033/125] move structure around to facilitate cmake --- unit_testing/Makefile | 64 ------------------- unit_testing/cmake_tests.py | 55 ++++++++++++++++ .../FatesUnitTestRadiation.F90 | 0 .../{ => utils}/FatesUnitTestIOMod.F90 | 0 .../{ => utils}/FatesUnitTestOrbitalMod.F90 | 0 5 files changed, 55 insertions(+), 64 deletions(-) delete mode 100644 unit_testing/Makefile create mode 100755 unit_testing/cmake_tests.py rename unit_testing/{ => radiation}/FatesUnitTestRadiation.F90 (100%) rename unit_testing/{ => utils}/FatesUnitTestIOMod.F90 (100%) rename unit_testing/{ => utils}/FatesUnitTestOrbitalMod.F90 (100%) diff --git a/unit_testing/Makefile b/unit_testing/Makefile deleted file mode 100644 index 5b9473ee1c..0000000000 --- a/unit_testing/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -PROG = test_norman - -SRCS = FatesConstantsMod.F90 FatesGlobals.F90 log_mod.f90 \ - FatesHydraulicsMemMod.F90 FatesHydroWTFMod.F90 FatesLitterMod.F90 \ - CohortModule.f90 FatesRunningMeanMod.F90 PatchModule.f90 \ - PRTGenericMod.F90 PRTParametersMod.F90 norman_constants.f90 \ - IOMod.f90 norman_radiation.f90 test_norman.f90 OrbitalValsMod.f90 - - -OBJS = FatesConstantsMod.o FatesGlobals.o log_mod.o \ - FatesHydraulicsMemMod.o FatesHydroWTFMod.o FatesLitterMod.o \ - CohortModule.o FatesRunningMeanMod.o PatchModule.o \ - PRTGenericMod.o PRTParametersMod.o norman_constants.o \ - IOMod.o norman_radiation.o test_norman.o OrbitalValsMod.o - -## need both -LIBS = -L/usr/local/Cellar/netcdf/4.9.2/lib -lnetcdf -L/usr/local/Cellar/netcdf-fortran/4.6.0/lib -lnetcdff -lnetcdf - -INCLUDES = -I/usr/local/Cellar/netcdf-fortran/4.6.0/include - -F90 = gfortran - -##DBG = -g -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow,denormal - -##OPT = -O2 -axcore-avx2 -xavx -align array64byte -ipo - -F90FLAGS = $(DBG) $(OPT) - -all: $(PROG) - -## link objects into a library (don't need includes?) -$(PROG): $(OBJS) - $(F90) -o $@ $(OBJS) $(LIBS) - -.PHONY: clean -clean: - rm -f $(PROG) $(OBJS) *.mod - -.SUFFIXES: $(SUFFIXES) .f90 .F90 .f95 .f - -# percent can stand for anything XX.o depends on XX.mod -%.o: %.mod - -# for each .o file, make it from a -.f90.o .f95.o .F90.o: - $(F90) $(F90FLAGS) $(INCLUDES) -c $< - -# dependencies (:) - if norman_constants.o gets updated, remake parameter_mod, etc. -FatesGlobals.o: FatesConstantsMod.o -FatesHydraulicsMemMod.o: FatesConstantsMod.o FatesHydroWTFMod.o norman_constants.o -FatesHydroWTFMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o -FatesLitterMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o -CohortModule.o: FatesConstantsMod.o PRTGenericMod.o FatesHydraulicsMemMod.o -FatesRunningMeanMod.o: FatesConstantsMod.o log_mod.o FatesGlobals.o norman_constants.o -PatchModule.o: CohortModule.o FatesLitterMod.o FatesRunningMeanMod.o FatesConstantsMod.o PRTGenericMod.o norman_constants.o -PRTGenericMod.o: FatesConstantsMod.o FatesGlobals.o log_mod.o PRTParametersMod.o -PRTParametersMod.o: FatesConstantsMod.o -IOMod.o: norman_constants.o -OrbitalValsMod.o: IOMod.o -norman_radiation.o: norman_constants.o -norman_constants.o: FatesConstantsMod.o -test_norman.o: norman_radiation.o norman_constants.o IOmod.o PatchModule.o OrbitalValsMod.o - - diff --git a/unit_testing/cmake_tests.py b/unit_testing/cmake_tests.py new file mode 100755 index 0000000000..4d7775ccb5 --- /dev/null +++ b/unit_testing/cmake_tests.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +import os +import sys +from shutil import rmtree + +def main(): + cmake_stage("radiation test", + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing", + "test_pfunit_path") + +def cmake_stage( + name, + test_spec_dir, + pfunit_path, + cmake_args=None, + clean=False, +): + """Run cmake in the current working directory. + + Arguments: + name - Name for output messages. + test_spec_dir - Test specification directory to run CMake on. + """ + if clean: + if os.path.isfile("CMakeCache.txt"): + os.remove("CMakeCache.txt") + if os.path.isdir("CMakeFiles"): + rmtree("CMakeFiles") + + if not os.path.isfile("CMakeCache.txt"): + + print("Running cmake for " + name + ".") + + cmake_command = [ + "cmake", + "-C Macros.cmake", + test_spec_dir, + # "-DCIMEROOT=" + _CIMEROOT, + # "-DSRC_ROOT=" + get_src_root(), + # "-DCIME_CMAKE_MODULE_DIRECTORY=" + # + os.path.abspath(os.path.join(_CIMEROOT, "CIME", "non_py", "src", "CMake")), + # "-DCMAKE_BUILD_TYPE=" + build_type, + # "-DPFUNIT_MPIRUN='" + mpirun_command + "'", + # "-DPFUNIT_PATH=" + pfunit_path, + ] + + if cmake_args is not None: + cmake_command.extend(cmake_args.split(" ")) + + #run_cmd_no_fail(" ".join(cmake_command), combine_output=True) + print(" ".join(cmake_command)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/unit_testing/FatesUnitTestRadiation.F90 b/unit_testing/radiation/FatesUnitTestRadiation.F90 similarity index 100% rename from unit_testing/FatesUnitTestRadiation.F90 rename to unit_testing/radiation/FatesUnitTestRadiation.F90 diff --git a/unit_testing/FatesUnitTestIOMod.F90 b/unit_testing/utils/FatesUnitTestIOMod.F90 similarity index 100% rename from unit_testing/FatesUnitTestIOMod.F90 rename to unit_testing/utils/FatesUnitTestIOMod.F90 diff --git a/unit_testing/FatesUnitTestOrbitalMod.F90 b/unit_testing/utils/FatesUnitTestOrbitalMod.F90 similarity index 100% rename from unit_testing/FatesUnitTestOrbitalMod.F90 rename to unit_testing/utils/FatesUnitTestOrbitalMod.F90 From 89e5ae87f0cea097704c554911495c6353dbfee3 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 14:09:30 -0600 Subject: [PATCH 034/125] updates for making --- unit_testing/radiation/FatesUnitTestRadiation.F90 | 15 +++++++-------- unit_testing/utils/FatesUnitTestOrbitalMod.F90 | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/unit_testing/radiation/FatesUnitTestRadiation.F90 b/unit_testing/radiation/FatesUnitTestRadiation.F90 index 56ce2d75ee..21ca8c57df 100644 --- a/unit_testing/radiation/FatesUnitTestRadiation.F90 +++ b/unit_testing/radiation/FatesUnitTestRadiation.F90 @@ -8,12 +8,12 @@ program FatesUnitTestRadiation use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz use FatesUnitTestOrbitalMod, only : shr_orb_decl - use EDParamsMod, only : nlevleaf, nclmax + !use EDParamsMod, only : nlevleaf, nclmax implicit none ! LOCALS: - character(len=MAX_PATH) :: param_file, patch_file, out_file ! file names + character(len=256) :: param_file, patch_file, out_file ! file names integer :: numpft, numSWb ! real(r8) :: rhol(num_pft,num_swb) ! leaf reflectance (0-1) ! real(r8) :: rhos(num_pft,num_swb) ! stem reflectance (0-1) @@ -49,11 +49,10 @@ subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file - implicit none - - character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names - integer, intent(out) :: numpft, numSWb + implicit none + character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names + integer, intent(out) :: numpft, numSWb end subroutine read_radiation_namelist @@ -120,8 +119,8 @@ subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & ! LOCALS: character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name - character(len=MAX_CHAR) :: message ! Error message - character(len=MAX_CHAR) :: msg ! I/O Error message + character(len=MAX_PATH) :: message ! Error message + character(len=MAX_PATH) :: msg ! I/O Error message integer :: rad_nl_file ! unit number for namelist integer :: ios ! I/O status diff --git a/unit_testing/utils/FatesUnitTestOrbitalMod.F90 b/unit_testing/utils/FatesUnitTestOrbitalMod.F90 index b1e55591af..843bf1e217 100644 --- a/unit_testing/utils/FatesUnitTestOrbitalMod.F90 +++ b/unit_testing/utils/FatesUnitTestOrbitalMod.F90 @@ -6,7 +6,7 @@ module FatesUnitTestOrbitalMod ! ! - use IOMod + use FatesUnitTestIOMod implicit none @@ -69,7 +69,7 @@ subroutine shr_orb_params(iyear_AD, eccen, obliq, mvelp, & ! !--------------------------------------------------------------------------- - !----------------------------- Arguments ------------------------------------ + !----------------------------- Arguments ----------------------------------- integer(SHR_KIND_IN), intent(in) :: iyear_AD ! Year to calculate orbit for real(SHR_KIND_R8), intent(inout) :: eccen ! orbital eccentricity real(SHR_KIND_R8), intent(inout) :: obliq ! obliquity in degrees From 925b257c16139212b0828bccadb3b97237247b31 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 11 Apr 2023 14:32:19 -0600 Subject: [PATCH 035/125] add Cmakelists --- unit_testing/CMakeLists.txt | 12 ++++++++++++ unit_testing/radiation/CMakeLists.txt | 10 ++++++++++ unit_testing/utils/CMakeLists.txt | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 unit_testing/CMakeLists.txt create mode 100644 unit_testing/radiation/CMakeLists.txt create mode 100644 unit_testing/utils/CMakeLists.txt diff --git a/unit_testing/CMakeLists.txt b/unit_testing/CMakeLists.txt new file mode 100644 index 0000000000..506036d449 --- /dev/null +++ b/unit_testing/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) +include(CIME_initial_setup) + +project(radiation_tests Fortran C) + +include(CIME_utils) + +add_subdirectory(radiation) + +add_subdirectory(utils) diff --git a/unit_testing/radiation/CMakeLists.txt b/unit_testing/radiation/CMakeLists.txt new file mode 100644 index 0000000000..54408798ec --- /dev/null +++ b/unit_testing/radiation/CMakeLists.txt @@ -0,0 +1,10 @@ +# Local files +set(test_sources FatesUnitTestRadiation.F90) + +# Add sources we need from other directories +set(sources_needed + FatesUnitTestIOMod.F90 + FatesUnitTestOrbitalMod.F90) +extract_sources("${sources_needed}" "${utils_sources}" test_sources) + +add_executable(FATES_rad_test ${test_sources}) diff --git a/unit_testing/utils/CMakeLists.txt b/unit_testing/utils/CMakeLists.txt new file mode 100644 index 0000000000..b5432bf9cd --- /dev/null +++ b/unit_testing/utils/CMakeLists.txt @@ -0,0 +1,5 @@ +# Append sources from this directory to the list. +list(APPEND utils_sources FatesUnitTestIOMod.F90 FatesUnitTestOrbitalMod.F90) + +# Export source list to parent +sourcelist_to_parent(circle_area_sources) \ No newline at end of file From 9ce7eea28a05169862b52421c36654e2ad327242 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 12 Apr 2023 08:14:03 -0600 Subject: [PATCH 036/125] update for making --- unit_testing/CMakeLists.txt | 2 ++ unit_testing/cmake_tests.py | 55 ------------------------------- unit_testing/utils/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 56 deletions(-) delete mode 100755 unit_testing/cmake_tests.py diff --git a/unit_testing/CMakeLists.txt b/unit_testing/CMakeLists.txt index 506036d449..34f5abc758 100644 --- a/unit_testing/CMakeLists.txt +++ b/unit_testing/CMakeLists.txt @@ -10,3 +10,5 @@ include(CIME_utils) add_subdirectory(radiation) add_subdirectory(utils) + + diff --git a/unit_testing/cmake_tests.py b/unit_testing/cmake_tests.py deleted file mode 100755 index 4d7775ccb5..0000000000 --- a/unit_testing/cmake_tests.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -from shutil import rmtree - -def main(): - cmake_stage("radiation test", - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing", - "test_pfunit_path") - -def cmake_stage( - name, - test_spec_dir, - pfunit_path, - cmake_args=None, - clean=False, -): - """Run cmake in the current working directory. - - Arguments: - name - Name for output messages. - test_spec_dir - Test specification directory to run CMake on. - """ - if clean: - if os.path.isfile("CMakeCache.txt"): - os.remove("CMakeCache.txt") - if os.path.isdir("CMakeFiles"): - rmtree("CMakeFiles") - - if not os.path.isfile("CMakeCache.txt"): - - print("Running cmake for " + name + ".") - - cmake_command = [ - "cmake", - "-C Macros.cmake", - test_spec_dir, - # "-DCIMEROOT=" + _CIMEROOT, - # "-DSRC_ROOT=" + get_src_root(), - # "-DCIME_CMAKE_MODULE_DIRECTORY=" - # + os.path.abspath(os.path.join(_CIMEROOT, "CIME", "non_py", "src", "CMake")), - # "-DCMAKE_BUILD_TYPE=" + build_type, - # "-DPFUNIT_MPIRUN='" + mpirun_command + "'", - # "-DPFUNIT_PATH=" + pfunit_path, - ] - - if cmake_args is not None: - cmake_command.extend(cmake_args.split(" ")) - - #run_cmd_no_fail(" ".join(cmake_command), combine_output=True) - print(" ".join(cmake_command)) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/unit_testing/utils/CMakeLists.txt b/unit_testing/utils/CMakeLists.txt index b5432bf9cd..8c80618658 100644 --- a/unit_testing/utils/CMakeLists.txt +++ b/unit_testing/utils/CMakeLists.txt @@ -2,4 +2,4 @@ list(APPEND utils_sources FatesUnitTestIOMod.F90 FatesUnitTestOrbitalMod.F90) # Export source list to parent -sourcelist_to_parent(circle_area_sources) \ No newline at end of file +sourcelist_to_parent(utils_sources) \ No newline at end of file From b9ec30f99612be0982b641e60c87850f2dd17604 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 12 Apr 2023 08:34:08 -0600 Subject: [PATCH 037/125] more updates for cmake --- unit_testing/CMakeLists.txt | 9 +++++++-- unit_testing/radiation/CMakeLists.txt | 10 ---------- unit_testing/test/CMakeLists.txt | 1 + unit_testing/test/radiation_test/CMakeLists.txt | 12 ++++++++++++ .../radiation_test}/FatesUnitTestRadiation.F90 | 0 unit_testing/utils/CMakeLists.txt | 4 +++- 6 files changed, 23 insertions(+), 13 deletions(-) delete mode 100644 unit_testing/radiation/CMakeLists.txt create mode 100644 unit_testing/test/CMakeLists.txt create mode 100644 unit_testing/test/radiation_test/CMakeLists.txt rename unit_testing/{radiation => test/radiation_test}/FatesUnitTestRadiation.F90 (100%) diff --git a/unit_testing/CMakeLists.txt b/unit_testing/CMakeLists.txt index 34f5abc758..f00baf40c4 100644 --- a/unit_testing/CMakeLists.txt +++ b/unit_testing/CMakeLists.txt @@ -7,8 +7,13 @@ project(radiation_tests Fortran C) include(CIME_utils) -add_subdirectory(radiation) +set(CLM_ROOT "..") -add_subdirectory(utils) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) +add_library(utils ${utils_sources}) +add_dependencies(utils) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file diff --git a/unit_testing/radiation/CMakeLists.txt b/unit_testing/radiation/CMakeLists.txt deleted file mode 100644 index 54408798ec..0000000000 --- a/unit_testing/radiation/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Local files -set(test_sources FatesUnitTestRadiation.F90) - -# Add sources we need from other directories -set(sources_needed - FatesUnitTestIOMod.F90 - FatesUnitTestOrbitalMod.F90) -extract_sources("${sources_needed}" "${utils_sources}" test_sources) - -add_executable(FATES_rad_test ${test_sources}) diff --git a/unit_testing/test/CMakeLists.txt b/unit_testing/test/CMakeLists.txt new file mode 100644 index 0000000000..6b1f8471cf --- /dev/null +++ b/unit_testing/test/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(radiation_test) \ No newline at end of file diff --git a/unit_testing/test/radiation_test/CMakeLists.txt b/unit_testing/test/radiation_test/CMakeLists.txt new file mode 100644 index 0000000000..a25360fb1c --- /dev/null +++ b/unit_testing/test/radiation_test/CMakeLists.txt @@ -0,0 +1,12 @@ +# Local files +set(test_sources FatesUnitTestRadiation.F90) + +# Add sources we need from other directories +#set(sources_needed +# FatesUnitTestIOMod.F90 +# FatesUnitTestOrbitalMod.F90) +#extract_sources("${sources_needed}" "${utils_sources}" test_sources) + +#add_executable(FATES_rad_test ${test_sources}) + +target_link_libraries(test_radiation_exe utils) diff --git a/unit_testing/radiation/FatesUnitTestRadiation.F90 b/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 similarity index 100% rename from unit_testing/radiation/FatesUnitTestRadiation.F90 rename to unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 diff --git a/unit_testing/utils/CMakeLists.txt b/unit_testing/utils/CMakeLists.txt index 8c80618658..c78cf7f05d 100644 --- a/unit_testing/utils/CMakeLists.txt +++ b/unit_testing/utils/CMakeLists.txt @@ -1,5 +1,7 @@ # Append sources from this directory to the list. -list(APPEND utils_sources FatesUnitTestIOMod.F90 FatesUnitTestOrbitalMod.F90) +list(APPEND utils_sources + FatesUnitTestIOMod.F90 + FatesUnitTestOrbitalMod.F90) # Export source list to parent sourcelist_to_parent(utils_sources) \ No newline at end of file From 5a2fb0e706711a3e4cc8f00cc6b802178caf88bf Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 12 Apr 2023 10:46:44 -0600 Subject: [PATCH 038/125] move cmakelists --- CMakeLists.txt | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..78bb1bb231 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 2.8) + +#list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) +#include(CIME_initial_setup) + +project(radiation_tests Fortran C) + +#include(CIME_utils) + +set(CLM_ROOT "../../") + +find_package (NetCDF COMPONENTS F90) +include_directories(${NETCDF_F90_INCLUDE_DIRS}) + +message(" inc = ${NETCDF_F90_INCLUDE_DIRS} ") + +#add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) +#add_subdirectory(${CLM_ROOT}/src/fates/main) +#add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/test) + +#add_library(utils ${utils_sources}) + +#target_link_libraries(utils, ${NETCDF_F90_INCLUDE_DIRS}) +#include_directories(${CMAKE_CURRENT_BINARY_DIR}) +#link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file From 7ee366cce7a7543cee5fcf141831cfe7e9548b7c Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 12 Apr 2023 11:47:15 -0600 Subject: [PATCH 039/125] works except for netcdf --- CMakeLists.txt | 23 +- main/CMakeLists.txt | 5 +- unit_testing/CMakeLists.txt | 19 - .../test/radiation_test/CMakeLists.txt | 16 +- unit_testing/utils/FatesUnitTestIOMod.F90 | 330 +++++++++--------- 5 files changed, 187 insertions(+), 206 deletions(-) delete mode 100644 unit_testing/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 78bb1bb231..f7c8899d8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,25 +1,20 @@ cmake_minimum_required(VERSION 2.8) -#list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) -#include(CIME_initial_setup) +list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) +include(CIME_initial_setup) project(radiation_tests Fortran C) -#include(CIME_utils) +include(CIME_utils) set(CLM_ROOT "../../") -find_package (NetCDF COMPONENTS F90) -include_directories(${NETCDF_F90_INCLUDE_DIRS}) +add_subdirectory(${CLM_ROOT}/src/fates/main) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/test) -message(" inc = ${NETCDF_F90_INCLUDE_DIRS} ") -#add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) -#add_subdirectory(${CLM_ROOT}/src/fates/main) -#add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/test) +add_library(utils ${utils_sources}) -#add_library(utils ${utils_sources}) - -#target_link_libraries(utils, ${NETCDF_F90_INCLUDE_DIRS}) -#include_directories(${CMAKE_CURRENT_BINARY_DIR}) -#link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 4506d2c354..2d7863eb91 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -11,5 +11,8 @@ list(APPEND clm_sources FatesUtilsMod.F90 ) -sourcelist_to_parent(clm_sources) +list(APPEND utils_sources + FatesConstantsMod.F90) +sourcelist_to_parent(clm_sources) +sourcelist_to_parent(utils_sources) diff --git a/unit_testing/CMakeLists.txt b/unit_testing/CMakeLists.txt deleted file mode 100644 index f00baf40c4..0000000000 --- a/unit_testing/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) -include(CIME_initial_setup) - -project(radiation_tests Fortran C) - -include(CIME_utils) - -set(CLM_ROOT "..") - -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) - -add_library(utils ${utils_sources}) -add_dependencies(utils) - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file diff --git a/unit_testing/test/radiation_test/CMakeLists.txt b/unit_testing/test/radiation_test/CMakeLists.txt index a25360fb1c..9263c1ee0d 100644 --- a/unit_testing/test/radiation_test/CMakeLists.txt +++ b/unit_testing/test/radiation_test/CMakeLists.txt @@ -1,12 +1,14 @@ # Local files set(test_sources FatesUnitTestRadiation.F90) -# Add sources we need from other directories -#set(sources_needed -# FatesUnitTestIOMod.F90 -# FatesUnitTestOrbitalMod.F90) -#extract_sources("${sources_needed}" "${utils_sources}" test_sources) +#Add sources we need from other directories +set(sources_needed + FatesUnitTestIOMod.F90 + FatesUnitTestOrbitalMod.F90 + FatesConstantsMod.F90) + +extract_sources("${sources_needed}" "${utils_sources}" test_sources) + +add_executable(FATES_rad_test ${test_sources}) -#add_executable(FATES_rad_test ${test_sources}) -target_link_libraries(test_radiation_exe utils) diff --git a/unit_testing/utils/FatesUnitTestIOMod.F90 b/unit_testing/utils/FatesUnitTestIOMod.F90 index 899942a282..02ec08a2ab 100644 --- a/unit_testing/utils/FatesUnitTestIOMod.F90 +++ b/unit_testing/utils/FatesUnitTestIOMod.F90 @@ -1,6 +1,6 @@ module FatesUnitTestIOMod - use FatesConstantsMod, only : fates_r8 => r8 - use netcdf + use FatesConstantsMod, only : r8 => fates_r8 + !use netcdf implicit none @@ -123,199 +123,199 @@ end function open_file !:.........................................................................: - subroutine write_radiation_data(file, kdir, declin) - ! - ! DESCRIPTION: - ! Opens the file filename if it can, returns a unit number for it. - ! The first time the function is called, it returns BASE_UNIT - ! + ! subroutine write_radiation_data(file, kdir, declin) + ! ! + ! ! DESCRIPTION: + ! ! Opens the file filename if it can, returns a unit number for it. + ! ! The first time the function is called, it returns BASE_UNIT + ! ! - ! ARGUMENTS: - character(len=MAX_PATH), intent(in) :: file ! output file name - real(r8), intent(in) :: kdir(num_pft,48) ! direct beam extinction coefficient - real(r8), intent(in) :: declin(48) + ! ! ARGUMENTS: + ! character(len=MAX_PATH), intent(in) :: file ! output file name + ! real(r8), intent(in) :: kdir(num_pft,48) ! direct beam extinction coefficient + ! real(r8), intent(in) :: declin(48) - ! LOCALS: - integer :: ncid - integer :: pft_dimid, time_dimid - integer :: kdir_id, declin_id - integer :: dimids(2) + ! ! LOCALS: + ! integer :: ncid + ! integer :: pft_dimid, time_dimid + ! integer :: kdir_id, declin_id + ! integer :: dimids(2) - ! Create the netCDF file. The nf90_clobber parameter tells netCDF to - ! overwrite this file, if it already exists. - call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) + ! ! Create the netCDF file. The nf90_clobber parameter tells netCDF to + ! ! overwrite this file, if it already exists. + ! call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) - ! define dimensions - call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) - call check(nf90_def_dim(ncid, "time", 48, time_dimid)) + ! ! define dimensions + ! call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) + ! call check(nf90_def_dim(ncid, "time", 48, time_dimid)) - ! define the variables - dimids = (/ pft_dimid, time_dimid/) - call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) - call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) + ! ! define the variables + ! dimids = (/ pft_dimid, time_dimid/) + ! call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) + ! call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) - ! end define mode - call check(nf90_enddef(ncid)) + ! ! end define mode + ! call check(nf90_enddef(ncid)) - ! write to file. - call check(nf90_put_var(ncid, kdir_id, kdir)) - call check(nf90_put_var(ncid, declin_id, declin)) + ! ! write to file. + ! call check(nf90_put_var(ncid, kdir_id, kdir)) + ! call check(nf90_put_var(ncid, declin_id, declin)) - ! close the file. - call check(nf90_close(ncid)) + ! ! close the file. + ! call check(nf90_close(ncid)) - end subroutine write_radiation_data + ! end subroutine write_radiation_data - !:.........................................................................: + ! !:.........................................................................: - subroutine check(status) - ! - ! DESCRIPTION: - ! Checks status of netcdf operations + ! subroutine check(status) + ! ! + ! ! DESCRIPTION: + ! ! Checks status of netcdf operations - ! ARGUMENTS: - integer, intent (in) :: status ! return status code from a netcdf procedure + ! ! ARGUMENTS: + ! integer, intent (in) :: status ! return status code from a netcdf procedure - if (status /= nf90_noerr) then - print *, trim(nf90_strerror(status)) - stop "Stopped" - end if + ! if (status /= nf90_noerr) then + ! print *, trim(nf90_strerror(status)) + ! stop "Stopped" + ! end if - end subroutine check + ! end subroutine check - !:.........................................................................: + ! !:.........................................................................: - subroutine read_patch_data(file, canopy_area, elai, esai, nrad) - ! - ! DESCRIPTION: - ! Reads and return patch data + ! subroutine read_patch_data(file, canopy_area, elai, esai, nrad) + ! ! + ! ! DESCRIPTION: + ! ! Reads and return patch data - ! ARGUMENTS: - character(len=MAX_PATH), intent(in) :: file ! patch file name - real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile - real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile - real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile - real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers - - ! Data dictionary: declare variable types, definitions, and units - real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers - integer :: fidA, varID - - ! open file - call check(nf90_open(trim(file), 0, fidA)) - - ! read patch data values - call check(nf90_inq_varid(fidA, "can_area", varID)) - call check(nf90_get_var(fidA, varID, canopy_area)) - - call check(nf90_inq_varid(fidA, "elai", varID)) - call check(nf90_get_var(fidA, varID, elai)) - - call check(nf90_inq_varid(fidA, "esai", varID)) - call check(nf90_get_var(fidA, varID, esai)) - - call check(nf90_inq_varid(fidA, "nrad", varID)) - call check(nf90_get_var(fidA, varID, nrad)) - - end subroutine read_patch_data - - !:.........................................................................: - - subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) - ! - ! Purpose: - ! Returns parameter values - ! - ! Record of revisions: - ! Date Programmer Description of change - ! ======== ============= ===================== - ! 03/20/23 A. C. Foster Original code - ! - - ! Data dictionary: declare calling parameter types & definitions - character(len=100), intent(in) :: file ! parameter file name - real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance - real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance - real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance - real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance - real(r8), intent(out) :: xl(num_pft) ! leaf orientation index - real(r8), intent(out) :: ci(num_pft) ! clumping index - - ! read in all parameters - call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & - taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) - - end subroutine get_parameters - - !:...........................................................................: - - subroutine read_param_netcdf(file, rholvis, rholnir, rhosvis, rhosnir, & - taulvis, taulnir, tausvis, tausnir, xl, ci) - ! - ! Purpose: - ! Reads a FATES netcdf parameter file - ! - ! Record of revisions: - ! Date Programmer Description of change - ! ======== ============= ===================== - ! 03/20/23 A. C. Foster Original code - ! - - ! Data dictionary: declare calling parameter types & definitions - character(len=100), intent(in) :: file ! parameter file name - real(r8), intent(out) :: rholvis(num_pft) ! vis leaf reflectance - real(r8), intent(out) :: rholnir(num_pft) ! nir leaf reflectance - real(r8), intent(out) :: rhosvis(num_pft) ! vis stem reflectance - real(r8), intent(out) :: rhosnir(num_pft) ! nir stem reflectance - real(r8), intent(out) :: taulvis(num_pft) ! vis leaf transmittance - real(r8), intent(out) :: taulnir(num_pft) ! nir leaf transmittance - real(r8), intent(out) :: tausvis(num_pft) ! vis stem transmittance - real(r8), intent(out) :: tausnir(num_pft) ! nir stem transmittance - real(r8), intent(out) :: xl(num_pft) ! leaf orientation index - real(r8), intent(out) :: ci(num_pft) ! clumping index - - ! Data dictionary: declare variable types, definitions, and units - integer :: fidA, paramID + ! ! ARGUMENTS: + ! character(len=MAX_PATH), intent(in) :: file ! patch file name + ! real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile + ! real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile + ! real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile + ! real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers + + ! ! Data dictionary: declare variable types, definitions, and units + ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers + ! integer :: fidA, varID + + ! ! open file + ! call check(nf90_open(trim(file), 0, fidA)) + + ! ! read patch data values + ! call check(nf90_inq_varid(fidA, "can_area", varID)) + ! call check(nf90_get_var(fidA, varID, canopy_area)) + + ! call check(nf90_inq_varid(fidA, "elai", varID)) + ! call check(nf90_get_var(fidA, varID, elai)) + + ! call check(nf90_inq_varid(fidA, "esai", varID)) + ! call check(nf90_get_var(fidA, varID, esai)) + + ! call check(nf90_inq_varid(fidA, "nrad", varID)) + ! call check(nf90_get_var(fidA, varID, nrad)) + + ! end subroutine read_patch_data + + ! !:.........................................................................: + + ! subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) + ! ! + ! ! Purpose: + ! ! Returns parameter values + ! ! + ! ! Record of revisions: + ! ! Date Programmer Description of change + ! ! ======== ============= ===================== + ! ! 03/20/23 A. C. Foster Original code + ! ! + + ! ! Data dictionary: declare calling parameter types & definitions + ! character(len=100), intent(in) :: file ! parameter file name + ! real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance + ! real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance + ! real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance + ! real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance + ! real(r8), intent(out) :: xl(num_pft) ! leaf orientation index + ! real(r8), intent(out) :: ci(num_pft) ! clumping index + + ! ! read in all parameters + ! call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & + ! taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) + + ! end subroutine get_parameters + + ! !:...........................................................................: + + ! subroutine read_param_netcdf(file, rholvis, rholnir, rhosvis, rhosnir, & + ! taulvis, taulnir, tausvis, tausnir, xl, ci) + ! ! + ! ! Purpose: + ! ! Reads a FATES netcdf parameter file + ! ! + ! ! Record of revisions: + ! ! Date Programmer Description of change + ! ! ======== ============= ===================== + ! ! 03/20/23 A. C. Foster Original code + ! ! + + ! ! Data dictionary: declare calling parameter types & definitions + ! character(len=100), intent(in) :: file ! parameter file name + ! real(r8), intent(out) :: rholvis(num_pft) ! vis leaf reflectance + ! real(r8), intent(out) :: rholnir(num_pft) ! nir leaf reflectance + ! real(r8), intent(out) :: rhosvis(num_pft) ! vis stem reflectance + ! real(r8), intent(out) :: rhosnir(num_pft) ! nir stem reflectance + ! real(r8), intent(out) :: taulvis(num_pft) ! vis leaf transmittance + ! real(r8), intent(out) :: taulnir(num_pft) ! nir leaf transmittance + ! real(r8), intent(out) :: tausvis(num_pft) ! vis stem transmittance + ! real(r8), intent(out) :: tausnir(num_pft) ! nir stem transmittance + ! real(r8), intent(out) :: xl(num_pft) ! leaf orientation index + ! real(r8), intent(out) :: ci(num_pft) ! clumping index + + ! ! Data dictionary: declare variable types, definitions, and units + ! integer :: fidA, paramID - ! open file - call check(nf90_open(trim(file), 0, fidA)) + ! ! open file + ! call check(nf90_open(trim(file), 0, fidA)) - ! read parameter values - call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhovis", paramID)) - call check(nf90_get_var(fidA, paramID, rholvis)) + ! ! read parameter values + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhovis", paramID)) + ! call check(nf90_get_var(fidA, paramID, rholvis)) - call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhonir", paramID)) - call check(nf90_get_var(fidA, paramID, rholnir)) + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhonir", paramID)) + ! call check(nf90_get_var(fidA, paramID, rholnir)) - call check(nf90_inq_varid(fidA, "fates_rad_stem_rhovis", paramID)) - call check(nf90_get_var(fidA, paramID, rhosvis)) + ! call check(nf90_inq_varid(fidA, "fates_rad_stem_rhovis", paramID)) + ! call check(nf90_get_var(fidA, paramID, rhosvis)) - call check(nf90_inq_varid(fidA, "fates_rad_stem_rhonir", paramID)) - call check(nf90_get_var(fidA, paramID, rhosnir)) + ! call check(nf90_inq_varid(fidA, "fates_rad_stem_rhonir", paramID)) + ! call check(nf90_get_var(fidA, paramID, rhosnir)) - call check(nf90_inq_varid(fidA, "fates_rad_leaf_tauvis", paramID)) - call check(nf90_get_var(fidA, paramID, taulvis)) + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_tauvis", paramID)) + ! call check(nf90_get_var(fidA, paramID, taulvis)) - call check(nf90_inq_varid(fidA, "fates_rad_leaf_taunir", paramID)) - call check(nf90_get_var(fidA, paramID, taulnir)) + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_taunir", paramID)) + ! call check(nf90_get_var(fidA, paramID, taulnir)) - call check(nf90_inq_varid(fidA, "fates_rad_stem_tauvis", paramID)) - call check(nf90_get_var(fidA, paramID, tausvis)) + ! call check(nf90_inq_varid(fidA, "fates_rad_stem_tauvis", paramID)) + ! call check(nf90_get_var(fidA, paramID, tausvis)) - call check(nf90_inq_varid(fidA, "fates_rad_stem_taunir", paramID)) - call check(nf90_get_var(fidA, paramID, tausnir)) + ! call check(nf90_inq_varid(fidA, "fates_rad_stem_taunir", paramID)) + ! call check(nf90_get_var(fidA, paramID, tausnir)) - call check(nf90_inq_varid(fidA, "fates_rad_leaf_xl", paramID)) - call check(nf90_get_var(fidA, paramID, xl)) + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_xl", paramID)) + ! call check(nf90_get_var(fidA, paramID, xl)) - call check(nf90_inq_varid(fidA, "fates_rad_leaf_clumping_index", paramID)) - call check(nf90_get_var(fidA, paramID, ci)) + ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_clumping_index", paramID)) + ! call check(nf90_get_var(fidA, paramID, ci)) - ! close file - call check(nf90_close(fidA)) + ! ! close file + ! call check(nf90_close(fidA)) - end subroutine read_param_netcdf + ! end subroutine read_param_netcdf - !:...........................................................................: + ! !:...........................................................................: end module FatesUnitTestIOMod \ No newline at end of file From ec5d6b5ae0ff448d43764eb754a259057cc3a72f Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 12 Apr 2023 12:50:13 -0600 Subject: [PATCH 040/125] add testing functionality --- unit_testing/test/radiation_test/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unit_testing/test/radiation_test/CMakeLists.txt b/unit_testing/test/radiation_test/CMakeLists.txt index 9263c1ee0d..895badcf9d 100644 --- a/unit_testing/test/radiation_test/CMakeLists.txt +++ b/unit_testing/test/radiation_test/CMakeLists.txt @@ -11,4 +11,7 @@ extract_sources("${sources_needed}" "${utils_sources}" test_sources) add_executable(FATES_rad_test ${test_sources}) +add_test(rad_test FATES_rad_test) +# Tell CTest how to figure out that "STOP 1" fails for the current +define_Fortran_stop_failure(rad_test) From 4e8936db685baf7e45be3e454ca26a75a422fe0b Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Apr 2023 08:27:35 -0600 Subject: [PATCH 041/125] working for netcdf --- CMakeLists.txt | 32 ++++++++++++++++--- .../test/radiation_test/CMakeLists.txt | 23 +++++++++++++ unit_testing/utils/FatesUnitTestIOMod.F90 | 2 +- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7c8899d8b..213a44115a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,40 @@ -cmake_minimum_required(VERSION 2.8) - -list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) -include(CIME_initial_setup) +cmake_minimum_required(VERSION 3.4) project(radiation_tests Fortran C) +enable_language(Fortran) + +list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) +include(CIME_initial_setup) include(CIME_utils) set(CLM_ROOT "../../") - add_subdirectory(${CLM_ROOT}/src/fates/main) add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/test) +set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") +set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") +MESSAGE(">> CISM_NETCDF_C_DIR set to : ${NETCDF_C_DIR}") +MESSAGE(">> CISM_NETCDF_FORTRAN_DIR set to : ${NETCDF_FORTRAN_DIR}") + +FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) +FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) +MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") +MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") + +IF (${NETCDFC_FOUND} STREQUAL ${NETCDF_C_DIR}/lib ) + SET(NETCDF_C_LIBS "netcdff;netcdf" CACHE STRING "Netcdf Library Names(s)") +ELSE() + SET(NETCDF_C_LIBS "netcdf" CACHE STRING "Netcdf Library Names(s)") +ENDIF() +MESSAGE(">> NETCDF_LIBS Library(s) set to : ${NETCDF_C_LIBS}") + + +include_directories(${NETCDF_C_DIR}/include + ${NETCDF_FORTRAN_DIR}/include) +link_directories(${NETCDF_C_DIR}/lib + ${NETCDF_FORTRAN_DIR}/lib) add_library(utils ${utils_sources}) diff --git a/unit_testing/test/radiation_test/CMakeLists.txt b/unit_testing/test/radiation_test/CMakeLists.txt index 895badcf9d..cd6f767d2b 100644 --- a/unit_testing/test/radiation_test/CMakeLists.txt +++ b/unit_testing/test/radiation_test/CMakeLists.txt @@ -9,6 +9,29 @@ set(sources_needed extract_sources("${sources_needed}" "${utils_sources}" test_sources) +set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") +set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") +MESSAGE(">> CISM_NETCDF_C_DIR set to : ${NETCDF_C_DIR}") +MESSAGE(">> CISM_NETCDF_FORTRAN_DIR set to : ${NETCDF_FORTRAN_DIR}") + +FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) +FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) +MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") +MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") + +IF (${NETCDFC_FOUND} STREQUAL ${NETCDF_C_DIR}/lib ) + SET(NETCDF_C_LIBS "netcdff;netcdf" CACHE STRING "Netcdf Library Names(s)") +ELSE() + SET(NETCDF_C_LIBS "netcdf" CACHE STRING "Netcdf Library Names(s)") +ENDIF() +MESSAGE(">> NETCDF_LIBS Library(s) set to : ${NETCDF_C_LIBS}") + + +include_directories(${NETCDF_C_DIR}/include + ${NETCDF_FORTRAN_DIR}/include) +link_directories(${NETCDF_C_DIR}/lib + ${NETCDF_FORTRAN_DIR}/lib) + add_executable(FATES_rad_test ${test_sources}) add_test(rad_test FATES_rad_test) diff --git a/unit_testing/utils/FatesUnitTestIOMod.F90 b/unit_testing/utils/FatesUnitTestIOMod.F90 index 02ec08a2ab..0cc004f7a4 100644 --- a/unit_testing/utils/FatesUnitTestIOMod.F90 +++ b/unit_testing/utils/FatesUnitTestIOMod.F90 @@ -1,6 +1,6 @@ module FatesUnitTestIOMod use FatesConstantsMod, only : r8 => fates_r8 - !use netcdf + use netcdf implicit none From ffeb8ee82c2a18e1e3b2bdbbf822d29e31062fa8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Apr 2023 09:19:27 -0600 Subject: [PATCH 042/125] adding a namelist --- build/.env_mach_specific.csh | 8 + build/.env_mach_specific.sh | 8 + build/Depends.gnu | 2 + build/Macros.cmake | 37 + .../__command_line_test__/CMakeCache.txt | 492 ++++++++ .../CMakeFiles/3.25.2/CMakeCCompiler.cmake | 72 ++ .../3.25.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 16688 bytes .../CMakeDetermineCompilerABI_Fortran.bin | Bin 0 -> 33512 bytes .../3.25.2/CMakeFortranCompiler.cmake | 62 + .../CMakeFiles/3.25.2/CMakeSystem.cmake | 15 + .../3.25.2/CompilerIdC/CMakeCCompilerId.c | 868 +++++++++++++ .../CMakeFortranCompilerId.F | 1114 +++++++++++++++++ .../CMakeDirectoryInformation.cmake | 16 + .../CMakeFiles/Makefile.cmake | 141 +++ .../CMakeFiles/Makefile2 | 206 +++ .../CMakeFiles/Progress/1 | 1 + .../CMakeFiles/Progress/2 | 1 + .../CMakeFiles/Progress/3 | 1 + .../CMakeFiles/Progress/4 | 1 + .../CMakeFiles/Progress/6 | 1 + .../CMakeFiles/Progress/7 | 1 + .../CMakeFiles/Progress/8 | 1 + .../CMakeFiles/Progress/9 | 1 + .../CMakeFiles/Progress/count.txt | 1 + .../CMakeFiles/TargetDirectories.txt | 17 + .../CMakeFiles/cmake.check_cache | 1 + .../CMakeFiles/progress.marks | 1 + .../CMakeFiles/utils.dir/DependInfo.cmake | 37 + .../CMakeFiles/utils.dir/build.make | 140 +++ .../CMakeFiles/utils.dir/cmake_clean.cmake | 12 + .../utils.dir/cmake_clean_Fortran.cmake | 14 + .../utils.dir/cmake_clean_target.cmake | 3 + .../CMakeFiles/utils.dir/compiler_depend.make | 2 + .../CMakeFiles/utils.dir/compiler_depend.ts | 2 + .../CMakeFiles/utils.dir/depend.internal | 9 + .../CMakeFiles/utils.dir/depend.make | 25 + .../utils.dir/fatesconstantsmod.mod.stamp | Bin 0 -> 2256 bytes .../utils.dir/fatesunittestiomod.mod.stamp | Bin 0 -> 24087 bytes .../fatesunittestorbitalmod.mod.stamp | Bin 0 -> 25076 bytes .../CMakeFiles/utils.dir/flags.make | 10 + .../CMakeFiles/utils.dir/fortran.internal | 5 + .../CMakeFiles/utils.dir/link.txt | 2 + .../FatesConstantsMod.F90.o.provides.build | 0 .../CMakeFiles/utils.dir/progress.make | 5 + .../FatesUnitTestIOMod.F90.o.provides.build | 0 ...tesUnitTestOrbitalMod.F90.o.provides.build | 0 .../__command_line_test__/CTestTestfile.cmake | 9 + .../__command_line_test__/Macros.cmake | 1 + .../__command_line_test__/Makefile | 260 ++++ .../__command_line_test__/cmake_install.cmake | 57 + .../__command_line_test__/libutils.a | Bin 0 -> 40264 bytes .../CMakeDirectoryInformation.cmake | 16 + .../main/CMakeFiles/progress.marks | 1 + .../main/CTestTestfile.cmake | 6 + .../__command_line_test__/main/Makefile | 151 +++ .../main/cmake_install.cmake | 39 + .../CMakeDirectoryInformation.cmake | 16 + .../test/CMakeFiles/progress.marks | 1 + .../unit_testing/test/CTestTestfile.cmake | 7 + .../unit_testing/test/Makefile | 151 +++ .../unit_testing/test/cmake_install.cmake | 45 + .../CMakeDirectoryInformation.cmake | 16 + .../FATES_rad_test.dir/DependInfo.cmake | 37 + .../FatesConstantsMod.F90.o.provides.build | 0 .../FatesUnitTestIOMod.F90.o.provides.build | 0 ...tesUnitTestOrbitalMod.F90.o.provides.build | 0 .../CMakeFiles/FATES_rad_test.dir/build.make | 154 +++ .../FATES_rad_test.dir/cmake_clean.cmake | 13 + .../cmake_clean_Fortran.cmake | 14 + .../FATES_rad_test.dir/compiler_depend.make | 2 + .../FATES_rad_test.dir/compiler_depend.ts | 2 + .../FATES_rad_test.dir/depend.internal | 11 + .../CMakeFiles/FATES_rad_test.dir/depend.make | 27 + .../fatesconstantsmod.mod.stamp | Bin 0 -> 2256 bytes .../fatesunittestiomod.mod.stamp | Bin 0 -> 24087 bytes .../fatesunittestorbitalmod.mod.stamp | Bin 0 -> 25076 bytes .../CMakeFiles/FATES_rad_test.dir/flags.make | 10 + .../FATES_rad_test.dir/fortran.internal | 5 + .../CMakeFiles/FATES_rad_test.dir/link.txt | 1 + .../FATES_rad_test.dir/progress.make | 6 + .../radiation_test/CMakeFiles/progress.marks | 1 + .../test/radiation_test/CTestTestfile.cmake | 8 + .../unit_testing/test/radiation_test/Makefile | 274 ++++ .../test/radiation_test/cmake_install.cmake | 39 + .../CMakeDirectoryInformation.cmake | 16 + .../utils/CMakeFiles/progress.marks | 1 + .../unit_testing/utils/CTestTestfile.cmake | 6 + .../unit_testing/utils/Makefile | 151 +++ .../unit_testing/utils/cmake_install.cmake | 39 + build/cmake_macros/CMakeLists.txt | 4 + build/cmake_macros/CNL.cmake | 14 + build/cmake_macros/Darwin.cmake | 1 + build/cmake_macros/Macros.cmake | 37 + build/cmake_macros/arm.cmake | 0 build/cmake_macros/armgcc.cmake | 0 build/cmake_macros/athena.cmake | 0 build/cmake_macros/bluewaters.cmake | 0 build/cmake_macros/casper.cmake | 0 build/cmake_macros/centos7-linux.cmake | 1 + build/cmake_macros/cheyenne.cmake | 6 + build/cmake_macros/container.cmake | 7 + build/cmake_macros/cray.cmake | 37 + build/cmake_macros/cray_daint.cmake | 2 + build/cmake_macros/euler2.cmake | 5 + build/cmake_macros/euler3.cmake | 5 + build/cmake_macros/euler4.cmake | 5 + build/cmake_macros/frontera.cmake | 9 + build/cmake_macros/gnu.cmake | 43 + build/cmake_macros/gnu_cheyenne.cmake | 4 + build/cmake_macros/gnu_coeus.cmake | 2 + build/cmake_macros/gnu_fleabone.cmake | 27 + build/cmake_macros/gnu_hobart.cmake | 1 + build/cmake_macros/gnu_homebrew.cmake | 1 + build/cmake_macros/gnu_lobata.cmake | 15 + build/cmake_macros/gnu_melvin.cmake | 13 + build/cmake_macros/gnu_modex.cmake | 5 + build/cmake_macros/gust.cmake | 10 + build/cmake_macros/hobart.cmake | 9 + build/cmake_macros/ibm.cmake | 38 + build/cmake_macros/ibm_AIX.cmake | 18 + build/cmake_macros/ibm_BGQ.cmake | 11 + build/cmake_macros/intel.cmake | 61 + build/cmake_macros/intel_Darwin.cmake | 3 + build/cmake_macros/intel_aleph.cmake | 8 + build/cmake_macros/intel_athena.cmake | 20 + build/cmake_macros/intel_aws-hpc6a.cmake | 8 + build/cmake_macros/intel_bluewaters.cmake | 3 + build/cmake_macros/intel_casper.cmake | 9 + build/cmake_macros/intel_cheyenne.cmake | 12 + build/cmake_macros/intel_constance.cmake | 11 + build/cmake_macros/intel_cori-haswell.cmake | 9 + build/cmake_macros/intel_cori-knl.cmake | 9 + build/cmake_macros/intel_eastwind.cmake | 11 + build/cmake_macros/intel_edison.cmake | 11 + build/cmake_macros/intel_euler2.cmake | 7 + build/cmake_macros/intel_euler3.cmake | 7 + build/cmake_macros/intel_euler4.cmake | 7 + .../intel_greenplanet-sib29.cmake | 3 + .../intel_greenplanet-sky24.cmake | 3 + build/cmake_macros/intel_gust.cmake | 6 + build/cmake_macros/intel_hobart.cmake | 16 + build/cmake_macros/intel_izumi.cmake | 3 + build/cmake_macros/intel_laramie.cmake | 5 + build/cmake_macros/intel_lawrencium-lr3.cmake | 12 + build/cmake_macros/intel_sandiatoss3.cmake | 12 + build/cmake_macros/intel_stampede2-knl.cmake | 10 + build/cmake_macros/intel_stampede2-skx.cmake | 10 + build/cmake_macros/intel_theia.cmake | 4 + build/cmake_macros/intel_zeus.cmake | 18 + build/cmake_macros/izumi.cmake | 9 + build/cmake_macros/laramie.cmake | 6 + build/cmake_macros/lonestar5.cmake | 6 + build/cmake_macros/nag.cmake | 30 + build/cmake_macros/nvhpc-gpu.cmake | 46 + build/cmake_macros/nvhpc-gpu_casper.cmake | 15 + build/cmake_macros/nvhpc.cmake | 51 + build/cmake_macros/nvhpc_casper.cmake | 15 + build/cmake_macros/nvhpc_cheyenne.cmake | 4 + build/cmake_macros/nvhpc_gust.cmake | 3 + build/cmake_macros/oneapi.cmake | 61 + build/cmake_macros/pgi-gpu.cmake | 46 + build/cmake_macros/pgi-gpu_casper.cmake | 15 + build/cmake_macros/pgi.cmake | 46 + build/cmake_macros/pgi_bluewaters.cmake | 10 + build/cmake_macros/pgi_casper.cmake | 15 + build/cmake_macros/pgi_cheyenne.cmake | 4 + build/cmake_macros/pgi_constance.cmake | 11 + build/cmake_macros/pgi_daint.cmake | 3 + build/cmake_macros/pgi_eastwind.cmake | 20 + build/cmake_macros/pgi_euler2.cmake | 6 + build/cmake_macros/pgi_euler3.cmake | 6 + build/cmake_macros/pgi_euler4.cmake | 6 + build/cmake_macros/pgi_hobart.cmake | 10 + build/cmake_macros/pgi_izumi.cmake | 2 + build/cmake_macros/pgi_olympus.cmake | 11 + build/cmake_macros/pleiades-bro.cmake | 6 + build/cmake_macros/pleiades-has.cmake | 6 + build/cmake_macros/pleiades-ivy.cmake | 6 + build/cmake_macros/pleiades-san.cmake | 6 + build/cmake_macros/stampede2-knl.cmake | 4 + build/cmake_macros/stampede2-skx.cmake | 4 + build/cmake_macros/theta.cmake | 4 + build/cmake_macros/universal.cmake | 18 + build/cmake_macros/userdefined.cmake | 9 + build/cmake_macros/zeus.cmake | 8 + build/env_mach_specific.xml | 32 + test_list.xml | 7 + .../radiation_test/FatesUnitTestRadiation.F90 | 80 +- unit_testing/test/radiation_test/radiation_nl | 13 + 189 files changed, 6164 insertions(+), 52 deletions(-) create mode 100644 build/.env_mach_specific.csh create mode 100644 build/.env_mach_specific.sh create mode 100644 build/Depends.gnu create mode 100644 build/Macros.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeCache.txt create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake create mode 100755 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin create mode 100755 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeFortranCompiler.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeSystem.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdC/CMakeCCompilerId.c create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/CTestTestfile.cmake create mode 120000 build/__command_line_test__/__command_line_test__/Macros.cmake create mode 100644 build/__command_line_test__/__command_line_test__/Makefile create mode 100644 build/__command_line_test__/__command_line_test__/cmake_install.cmake create mode 100644 build/__command_line_test__/__command_line_test__/libutils.a create mode 100644 build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks create mode 100644 build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake create mode 100644 build/__command_line_test__/__command_line_test__/main/Makefile create mode 100644 build/__command_line_test__/__command_line_test__/main/cmake_install.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile create mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake create mode 100644 build/cmake_macros/CMakeLists.txt create mode 100644 build/cmake_macros/CNL.cmake create mode 100644 build/cmake_macros/Darwin.cmake create mode 100644 build/cmake_macros/Macros.cmake create mode 100644 build/cmake_macros/arm.cmake create mode 100644 build/cmake_macros/armgcc.cmake create mode 100644 build/cmake_macros/athena.cmake create mode 100644 build/cmake_macros/bluewaters.cmake create mode 100644 build/cmake_macros/casper.cmake create mode 100644 build/cmake_macros/centos7-linux.cmake create mode 100644 build/cmake_macros/cheyenne.cmake create mode 100644 build/cmake_macros/container.cmake create mode 100644 build/cmake_macros/cray.cmake create mode 100644 build/cmake_macros/cray_daint.cmake create mode 100644 build/cmake_macros/euler2.cmake create mode 100644 build/cmake_macros/euler3.cmake create mode 100644 build/cmake_macros/euler4.cmake create mode 100644 build/cmake_macros/frontera.cmake create mode 100644 build/cmake_macros/gnu.cmake create mode 100644 build/cmake_macros/gnu_cheyenne.cmake create mode 100644 build/cmake_macros/gnu_coeus.cmake create mode 100644 build/cmake_macros/gnu_fleabone.cmake create mode 100644 build/cmake_macros/gnu_hobart.cmake create mode 100644 build/cmake_macros/gnu_homebrew.cmake create mode 100644 build/cmake_macros/gnu_lobata.cmake create mode 100644 build/cmake_macros/gnu_melvin.cmake create mode 100644 build/cmake_macros/gnu_modex.cmake create mode 100644 build/cmake_macros/gust.cmake create mode 100644 build/cmake_macros/hobart.cmake create mode 100644 build/cmake_macros/ibm.cmake create mode 100644 build/cmake_macros/ibm_AIX.cmake create mode 100644 build/cmake_macros/ibm_BGQ.cmake create mode 100644 build/cmake_macros/intel.cmake create mode 100644 build/cmake_macros/intel_Darwin.cmake create mode 100644 build/cmake_macros/intel_aleph.cmake create mode 100644 build/cmake_macros/intel_athena.cmake create mode 100644 build/cmake_macros/intel_aws-hpc6a.cmake create mode 100644 build/cmake_macros/intel_bluewaters.cmake create mode 100644 build/cmake_macros/intel_casper.cmake create mode 100644 build/cmake_macros/intel_cheyenne.cmake create mode 100644 build/cmake_macros/intel_constance.cmake create mode 100644 build/cmake_macros/intel_cori-haswell.cmake create mode 100644 build/cmake_macros/intel_cori-knl.cmake create mode 100644 build/cmake_macros/intel_eastwind.cmake create mode 100644 build/cmake_macros/intel_edison.cmake create mode 100644 build/cmake_macros/intel_euler2.cmake create mode 100644 build/cmake_macros/intel_euler3.cmake create mode 100644 build/cmake_macros/intel_euler4.cmake create mode 100644 build/cmake_macros/intel_greenplanet-sib29.cmake create mode 100644 build/cmake_macros/intel_greenplanet-sky24.cmake create mode 100644 build/cmake_macros/intel_gust.cmake create mode 100644 build/cmake_macros/intel_hobart.cmake create mode 100644 build/cmake_macros/intel_izumi.cmake create mode 100644 build/cmake_macros/intel_laramie.cmake create mode 100644 build/cmake_macros/intel_lawrencium-lr3.cmake create mode 100644 build/cmake_macros/intel_sandiatoss3.cmake create mode 100644 build/cmake_macros/intel_stampede2-knl.cmake create mode 100644 build/cmake_macros/intel_stampede2-skx.cmake create mode 100644 build/cmake_macros/intel_theia.cmake create mode 100644 build/cmake_macros/intel_zeus.cmake create mode 100644 build/cmake_macros/izumi.cmake create mode 100644 build/cmake_macros/laramie.cmake create mode 100644 build/cmake_macros/lonestar5.cmake create mode 100644 build/cmake_macros/nag.cmake create mode 100644 build/cmake_macros/nvhpc-gpu.cmake create mode 100644 build/cmake_macros/nvhpc-gpu_casper.cmake create mode 100644 build/cmake_macros/nvhpc.cmake create mode 100644 build/cmake_macros/nvhpc_casper.cmake create mode 100644 build/cmake_macros/nvhpc_cheyenne.cmake create mode 100644 build/cmake_macros/nvhpc_gust.cmake create mode 100644 build/cmake_macros/oneapi.cmake create mode 100644 build/cmake_macros/pgi-gpu.cmake create mode 100644 build/cmake_macros/pgi-gpu_casper.cmake create mode 100644 build/cmake_macros/pgi.cmake create mode 100644 build/cmake_macros/pgi_bluewaters.cmake create mode 100644 build/cmake_macros/pgi_casper.cmake create mode 100644 build/cmake_macros/pgi_cheyenne.cmake create mode 100644 build/cmake_macros/pgi_constance.cmake create mode 100644 build/cmake_macros/pgi_daint.cmake create mode 100644 build/cmake_macros/pgi_eastwind.cmake create mode 100644 build/cmake_macros/pgi_euler2.cmake create mode 100644 build/cmake_macros/pgi_euler3.cmake create mode 100644 build/cmake_macros/pgi_euler4.cmake create mode 100644 build/cmake_macros/pgi_hobart.cmake create mode 100644 build/cmake_macros/pgi_izumi.cmake create mode 100644 build/cmake_macros/pgi_olympus.cmake create mode 100644 build/cmake_macros/pleiades-bro.cmake create mode 100644 build/cmake_macros/pleiades-has.cmake create mode 100644 build/cmake_macros/pleiades-ivy.cmake create mode 100644 build/cmake_macros/pleiades-san.cmake create mode 100644 build/cmake_macros/stampede2-knl.cmake create mode 100644 build/cmake_macros/stampede2-skx.cmake create mode 100644 build/cmake_macros/theta.cmake create mode 100644 build/cmake_macros/universal.cmake create mode 100644 build/cmake_macros/userdefined.cmake create mode 100644 build/cmake_macros/zeus.cmake create mode 100644 build/env_mach_specific.xml create mode 100644 test_list.xml create mode 100644 unit_testing/test/radiation_test/radiation_nl diff --git a/build/.env_mach_specific.csh b/build/.env_mach_specific.csh new file mode 100644 index 0000000000..35e5a959f4 --- /dev/null +++ b/build/.env_mach_specific.csh @@ -0,0 +1,8 @@ +# This file is for user convenience only and is not used by the model +# Changes to this file will be ignored and overwritten +# Changes to the environment should be made in env_mach_specific.xml +# Run ./case.setup --reset to regenerate this file +setenv COMPILER gnu +setenv MPILIB mpi-serial +setenv DEBUG TRUE +setenv OS Ventura diff --git a/build/.env_mach_specific.sh b/build/.env_mach_specific.sh new file mode 100644 index 0000000000..4adbda012f --- /dev/null +++ b/build/.env_mach_specific.sh @@ -0,0 +1,8 @@ +# This file is for user convenience only and is not used by the model +# Changes to this file will be ignored and overwritten +# Changes to the environment should be made in env_mach_specific.xml +# Run ./case.setup --reset to regenerate this file +export COMPILER=gnu +export MPILIB=mpi-serial +export DEBUG=TRUE +export OS=Ventura diff --git a/build/Depends.gnu b/build/Depends.gnu new file mode 100644 index 0000000000..2d53247217 --- /dev/null +++ b/build/Depends.gnu @@ -0,0 +1,2 @@ +geopk.o:geopk.F90 + $(FC) -c $(INCLDIR) $(INCS) $(FFLAGS) $(FREEFLAGS) -fcray-pointer $< diff --git a/build/Macros.cmake b/build/Macros.cmake new file mode 100644 index 0000000000..b089f58058 --- /dev/null +++ b/build/Macros.cmake @@ -0,0 +1,37 @@ +# +# Use this file to include the relevant macros based on +# machine/compiler settings. This file gets copied to CASEROOT +# and that's the one that gets included by the build system. Feel free +# to modify this file in the CASEROOT. +# +set(MACROS_DIR ${CASEROOT}/cmake_macros) + +set(UNIVERSAL_MACRO ${MACROS_DIR}/universal.cmake) +set(COMPILER_MACRO ${MACROS_DIR}/${COMPILER}.cmake) +set(OS_MACRO ${MACROS_DIR}/${OS}.cmake) +set(MACHINE_MACRO ${MACROS_DIR}/${MACH}.cmake) +set(COMPILER_OS_MACRO ${MACROS_DIR}/${COMPILER}_${OS}.cmake) +set(COMPILER_MACHINE_MACRO ${MACROS_DIR}/${COMPILER}_${MACH}.cmake) + +if (CONVERT_TO_MAKE) + get_cmake_property(VARS_BEFORE_BUILD_INTERNAL_IGNORE VARIABLES) +endif() + +# Include order defines precedence +foreach (MACRO_FILE ${UNIVERSAL_MACRO} ${COMPILER_MACRO} ${OS_MACRO} ${MACHINE_MACRO} ${COMPILER_OS_MACRO} ${COMPILER_MACHINE_MACRO}) + if (EXISTS ${MACRO_FILE}) + include(${MACRO_FILE}) + else() + message("No macro file found: ${MACRO_FILE}") + endif() +endforeach() + +if (CONVERT_TO_MAKE) + get_cmake_property(VARS_AFTER VARIABLES) + + foreach (VAR_AFTER IN LISTS VARS_AFTER) + if (NOT VAR_AFTER IN_LIST VARS_BEFORE_BUILD_INTERNAL_IGNORE) + message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}") + endif() + endforeach() +endif() diff --git a/build/__command_line_test__/__command_line_test__/CMakeCache.txt b/build/__command_line_test__/__command_line_test__/CMakeCache.txt new file mode 100644 index 0000000000..c99fedf020 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeCache.txt @@ -0,0 +1,492 @@ +# This is the CMakeCache file. +# For build in directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ +# It was generated by CMake: /usr/local/Cellar/cmake/3.25.2/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +CASEROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/src/fates/build + +//No help, variable specified on the command line. +CIMEROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/scripts/fortran_unit_testing/../.. + +//No help, variable specified on the command line. +CIME_CMAKE_MODULE_DIRECTORY:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=CMAKE_ADDR2LINE-NOTFOUND + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=CESM_DEBUG + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during CESM_DEBUG builds. +CMAKE_C_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib + +//Flags used by the linker during CESM_DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/pkgRedirects + +//Fortran compiler +CMAKE_Fortran_COMPILER:FILEPATH=/usr/local/bin/gfortran + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_Fortran_COMPILER_AR:FILEPATH=CMAKE_Fortran_COMPILER_AR-NOTFOUND + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_Fortran_COMPILER_RANLIB:FILEPATH=CMAKE_Fortran_COMPILER_RANLIB-NOTFOUND + +//Flags used by the Fortran compiler during all build types. +CMAKE_Fortran_FLAGS:STRING= + +//Flags used by the Fortran compiler during CESM_DEBUG builds. +CMAKE_Fortran_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the Fortran compiler during DEBUG builds. +CMAKE_Fortran_FLAGS_DEBUG:STRING=-g + +//Flags used by the Fortran compiler during MINSIZEREL builds. +CMAKE_Fortran_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -Os + +//Flags used by the Fortran compiler during RELEASE builds. +CMAKE_Fortran_FLAGS_RELEASE:STRING=-O3 -DNDEBUG -O3 + +//Flags used by the Fortran compiler during RELWITHDEBINFO builds. +CMAKE_Fortran_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/local/bin/gmake + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib + +//Flags used by the linker during the creation of modules during +// CESM_DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Build architectures for OSX +CMAKE_OSX_ARCHITECTURES:STRING= + +//Minimum OS X version to target for deployment (at runtime); newer +// APIs weak linked. Set to empty string for default value. +CMAKE_OSX_DEPLOYMENT_TARGET:STRING= + +//The product will be built against the headers and libraries located +// inside the indicated SDK. +CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk + +//No help, variable specified on the command line. +CMAKE_PROGRAM_PATH:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/scripts/fortran_unit_testing/../../CIME/non_py/externals/genf90 + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=radiation_tests + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=CMAKE_READELF-NOTFOUND + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib + +//Flags used by the linker during the creation of shared libraries +// during CESM_DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during CESM_DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//No help, variable specified on the command line. +COMPILER:UNINITIALIZED=gnu + +//No help, variable specified on the command line. +DEBUG:UNINITIALIZED=TRUE + +//Use genf90.pl to regenerate out-of-date Fortran files from .in +// files. +ENABLE_GENF90:BOOL=ON + +//Path to a program. +GENF90:FILEPATH=/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/externals/genf90/genf90.pl + +//No help, variable specified on the command line. +MACH:UNINITIALIZED=fleabone + +//No help, variable specified on the command line. +MPILIB:UNINITIALIZED=mpi-serial + +//Path to a file. +NETCDFC_FOUND:PATH=/usr/local/Cellar/netcdf/4.9.2/lib + +//Path to a file. +NETCDFF_FOUND:PATH=/usr/local/Cellar/netcdf-fortran/4.6.0/lib + +//Netcdf Library Names(s) +NETCDF_C_LIBS:STRING=netcdff;netcdf + +//No help, variable specified on the command line. +OS:UNINITIALIZED=Ventura + +//Path to a file. +PFUNIT_INCLUDE_DIR:PATH=/Users/afoster/pFUnit/include + +//Path to a library. +PFUNIT_LIBRARY:FILEPATH=/Users/afoster/pFUnit/lib/libpfunit.a + +//Path to a file. +PFUNIT_MODULE_DIR:PATH=/Users/afoster/pFUnit/mod + +//No help, variable specified on the command line. +PFUNIT_MPIRUN:UNINITIALIZED= + +//Path to a program. +PFUNIT_PARSER:FILEPATH=/Users/afoster/pFUnit/bin/pFUnitParser.py + +//No help, variable specified on the command line. +PFUNIT_PATH:UNINITIALIZED=/Users/afoster/pFUnit/ + +//No help, variable specified on the command line. +SRC_ROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM + +//Allow color from the build output. +USE_COLOR:BOOL=ON + +//No help, variable specified on the command line. +USE_MPI_SERIAL:UNINITIALIZED=ON + +//No help, variable specified on the command line. +compile_threaded:UNINITIALIZED=FALSE + +//Value Computed by CMake +radiation_tests_BINARY_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +//Value Computed by CMake +radiation_tests_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +radiation_tests_SOURCE_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=25 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/ctest +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_CESM_DEBUG +CMAKE_C_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=MACHO +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG +CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//ADVANCED property for variable: CMAKE_Fortran_COMPILER +CMAKE_Fortran_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_COMPILER_AR +CMAKE_Fortran_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_COMPILER_RANLIB +CMAKE_Fortran_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS +CMAKE_Fortran_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_CESM_DEBUG +CMAKE_Fortran_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_DEBUG +CMAKE_Fortran_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_MINSIZEREL +CMAKE_Fortran_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELEASE +CMAKE_Fortran_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELWITHDEBINFO +CMAKE_Fortran_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/afoster/Documents/ncar/CTSM/src/fates +//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL +CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG +CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=5 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/local/Cellar/cmake/3.25.2/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG +CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG +CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Details about finding pFUnit +FIND_PACKAGE_MESSAGE_DETAILS_pFUnit:INTERNAL=[/Users/afoster/pFUnit/lib/libpfunit.a][/Users/afoster/pFUnit/include][/Users/afoster/pFUnit/mod][/Users/afoster/pFUnit/bin/pFUnitParser.py][v()] +//ADVANCED property for variable: PFUNIT_INCLUDE_DIR +PFUNIT_INCLUDE_DIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PFUNIT_LIBRARY +PFUNIT_LIBRARY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PFUNIT_MODULE_DIR +PFUNIT_MODULE_DIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PFUNIT_PARSER +PFUNIT_PARSER-ADVANCED:INTERNAL=1 + diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake new file mode 100644 index 0000000000..b02d92f9f2 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake @@ -0,0 +1,72 @@ +set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "AppleClang") +set(CMAKE_C_COMPILER_VERSION "14.0.0.14000029") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Darwin") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/local/opt/lapack/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/System/Library/Frameworks") diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..4656549879429703477a75be0e856ae37b97684a GIT binary patch literal 16688 zcmeI3OKTHR6vuB&TkC_iE3qgTT!?nj)(03$(X@2h8EmJaMi4`}CY`ArNRyIGun{WV zh=d~eQHmRPZd`P!A40)Jgf5GS_&@U?8Ec^*;D6w79{1jJ&;8A8&zE06|D07Sl~zif zfet~l2;Qg+Jf%jVCRFSE%!2XESXq{AQc}tAzme3*Vx!gt<7pweB{-i;=2R5-BP}ZZ ziD>P++kWVWakAdw13U%`tI-yT`?}jD*zFCqUaM6b-Gcx2mwy=6dmbH+7<{dp z)t6q?(Oz}E7R1T^_M>{jR77Ioev)+gFIx5^W6p}%<-)#VPO+VgK8Bdc4N6~EYIpLa zOM3IU@Ow*7m!WyY1F-wByRa9ad8ml&5tVNv->COKgr^eu-!jmP(1~WFK2h^Hacyi6D1cU`LWMTBv%s2J)^Vw85zr-U!H1suiV3>$E_C^twLeZ(1tx{&Df|UGtO6o zN=YlT%QD-14_4I1T)Bw&G7~M+(IdfW$#xx;((0TXR%yMtq1|nFt%=Jw+!AhA{W8U_ zd!D22Z*aMlv6*V@@0E z;ag;V911ILAQ?>9AMZ1mwomk_gFa=DTsQn?S(h=Bj|YVtyL^#|1S~H%~${c literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin new file mode 100755 index 0000000000000000000000000000000000000000..332e100ff099bddf2017b5dc5af95bddaa46c149 GIT binary patch literal 33512 zcmeI5U2GIp6vyw-Z7JH8Me*B&eXs^K?6&121q8OAOrtFgv`Lkio9XVf-MC-Q%!bl{ zEY=z~Si_5n&-!Tmi1C3C1rnl_7d1Q>9*vQt321mQhE!xd=gtf}JCzut4?g@4oVoYh zd(WA3fA?^(upP^7DS9{LOepMlS(<-vwz^lfrAIQwO+J( z^DixqbA<*b$#R|#de)UL^)_n zX*;D!`%Y6h-sgMWcu#mEeA{=J%}U#C9YYAXJyqoRL$Oku%+naJ-@y?@iB-?O=YPaB6?NON~+@p%{u*#U@3&fB+~P?&l$YP` zmBGBYNyjHzA6$FCi`rtO8mVY#C2di4 z&PgPDt9L&t)k(~a5mFZ18q%8xxmIIFnH@T6J7zB4 z8}xge<{hKV*gu&q7-`dzJTo$ta6kWj=6;udA!TF}{-o7%Os7(b+3p>3$F?m-v6wZt zqz&sxCg0VW=r1=%iS$mGXt~KfNJSuhI_BndfEI!nT=m_5qwXA8vf=z$7+$z(rHdgp;f)QqTW-i_40eh$vl1O zqM|*2Jz6<_ORtn}=%>bSoEo6&_cSD?JQ_dbqVm;wI-)L?@8ib{H19K15tlAj+xOB` zs_jYj>{ZWx^&C`Bot}X+k$q-1Ygma?&Uo2OY>jtqk9Q^P8N)KYrr|=mlr`-{-!Kgr zbPtX86>`N)*0g$hhvI`f>7?Y)$l!rpc4p2jOv!Z7u?}~?M18S-(=k&{rjYNa!;aPU zoS%EPl~Pc$$tyQ{r8aj^XtPl*+OoF!G!3HjynF^zyh=;RlJ^}WTxpBGu_nStV_Tad z8EPOWGFaGejPx_Y!jh!Al2v}Ysk!Fojq-|U*?nEKOgo<>T2|+9sf>6wpARM}t0x{H z00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY z0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4ea|2cseMdWWk&ye!< z5&qQ!R8`*v=aPlLvF(ehM`?7@Z}ILspbG>v`gpfCL0TsLl=Md$LmzneKEy3;(~*WX zZHLe7QXGB+d5Su<5~OgUrnm$pS?&dB6NdxN;e_gk>MJ@<>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(1) +# if defined(__LCC__) +# define COMPILER_VERSION_MINOR DEC(__LCC__- 100) +# endif +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F new file mode 100644 index 0000000000..4e88c9ae60 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F @@ -0,0 +1,1114 @@ + PROGRAM CMakeFortranCompilerId +#if 0 +! Identify the compiler +#endif +#if defined(_MSC_VER) + PRINT *, 'INFO:simulate[MSVC]' +# if _MSC_VER >= 1900 + PRINT *, 'INFO:simulate_version[019.00]' +# elif _MSC_VER >= 1800 + PRINT *, 'INFO:simulate_version[018.00]' +# elif _MSC_VER >= 1700 + PRINT *, 'INFO:simulate_version[017.00]' +# elif _MSC_VER >= 1600 + PRINT *, 'INFO:simulate_version[016.00]' +# elif _MSC_VER >= 1500 + PRINT *, 'INFO:simulate_version[015.00]' +# elif _MSC_VER >= 1400 + PRINT *, 'INFO:simulate_version[014.00]' +# elif _MSC_VER >= 1310 + PRINT *, 'INFO:simulate_version[013.01]' +# else + PRINT *, 'INFO:simulate_version[013.00]' +# endif +#endif +#if defined(__INTEL_LLVM_COMPILER) + PRINT *, 'INFO:compiler[IntelLLVM]' +! __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and +! later. Look for 6 digit vs. 8 digit version number to decide encoding. +! VVVV is no smaller than the current year when a version is released. +# if __INTEL_LLVM_COMPILER < 1000000 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +# endif +#elif defined(__INTEL_COMPILER) && __INTEL_COMPILER == 201900 + PRINT *, 'INFO:compiler[IntelLLVM]' +! ifx 2021.1 forgot to define __INTEL_LLVM_COMPILER. +! Instead it defines __INTEL_COMPILER == 201900. +# define COMPILER_VERSION_MAJOR DEC(2021) +# define COMPILER_VERSION_MINOR DEC(1) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +#elif defined(__INTEL_COMPILER) || defined(__ICC) + PRINT *, 'INFO:compiler[Intel]' +! __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later. +# if __INTEL_COMPILER < 2021 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) +! The third version component from --version is an update index, +! but no macro is provided for it. +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +#elif defined(__SUNPRO_F95) + PRINT *, 'INFO:compiler[SunPro]' +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_F95>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_F95>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_F95 & 0xF) +#elif defined(__SUNPRO_F90) + PRINT *, 'INFO:compiler[SunPro]' +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_F90>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_F90>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_F90 & 0xF) +#elif defined(_CRAYFTN) + PRINT *, 'INFO:compiler[Cray]' +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) +# if defined(_RELEASE_PATCHLEVEL) +# define COMPILER_VERSION_PATCH DEC(_RELEASE_PATCHLEVEL) +# endif +#elif defined(__G95__) + PRINT *, 'INFO:compiler[G95]' +# define COMPILER_VERSION_MAJOR DEC(__G95__) +# define COMPILER_VERSION_MINOR DEC(__G95_MINOR__) +#elif defined(__PATHSCALE__) + PRINT *, 'INFO:compiler[PathScale]' +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif +#elif defined(__ABSOFT__) + PRINT *, 'INFO:compiler[Absoft]' +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) + PRINT *, 'INFO:compiler[LCC]' +# define COMPILER_VERSION_MAJOR DEC(1) +# define COMPILER_VERSION_MINOR DEC(__LCC__ - 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +#elif defined(__GNUC__) + PRINT *, 'INFO:compiler[GNU]' +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +#elif defined(__IBMC__) +# if defined(__COMPILER_VER__) + PRINT *, 'INFO:compiler[zOS]' +# elif __IBMC__ >= 800 + PRINT *, 'INFO:compiler[XL]' +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) +# else + PRINT *, 'INFO:compiler[VisualAge]' +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) +# endif +#elif defined(__NVCOMPILER) || defined(__NVCOMPILER_LLVM__) + PRINT *, 'INFO:compiler[NVHPC]' +# if defined(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# else +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# endif +# if defined(__NVCOMPILER_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# else +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# endif +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# elif defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif +#elif defined(__PGI) + PRINT *, 'INFO:compiler[PGI]' +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif +#elif defined(__FLANG) + PRINT *, 'INFO:compiler[Flang]' +# define COMPILER_VERSION_MAJOR DEC(__FLANG_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__FLANG_MINOR__) +# if defined(__FLANG_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__FLANG_PATCHLEVEL__) +# endif +#elif defined(__flang__) + PRINT *, 'INFO:compiler[LLVMFlang]' +# define COMPILER_VERSION_MAJOR DEC(__flang_major__) +# define COMPILER_VERSION_MINOR DEC(__flang_minor__) +# if defined(__flang_patchlevel__) +# define COMPILER_VERSION_PATCH DEC(__flang_patchlevel__) +# endif +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) + PRINT *, 'INFO:compiler[VisualAge]' +#elif defined(__hpux) || defined(__hpux__) + PRINT *, 'INFO:compiler[HP]' +#elif defined(NAGFOR) + PRINT *, 'INFO:compiler[NAG]' +#define COMPILER_VERSION_MAJOR DEC(__NAG_COMPILER_RELEASE/10) +#define COMPILER_VERSION_MINOR DEC(__NAG_COMPILER_RELEASE % 10) +#define COMPILER_VERSION_PATCH DEC(__NAG_COMPILER_BUILD) +#elif defined(__FUJITSU) + PRINT *, 'INFO:compiler[Fujitsu]' +# if defined(__FRT_major__) +# define COMPILER_VERSION_MAJOR DEC(__FRT_major__) +# define COMPILER_VERSION_MINOR DEC(__FRT_minor__) +# define COMPILER_VERSION_PATCH DEC(__FRT_patchlevel__) +# elif defined(__FRT_version__) + PRINT *, 'INFO:compiler_version['//__FRT_version__//']' +# endif +#else + PRINT *, 'INFO:compiler[]' +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + PRINT *, 'INFO:compiler_wrapper[CrayPrgEnv]' +#endif + +#if 0 +! Identify the platform +#endif +#if defined(__linux) || defined(__linux__) || defined(linux) + PRINT *, 'INFO:platform[Linux]' +#elif defined(__CYGWIN__) + PRINT *, 'INFO:platform[Cygwin]' +#elif defined(__MINGW32__) + PRINT *, 'INFO:platform[MinGW]' +#elif defined(__APPLE__) + PRINT *, 'INFO:platform[Darwin]' +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + PRINT *, 'INFO:platform[Windows]' +#elif defined(__FreeBSD__) || defined(__FreeBSD) + PRINT *, 'INFO:platform[FreeBSD]' +#elif defined(__NetBSD__) || defined(__NetBSD) + PRINT *, 'INFO:platform[NetBSD]' +#elif defined(__OpenBSD__) || defined(__OPENBSD) + PRINT *, 'INFO:platform[OpenBSD]' +#elif defined(__sun) || defined(sun) + PRINT *, 'INFO:platform[SunOS]' +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) + PRINT *, 'INFO:platform[AIX]' +#elif defined(__hpux) || defined(__hpux__) + PRINT *, 'INFO:platform[HP-UX]' +#elif defined(__HAIKU__) + PRINT *, 'INFO:platform[Haiku]' +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) + PRINT *, 'INFO:platform[BeOS]' +#elif defined(__QNX__) || defined(__QNXNTO__) + PRINT *, 'INFO:platform[QNX]' +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) + PRINT *, 'INFO:platform[Tru64]' +#elif defined(__riscos) || defined(__riscos__) + PRINT *, 'INFO:platform[RISCos]' +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) + PRINT *, 'INFO:platform[SINIX]' +#elif defined(__UNIX_SV__) + PRINT *, 'INFO:platform[UNIX_SV]' +#elif defined(__bsdos__) + PRINT *, 'INFO:platform[BSDOS]' +#elif defined(_MPRAS) || defined(MPRAS) + PRINT *, 'INFO:platform[MP-RAS]' +#elif defined(__osf) || defined(__osf__) + PRINT *, 'INFO:platform[OSF1]' +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) + PRINT *, 'INFO:platform[SCO_SV]' +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) + PRINT *, 'INFO:platform[ULTRIX]' +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) + PRINT *, 'INFO:platform[Xenix]' +#else + PRINT *, 'INFO:platform[]' +#endif +#if defined(_WIN32) && (defined(__INTEL_COMPILER) || defined(__ICC)) +# if defined(_M_IA64) + PRINT *, 'INFO:arch[IA64]' +# elif defined(_M_X64) || defined(_M_AMD64) + PRINT *, 'INFO:arch[x64]' +# elif defined(_M_IX86) + PRINT *, 'INFO:arch[X86]' +# endif +#endif + +#if 0 +! Encode compiler version digits +#endif +#define DEC_8(n) (((n) / 10000000) % 10) +#define DEC_7(n) (((n) / 1000000) % 10) +#define DEC_6(n) (((n) / 100000) % 10) +#define DEC_5(n) (((n) / 10000) % 10) +#define DEC_4(n) (((n) / 1000) % 10) +#define DEC_3(n) (((n) / 100) % 10) +#define DEC_2(n) (((n) / 10) % 10) +#define DEC_1(n) (((n) ) % 10) +#define HEX_8(n) ((n)>>28 & 0xF) +#define HEX_7(n) ((n)>>24 & 0xF) +#define HEX_6(n) ((n)>>20 & 0xF) +#define HEX_5(n) ((n)>>16 & 0xF) +#define HEX_4(n) ((n)>>12 & 0xF) +#define HEX_3(n) ((n)>>8 & 0xF) +#define HEX_2(n) ((n)>>4 & 0xF) +#define HEX_1(n) ((n) & 0xF) + +#if defined(COMPILER_VERSION_MAJOR) +# undef DEC +# undef HEX +# define DEC(n) DEC_1(n) +# define HEX(n) HEX_1(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_1[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_2(n) +# define HEX(n) HEX_2(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_2[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_3(n) +# define HEX(n) HEX_3(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_3[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_4(n) +# define HEX(n) HEX_4(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_4[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_5(n) +# define HEX(n) HEX_5(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_5[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_6(n) +# define HEX(n) HEX_6(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_6[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_7(n) +# define HEX(n) HEX_7(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_7[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_8(n) +# define HEX(n) HEX_8(n) +# if COMPILER_VERSION_MAJOR == 0 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[0]' +# elif COMPILER_VERSION_MAJOR == 1 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[1]' +# elif COMPILER_VERSION_MAJOR == 2 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[2]' +# elif COMPILER_VERSION_MAJOR == 3 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[3]' +# elif COMPILER_VERSION_MAJOR == 4 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[4]' +# elif COMPILER_VERSION_MAJOR == 5 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[5]' +# elif COMPILER_VERSION_MAJOR == 6 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[6]' +# elif COMPILER_VERSION_MAJOR == 7 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[7]' +# elif COMPILER_VERSION_MAJOR == 8 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[8]' +# elif COMPILER_VERSION_MAJOR == 9 + PRINT *, 'INFO:compiler_version_MAJOR_digit_8[9]' +# endif + +#endif +#if defined(COMPILER_VERSION_MINOR) +# undef DEC +# undef HEX +# define DEC(n) DEC_1(n) +# define HEX(n) HEX_1(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_1[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_2(n) +# define HEX(n) HEX_2(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_2[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_3(n) +# define HEX(n) HEX_3(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_3[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_4(n) +# define HEX(n) HEX_4(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_4[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_5(n) +# define HEX(n) HEX_5(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_5[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_6(n) +# define HEX(n) HEX_6(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_6[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_7(n) +# define HEX(n) HEX_7(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_7[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_8(n) +# define HEX(n) HEX_8(n) +# if COMPILER_VERSION_MINOR == 0 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[0]' +# elif COMPILER_VERSION_MINOR == 1 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[1]' +# elif COMPILER_VERSION_MINOR == 2 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[2]' +# elif COMPILER_VERSION_MINOR == 3 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[3]' +# elif COMPILER_VERSION_MINOR == 4 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[4]' +# elif COMPILER_VERSION_MINOR == 5 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[5]' +# elif COMPILER_VERSION_MINOR == 6 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[6]' +# elif COMPILER_VERSION_MINOR == 7 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[7]' +# elif COMPILER_VERSION_MINOR == 8 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[8]' +# elif COMPILER_VERSION_MINOR == 9 + PRINT *, 'INFO:compiler_version_MINOR_digit_8[9]' +# endif + +#endif +#if defined(COMPILER_VERSION_PATCH) +# undef DEC +# undef HEX +# define DEC(n) DEC_1(n) +# define HEX(n) HEX_1(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_1[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_2(n) +# define HEX(n) HEX_2(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_2[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_3(n) +# define HEX(n) HEX_3(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_3[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_4(n) +# define HEX(n) HEX_4(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_4[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_5(n) +# define HEX(n) HEX_5(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_5[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_6(n) +# define HEX(n) HEX_6(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_6[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_7(n) +# define HEX(n) HEX_7(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_7[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_8(n) +# define HEX(n) HEX_8(n) +# if COMPILER_VERSION_PATCH == 0 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[0]' +# elif COMPILER_VERSION_PATCH == 1 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[1]' +# elif COMPILER_VERSION_PATCH == 2 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[2]' +# elif COMPILER_VERSION_PATCH == 3 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[3]' +# elif COMPILER_VERSION_PATCH == 4 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[4]' +# elif COMPILER_VERSION_PATCH == 5 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[5]' +# elif COMPILER_VERSION_PATCH == 6 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[6]' +# elif COMPILER_VERSION_PATCH == 7 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[7]' +# elif COMPILER_VERSION_PATCH == 8 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[8]' +# elif COMPILER_VERSION_PATCH == 9 + PRINT *, 'INFO:compiler_version_PATCH_digit_8[9]' +# endif + +#endif +#if defined(COMPILER_VERSION_TWEAK) +# undef DEC +# undef HEX +# define DEC(n) DEC_1(n) +# define HEX(n) HEX_1(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_1[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_2(n) +# define HEX(n) HEX_2(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_2[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_3(n) +# define HEX(n) HEX_3(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_3[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_4(n) +# define HEX(n) HEX_4(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_4[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_5(n) +# define HEX(n) HEX_5(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_5[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_6(n) +# define HEX(n) HEX_6(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_6[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_7(n) +# define HEX(n) HEX_7(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_7[9]' +# endif + +# undef DEC +# undef HEX +# define DEC(n) DEC_8(n) +# define HEX(n) HEX_8(n) +# if COMPILER_VERSION_TWEAK == 0 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[0]' +# elif COMPILER_VERSION_TWEAK == 1 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[1]' +# elif COMPILER_VERSION_TWEAK == 2 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[2]' +# elif COMPILER_VERSION_TWEAK == 3 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[3]' +# elif COMPILER_VERSION_TWEAK == 4 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[4]' +# elif COMPILER_VERSION_TWEAK == 5 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[5]' +# elif COMPILER_VERSION_TWEAK == 6 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[6]' +# elif COMPILER_VERSION_TWEAK == 7 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[7]' +# elif COMPILER_VERSION_TWEAK == 8 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[8]' +# elif COMPILER_VERSION_TWEAK == 9 + PRINT *, 'INFO:compiler_version_TWEAK_digit_8[9]' +# endif + +#endif + + END diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..0626f191b1 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000000..ab222437f3 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake @@ -0,0 +1,141 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/CIME_initial_setup.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/CIME_utils.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/Compilers.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/FindpFUnit.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/Sourcelist_utils.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/genf90_utils.cmake" + "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/pFUnit_utils.cmake" + "/Users/afoster/Documents/ncar/CTSM/src/fates/CMakeLists.txt" + "CMakeFiles/3.25.2/CMakeCCompiler.cmake" + "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" + "CMakeFiles/3.25.2/CMakeSystem.cmake" + "Macros.cmake" + "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/gnu.cmake" + "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/gnu_fleabone.cmake" + "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/universal.cmake" + "/Users/afoster/Documents/ncar/CTSM/src/fates/main/CMakeLists.txt" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/CMakeLists.txt" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/CMakeLists.txt" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCCompiler.cmake.in" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCCompilerABI.c" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCInformation.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCompilerIdDetection.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompilerId.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineFortranCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineSystem.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFindBinUtils.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranCompiler.cmake.in" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranCompilerABI.F90" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranInformation.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeGenericSystem.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeInitializeConfigs.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeLanguageInformation.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseArguments.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseImplicitIncludeInfo.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseLibraryArchitecture.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystem.cmake.in" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestCCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestCompilerCommon.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestFortranCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeUnixFindMake.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/AppleClang-C.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-Fortran.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Tasking-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/FindPackageMessage.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Internal/FeatureTesting.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-AppleClang-C.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-Clang-C.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-Clang.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-GNU-Fortran.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-GNU.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Darwin-Initialize.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Darwin.cmake" + "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.25.2/CMakeSystem.cmake" + "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" + "CMakeFiles/3.25.2/CMakeCCompiler.cmake" + "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" + "CMakeFiles/3.25.2/CMakeCCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "main/CMakeFiles/CMakeDirectoryInformation.cmake" + "unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake" + "unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake" + "unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/utils.dir/DependInfo.cmake" + "unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake" + ) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 new file mode 100644 index 0000000000..966dd8971c --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 @@ -0,0 +1,206 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/utils.dir/all +all: main/all +all: unit_testing/utils/all +all: unit_testing/test/all +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: main/preinstall +preinstall: unit_testing/utils/preinstall +preinstall: unit_testing/test/preinstall +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/utils.dir/clean +clean: main/clean +clean: unit_testing/utils/clean +clean: unit_testing/test/clean +.PHONY : clean + +#============================================================================= +# Directory level rules for directory main + +# Recursive "all" directory target. +main/all: +.PHONY : main/all + +# Recursive "preinstall" directory target. +main/preinstall: +.PHONY : main/preinstall + +# Recursive "clean" directory target. +main/clean: +.PHONY : main/clean + +#============================================================================= +# Directory level rules for directory unit_testing/test + +# Recursive "all" directory target. +unit_testing/test/all: unit_testing/test/radiation_test/all +.PHONY : unit_testing/test/all + +# Recursive "preinstall" directory target. +unit_testing/test/preinstall: unit_testing/test/radiation_test/preinstall +.PHONY : unit_testing/test/preinstall + +# Recursive "clean" directory target. +unit_testing/test/clean: unit_testing/test/radiation_test/clean +.PHONY : unit_testing/test/clean + +#============================================================================= +# Directory level rules for directory unit_testing/test/radiation_test + +# Recursive "all" directory target. +unit_testing/test/radiation_test/all: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all +.PHONY : unit_testing/test/radiation_test/all + +# Recursive "preinstall" directory target. +unit_testing/test/radiation_test/preinstall: +.PHONY : unit_testing/test/radiation_test/preinstall + +# Recursive "clean" directory target. +unit_testing/test/radiation_test/clean: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean +.PHONY : unit_testing/test/radiation_test/clean + +#============================================================================= +# Directory level rules for directory unit_testing/utils + +# Recursive "all" directory target. +unit_testing/utils/all: +.PHONY : unit_testing/utils/all + +# Recursive "preinstall" directory target. +unit_testing/utils/preinstall: +.PHONY : unit_testing/utils/preinstall + +# Recursive "clean" directory target. +unit_testing/utils/clean: +.PHONY : unit_testing/utils/clean + +#============================================================================= +# Target rules for target CMakeFiles/utils.dir + +# All Build rule for target. +CMakeFiles/utils.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=6,7,8,9 "Built target utils" +.PHONY : CMakeFiles/utils.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/utils.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 4 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/utils.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : CMakeFiles/utils.dir/rule + +# Convenience name for target. +utils: CMakeFiles/utils.dir/rule +.PHONY : utils + +# clean rule for target. +CMakeFiles/utils.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/clean +.PHONY : CMakeFiles/utils.dir/clean + +#============================================================================= +# Target rules for target unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir + +# All Build rule for target. +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all: + $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend + $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=1,2,3,4,5 "Built target FATES_rad_test" +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all + +# Build rule for subdir invocation for target. +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 5 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule + +# Convenience name for target. +FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule +.PHONY : FATES_rad_test + +# clean rule for target. +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean: + $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 new file mode 100644 index 0000000000..7b4d68d70f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt new file mode 100644 index 0000000000..ec635144f6 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt @@ -0,0 +1 @@ +9 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000000..949f360985 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,17 @@ +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/edit_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/rebuild_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/edit_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/rebuild_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/edit_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/rebuild_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/edit_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/rebuild_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/test.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/edit_cache.dir +/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/rebuild_cache.dir diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache b/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000000..3dccd73172 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks new file mode 100644 index 0000000000..ec635144f6 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks @@ -0,0 +1 @@ +9 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake new file mode 100644 index 0000000000..1dab08913a --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake @@ -0,0 +1,37 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "Fortran" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_Fortran + "/Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" + ) +set(CMAKE_Fortran_COMPILER_ID "GNU") +set(CMAKE_Fortran_SUBMODULE_SEP "@") +set(CMAKE_Fortran_SUBMODULE_EXT ".smod") + +# The include file search paths: +set(CMAKE_Fortran_TARGET_INCLUDE_PATH + "/Users/afoster/pFUnit/include" + "/Users/afoster/pFUnit/mod" + "/usr/local/Cellar/netcdf/4.9.2/include" + "/usr/local/Cellar/netcdf-fortran/4.6.0/include" + "." + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make new file mode 100644 index 0000000000..e85a792b85 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make @@ -0,0 +1,140 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +# Include any dependencies generated for this target. +include CMakeFiles/utils.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/utils.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/utils.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/utils.dir/flags.make + +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o: CMakeFiles/utils.dir/flags.make +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building Fortran object CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o + +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 > CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i + +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: CMakeFiles/utils.dir/flags.make +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building Fortran object CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 > CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: CMakeFiles/utils.dir/flags.make +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Fortran object CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 > CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i + +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s" + /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s + +# Object files for target utils +utils_OBJECTS = \ +"CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" \ +"CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" \ +"CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" + +# External object files for target utils +utils_EXTERNAL_OBJECTS = + +libutils.a: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o +libutils.a: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o +libutils.a: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o +libutils.a: CMakeFiles/utils.dir/build.make +libutils.a: CMakeFiles/utils.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Linking Fortran static library libutils.a" + $(CMAKE_COMMAND) -P CMakeFiles/utils.dir/cmake_clean_target.cmake + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/utils.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/utils.dir/build: libutils.a +.PHONY : CMakeFiles/utils.dir/build + +CMakeFiles/utils.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/utils.dir/cmake_clean.cmake +.PHONY : CMakeFiles/utils.dir/clean + +CMakeFiles/utils.dir/depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/utils.dir/depend + diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake new file mode 100644 index 0000000000..3c01a04cf5 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" + "CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" + "CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" + "libutils.a" + "libutils.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang Fortran) + include(CMakeFiles/utils.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake new file mode 100644 index 0000000000..820ee03e9b --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake @@ -0,0 +1,14 @@ +# Remove fortran modules provided by this target. +FILE(REMOVE + "fatesconstantsmod.mod" + "FATESCONSTANTSMOD.mod" + "CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp" + + "fatesunittestiomod.mod" + "FATESUNITTESTIOMOD.mod" + "CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp" + + "fatesunittestorbitalmod.mod" + "FATESUNITTESTORBITALMOD.mod" + "CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp" + ) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake new file mode 100644 index 0000000000..6da29f6b6f --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libutils.a" +) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make new file mode 100644 index 0000000000..ab29ade490 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for utils. +# This may be replaced when dependencies are built. diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts new file mode 100644 index 0000000000..92e446bc27 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for utils. diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal new file mode 100644 index 0000000000..f7c3988daa --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal @@ -0,0 +1,9 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make new file mode 100644 index 0000000000..304216def0 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make @@ -0,0 +1,25 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Note that incremental build could trigger a call to cmake_copy_f90_mod on each re-build +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp +CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesconstantsmod.mod CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp GNU +CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build +CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: /usr/local/Cellar/netcdf-fortran/4.6.0/include/netcdf.mod +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp +CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesunittestiomod.mod CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp GNU +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build +CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp +CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesunittestorbitalmod.mod CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp GNU +CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build +CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..2b4ac0b598d43fed2ea70fd8680dacf9fc821b43 GIT binary patch literal 2256 zcmV;>2ru^^iwFP!000006WyF!bDKyO$KUxByvcshRA0C>Z}O&`Dc2-U%Hy4V>}sHq zh`49~dB*eU_aF%b5>3#qW4q%@QtE~%{L+{6?{neTk6#`hA8zi=G!M6lG@oQq#(8GW zust(_LW)X;W>n;<`4K*rAM&iML{^ob^YE9C9x|@3uFaSDWi%hI4fr_lo0zjeBuO4{ z;g?(%MPAIzSyVq%&^#0{K;O*7=GE2Ln}?gvw~x0E#=q}>yZ`c^`}y7dfGIkAkz+JPx`r*s{?~ga|mA(7S z&V4iVi)HzYL;`ufEo^HscV|X@?dtmQC5Mmb+Mqy~626fIPsubkv(IMyuWaTCn=y@z zxELLO7S_x>Lo;@0R*gpYXjBWd$Rbt;%~qn>fR=AJi41whx0_0=<&Ouf|H`lM71rU| zn|8f?&S&Sy-8C#3V1wxnY)*%5!-G8C@DdhboGpL+((666ar)2~BH{+oI9+t^5pnag z4IeXSp?EHL%dV7x7V9n`L|Qg-T*5qyE#_x?iqVXm*P(lsVxl#8V?6AH-5rxEw-pSx zhcYX9RLFA0llaeV9P+;aP!F?5CF_H#tRBV(94?-gJW9lpCo)@BE6uhTs@!5QX$XUr z4Ay)j3X#Hstn?U26huri#|d5JvISx4k)#dhYP)=eUGycaeD??7Y)84>V5^~vvxy`3 zZcN0GFx#65Y&TR%o-KJ<6=2-;T!7f~c9_P{)N~rmOLWX1HxG9=|N33OClm174A zWLbzO4#$D1Tgn@=dBO1~L<_8D1O2fQI(dg27W&K=fs0Y#TZ{SGxE*ICsE}2X@|7r_ zWLa@hNC5{Q5ma%WX=WMJt_I@tDFadX+Tp3~9s$h~2cmX@ZKfVl-;GTeT6cTZLRf=U zR(bIX_WYHcLj+_>9EqgV&EIuq*jgkCSL3SK>PDoVd=$jUx4o(Urp2B=*;G>yA?v*g z(L;n-n0eH-{J;@zRBL3VHKVjeOXX7Nfj52NK!+q!fCb}u6#YCa%|2pHw8`&=O1;Tb zkQ_-`z~jq=i)tNbTvj6C1Y!555gyd-Ko-wnsjI%aDa*u{R61aH%G6=Xn@PIFKgkVc@htBP_Cm z<_~8vKeKX2G}@r0dZ0~LT^8t)RQ$b(baO}IvzSwBzAX?XsZJt!vWm2vmP`{T1@!No>NYKCL&- zL+~Q%JC-eQAOge|NSTIU;~uC!DKnV#qHsh_SPPUqt5%vNKL!0TqdL}M*D__Z4|Z(y zIP+Yv5J9M995_}*&cnE@wuLXUK=J?}mw6G(a+KImAzw6Kjd4|Sfrc@Z9*7;SUDJmC ziu-Xk4)*?}nOd3I&JGJkk5|u|?~K^{0~@k}2Qaq=D@0hQXGoD=g7=?gGop=u?drp z3=T+^%_^_*@)^tm7eSE3Dc?IZ*V|NpSX*tgrEHzIo{HZXydV$sMEj4?Y5tr4~6fS}nFKvTs2#Z@pmjGW!$yR1w^ z2R^6fi(#92j&k7C&Vi<`Uji{xEJew`@ikxTa;7K96|U{uE|tQ!M#3i!>)`1^$85xq z6Gee!IAmkn3dotF%=`q-@n9KX1?o}3gt6y(9>XM*0^`N}EY-9XY%bhi%3!ByLZL^h zFt#z9q-k7ygiGUB2&un>$?JJ27DKA#07rIkc^1N^$pt7gIL*s)l_#$txL?54WXp-J zCYN?VwX_cEU@$9|_wi7S%+r{abqrF(yv?Gg4sZ+5?zX5pR-LkT5R< z+6Fl37%1qNy5vHOjQz`sE?f{YFl0|L9RKvL#8$gzTu?LHCIF+2Sfjot0@04*Q1#Qn zWOyCCR2#gh(KCj+c$&~ncF-`qrwe$M^Yu~>AxbF|g!;_281?01uC8rmAZO|*QmK^` z^(hM?&qoM8grm73_4{K6-X4QY(tqU&GHL%sCCIdlf!BK=(;j&<1~Q$2mrB4ya!=pK zfJ}Dw5(8vH$hNk?&~A%Zhw44+f4(gU-B(INPg^_LDK3OzI;lC_e?P%Sr;ZKUq+k67J+xOd z1syP)BZWqAgFRfM16Q10c?&%LvEb!U83JAGSX2QmudPRbnT5Kk{LqG{KPJFKo1A8i zLm%zuT0@W3OH+mp7!h@bFI;zqlVjnE+si9O-9*#%VKsRD97b3UsGs-;J-C}K2W?_> zQp})Dk9k?pvbq^f(6)PdK+xfIvS;8wd7n+wwJXraPBS&2&l^c^K&ROc&1y3D$pR;# zbm%7i05tSaYiH$DYzHW<@^3!c#nhrp(TE)OEW z--2m4?th1SNY`}@Z944m1+o)g@TRk6?%k+8HzRa9XC6A#ciSDtcjxOm^#(z=cj7{U zT^1RA#{+cXk>fgCCIg3D=!PLzoDbpR(BZK;Rl#NZcosqXlZi^c!_DrQ@`X-zrWetP eh}_@UD6gY7fj)d@(4muD8~+8>o>chnO#lFlSy+$& literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..bac5e8f68dbed86771ad6e160e953b2ced9f2e29 GIT binary patch literal 24087 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 P!!w~bQoeT*Pci-nwC<&` literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..cb85e3a79588da53be704d893829e4e21f8807ee GIT binary patch literal 25076 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%0Du&QhFE5>J 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 literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make new file mode 100644 index 0000000000..97f3ac41ce --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# compile Fortran with /usr/local/bin/gfortran +Fortran_DEFINES = + +Fortran_INCLUDES = -I/Users/afoster/pFUnit/include -I/Users/afoster/pFUnit/mod -I/usr/local/Cellar/netcdf/4.9.2/include -I/usr/local/Cellar/netcdf-fortran/4.6.0/include -I/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +Fortran_FLAGS = -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk + diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal new file mode 100644 index 0000000000..8030915fe2 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal @@ -0,0 +1,5 @@ +# The fortran modules provided by this target. +provides + fatesconstantsmod.mod + fatesunittestiomod.mod + fatesunittestorbitalmod.mod diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt new file mode 100644 index 0000000000..bac60900c6 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libutils.a CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o +/usr/bin/ranlib libutils.a diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make new file mode 100644 index 0000000000..fdb0a7b084 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make @@ -0,0 +1,5 @@ +CMAKE_PROGRESS_1 = 6 +CMAKE_PROGRESS_2 = 7 +CMAKE_PROGRESS_3 = 8 +CMAKE_PROGRESS_4 = 9 + diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake new file mode 100644 index 0000000000..2a25e968d2 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake @@ -0,0 +1,9 @@ +# CMake generated Testfile for +# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates +# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("main") +subdirs("unit_testing/utils") +subdirs("unit_testing/test") diff --git a/build/__command_line_test__/__command_line_test__/Macros.cmake b/build/__command_line_test__/__command_line_test__/Macros.cmake new file mode 120000 index 0000000000..d2c6ddac24 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/Macros.cmake @@ -0,0 +1 @@ +/Users/afoster/Documents/ncar/CTSM/src/fates/build/Macros.cmake \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/Makefile b/build/__command_line_test__/__command_line_test__/Makefile new file mode 100644 index 0000000000..261969932c --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/Makefile @@ -0,0 +1,260 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__//CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named utils + +# Build rule for target. +utils: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 utils +.PHONY : utils + +# fast build rule for target. +utils/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/build +.PHONY : utils/fast + +#============================================================================= +# Target rules for targets named FATES_rad_test + +# Build rule for target. +FATES_rad_test: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 FATES_rad_test +.PHONY : FATES_rad_test + +# fast build rule for target. +FATES_rad_test/fast: + $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build +.PHONY : FATES_rad_test/fast + +main/FatesConstantsMod.o: main/FatesConstantsMod.F90.o +.PHONY : main/FatesConstantsMod.o + +# target to build an object file +main/FatesConstantsMod.F90.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o +.PHONY : main/FatesConstantsMod.F90.o + +main/FatesConstantsMod.i: main/FatesConstantsMod.F90.i +.PHONY : main/FatesConstantsMod.i + +# target to preprocess a source file +main/FatesConstantsMod.F90.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i +.PHONY : main/FatesConstantsMod.F90.i + +main/FatesConstantsMod.s: main/FatesConstantsMod.F90.s +.PHONY : main/FatesConstantsMod.s + +# target to generate assembly for a file +main/FatesConstantsMod.F90.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s +.PHONY : main/FatesConstantsMod.F90.s + +unit_testing/utils/FatesUnitTestIOMod.o: unit_testing/utils/FatesUnitTestIOMod.F90.o +.PHONY : unit_testing/utils/FatesUnitTestIOMod.o + +# target to build an object file +unit_testing/utils/FatesUnitTestIOMod.F90.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o +.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.o + +unit_testing/utils/FatesUnitTestIOMod.i: unit_testing/utils/FatesUnitTestIOMod.F90.i +.PHONY : unit_testing/utils/FatesUnitTestIOMod.i + +# target to preprocess a source file +unit_testing/utils/FatesUnitTestIOMod.F90.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i +.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.i + +unit_testing/utils/FatesUnitTestIOMod.s: unit_testing/utils/FatesUnitTestIOMod.F90.s +.PHONY : unit_testing/utils/FatesUnitTestIOMod.s + +# target to generate assembly for a file +unit_testing/utils/FatesUnitTestIOMod.F90.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s +.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.s + +unit_testing/utils/FatesUnitTestOrbitalMod.o: unit_testing/utils/FatesUnitTestOrbitalMod.F90.o +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.o + +# target to build an object file +unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.o + +unit_testing/utils/FatesUnitTestOrbitalMod.i: unit_testing/utils/FatesUnitTestOrbitalMod.F90.i +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.i + +# target to preprocess a source file +unit_testing/utils/FatesUnitTestOrbitalMod.F90.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.i + +unit_testing/utils/FatesUnitTestOrbitalMod.s: unit_testing/utils/FatesUnitTestOrbitalMod.F90.s +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.s + +# target to generate assembly for a file +unit_testing/utils/FatesUnitTestOrbitalMod.F90.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s +.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" + @echo "... FATES_rad_test" + @echo "... utils" + @echo "... main/FatesConstantsMod.o" + @echo "... main/FatesConstantsMod.i" + @echo "... main/FatesConstantsMod.s" + @echo "... unit_testing/utils/FatesUnitTestIOMod.o" + @echo "... unit_testing/utils/FatesUnitTestIOMod.i" + @echo "... unit_testing/utils/FatesUnitTestIOMod.s" + @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.o" + @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.i" + @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/cmake_install.cmake new file mode 100644 index 0000000000..c8099b8c37 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/cmake_install.cmake @@ -0,0 +1,57 @@ +# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake") + include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake") + include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/build/__command_line_test__/__command_line_test__/libutils.a b/build/__command_line_test__/__command_line_test__/libutils.a new file mode 100644 index 0000000000000000000000000000000000000000..801611e8e9d8fa8e4ac2679e58fcaf3a36e6b717 GIT binary patch literal 40264 zcmeIb2Ygh;7C(OPCL1=CBoIm{fdvADl3qw?JAr^33=o+DUfW!?gkQybTvX0 zP@bqy#E#goBPuK+#SUUYv0y_G3-UlwRQ}&HcV>69*&w|4f4|TBeLlZQ_MSOs&YU@O zrrx=8=XM`rbrhBkYu+;{Avw|LbxG+NNhz6`iRtM^V_IS|0<_?y#KiQ}RHHF9IYThd zY;Li{PnasZtEA38~)$VduR2EsrjLX)j7JHSYu(G1c;w-e5m)T1^?A7)%7h<`}DkXn; zWl8Zxf-9?Rc1v+tx$Po6B-CQBt|+iM8gW%R3d&s8a+z9*&1DfJ%Uo-@^Y8ebr4Hgp zW}NdcmAA-NSbnLzRaS?!!U_9QIm?ox0`!zK3O`^ur=<$^naxL0L5z?EF{ZL8epF^+ zd?lnR$~(XR@K-ZMQG?(|u_?j$Z6L&mA6!TLq6lxoJ=jVM*d}-+4w(x5LPb1_#bv8; z2?W4mnKUwgk{9>)NqIi>B|d({FS5FqxmsrZ| z#oREEHzjMrC=aic6WLNDy(IEGv$bY7P#cJs@~i~~4%=MHZ$o(iiBBOB6|QQ#ZD?Vo!256!><_qI(S_}3(893Z1$ous~yB*hs_p8B^Fn1 zvzNF^>0&C%Hs9eaIs%&xaR}GzSb5stfg!JO_%6W)gP+4s+a>f;w z+6rd_wU&b%XLXcRSJ><>XzHx6x(Z7@A!T-S++{^^1(owbE3>;CWp-y-VH~>n>T;Vi zuFC2vH6~O$9SP-?7=02-iZ!z(l$RAGloS>w)MTVv(o^HCRaND-xFV}#UYR{PDM2%6 z0t6P8R~Ok7gDzpR6V^(w7FRl5Hb+8sWg*wdnP4xpIub@qnm8uG=_pL#!(c*%walIn zup?G3OHM&`S$R={g+|W`tG&oVMn%`^bXhEcsag%waV;7RyXxeAmp4u?Lw!?2J>x-8 zupS1smDn7yv&-y7LsR=I!Nj76VPRd1wZLhyIUJP^MJ*rr7R5EJ|DgBr7V)iz1sQ@J zHfy;SF9Y#j=J6_$Emby$r6O5TpG(qW@D_2yZl*7+NYMgQ6m^GB;F1;bSs{g$)hMqb zi``OP<+9GUDXKYfJ*BAg2Kh}o)X@Vuhw9;|@}D3Cm5_CA ziKV#QT4K>!kfMgAaUFy7S~zb77CtSoIBhOP?Knh}Gh|!(hJpgXys*** z?tWS<5JQ6iLPT7IhS$OT4SC={8%qy7BkVi8dbqg30cX_@@WSo_XzZA$m) zOL&pYE>YCg2@UP2FL7AsT2L6SQbj#2620Sgay^;8)at2TyArjCaU;5%{4%|hDWtT# z!cuB=%%#R;McqWPSqm`}wJYjOEk|kt9<=fT3bZD3y>%gFg;uJ4sK1Ju*^d)dL3Fw* z9WcV6{*o2lm=gumtv4qqA!RN{HSjLIv}pQSS_Wq+>S6y3&ek%Iyx%N>{&@K3cgGau zne-y4!d7BM@On{Mc>|&cCj(~3pdY--|9`&0^Q#d^`g z(b5(5B@tNv!?T-y-Me*|46LBQ7et`!PV^PrV1*Tm`k1iFg0_!e@x}ZVCJ|JDpojbn z7E)oYsVYX@>#3DPgucRK+;#qT7eQ3%>U=V#>8&M?B(^k)R#925Rl3S@MZMFnO!P9e z8XiTxM+AHGTv={KcW8AwEeIn~>qo3A|Mn~7(#t8jnD0fGt4%4A z8CdMDQmr@Bx~uooeHxDv3yvzSfmEU7&iUCt#BRZjT&bhdQdH)2RXYl-_ClMb5Zzfx zrK1dUJ~iGXs<+)zR8VRuz`(1h-L*O&g6I^_!l#>x+CPr-27&Cb7Eu>svsTE!Ska{P zb~I#~4=CzlVb@Ksoc!xb^D~(t_DX&SS%9Wm;-D#lq7F;aT9aPn0=ZGtvwn3fq^h*i zRq3onRxH-SLQIS-T3w%AU4hxFtF#&uSWlJDRMhEXMXs8PNV6P8oi>ECsfMaDjLx|0 z#n7V)rN4{Mo^-x@C=02=NKoh~D`+rKU6G>2^bPfnM8mzIWl*pd(-rhkikhGqP}Mt1 ztWL`;%WTVRUWGmtL(tV{U-)>?P&f02^WdYRh7CUO+vmzXMg%+U1?8w=FbA~57&lK; ziq_x7ExrA=IYadr`FI7!P^hT;l6|U7)LG^U#gtJ|U-b=D#`4fgJ0?-J7AvfZ+Jlj> zvK(bK#drK$GKGa86^&D7Fi{&1bb6OIX3{Wfn{Pu#ldLYZw6Da-S4^(W9M+f*qZ#G| zih4|>wfk)Bw3|66h9nwS=EwPD27^)vV$3Z=XXn2@q2_8+1)ZMSsn$1hbKdVW;M?AM zE6W>R!NWKBge&NSeZr}|Z}jO7ct=9w3oWin%j^;q#dRY1^Q=LiwBD05Oi#^LYrwoP z-WAe2m8j`=&nY%3YHPKZA+p8r7D0y2hG&Mij0nLkLaGvE7}R2Li_8|+Geb_Ksim$t z?pb1#7A=N>5BL1Nl^iVd==*s1h^Y&hLi|X$i)rRZ!mW=%ko1`?WJF~+Ivvcu;OLII zKfHlwpiPHR+!Xx0QfOxBKi#BRV}p4lMeE{;hTH{kbVnJiSa4NU^?X<>0^(*&y{y?d z&FU3pRG{@0ac4Il`r$u>#D~MsmqBshZWOp&|B<)Rm%9FQh$6yCdHcI6%GE>& zR+bQuj_!b{kCo1UJ?XHJbGKlK2t$>Z%mE*o^{LguPI6s|_-!+$?U%noPId}y%SO4`NGcBmVZQ@r&S%Qj2w8VD7p@WOXM;rB*$;W- z%#eqUm7Je`+WKQt>xHk2hSWurhfdg26VP8ZUgiaiUriK zsrAQR?X~#BHK0tVKDeQ4N?ySA#}Xm0NXWSR66H0u{`iKFmnh@~MQfhTJunDp-hlcw zwf=Zs$h%oYP7(69{*An*)*ofRDb!P5LBHqc8tC_T>yO)@2k{*4g|>m1RK4?rKvI={ zRP;vtL{)(A(%tf*w4|W8I`7l}0S{Ga%|{|u@k+mYxt@5`lc%yKXHA+s(Y*Bg&FGbL z>i#g-9Wt-{C49xb;5FBs-a&nhxqc``Jx-UpUCYlI=FQ$lwlyC*`tT%ps@dins*Rg_ zxF(smVZbkjU33J`YTF|P0YNShrg0OIdLn7RH@ZW(hu zUz*-dU6{G<$DL$p&R@5CyJqz?P!Oa^S$QP<*4^RH9a-rPzttW7oI7-P_zGet_1D0{ z+o>7PNHJhdVaNUMa)8Qku%rd%KhfLNing6X!UAR45Q58CP-u9 ziq_p4vx%Z0`UXI%A@C-Gg&eYJ%);UavMIBOTF27~UwH?T)7rgx>8sSvubG}TEo=I2 zf0NQ=j_gGMf@s=kuKUVd_c_necA8trLKZYn7=n}?kPHTIUy)nii|Dy^MOyA{Jp9oZ zBlI!XmB&<3E^DakBafMQDP8KBd{oP$zOIKm`C$sE%hY?JeCn=;re^!$++9W`}Zc91t#hc{GxyChw9^U%p<#KBXZwR6TlNBHR2emHIdu#b_ zWFxxE`2WR5ki+k#i)eV|!)T87D9uRwE9j~7L{}wNx3#d?tO5AzI|@NY#53Azu(;=p zH;%B{?UgPg?aMG~V{xUuyf)rgRB3Y>DTFg}zCJD^B^9rU8jzFTH_uU7P;RT>vGE|n zSXSvAWSlTz%9JS+9FBSO<~fucdy%ci*r!){Q6FPvv9YKO4*}_kr7?+6tHWWfHTEgy zu#d68Mo$p&vpJ0XDI)P8D)h~A8EI-~%os>C%AoPG?)>?l624Q#UXoDlDl2ztPxl(# zW+N?fm!-G00FOV7{7Hhp-v2Ensf(w|{qH(4M0lc0TtXRu>fFFdTtXS>A5Y>KF&jAl zcoOFWu@9$=FG&)ozTMZ!_>v}ZvAiM4)aN&F5~m@=*U9*jCUJuxv<0NGNLAFDh?dO^ zYlI-8`?@%RlnW^F2StLxBseUhUZ;7YRtE)>q%h-k!I~#_xjvY9!w!T8ABPp2hs6pG z4MYhE8ZdAoZW^Q>>ih|$p(=Hx-kW|$NqIP_4@lgRoEMxvmvxCj_zR z3#?9?g=ApwL-$)KQgc0?I$8?xs2P4EC*{$DNIcc2XV#$_30v}112N$lwA@~i)E6uC z4R>77&WYoY+DzqE6}ueOaAT9&`|^>7(#aOAn`gKO{ez*n%t4QtI*h@yyEYmfT7_g`i+EEFO`IEg#q_(p>fK-cU}_!6G_jeLWz(Qnc7l^VYhkUm?0Fig&vIBqb*UM*+e%a=D!a^|*kQT`IXk4vG|49#Rp(6cynxMexlxju# zOFXoN3N=M?GX>Ns3pIkzRi-&!&~%DRk^X5O+MEDsdLJE0aZ*;UAgIcC>6I$0%0%gv z8iPxEM+@b_C1pw|WlNn@WkO>?6C}5Uw9rFNS^}{gf;3M+kfiq}4{7|(!h5TSG(mbF z@sP$pD!dhaJDwC`~A z3~+DHMlxnLkgx<2{2u@x0^L5FpKHBiOzPsUZT%!$7=zAG%4bffQM%TBEzH5k~RNq!N zuC2bOp+p~HFoxvo`-d#ohYjJLHTsCJ^t~pA7>e~_A%@-|hV3DSmqPNFZ7j~$Cx+DN zJL|@_)A!aTb=R zK(og?xVMSLnEyH;M$qUN0Q&%c60kquJ%GId7YTYbAPPQirU<9Czt)JCEAV8%z6g&N zcsoF>O-6?TlAIG5PO$0|{RkkX`ye2tyB@F)@OnT>cM)K3z^Q^hUeI#@@d!D3sK9#y zQhH$m4*_h6@ZZsJdV~HkU<=@P144ypdL~cl-U3MJE(4@==L1r@vj8dHC_x`4=yadd z3jF;99sx+{o=2;uc>e;VbiW0p`1=4U-PM4U?n*#PcL^Y+TM0<%mH<+G3!nk?iGUP; z03gNd0EmG$ItZ{A=r^G;68(BWqAvyP26`o6cfgr|sO-_h1fBqhnL)G>Fb3ftA&}y4 z2J8WRBOtO8eH&m1;3`31D(JKi14&1h0irXGn*x{!7zs%ER{=3J$GwaCgkd}GbwDH) z{SqMQvjq?=(W?O|{t7_iw*!)#VSxPrdjc8(+W^J`PDSoq$IPNX&R-8+HoJ1P=p70qz%YD_{rUn*_W85RWXw zY6P4Kh_u7<1k3=$y?z+VmP5jkM2Jy92G~VWW)Q@q$uOh92_i3Hufe#mf5>SVjpBVL zU@ahmLacxkK3vcT30Q*+qZ~tq0aCnl0s9Dk)D0d#0+7NN33xU5!XQxImdqg>3CY`$ zLc;Nr`#^F9{s|HzNBfS#kVXwED>>pN+%0guz!Oo)$^C)EIlsXFML2lA5%Rth_*sE} zA@Dy0epukDkY7&n@iPc~vcMw*o+|J}fp-viuE1#|p!in_oGK^bHi6UBf%=l8Lf=fn zVJ|sU|0?vEE%<*Fc)7s85x8C8p9s8C;3XoxIReiUxI^Fx0(S|#jlin~KAdpqCih*O zg^j~uD|tWtAkquRPfnbAQ8;kvHo)V9Do6Zq%C>L#BYyZi1p0>4jLjF1_6x7~!(a8| zFZRQi`r%1_@hAJ?)ZgIW;|}=YSNh3o>laROed8;Z3R?xeAYie`7hEikYP$>T<=Pt= z*xHRS?R89=h%{W{@ST;Bq{50SUrE@;OY^jbB>C!q1)C@<0tES!twpn{oi2J6(xai% zR&Fbl?-Mi#z>^2@nt?Bwb^v4luQ#Nr{P1}vWuyWt>%J0@6aJLKmqss9Ig9ZYif3MV z5gswiY|H`4Wp=#r;Ru+XrHD2SH(dbUX)xdRisIyN)F|a6GVx2IO9px9GLSrUNhc3o z(#S)XRPxXz1;1pvB&8^pS=AMIM+Q$?;uGU}00kyfV6tN2>k;wE%1E=eUn+^{#K1jC z3KmeXFceQ%B9ZBmlqlmRiW-dliYeOuLnC*d_f?Yu?^jGtP0zsV$#8!A6~}2W=r-82 zh%^H2TdYCeRpyzpZ~r# znp~2j{*&AW$Rqn5zRDxFfeHU^U*G|nu)#@rrMPJzdFLRHhO!pQtxGaT7SMC@2?UbqEKG%Tqn%WoGJ57t3g~=+p9dgY{L+Kh& zUQ_!5ORmr&%7u>$xn4oS*Oa_~`vP|hd7}9$*NnL|c}?vL3^Qx-Wxw^Hkaqy(Axs)j zzozyD4ioa85V1ZG@(%xvyr%XA{xDk8PgEOaCHfUV*Fe8y1V-V*jI0}CHQTwB0DeQ7x)|9NP#CE^s-$$A2-p{Ff%e<;vu{qp+=yZ1YfG=}b zr5ERf+xH$P$?#pfZ_KI+^4RxClKu13;Zt|>u!gLA8?qe(+pDL;TVu0UarjTKoz4pH z_a-HDvN$~9gtJxF^6%9K^xdb!r|mi&p6^CH-Uq@zQro(7Iy@pb#sK<$N@5=|nwP&C zrR`zLnvrGM?a5SZPTkpD+UNHMA~gf26y+m!2B#H=#~wx!9dlRpfR@u@B0%_x`$Flp;HugZ?eg9rr$ z5-T>9`P8zd-vCg^tC|f}ZcUpPzTz_|X0AKWD?)g`{SYh4 zi>gBF6*2jUjfD3Xhfm^`Lfzpo{QBb|6f#Ayqn1U`CNTr$^hIi3%g-l--~1?Wb0M~~ zz8ij1G5MGO4r(p=>SxIvX5K`nW*<0*Op&a5S#LBF$BvV5(#8`iwVfIaQ%_pkgh8ZkLLpBhlH=7jgp|r-0Tm(z5p#6`QjYm*G~dQ^(=&J0x}rhZ@@rn zKE%*61|08#<6!vpS0J+2G?^Tu+C3FNRP9*!(7a%zL~qiuyC7xiNRrhW4Mk)nD?FbU z>@KPYyUnXs#B4$lATBA*RYcv%CW+(STp}tVsx#zH0&8gGMmmCz$F&Jh?- zkg1jl@>IS-(i_CvrB-J_{F1cn4bQ7QAy_wmFMM%S7Jv(>73BYf!JT#i7R=l`9C z^hErU3x#IhO$gkMpvK!yeYVr`s!K~A9@>fqRTnFWjjOJLjm3Udm-zg2*p9B1w%y9= zE#al*U|wW{qx_ZCieK^#gT^D3S3+le;2~H_w#>I0wWinK;&y9 zEk@>%+HA%%w^@EZGW_O^WDh>Axpo?+G?9y)|MqmoGnL^}mw^7@u^4@=3M`Y(y+dFVvZ?6#3Vk$e+82R{PK5UvViF!W>MPg2c;8&Al#17 z#0oQ1G0pbO?OqRG_BBj^X_^}|z*FHjJ^(Cy<=wcFeKG*Khx$xusIlQUFQQ5-CanX> zzx;PlNAs%ue`wN5D)ao~HYMSe@ayk_g76&(zb;ps(u%CMo)nXDA`>J}1l)}zyfSZq z2j>Fj4dWFXr8Gm{R&b+bocQxEK0`)jL72R~5VfDonsMR?IAC}bfKS{894}}xd{uf7 zq>ESHv1EHO?eed@P&PLv0||=xBibY;nVy?cnk0&uFmErY2beNrMjlKvaz1CDOOsMh z8xD>+c~pjrY5p?T8Opf0JLM8ieq!eLh!qsycWkdO3$(HQw0JaC3aaHC-_}7Fa8)F1oGXv#&n|2VnkJHun4JemQzy zWLy8Gy&qsJy!8AJ%>3WUztH<)`Iqlwq~IyQ|4g}6%)MlLrzWTT&*^ zR-S39ojuyu*k?ehwXe~Pqoa(jN~5#NR#;YCYs9Iiba1MXbJ_67z&VJ-jVyDO;%yr| zc^qUcqti+(S=j@O<0crd!J9p0a|Re~g@rcz03*(>Ggi#Cl~+yY(GPwW?Ew3K}MyaR4&n@BFW)u;x!?hY~w1g9i&VGEo)3p zo-rqfl*HL&B~D{3iM2vzW||hEFWw}w4KfcPIVl zBHj4s{5kCWpsKfTcy|QbklSwc=sPTIx%>5dMrJzLtk34$cvGsAJ&vQp+Wwf#w#=L~ zp--1N>=&FI^vZ8m<|09Vl(1U{sbf}HEiAjN^3=-PY|Qm+yYp|n>13}y8E?PuHzy0* zk$8K*s_`s-&8Bln$7Zmk+xtbWPo2%?9{p$Q2W*oWrT*DbP3Te;K74t;jC#Vw&p?9OA+4;`OX$X?u5A9Cu(DeTjj zkfrPIn=SMmBJ4Ar{qT>Nu`40wgPuh!b;Q}- z%zWz}`J0#3XZ87~iM_Jo;G^Z^7&|fYhilsn$Y6)xtDW?RLco@_$VWB0rl(vRJmx;S_Cp#!F;PQNj8wb^Crc_!uT_K~Men%?8sGuEP7|k7W#0+5KJK?ClQAV+8{aCA2;{l5L%mUuD{M1v?)z?{IeSUrftZFKK>- zJDTb4be_t6FPTN?PWPIm^kg4KxrQI#bi{P?mfkmPzxlMOcFNG1UBAAPJ?wrhz3Pg- z?4O_QIX`E?Y15JOliGE3=-Z?V8_BTaPKby6ox2^0&08xqVK1Hgw6zYyZsa z%bsp__0sPBPnk6PTrim*ID9apq z$Igr&HBEVQ9NToXU}UQ<6WO5oe|+{}x7O^VnP0@bRoRbS|NHdAcN|P&k3h}vZASKd zA9MLUTQ1AEe)hB1e`92+qi_4G*TWY~yNl3Lw|8gH3<>}7?T`1F&h36@arj@|*&n2S zyUy&HWBV*uA0Nf8>A7r9l^V-_89Dr#w+~Jb^&pRZ^vndq*PkV`UbpUuaOl!m$F;G~ zJlZ>to!r9WLN4@X=XLYHczflSrgFngZ)~gW!S2Z^$a&#&v!|R#|J2#Cp!dH_cV3th zorxD4s;;@FW=6lgCja`!ZYbKX|NJGk`iBc~V}H4i1^=~vP^&xdW_z~{sJiomjqc+g zMC|%u<}GaVjEV(6zg^FI_PYM|W?k#u_vOvJGIYc$R&!&EU*12xjNQ8W*I`x4V)t?V z38&@eh3u2!ey{d?qM8}!J@c;n@kI$+xo`h{ zwi7n@kg3K*{mVrxA!|x`bW9OjX8GvFv|1}G{rTliFK(Ub{>Q+B=f-7EXQk)w`6_k5 z)hy-t)!#hy-V`>j|KO)1pPI~8L~R_iXys(4Msyjn?Sb*EU5D@cr(QeW{a|p|Q*%d; zbC1aT*!{|$v8-#xD}NsOHP_wJcH4~c8**9qE$biGFVA(K&Ci};?0ltr;>QPn9CiO_ z_EvSLvWLS*vkyaS$G*D6>@GU{=Zz=(nBBadJUhyL#iY&l_^u<}PaI$HRI}nN_kn>= zKNLSWi#;%JaLZr6WA0vIH$Q#%`;2WX$(>ivOzz4-+xnTl80H>2sc6SrbBC}8iar~c zoIKclV@vBvL;Jz(gP8c|E=(EZE}U^im#1FHV0l@o4^MeCgJqtXv)@{g!TxAJ+&Mfb zgFW@w)_yIYPh;(Vef9G@>(bnNzb-vti%w>lI^DM)oK1Aky>asL#JEIvVN~&yi0A~i z?cKfQG3Vl$z1Pa!UF`8}{~M;eD|B(J->mm1=ItHeUU=V=0xa!#=n!VcV*#7QH8k_G@W8D7r@2@*M z^x3g-2n$yBZ5*0e%4~BktUZzKWWBnteJ&};#SZ^$F&gI1Vf^gOHz%{FHYLVJzFW;Y zg#VP87&epD9~`vhj_g9V;hvwf^HLq`wr<;Ak9>X_v#^9uYInKV{ktkE?zzsv?m2R0 zr~5Jr*u16dbZIqIlGx@smDlb*oX8^0b<>Z$(UzV2>X$eA z3{GY>y;u=(gVpO3+3QDRYpbtK zW`{=~kFVPu#Wp^5$K!p_?%i1n&i-7U#Ex`0&|=<>C^koTsO-~O$?VQYj%D_+eB)`y zWlzQxpKEoCDcyPFbw!-v%)Rbvm*3aJg(D<3gTJk2^24CNG-FVqW;; z`ZLSNYV*V84o1_#hku%>)wgZa7)@W&zqE^aXcas0{1ZXnwq%T^Eql&dwRzgnL>7H@ z(csV96)_Tb6`9fH-W7g{p5XfqI!GgYl$!a`9kT|z8?GE z{e{CiXUKi-TP7U%Vg2hjx{pK+{$l->E%GN#I!s_bdKE3Y#h>F!QY}&*< zzp-CCvNq=U`%7naU{iOG{PD!;cJALREBEI;-_HH2srVf!75``$-(1aG_X!p)-{dGdkfz^NR ztQ?Wlb#%u+O;gtnc=5%)f0zpPSaLQ$ac<|KEkDOKTmP%+{trfWUOV;IoiE4TJFxe& zznJ1D-g30niPJmJgnsvc^PSVCv7cUfpk3$FJ2(8X<#}u6&!(t2?Sxz24;e*!zyatS zR}5@2cR!1M^nie81UzMWw|mOsg&(zHnw;NE;-qhFx7U)Z++5C*tC)6@_X}FQB|?79 zMxG8Gp!)eschp>!nrzCvYr?&wK3{8^UdPUcPZ-Dstxo*%rrMFiH2EFbPtT07xu0BZ z+WXn6gpYf+;PI6u#Tr!HLa(DHP4D*wuAS9@)#$}sAMa&}^x_?gfaf`^kPHHTB%nAB z;bwVm!%cWk8bM*k`e4lyyIRlBVhBsTE=2QWEN>PZOgwqPZUPx1Tm!Kpz6ShGbx@Qd z#2_crr+w|@H1@waKSHFs5OFSkdIa9X(8MamlpDAVzS8YU=W_Gg3?jld>4SGbT=UDx zF*gb}vZZn@6lJ5>Un_CVlE&a3lt8S8B?i;m17ZB336&=~|MM@XJn=q^=llz4Pie@@ z&EUUVpj4js zg+8)8mA@&_&#>=StCIikoRI(9&k6B+6mwaRsQ!b)LgZF|)Idd7g~J`f`?yf0RD&D? z8-3cO2*G+niQIG1FgmTx&xXciUx5%x1T>lA#HK$qZe33Ltq z5x}4}`mUSWxtrh1PvU_F&hy~kscRHNjvT(le;6HTXg62_;;7hM@X{N?65jxCb6!|P zp=xk|DBSFlVn8nzO54E%2krU_rJW4|&jZePVhcQItrF6b8&gsH8A+yYZ7H%SZKyrA z!67Bl7tf#{zZ|G#HeE=TUhdPfH!zyAw--N|oq^GmbOEf}TqvVaZiGo>1~tk?JZRQ3 zsNqjxU#*rw4gVMh(=w>xl))Cl94O;C^B9oyN z9p2JH<+*==(2BV{(Fl!0Z3$9k0VlQ8NMniQ#FsBfw=hliouIX>El9;@QqmGhzo|V* ze$d)&i(B!hEoc&2?Bm4AA9E|}jMSxM|DYv3P#NGr$LA?s5wMBxoP{L*C=}mhO5e#P89NI} z6>~L7?}~s;RCD1FL6h{OjL}{T2(QA29#Bq-dR08NV1t~oM^vF6;hjQtVjQ*ngor9? zCPbJVPlT}%c=A}t36nS>vUPDH%CD2!>lA8X*Cw7(iDz!$MfrDBdz}DpmnL|N)8kY6 zf)k&ziBfxg3C>PUaN@}q_!7|#slASXFDf7(o|`IdsHCa9BCo?GK?$Zt72p&n&PT<> z`689z+u`R#vN$Kcjp_5_K-zlRI{%cUdRXmzX-%E8%bBWd@M)Nt$Ds1JE3}sLk4ius z>D&VwK--DFOOQr^#EX%VB%W)D!22pexR(gLGZTcpBn4j*qSh-&e}U8ig7Fa|L7^7k z3g2yWl;T4#zi2HX9TW9d<<^P>xOE|nIO<@ec6k2Er4!*XPN45e366tApc11IQ_w>3R#r#PL0hs1_av*T zRty_{p8)Zk=j8X{4itIN-+luGU7r78PUyXxX{RI^{7z=#Cpz(SnL=?4Q<(3$OwIid zYNC^yyd2P_WrM?-s52G>{#6k=+bPVKgT77@?wcbbL^L2k_tw5&CLs{oZ(0O~%{pi8n`) zes4UQ9W`_^Jui==Ap@|+JT;fVQ`?9~_ILEc1v#>j^w09rBBY;AXb^l+(r@?DjM87} zrNv5rm6w(%{qwxE4Cznfd+^W@m3f==5}_knM8X-;KhR4{lzw^%NASf;|6ni8DE&jd zv?%E}d1(>S&%88)^h@J&1-0b7S836co}5)HP7H?RbhNZU5Qlq7VcHu{8tpty@Zij% zo)X{9!vBd6ttTzTz*PxIe9sGiFBKDdh+U0q+jNl_@v+E$-hgHerX5dlm6z^y}(hr z(mt{fiO=6Pwi6CZ6Xof()1m-&n&YvPtY|uAQ2;y531E{s0c^4;fKBEEu*sqTHklK^ zCW`{tWKIB^Eb=#rXU$UDL8mwZ*koYai+ndhnh3j^515x^#n05(||z$T6WHdz?J zCXN6$Ss1`3jsP}UcnLPC31E}O0c=v^v5D+xbjsoYHmM2Fo)!nNQ%wLnEe>F(ngDiM z9KcRB0qnFmfSqa-*|xmx$^S6`_OOe#LDcRd-oD!4$ zjZUd;WGjucaqm;x$XXg_ZKvl6y zugrXqvi8(`jmvv|MT`LbaNA4{OvmR-BtZ}%OnUDWPa!y8Ebc?deJ>y^v1!f^RS3o2xz3V)rQt6dRBgq>UNTg2ap(>@)yWXqX4GSc4pO;U1pZDdH z$R01B^nT>aClQ%{q$|C$hI9SA#?X8L^1o)mH6oL>p3GXMcd9qhH47v%-J_gUdVLaI zv%o*m0G8XZV2uzWEd!%JB}mc;AiXC@GQS`N$mfPeNy;WH8!C?Vlq2dhqTYcdtDsa6 zq)oyGGD88*1C=aBp&PGz5|I@mu%gEswF0T=Y*AOaFo}4zw@U4$%AC*N(DOvA`P|#2 z&dry|*WM;2y)u&!cCL|TpZfKN$dOc5>VV>0v{>o42*v53TSX!>1rZ6yO25@hGfF?5Jx30FQPOYo(juf^jun&< zEr$0hGn;{BSaLM)^>>YVT#Do`_QY#EziAwAj=yNn^I<8E=0N_gv78!D`mvt;&h?KL zKz6Msp0sPAIekYVvxk7HQY^jFl&DQx8x6|u2wNNz5VcTxed29v6pzkWBPVTuzF&G} zJe{(ZaUP!wy;x38@~VnWdfyj8P_uDzCJ{JIK&UCbKFOIi;f=4tC{*hV(l3TnqD4qQ zR#Ld5+A00A`hjMYesRM=abu-l+*}YXQTjy>Mzjp+e_N!%n~y}^@g|%h{q#7590`>E zcQq1ESo+`d(u~softMB~{fE7@2)^Tcc1%p{kWr}08YW1cylqYGue zbV}o<&^VsM6OT?sAV;@V{w|->iAo1aokhpr=y?@Ao02Pp;+fE^$iF1RGi7@@(5%H z^Sk-~_R-3I&yK0d=@Wg=SAIBH)n^BFFboON&1|y379Z$auEiP4u_5d9-3EuOf#+_0OPw`B9~!i6@iKkipcaN9hU11`^qq7) z+Uq-isP7o`hq6&0AJh_uF~{n9w%5-N3N^U&-E|+UZS^CA-o4gf)KAjcBlY>Z@savG zx{ReuGF?*Xl0cUzx{Sh^%O>4~Ht-D5M;WU1IUo!tLXIGe0AVl@MhHSSQp<;&sz`md zZbGC!Q#Z7YJ{y6c27o6RK`WW(YRJ6W-h~Z^@OT-(Z?>Yt9)lXQf??wkpPY5YS zUdOlAcbiIlID{H}WQ_?SfjI_*73)%G_08|mhZ)x5xay&>V#hU2SurxGWSL=@ zzSrIQa6_U#?5w`eS)3yM5RQ}XffK8PYN$}U1$8vUlL8h}puaA)y*{E?-~VoX#QXZV zB<}x^{M~}STNtl52DRS!;g$MMWAr_b>GU{ynm@;_Qk)hXFG=sbYHy=C6nbn?ktp72 zvldYWe+?_6IXKSrQNRS8`@0S>1#pFc^l*dl(SX^2!vIGBCIX`4iS7Y78r~?t7~rh| zdjaYN{XDu}qMrfm3HT}CaKP6AvjATKoPhY70pX%I3H&+%M*}j@n*sI*yns2Z3GfWy zB*gm(ko5Qha2Vj*fW)^Ka4292;1ECyU?0FvfTS1MUW-^mYKo0pALUHw2^a0;KfT17-r+07=d@fJWex07<@C(1!{7KtPh;4v^%B z0Zv4`P(YG@9y588Pv_8*{G)&*e+ys+;6DK=oppfG_+JIs6>zbjR|~ow5c|QR3joJ} ze>z|r;JJXgz_S6z0j2_u1snj_8R162D}n#ooS*L;{S_eb9|6n*+zUwjI{-U^|0zJ? zuLFz(UJXe66@bKN1B?QFDj@Oo6ycpkcqCv4gf|o6Z)0f3e>8m!6n%8`(}1M^`0lqkjb? zIi~?h&KH0r=OaLhe-IE4+@kjYQhfUMD23l3!j}L>AlxOwO(J}t2u}b+Q;hB@!hgin zisBywB>A5Kh9Uf2K$3r#2&ePnDV)xWZ-wxsB0N`wXN&M5fGrW8D8kQU9h&6-3y|WU z1Z;uu&jCsP77>202)_dmMIL>V2%iFoqKF;=NcL$3hzUpZsbCC*fNuaIE76YvrUPyQ zq;`25AZ8o<9C*U*f<6N<4RpL%!sA5)rUDNEj02=iIVpfU0Fwdl0!#v=@Af7FE&xmb zoB-G#a5P{%Abp>DB1F)6;Us4O-~hmmfW+4tupi(d9Y4oCdJkYM@RtGm0NxMS8!!uS zJVYb_lHT0}Jf~{ZXxCxQ)9}*$pX3z;Y3P|B2aSl7dQK(YH zM>xS8;KWZjK{IfQM>xSNfZI_Cz#394U~^Og!gT`HqR^4QkeLErAt2RnqPG|DPZ){t zZv=c(z^4W5uGi#t6mU3Sca+pAz^v;>S;(JN%}=mry~& z{Zrtl1l~gOqZ20gHOT{QiNIeL_$h(kDew$*=HzY@@iz;cp1M-}Qv#3b0rUL){LlpexQ3H%`8C=a;@t6K0c5#iLYP`KQRHCBY*Ai|%J z;XSze$`KK67U7Epo+ofRiHh{e7dSt!ANWjxKS1(;mkRuIfo~J|Hi5eZ{ttog7x<4t z{sDp0`VGljBk%&kksrBJtWMx^gV+#(%PnUA67e^P_(vr_CMV=tLKew0ViG}as|c4H z%bHO*(q|(6J|S7KA24fNRS6&Ci7pL*U7eC?0?|*(jtq}S0U+srK>KFfcKOB93gZNMR;f;=( z_uKB;U=_gUME=I#48S_Ur3w?v4*sXy`z76I<-%gc4lc#QFIJb8J~PnpTz@|SQg^2Z}0J@~oC50}@bn$#L zAdP=AfG#O?Nv2CunquMGNaJ}RC~5RPfmHrc0lFm91>YC|7gvY}5F342AeAmD{2K#w zp^p#P3b{g@Mr`!mfmFJr(8co^0>0riz-I{3=)(i4bV;F$=c@$TM$~xuS%P%>EI}Gw UQt6UH7tf~(w7seEn0G4wA0CJvng9R* literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..0626f191b1 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake new file mode 100644 index 0000000000..09d92f9199 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/main +# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/build/__command_line_test__/__command_line_test__/main/Makefile b/build/__command_line_test__/__command_line_test__/main/Makefile new file mode 100644 index 0000000000..c0af35d7b3 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/main/Makefile @@ -0,0 +1,151 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main//CMakeFiles/progress.marks + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake new file mode 100644 index 0000000000..930efcb765 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake @@ -0,0 +1,39 @@ +# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/main + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..0626f191b1 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks new file mode 100644 index 0000000000..7ed6ff82de --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks @@ -0,0 +1 @@ +5 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake new file mode 100644 index 0000000000..9ed9c2cf62 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test +# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("radiation_test") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile new file mode 100644 index 0000000000..3b163f0e65 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile @@ -0,0 +1,151 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test//CMakeFiles/progress.marks + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake new file mode 100644 index 0000000000..6b3c9fb0cc --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake @@ -0,0 +1,45 @@ +# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake") + +endif() + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..0626f191b1 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake new file mode 100644 index 0000000000..61a4a7133c --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake @@ -0,0 +1,37 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "Fortran" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_Fortran + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" + "/Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" + "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" + ) +set(CMAKE_Fortran_COMPILER_ID "GNU") +set(CMAKE_Fortran_SUBMODULE_SEP "@") +set(CMAKE_Fortran_SUBMODULE_EXT ".smod") + +# The include file search paths: +set(CMAKE_Fortran_TARGET_INCLUDE_PATH + "/Users/afoster/pFUnit/include" + "/Users/afoster/pFUnit/mod" + "/usr/local/Cellar/netcdf/4.9.2/include" + "/usr/local/Cellar/netcdf-fortran/4.6.0/include" + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make new file mode 100644 index 0000000000..7149be51cf --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make @@ -0,0 +1,154 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +# Include any dependencies generated for this target. +include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make + +# Include the progress variables for this target. +include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make + +# Include the compile flags for this target's objects. +include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 -o CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 > CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 -o CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s + +# Object files for target FATES_rad_test +FATES_rad_test_OBJECTS = \ +"CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" \ +"CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" \ +"CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" \ +"CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" + +# External object files for target FATES_rad_test +FATES_rad_test_EXTERNAL_OBJECTS = + +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make +unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Linking Fortran executable FATES_rad_test" + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/FATES_rad_test.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/FATES_rad_test +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && $(CMAKE_COMMAND) -P CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake new file mode 100644 index 0000000000..6b7063ba42 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake @@ -0,0 +1,13 @@ +file(REMOVE_RECURSE + "CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" + "CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" + "CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" + "CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" + "FATES_rad_test" + "FATES_rad_test.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang Fortran) + include(CMakeFiles/FATES_rad_test.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake new file mode 100644 index 0000000000..bd62e20bc8 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake @@ -0,0 +1,14 @@ +# Remove fortran modules provided by this target. +FILE(REMOVE + "fatesconstantsmod.mod" + "FATESCONSTANTSMOD.mod" + "CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp" + + "fatesunittestiomod.mod" + "FATESUNITTESTIOMOD.mod" + "CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp" + + "fatesunittestorbitalmod.mod" + "FATESUNITTESTORBITALMOD.mod" + "CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp" + ) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make new file mode 100644 index 0000000000..80afc53fef --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for FATES_rad_test. +# This may be replaced when dependencies are built. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts new file mode 100644 index 0000000000..57ac27d1ed --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for FATES_rad_test. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal new file mode 100644 index 0000000000..46ca19ac45 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal @@ -0,0 +1,11 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o + /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make new file mode 100644 index 0000000000..daa358a424 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make @@ -0,0 +1,27 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Note that incremental build could trigger a call to cmake_copy_f90_mod on each re-build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesconstantsmod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp GNU +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: /usr/local/Cellar/netcdf-fortran/4.6.0/include/netcdf.mod +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesunittestiomod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp GNU +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o + $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesunittestorbitalmod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp GNU +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: + $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..2b4ac0b598d43fed2ea70fd8680dacf9fc821b43 GIT binary patch literal 2256 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 literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..bac5e8f68dbed86771ad6e160e953b2ced9f2e29 GIT binary patch literal 24087 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 P!!w~bQoeT*Pci-nwC<&` literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp new file mode 100644 index 0000000000000000000000000000000000000000..cb85e3a79588da53be704d893829e4e21f8807ee GIT binary patch literal 25076 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%0Du&QhFE5>J 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 literal 0 HcmV?d00001 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make new file mode 100644 index 0000000000..0dcb8e6e9a --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# compile Fortran with /usr/local/bin/gfortran +Fortran_DEFINES = + +Fortran_INCLUDES = -I/Users/afoster/pFUnit/include -I/Users/afoster/pFUnit/mod -I/usr/local/Cellar/netcdf/4.9.2/include -I/usr/local/Cellar/netcdf-fortran/4.6.0/include + +Fortran_FLAGS = -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal new file mode 100644 index 0000000000..8030915fe2 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal @@ -0,0 +1,5 @@ +# The fortran modules provided by this target. +provides + fatesconstantsmod.mod + fatesunittestiomod.mod + fatesunittestorbitalmod.mod diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt new file mode 100644 index 0000000000..2d1f965f41 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt @@ -0,0 +1 @@ +/usr/local/bin/gfortran -framework Accelerate -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o -o FATES_rad_test -L/usr/local/Cellar/netcdf/4.9.2/lib -L/usr/local/Cellar/netcdf-fortran/4.6.0/lib diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make new file mode 100644 index 0000000000..33e6bffba3 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make @@ -0,0 +1,6 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks new file mode 100644 index 0000000000..7ed6ff82de --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks @@ -0,0 +1 @@ +5 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake new file mode 100644 index 0000000000..cb5f7e2cb4 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake @@ -0,0 +1,8 @@ +# CMake generated Testfile for +# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test +# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(rad_test "FATES_rad_test") +set_tests_properties(rad_test PROPERTIES _BACKTRACE_TRIPLES "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt;37;add_test;/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt;0;") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile new file mode 100644 index 0000000000..f12b8509d6 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile @@ -0,0 +1,274 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test//CMakeFiles/progress.marks + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule +.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule + +# Convenience name for target. +FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule +.PHONY : FATES_rad_test + +# fast build rule for target. +FATES_rad_test/fast: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build +.PHONY : FATES_rad_test/fast + +FatesUnitTestRadiation.o: FatesUnitTestRadiation.F90.o +.PHONY : FatesUnitTestRadiation.o + +# target to build an object file +FatesUnitTestRadiation.F90.o: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o +.PHONY : FatesUnitTestRadiation.F90.o + +FatesUnitTestRadiation.i: FatesUnitTestRadiation.F90.i +.PHONY : FatesUnitTestRadiation.i + +# target to preprocess a source file +FatesUnitTestRadiation.F90.i: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i +.PHONY : FatesUnitTestRadiation.F90.i + +FatesUnitTestRadiation.s: FatesUnitTestRadiation.F90.s +.PHONY : FatesUnitTestRadiation.s + +# target to generate assembly for a file +FatesUnitTestRadiation.F90.s: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s +.PHONY : FatesUnitTestRadiation.F90.s + +__/__/__/main/FatesConstantsMod.o: __/__/__/main/FatesConstantsMod.F90.o +.PHONY : __/__/__/main/FatesConstantsMod.o + +# target to build an object file +__/__/__/main/FatesConstantsMod.F90.o: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o +.PHONY : __/__/__/main/FatesConstantsMod.F90.o + +__/__/__/main/FatesConstantsMod.i: __/__/__/main/FatesConstantsMod.F90.i +.PHONY : __/__/__/main/FatesConstantsMod.i + +# target to preprocess a source file +__/__/__/main/FatesConstantsMod.F90.i: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i +.PHONY : __/__/__/main/FatesConstantsMod.F90.i + +__/__/__/main/FatesConstantsMod.s: __/__/__/main/FatesConstantsMod.F90.s +.PHONY : __/__/__/main/FatesConstantsMod.s + +# target to generate assembly for a file +__/__/__/main/FatesConstantsMod.F90.s: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s +.PHONY : __/__/__/main/FatesConstantsMod.F90.s + +__/__/utils/FatesUnitTestIOMod.o: __/__/utils/FatesUnitTestIOMod.F90.o +.PHONY : __/__/utils/FatesUnitTestIOMod.o + +# target to build an object file +__/__/utils/FatesUnitTestIOMod.F90.o: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o +.PHONY : __/__/utils/FatesUnitTestIOMod.F90.o + +__/__/utils/FatesUnitTestIOMod.i: __/__/utils/FatesUnitTestIOMod.F90.i +.PHONY : __/__/utils/FatesUnitTestIOMod.i + +# target to preprocess a source file +__/__/utils/FatesUnitTestIOMod.F90.i: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i +.PHONY : __/__/utils/FatesUnitTestIOMod.F90.i + +__/__/utils/FatesUnitTestIOMod.s: __/__/utils/FatesUnitTestIOMod.F90.s +.PHONY : __/__/utils/FatesUnitTestIOMod.s + +# target to generate assembly for a file +__/__/utils/FatesUnitTestIOMod.F90.s: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s +.PHONY : __/__/utils/FatesUnitTestIOMod.F90.s + +__/__/utils/FatesUnitTestOrbitalMod.o: __/__/utils/FatesUnitTestOrbitalMod.F90.o +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.o + +# target to build an object file +__/__/utils/FatesUnitTestOrbitalMod.F90.o: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.o + +__/__/utils/FatesUnitTestOrbitalMod.i: __/__/utils/FatesUnitTestOrbitalMod.F90.i +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.i + +# target to preprocess a source file +__/__/utils/FatesUnitTestOrbitalMod.F90.i: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.i + +__/__/utils/FatesUnitTestOrbitalMod.s: __/__/utils/FatesUnitTestOrbitalMod.F90.s +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.s + +# target to generate assembly for a file +__/__/utils/FatesUnitTestOrbitalMod.F90.s: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s +.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" + @echo "... FATES_rad_test" + @echo "... FatesUnitTestRadiation.o" + @echo "... FatesUnitTestRadiation.i" + @echo "... FatesUnitTestRadiation.s" + @echo "... __/__/__/main/FatesConstantsMod.o" + @echo "... __/__/__/main/FatesConstantsMod.i" + @echo "... __/__/__/main/FatesConstantsMod.s" + @echo "... __/__/utils/FatesUnitTestIOMod.o" + @echo "... __/__/utils/FatesUnitTestIOMod.i" + @echo "... __/__/utils/FatesUnitTestIOMod.s" + @echo "... __/__/utils/FatesUnitTestOrbitalMod.o" + @echo "... __/__/utils/FatesUnitTestOrbitalMod.i" + @echo "... __/__/utils/FatesUnitTestOrbitalMod.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake new file mode 100644 index 0000000000..7f8055d555 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake @@ -0,0 +1,39 @@ +# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..0626f191b1 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake new file mode 100644 index 0000000000..6e2fdc5a3d --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils +# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile new file mode 100644 index 0000000000..b1f822e9bf --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile @@ -0,0 +1,151 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.25 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils//CMakeFiles/progress.marks + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake new file mode 100644 index 0000000000..42c88ffb10 --- /dev/null +++ b/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake @@ -0,0 +1,39 @@ +# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + diff --git a/build/cmake_macros/CMakeLists.txt b/build/cmake_macros/CMakeLists.txt new file mode 100644 index 0000000000..c2ebcb51be --- /dev/null +++ b/build/cmake_macros/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_policy(SET CMP0057 NEW) +cmake_minimum_required(VERSION 3.5) +project(cime LANGUAGES C Fortran) +include(../Macros.cmake) diff --git a/build/cmake_macros/CNL.cmake b/build/cmake_macros/CNL.cmake new file mode 100644 index 0000000000..7202f78196 --- /dev/null +++ b/build/cmake_macros/CNL.cmake @@ -0,0 +1,14 @@ +set(CMAKE_OPTS "-DCMAKE_SYSTEM_NAME=Catamount") +string(APPEND CPPDEFS " -DLINUX") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(MPICC "cc") +set(MPICXX "CC") +set(MPIFC "ftn") +set(NETCDF_PATH "$ENV{NETCDF_DIR}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PARALLEL_NETCDF_DIR}") +set(SCC "cc") +set(SCXX "CC") +set(SFC "ftn") diff --git a/build/cmake_macros/Darwin.cmake b/build/cmake_macros/Darwin.cmake new file mode 100644 index 0000000000..89fd4bdc07 --- /dev/null +++ b/build/cmake_macros/Darwin.cmake @@ -0,0 +1 @@ +string(APPEND CPPDEFS " -DSYSDARWIN") diff --git a/build/cmake_macros/Macros.cmake b/build/cmake_macros/Macros.cmake new file mode 100644 index 0000000000..b089f58058 --- /dev/null +++ b/build/cmake_macros/Macros.cmake @@ -0,0 +1,37 @@ +# +# Use this file to include the relevant macros based on +# machine/compiler settings. This file gets copied to CASEROOT +# and that's the one that gets included by the build system. Feel free +# to modify this file in the CASEROOT. +# +set(MACROS_DIR ${CASEROOT}/cmake_macros) + +set(UNIVERSAL_MACRO ${MACROS_DIR}/universal.cmake) +set(COMPILER_MACRO ${MACROS_DIR}/${COMPILER}.cmake) +set(OS_MACRO ${MACROS_DIR}/${OS}.cmake) +set(MACHINE_MACRO ${MACROS_DIR}/${MACH}.cmake) +set(COMPILER_OS_MACRO ${MACROS_DIR}/${COMPILER}_${OS}.cmake) +set(COMPILER_MACHINE_MACRO ${MACROS_DIR}/${COMPILER}_${MACH}.cmake) + +if (CONVERT_TO_MAKE) + get_cmake_property(VARS_BEFORE_BUILD_INTERNAL_IGNORE VARIABLES) +endif() + +# Include order defines precedence +foreach (MACRO_FILE ${UNIVERSAL_MACRO} ${COMPILER_MACRO} ${OS_MACRO} ${MACHINE_MACRO} ${COMPILER_OS_MACRO} ${COMPILER_MACHINE_MACRO}) + if (EXISTS ${MACRO_FILE}) + include(${MACRO_FILE}) + else() + message("No macro file found: ${MACRO_FILE}") + endif() +endforeach() + +if (CONVERT_TO_MAKE) + get_cmake_property(VARS_AFTER VARIABLES) + + foreach (VAR_AFTER IN LISTS VARS_AFTER) + if (NOT VAR_AFTER IN_LIST VARS_BEFORE_BUILD_INTERNAL_IGNORE) + message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}") + endif() + endforeach() +endif() diff --git a/build/cmake_macros/arm.cmake b/build/cmake_macros/arm.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/cmake_macros/armgcc.cmake b/build/cmake_macros/armgcc.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/cmake_macros/athena.cmake b/build/cmake_macros/athena.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/cmake_macros/bluewaters.cmake b/build/cmake_macros/bluewaters.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/cmake_macros/casper.cmake b/build/cmake_macros/casper.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/build/cmake_macros/centos7-linux.cmake b/build/cmake_macros/centos7-linux.cmake new file mode 100644 index 0000000000..4dc3995df5 --- /dev/null +++ b/build/cmake_macros/centos7-linux.cmake @@ -0,0 +1 @@ +string(APPEND SLIBS " -L$(NETCDF_PATH)/lib -Wl,-rpath,$(NETCDF_PATH)/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/cheyenne.cmake b/build/cmake_macros/cheyenne.cmake new file mode 100644 index 0000000000..35c2d3c33e --- /dev/null +++ b/build/cmake_macros/cheyenne.cmake @@ -0,0 +1,6 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "gpfs") +set(PNETCDF_PATH "$ENV{PNETCDF}") diff --git a/build/cmake_macros/container.cmake b/build/cmake_macros/container.cmake new file mode 100644 index 0000000000..82b8a1428d --- /dev/null +++ b/build/cmake_macros/container.cmake @@ -0,0 +1,7 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(NETCDF_PATH "/usr/local") +set(PNETCDF_PATH "/usr/local") +set(LDFLAGS "") +string(APPEND SLIBS " -lnetcdf -lnetcdff -llapack -lblas") diff --git a/build/cmake_macros/cray.cmake b/build/cmake_macros/cray.cmake new file mode 100644 index 0000000000..89c27843d7 --- /dev/null +++ b/build/cmake_macros/cray.cmake @@ -0,0 +1,37 @@ +if (NOT compile_threaded) + string(APPEND CFLAGS " -h noomp") +endif() +if (compile_threaded) + string(APPEND CFLAGS " -fopenmp") +endif() +if (DEBUG) + string(APPEND CFLAGS " -g -O0") +endif() +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_R16 -DCPRCRAY") +if (COMP_NAME STREQUAL pop) + string(APPEND CPPDEFS " -DDIR=NOOP") +endif() +if (COMP_NAME STREQUAL moby) + string(APPEND CPPDEFS " -DDIR=NOOP") +endif() +set(FC_AUTO_R8 "-s real64") +string(APPEND FFLAGS " -f free -N 255 -h byteswapio -x dir -ef") +if (NOT compile_threaded) + string(APPEND FFLAGS " -h noomp") +endif() +if (compile_threaded) + string(APPEND FFLAGS " -h omp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -g -O0 -K trap=fp -m1") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2,ipa2 -em") +endif() +set(FFLAGS_NOOPT "-O1,fp2,ipa0,scalar0,vector0") +set(HAS_F2008_CONTIGUOUS "TRUE") +set(LDFLAGS "-Wl,--allow-multiple-definition -h byteswapio") +string(APPEND LDFLAGS " -h omp") diff --git a/build/cmake_macros/cray_daint.cmake b/build/cmake_macros/cray_daint.cmake new file mode 100644 index 0000000000..5929a1be65 --- /dev/null +++ b/build/cmake_macros/cray_daint.cmake @@ -0,0 +1,2 @@ +string(APPEND FFLAGS " -I/project/s824/edavin/OASIS3-MCT_2.0/build.cray/build/lib/mct -I/project/s824/edavin/OASIS3-MCT_2.0/build.cray/build/lib/psmile.MPI1") +string(APPEND SLIBS " -L/project/s824/edavin/OASIS3-MCT_2.0/build.cray/lib -lpsmile.MPI1 -lscrip -lmct_oasis -lmpeu_oasis") diff --git a/build/cmake_macros/euler2.cmake b/build/cmake_macros/euler2.cmake new file mode 100644 index 0000000000..63ca8a325f --- /dev/null +++ b/build/cmake_macros/euler2.cmake @@ -0,0 +1,5 @@ +string(APPEND CPPDEFS " -DLINUX") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PNETCDF}") +set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/euler3.cmake b/build/cmake_macros/euler3.cmake new file mode 100644 index 0000000000..63ca8a325f --- /dev/null +++ b/build/cmake_macros/euler3.cmake @@ -0,0 +1,5 @@ +string(APPEND CPPDEFS " -DLINUX") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PNETCDF}") +set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/euler4.cmake b/build/cmake_macros/euler4.cmake new file mode 100644 index 0000000000..63ca8a325f --- /dev/null +++ b/build/cmake_macros/euler4.cmake @@ -0,0 +1,5 @@ +string(APPEND CPPDEFS " -DLINUX") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PNETCDF}") +set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/frontera.cmake b/build/cmake_macros/frontera.cmake new file mode 100644 index 0000000000..bbdb959a39 --- /dev/null +++ b/build/cmake_macros/frontera.cmake @@ -0,0 +1,9 @@ +set(HAS_F2008_CONTIGUOUS "TRUE") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") +string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/gnu.cmake b/build/cmake_macros/gnu.cmake new file mode 100644 index 0000000000..621740c595 --- /dev/null +++ b/build/cmake_macros/gnu.cmake @@ -0,0 +1,43 @@ +string(APPEND CFLAGS " -std=gnu99") +if (compile_threaded) + string(APPEND CFLAGS " -fopenmp") +endif() +if (DEBUG) + string(APPEND CFLAGS " -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds") +endif() +if (NOT DEBUG) + string(APPEND CFLAGS " -O") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU") +set(CXX_LINKER "FORTRAN") +set(FC_AUTO_R8 "-fdefault-real-8 -fdefault-double-8") +string(APPEND FFLAGS " -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none") +if (compile_threaded) + string(APPEND FFLAGS " -fopenmp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-ffixed-form") +set(FREEFLAGS "-ffree-form") +set(HAS_F2008_CONTIGUOUS "FALSE") +if (compile_threaded) + string(APPEND LDFLAGS " -fopenmp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "gcc") +set(SCXX "g++") +set(SFC "gfortran") +set(SUPPORTS_CXX "TRUE") + +message("C compiler version is ${CMAKE_C_COMPILER_VERSION}") +message("Fortran compiler version is ${CMAKE_Fortran_COMPILER_VERSION}") +if (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 10) + string(APPEND FFLAGS " -fallow-argument-mismatch -fallow-invalid-boz ") +endif() diff --git a/build/cmake_macros/gnu_cheyenne.cmake b/build/cmake_macros/gnu_cheyenne.cmake new file mode 100644 index 0000000000..988fbb33be --- /dev/null +++ b/build/cmake_macros/gnu_cheyenne.cmake @@ -0,0 +1,4 @@ +if (COMP_NAME STREQUAL pio1) + string(APPEND CPPDEFS " -DNO_MPIMOD") +endif() +string(APPEND SLIBS " -ldl") diff --git a/build/cmake_macros/gnu_coeus.cmake b/build/cmake_macros/gnu_coeus.cmake new file mode 100644 index 0000000000..f2c24ef9e8 --- /dev/null +++ b/build/cmake_macros/gnu_coeus.cmake @@ -0,0 +1,2 @@ +set(NETCDF_PATH "/vol/apps/hpc/stow/netcdf/4.4.1.1/gcc-6.3.0") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/gnu_fleabone.cmake b/build/cmake_macros/gnu_fleabone.cmake new file mode 100644 index 0000000000..d2f1e44096 --- /dev/null +++ b/build/cmake_macros/gnu_fleabone.cmake @@ -0,0 +1,27 @@ +set(NETCDF_C_PATH "/usr/local/Cellar/netcdf/4.9.2") +set(NETCDF_FORTRAN_PATH "/usr/local/Cellar/netcdf-fortran/4.6.0") + +# These LDFLAGS provide lapack and blas support on a Mac. This may require installation of +# the Apple Developer Tools. +string(APPEND LDFLAGS " -framework Accelerate") + +#string(APPEND FFLAGS " -Wunused") + +# Trying to produce a backtrace leads to a hang, so don't even try +#string(APPEND CFLAGS " -fno-backtrace") +#string(APPEND FFLAGS " -fno-backtrace") + +# This is needed to run the Fortran unit tests; +# this isn't needed to build and run CESM. +#if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) +set(PFUNIT_PATH "/Users/afoster/pFUnit/") +#endif() + +# Most of the following paths aren't necessary on my machine because I have my PATH set so +# that the right compilers are picked up by default. But it doesn't hurt to be explicit. +set(SFC "/usr/local/bin/gfortran") +set(SCC "/usr/bin/gcc") +set(SCXX "/usr/bin/g++") +set(MPIFC "/usr/local/bin/mpif90") +set(MPICC "/usr/local/bin/mpicc") +set(MPICXX "/usr/local/bin/mpic++") diff --git a/build/cmake_macros/gnu_hobart.cmake b/build/cmake_macros/gnu_hobart.cmake new file mode 100644 index 0000000000..35929dcc37 --- /dev/null +++ b/build/cmake_macros/gnu_hobart.cmake @@ -0,0 +1 @@ +string(APPEND SLIBS " -lm -ldl") diff --git a/build/cmake_macros/gnu_homebrew.cmake b/build/cmake_macros/gnu_homebrew.cmake new file mode 100644 index 0000000000..9e468c1276 --- /dev/null +++ b/build/cmake_macros/gnu_homebrew.cmake @@ -0,0 +1 @@ +string(APPEND LDFLAGS " -framework Accelerate -Wl,-rpath $(NETCDF)/lib") diff --git a/build/cmake_macros/gnu_lobata.cmake b/build/cmake_macros/gnu_lobata.cmake new file mode 100644 index 0000000000..60aeb9c8a8 --- /dev/null +++ b/build/cmake_macros/gnu_lobata.cmake @@ -0,0 +1,15 @@ +set(SUPPORTS_CXX "TRUE") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_TIMES -DHAVE_GETTIMEOFDAY -DHAVE_BACKTRACE") +endif() +string(APPEND SLIBS " -L$ENV{NETCDF_FORTRAN_PATH}/lib/ -lnetcdff -L$ENV{NETCDF_C_PATH}/lib/ -lnetcdf -lcurl -llapack -lblas") +if (DEBUG) + string(APPEND FFLAGS " -g -fbacktrace -fbounds-check -ffpe-trap=invalid,zero,overflow") +else() + string(APPEND FFLAGS " -fno-unsafe-math-optimizations") +endif() +if (MPILIB STREQUAL mpi-serial) + set(SCC "gcc") + set(SFC "gfortran") +endif() +string(APPEND CXX_LIBS " -lstdc++") diff --git a/build/cmake_macros/gnu_melvin.cmake b/build/cmake_macros/gnu_melvin.cmake new file mode 100644 index 0000000000..668d542c96 --- /dev/null +++ b/build/cmake_macros/gnu_melvin.cmake @@ -0,0 +1,13 @@ +set(ALBANY_PATH "/projects/install/rhel6-x86_64/ACME/AlbanyTrilinos/Albany/build/install") +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +set(CXX_LIBS "-lstdc++ -lmpi_cxx") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDFROOT}") +set(PNETCDF_PATH "$ENV{PNETCDFROOT}") +execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) +string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -lblas -llapack") diff --git a/build/cmake_macros/gnu_modex.cmake b/build/cmake_macros/gnu_modex.cmake new file mode 100644 index 0000000000..83a692512a --- /dev/null +++ b/build/cmake_macros/gnu_modex.cmake @@ -0,0 +1,5 @@ +string(APPEND SLIBS " -L$ENV{HDF5_HOME}/lib -lhdf5_fortran -lhdf5 -lhdf5_hl -lhdf5hl_fortran") +string(APPEND SLIBS " -L$ENV{NETCDF_PATH}/lib/ -lnetcdff -lnetcdf -lcurl -lblas -llapack") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_GETTIMEOFDAY -DHAVE_BACKTRACE") +endif() diff --git a/build/cmake_macros/gust.cmake b/build/cmake_macros/gust.cmake new file mode 100644 index 0000000000..5332d19c9e --- /dev/null +++ b/build/cmake_macros/gust.cmake @@ -0,0 +1,10 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PNETCDF}") +# If we want to use cray-libsci instead of mkl uncomment this line as well as the module in config_machines.xml +#string(REPLACE "-mkl=cluster" "" SLIBS "${SLIBS}") +string(REPLACE "-mkl=cluster" "-qmkl=cluster" SLIBS "${SLIBS}") +#string(APPEND CPPDEFS " -DNO_SHR_VMATH ") \ No newline at end of file diff --git a/build/cmake_macros/hobart.cmake b/build/cmake_macros/hobart.cmake new file mode 100644 index 0000000000..8894b6a383 --- /dev/null +++ b/build/cmake_macros/hobart.cmake @@ -0,0 +1,9 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(LAPACK_LIBDIR "/usr/lib64") +if (MPILIB STREQUAL mvapich2) + set(MPI_LIB_NAME "mpich") +endif() +set(NETCDF_PATH "$ENV{NETCDF_PATH}") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/ibm.cmake b/build/cmake_macros/ibm.cmake new file mode 100644 index 0000000000..37daaf31e5 --- /dev/null +++ b/build/cmake_macros/ibm.cmake @@ -0,0 +1,38 @@ +string(APPEND CFLAGS " -g -qfullpath -qmaxmem=-1") +if (NOT DEBUG) + string(APPEND CFLAGS " -O3") +endif() +if (compile_threaded) + string(APPEND CFLAGS " -qsmp=omp") +endif() +if (DEBUG AND compile_threaded) + string(APPEND CFLAGS " -qsmp=omp:noopt") +endif() +string(APPEND CPPDEFS " -DFORTRAN_SAME -DCPRIBM") +set(CPRE "-WF,-D") +set(FC_AUTO_R8 "-qrealsize=8") +string(APPEND FFLAGS " -g -qfullpath -qmaxmem=-1") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2 -qstrict -qinline=auto") +endif() +if (compile_threaded) + string(APPEND FFLAGS " -qsmp=omp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -qinitauto=7FF7FFFF -qflttrap=ov:zero:inv:en") +endif() +if (DEBUG AND compile_threaded) + string(APPEND FFLAGS " -qsmp=omp:noopt") +endif() +if (DEBUG AND COMP_NAME STREQUAL pop) + string(APPEND FFLAGS " -C") +endif() +set(FIXEDFLAGS "-qsuffix=f=f -qfixed=132") +set(FREEFLAGS "-qsuffix=f=f90:cpp=F90") +set(HAS_F2008_CONTIGUOUS "TRUE") +if (compile_threaded) + string(APPEND LDFLAGS " -qsmp=omp") +endif() +if (DEBUG AND compile_threaded) + string(APPEND LDFLAGS " -qsmp=omp:noopt") +endif() diff --git a/build/cmake_macros/ibm_AIX.cmake b/build/cmake_macros/ibm_AIX.cmake new file mode 100644 index 0000000000..ec2293afb9 --- /dev/null +++ b/build/cmake_macros/ibm_AIX.cmake @@ -0,0 +1,18 @@ +string(APPEND CFLAGS " -qarch=auto -qtune=auto -qcache=auto") +set(CONFIG_SHELL "/usr/bin/bash") +string(APPEND FFLAGS " -qarch=auto -qtune=auto -qcache=auto -qsclk=micro") +if (COMP_NAME STREQUAL cam) + string(APPEND FFLAGS " -qspill=6000") +endif() +if (DEBUG) + string(APPEND LDFLAGS " -qsigtrap=xl__trcedump") +endif() +string(APPEND LDFLAGS " -bdatapsize:64K -bstackpsize:64K -btextpsize:32K") +set(MPICC "mpcc_r") +set(MPIFC "mpxlf2003_r") +set(SCC "cc_r") +set(SFC "xlf2003_r") +string(APPEND SLIBS " -lmassv -lessl") +if (NOT DEBUG) + string(APPEND SLIBS " -lmass") +endif() diff --git a/build/cmake_macros/ibm_BGQ.cmake b/build/cmake_macros/ibm_BGQ.cmake new file mode 100644 index 0000000000..0f113a90fe --- /dev/null +++ b/build/cmake_macros/ibm_BGQ.cmake @@ -0,0 +1,11 @@ +set(CONFIG_ARGS "--build=powerpc-bgp-linux --host=powerpc64-suse-linux") +string(APPEND CPPDEFS " -DLINUX") +string(APPEND FFLAGS " -g -qfullpath -qmaxmem=-1 -qspillsize=2500 -qextname=flush") +if (NOT DEBUG) + string(APPEND FFLAGS " -O3 -qstrict -qinline=auto") +endif() +if (NOT DEBUG AND compile_threaded) +endif() +if (DEBUG AND compile_threaded) +endif() +set(LDFLAGS "-Wl,--relax -Wl,--allow-multiple-definition") diff --git a/build/cmake_macros/intel.cmake b/build/cmake_macros/intel.cmake new file mode 100644 index 0000000000..7328c85e30 --- /dev/null +++ b/build/cmake_macros/intel.cmake @@ -0,0 +1,61 @@ +string(APPEND CFLAGS " -qno-opt-dynamic-align -fp-model precise -std=gnu99") +if (compile_threaded) + string(APPEND CFLAGS " -qopenmp") +endif() +if (NOT DEBUG) + string(APPEND CFLAGS " -O2 -debug minimal") +endif() +if (DEBUG) + string(APPEND CFLAGS " -O0 -g") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DCPRINTEL") +string(APPEND CXX_LDFLAGS " -cxxlib") +set(CXX_LINKER "FORTRAN") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -qno-opt-dynamic-align -convert big_endian -assume byterecl -ftz -traceback -assume realloc_lhs -fp-model source") +if (compile_threaded) + string(APPEND FFLAGS " -qopenmp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -check uninit -check bounds -check pointers -fpe0 -check noarg_temp_created") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2 -debug minimal") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-fixed") +set(FREEFLAGS "-free") +if (compile_threaded) + string(APPEND LDFLAGS " -qopenmp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "icc") +set(SCXX "icpc") +set(SFC "ifort") +if (MPILIB STREQUAL mpich) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpich2) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mvapich) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mvapich2) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpt) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL openmpi) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL impi) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -mkl") +endif() +set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/intel_Darwin.cmake b/build/cmake_macros/intel_Darwin.cmake new file mode 100644 index 0000000000..7a2450e00f --- /dev/null +++ b/build/cmake_macros/intel_Darwin.cmake @@ -0,0 +1,3 @@ +if (NOT compile_threaded) + string(APPEND FFLAGS " -heap-arrays") +endif() diff --git a/build/cmake_macros/intel_aleph.cmake b/build/cmake_macros/intel_aleph.cmake new file mode 100644 index 0000000000..76985f0ede --- /dev/null +++ b/build/cmake_macros/intel_aleph.cmake @@ -0,0 +1,8 @@ +set(CONFIG_ARGS "--host=cray") +string(APPEND CFLAGS " -xCORE-AVX2") +string(APPEND FFLAGS " -xCORE-AVX2") +string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_PAPI -DHAVE_SLASHPROC") +endif() +string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_athena.cmake b/build/cmake_macros/intel_athena.cmake new file mode 100644 index 0000000000..b558b0fd4d --- /dev/null +++ b/build/cmake_macros/intel_athena.cmake @@ -0,0 +1,20 @@ +string(APPEND CFLAGS " -xHost") +string(APPEND CPPDEFS " -DINTEL_MKL -DHAVE_SSE2") +string(APPEND FFLAGS " -xHost") +if (COMP_NAME STREQUAL nemo) + string(APPEND FFLAGS " $(FC_AUTO_R8) -O3 -assume norealloc_lhs") +endif() +execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) +string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0}") +if (MPILIB STREQUAL mpich2) + set(MPICXX "mpiicpc") +endif() +if (MPILIB STREQUAL mpich2) + set(MPICC "mpiicc") +endif() +if (MPILIB STREQUAL mpich2) + set(MPIFC "mpiifort") +endif() +if (MPILIB STREQUAL mpich2) + set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") +endif() diff --git a/build/cmake_macros/intel_aws-hpc6a.cmake b/build/cmake_macros/intel_aws-hpc6a.cmake new file mode 100644 index 0000000000..0e4d281538 --- /dev/null +++ b/build/cmake_macros/intel_aws-hpc6a.cmake @@ -0,0 +1,8 @@ +string(APPEND CFLAGS " -qopt-report -march=core-avx2 -mtune=core-avx2 -no-fma") +string(APPEND FFLAGS " -qopt-report -march=core-avx2 -mtune=core-avx2 -no-fma") +if (DEBUG) + string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") +endif() +set(SLIBS "-lnetcdf -lnetcdff -lpnetcdf -lblas -llapack -lpthread -lm -ldl") +string(APPEND CPPDEFS " -DNO_SHR_VMATH") + diff --git a/build/cmake_macros/intel_bluewaters.cmake b/build/cmake_macros/intel_bluewaters.cmake new file mode 100644 index 0000000000..29b1da06da --- /dev/null +++ b/build/cmake_macros/intel_bluewaters.cmake @@ -0,0 +1,3 @@ +set(HAS_F2008_CONTIGUOUS "FALSE") +string(APPEND FFLAGS " -dynamic -mkl=sequential -no-fma") +string(APPEND CFLAGS " -dynamic -mkl=sequential -no-fma") diff --git a/build/cmake_macros/intel_casper.cmake b/build/cmake_macros/intel_casper.cmake new file mode 100644 index 0000000000..7ee1c8b71d --- /dev/null +++ b/build/cmake_macros/intel_casper.cmake @@ -0,0 +1,9 @@ +string(APPEND CFLAGS " -qopt-report -xCORE_AVX2 -no-fma") +string(APPEND FFLAGS " -qopt-report -xCORE_AVX2 -no-fma") +if (DEBUG) + string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") +endif() +if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) + set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_noMPI_noOpenMP") +endif() +set(HAS_F2008_CONTIGUOUS "TRUE") diff --git a/build/cmake_macros/intel_cheyenne.cmake b/build/cmake_macros/intel_cheyenne.cmake new file mode 100644 index 0000000000..f83ba0ebd2 --- /dev/null +++ b/build/cmake_macros/intel_cheyenne.cmake @@ -0,0 +1,12 @@ +string(APPEND CFLAGS " -qopt-report -xCORE_AVX2 -no-fma") +string(APPEND FFLAGS " -qopt-report -xCORE_AVX2 -no-fma") +if (DEBUG) + string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") +endif() +if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) + set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_noMPI_noOpenMP") +endif() +if (MPILIB STREQUAL mpt AND compile_threaded) + set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_MPI_openMP") +endif() +set(HAS_F2008_CONTIGUOUS "TRUE") diff --git a/build/cmake_macros/intel_constance.cmake b/build/cmake_macros/intel_constance.cmake new file mode 100644 index 0000000000..5733786855 --- /dev/null +++ b/build/cmake_macros/intel_constance.cmake @@ -0,0 +1,11 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +string(APPEND CPPDEFS " -DLINUX") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDF_HOME}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi -L$ENV{MKL_PATH} -lmkl_rt") diff --git a/build/cmake_macros/intel_cori-haswell.cmake b/build/cmake_macros/intel_cori-haswell.cmake new file mode 100644 index 0000000000..6fe65eb1d9 --- /dev/null +++ b/build/cmake_macros/intel_cori-haswell.cmake @@ -0,0 +1,9 @@ +set(CONFIG_ARGS "--host=cray") +string(APPEND CFLAGS " -xCORE-AVX2") +string(APPEND FFLAGS " -xCORE-AVX2") +string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_SLASHPROC") +endif() +string(APPEND LDFLAGS " -mkl") +set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_cori-knl.cmake b/build/cmake_macros/intel_cori-knl.cmake new file mode 100644 index 0000000000..683c1a8068 --- /dev/null +++ b/build/cmake_macros/intel_cori-knl.cmake @@ -0,0 +1,9 @@ +set(CONFIG_ARGS "--host=cray") +string(APPEND CFLAGS " -xMIC-AVX512") +string(APPEND FFLAGS " -xMIC-AVX512") +string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_SLASHPROC") +endif() +string(APPEND LDFLAGS " -mkl -lmemkind -zmuldefs") +set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_eastwind.cmake b/build/cmake_macros/intel_eastwind.cmake new file mode 100644 index 0000000000..1a1dcf69b3 --- /dev/null +++ b/build/cmake_macros/intel_eastwind.cmake @@ -0,0 +1,11 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +string(APPEND CPPDEFS " -DLINUX") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDF_HOME}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/intel_edison.cmake b/build/cmake_macros/intel_edison.cmake new file mode 100644 index 0000000000..3f41409deb --- /dev/null +++ b/build/cmake_macros/intel_edison.cmake @@ -0,0 +1,11 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_PAPI") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +string(APPEND SLIBS " -L$ENV{NETCDF_DIR} -lnetcdff -Wl,--as-needed,-L$ENV{NETCDF_DIR}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/intel_euler2.cmake b/build/cmake_macros/intel_euler2.cmake new file mode 100644 index 0000000000..42580b2a64 --- /dev/null +++ b/build/cmake_macros/intel_euler2.cmake @@ -0,0 +1,7 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -xCORE-AVX2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -xCORE-AVX2") +endif() +string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_euler3.cmake b/build/cmake_macros/intel_euler3.cmake new file mode 100644 index 0000000000..42580b2a64 --- /dev/null +++ b/build/cmake_macros/intel_euler3.cmake @@ -0,0 +1,7 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -xCORE-AVX2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -xCORE-AVX2") +endif() +string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_euler4.cmake b/build/cmake_macros/intel_euler4.cmake new file mode 100644 index 0000000000..42580b2a64 --- /dev/null +++ b/build/cmake_macros/intel_euler4.cmake @@ -0,0 +1,7 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -xCORE-AVX2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -xCORE-AVX2") +endif() +string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_greenplanet-sib29.cmake b/build/cmake_macros/intel_greenplanet-sib29.cmake new file mode 100644 index 0000000000..e445abd253 --- /dev/null +++ b/build/cmake_macros/intel_greenplanet-sib29.cmake @@ -0,0 +1,3 @@ +set(NETCDF_PATH "$ENV{NCDIR}") +set(PNETCDF_PATH "$ENV{PNDIR}") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/intel_greenplanet-sky24.cmake b/build/cmake_macros/intel_greenplanet-sky24.cmake new file mode 100644 index 0000000000..e445abd253 --- /dev/null +++ b/build/cmake_macros/intel_greenplanet-sky24.cmake @@ -0,0 +1,3 @@ +set(NETCDF_PATH "$ENV{NCDIR}") +set(PNETCDF_PATH "$ENV{PNDIR}") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/intel_gust.cmake b/build/cmake_macros/intel_gust.cmake new file mode 100644 index 0000000000..f3943efe8e --- /dev/null +++ b/build/cmake_macros/intel_gust.cmake @@ -0,0 +1,6 @@ +set(CONFIG_ARGS "--host=cray") +string(APPEND CFLAGS " -march=core-avx2") +string(APPEND FFLAGS " -march=core-avx2") +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_SLASHPROC") +endif() diff --git a/build/cmake_macros/intel_hobart.cmake b/build/cmake_macros/intel_hobart.cmake new file mode 100644 index 0000000000..e9ac234fd1 --- /dev/null +++ b/build/cmake_macros/intel_hobart.cmake @@ -0,0 +1,16 @@ +string(APPEND CFLAGS " -lifcore") +string(APPEND FFLAGS " -lifcore") +if (MPILIB STREQUAL mpi-serial) + string(APPEND FFLAGS " -mcmodel medium") +endif() +string(APPEND LDFLAGS " -lquadmath") +string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") +string(APPEND LDFLAGS " -Wl,-rpath,$ENV{COMPILER_PATH}/lib/intel64") +string(APPEND LDFLAGS " -Wl,-rpath,$ENV{COMPILER_PATH}/mkl/lib/intel64") +string(APPEND LDFLAGS " -Wl,-rpath,$ENV{MPI_PATH}/lib") +string(APPEND LDFLAGS " -lifcore") +if (MPILIB STREQUAL mvapich2) +endif() +if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) + set(PFUNIT_PATH "/fs/cgd/csm/tools/pFUnit/pFUnit3.2.8_hobart_Intel15.0.2_noMPI_noOpenMP") +endif() diff --git a/build/cmake_macros/intel_izumi.cmake b/build/cmake_macros/intel_izumi.cmake new file mode 100644 index 0000000000..13f2e3be28 --- /dev/null +++ b/build/cmake_macros/intel_izumi.cmake @@ -0,0 +1,3 @@ +if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) + set(PFUNIT_PATH "/fs/cgd/csm/tools/pFUnit/pFUnit3.3.3_izumi_Intel19.0.1_noMPI_noOpenMP") +endif() diff --git a/build/cmake_macros/intel_laramie.cmake b/build/cmake_macros/intel_laramie.cmake new file mode 100644 index 0000000000..ba6a09daa2 --- /dev/null +++ b/build/cmake_macros/intel_laramie.cmake @@ -0,0 +1,5 @@ +string(APPEND CFLAGS " -vec-report") +string(APPEND FFLAGS " -vec-report") +if (DEBUG) + string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") +endif() diff --git a/build/cmake_macros/intel_lawrencium-lr3.cmake b/build/cmake_macros/intel_lawrencium-lr3.cmake new file mode 100644 index 0000000000..8830234902 --- /dev/null +++ b/build/cmake_macros/intel_lawrencium-lr3.cmake @@ -0,0 +1,12 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +string(APPEND SLIBS " -lnetcdff -lnetcdf -mkl") +if (DEBUG) + string(APPEND FFLAGS " -ftrapuv") +endif() +if (DEBUG) + string(APPEND CFLAGS " -ftrapuv") +endif() +set(NETCDF_PATH "$ENV{NETCDF_DIR}") +set(LAPACK_LIBDIR "/global/software/sl-6.x86_64/modules/intel/2016.1.150/lapack/3.6.0-intel/lib") diff --git a/build/cmake_macros/intel_sandiatoss3.cmake b/build/cmake_macros/intel_sandiatoss3.cmake new file mode 100644 index 0000000000..8356ac5e73 --- /dev/null +++ b/build/cmake_macros/intel_sandiatoss3.cmake @@ -0,0 +1,12 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +set(ESMF_LIBDIR "/projects/ccsm/esmf-6.3.0rp1/lib/libO/Linux.intel.64.openmpi.default") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDFROOT}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{PNETCDFROOT}") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -L/projects/ccsm/BLAS-intel -lblas_LINUX") diff --git a/build/cmake_macros/intel_stampede2-knl.cmake b/build/cmake_macros/intel_stampede2-knl.cmake new file mode 100644 index 0000000000..6cdd9fe9c1 --- /dev/null +++ b/build/cmake_macros/intel_stampede2-knl.cmake @@ -0,0 +1,10 @@ +string(APPEND CFLAGS " -xCOMMON-AVX512 -no-fma") +string(APPEND FFLAGS " -xCOMMON-AVX512 -no-fma") +if (MPILIB STREQUAL mpi-serial) + string(APPEND FFLAGS " -mcmodel medium") +endif() +string(APPEND LDFLAGS " -L$ENV{TACC_HDF5_LIB} -lhdf5 $(MKL) -zmuldefs -xCOMMON-AVX512") +execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) +string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -L$ENV{TACC_HDF5_LIB} -lhdf5") +set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") +set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_stampede2-skx.cmake b/build/cmake_macros/intel_stampede2-skx.cmake new file mode 100644 index 0000000000..6cdd9fe9c1 --- /dev/null +++ b/build/cmake_macros/intel_stampede2-skx.cmake @@ -0,0 +1,10 @@ +string(APPEND CFLAGS " -xCOMMON-AVX512 -no-fma") +string(APPEND FFLAGS " -xCOMMON-AVX512 -no-fma") +if (MPILIB STREQUAL mpi-serial) + string(APPEND FFLAGS " -mcmodel medium") +endif() +string(APPEND LDFLAGS " -L$ENV{TACC_HDF5_LIB} -lhdf5 $(MKL) -zmuldefs -xCOMMON-AVX512") +execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) +string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -L$ENV{TACC_HDF5_LIB} -lhdf5") +set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") +set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_theia.cmake b/build/cmake_macros/intel_theia.cmake new file mode 100644 index 0000000000..6a09fe8c2c --- /dev/null +++ b/build/cmake_macros/intel_theia.cmake @@ -0,0 +1,4 @@ +set(MPICC "mpiicc") +set(MPICXX "mpiicpc") +set(MPIFC "mpiifort") +set(NETCDF_PATH "/apps/netcdf/4.3.0-intel") diff --git a/build/cmake_macros/intel_zeus.cmake b/build/cmake_macros/intel_zeus.cmake new file mode 100644 index 0000000000..281ae04b18 --- /dev/null +++ b/build/cmake_macros/intel_zeus.cmake @@ -0,0 +1,18 @@ +set(AR "xiar") +set(ARFLAGS "cru") +if (MPILIB STREQUAL mpi-serial) + string(APPEND FFLAGS " -mcmodel medium") + string(APPEND FFLAGS " -mkl -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") + string(APPEND CFLAGS " -mkl -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") + string(APPEND LDFLAGS " -mkl -lstdc++") + string(APPEND SLIBS " -lstdc++") +endif() +if (MPILIB STREQUAL impi) + string(APPEND FFLAGS " -mkl=cluster -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") + string(APPEND CFLAGS " -mkl=cluster -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") + string(APPEND LDFLAGS " -mkl=cluster") + string(APPEND SLIBS " -lstdc++") +endif() +set(MPICC "mpiicc") +set(MPICXX "mpiicpc") +set(MPIFC "mpiifort") diff --git a/build/cmake_macros/izumi.cmake b/build/cmake_macros/izumi.cmake new file mode 100644 index 0000000000..8894b6a383 --- /dev/null +++ b/build/cmake_macros/izumi.cmake @@ -0,0 +1,9 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(LAPACK_LIBDIR "/usr/lib64") +if (MPILIB STREQUAL mvapich2) + set(MPI_LIB_NAME "mpich") +endif() +set(NETCDF_PATH "$ENV{NETCDF_PATH}") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/laramie.cmake b/build/cmake_macros/laramie.cmake new file mode 100644 index 0000000000..35c2d3c33e --- /dev/null +++ b/build/cmake_macros/laramie.cmake @@ -0,0 +1,6 @@ +if (COMP_NAME STREQUAL gptl) + string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") +endif() +set(NETCDF_PATH "$ENV{NETCDF}") +set(PIO_FILESYSTEM_HINTS "gpfs") +set(PNETCDF_PATH "$ENV{PNETCDF}") diff --git a/build/cmake_macros/lonestar5.cmake b/build/cmake_macros/lonestar5.cmake new file mode 100644 index 0000000000..0c5eec8054 --- /dev/null +++ b/build/cmake_macros/lonestar5.cmake @@ -0,0 +1,6 @@ +string(APPEND CPPDEFS " -DHAVE_NANOTIME") +set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") +string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/nag.cmake b/build/cmake_macros/nag.cmake new file mode 100644 index 0000000000..6a2d97c87a --- /dev/null +++ b/build/cmake_macros/nag.cmake @@ -0,0 +1,30 @@ +string(APPEND CFLAGS " -std=gnu99") +if (DEBUG) + string(APPEND CFLAGS " -g") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_CRAY_POINTERS -DNO_SHR_VMATH -DCPRNAG -DNO_R16") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -Wp,-macro=no_com -convert=BIG_ENDIAN ") +string(APPEND FFLAGS "-indirect ${SRCROOT}/ccs_config/machines/nag_mpi_argument.txt") +if (NOT DEBUG) + string(APPEND FFLAGS " -ieee=full -O2") +endif() +if (DEBUG) + string(APPEND FFLAGS " -C=all -g -time -f2003 -ieee=stop") +endif() +if (DEBUG AND NOT compile_threaded) + string(APPEND FFLAGS " -gline") +endif() +if (COMP_NAME STREQUAL cism) + string(APPEND FFLAGS " -mismatch_all") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-fixed") +set(FREEFLAGS "-free") +set(HAS_F2008_CONTIGUOUS "FALSE") +set(MPICC "mpicc") +set(MPIFC "mpif90") +set(SCC "gcc") +set(SFC "nagfor") +string(APPEND LDFLAGS " -lpthread") +string(APPEND CONFIG_ARGS " FCLIBS='-Wl,--as-needed,--allow-shlib-undefined -L$(COMPILER_PATH)/lib/NAG_Fortran -lf62rts'") diff --git a/build/cmake_macros/nvhpc-gpu.cmake b/build/cmake_macros/nvhpc-gpu.cmake new file mode 100644 index 0000000000..679e81b2f4 --- /dev/null +++ b/build/cmake_macros/nvhpc-gpu.cmake @@ -0,0 +1,46 @@ +string(APPEND CFLAGS " -gopt -time") +if (compile_threaded) + string(APPEND CFLAGS " -mp") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") +set(CXX_LINKER "CXX") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") +if (compile_threaded) + string(APPEND FFLAGS " -mp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") +endif() +if (COMP_NAME STREQUAL datm) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dlnd) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL drof) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dwav) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dice) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL docn) + string(APPEND FFLAGS " -Mnovect") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-Mfixed") +set(FREEFLAGS "-Mfree") +set(HAS_F2008_CONTIGUOUS "FALSE") +set(LDFLAGS "-time -Wl,--allow-multiple-definition") +if (compile_threaded) + string(APPEND LDFLAGS " -mp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "nvc") +set(SCXX "nvc++") +set(SFC "nvfortran") diff --git a/build/cmake_macros/nvhpc-gpu_casper.cmake b/build/cmake_macros/nvhpc-gpu_casper.cmake new file mode 100644 index 0000000000..ed2adbc6c9 --- /dev/null +++ b/build/cmake_macros/nvhpc-gpu_casper.cmake @@ -0,0 +1,15 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O -tp=skylake -Mnofma") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") +if (NOT DEBUG) + string(APPEND LDFLAGS " -O -tp=skylake -Mnofma -acc -gpu=cc70,lineinfo,nofma -Minfo=accel") +endif() +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/nvhpc.cmake b/build/cmake_macros/nvhpc.cmake new file mode 100644 index 0000000000..3e1b451624 --- /dev/null +++ b/build/cmake_macros/nvhpc.cmake @@ -0,0 +1,51 @@ +string(APPEND CFLAGS " -gopt -time") +if (compile_threaded) + string(APPEND CFLAGS " -mp") +endif() +if (NOT DEBUG) + string(APPEND CFLAGS " -O ") + string(APPEND FFLAGS " -O -Mnofma") +endif() + +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") +set(CXX_LINKER "CXX") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") +if (compile_threaded) + string(APPEND FFLAGS " -mp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") +endif() +if (COMP_NAME STREQUAL datm) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dlnd) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL drof) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dwav) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dice) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL docn) + string(APPEND FFLAGS " -Mnovect") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-Mfixed") +set(FREEFLAGS "-Mfree") +set(HAS_F2008_CONTIGUOUS "FALSE") +set(LDFLAGS "-time -Wl,--allow-multiple-definition") +if (compile_threaded) + string(APPEND LDFLAGS " -mp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "nvc") +set(SCXX "nvc++") +set(SFC "nvfortran") diff --git a/build/cmake_macros/nvhpc_casper.cmake b/build/cmake_macros/nvhpc_casper.cmake new file mode 100644 index 0000000000..f3eb207d1e --- /dev/null +++ b/build/cmake_macros/nvhpc_casper.cmake @@ -0,0 +1,15 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O -tp=skylake -Mnofma") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") +if (NOT DEBUG) + string(APPEND LDFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/nvhpc_cheyenne.cmake b/build/cmake_macros/nvhpc_cheyenne.cmake new file mode 100644 index 0000000000..e3769dd9d7 --- /dev/null +++ b/build/cmake_macros/nvhpc_cheyenne.cmake @@ -0,0 +1,4 @@ +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() diff --git a/build/cmake_macros/nvhpc_gust.cmake b/build/cmake_macros/nvhpc_gust.cmake new file mode 100644 index 0000000000..461137315d --- /dev/null +++ b/build/cmake_macros/nvhpc_gust.cmake @@ -0,0 +1,3 @@ +if (NOT DEBUG) + string(APPEND FFLAGS " -target=zen3") +endif() diff --git a/build/cmake_macros/oneapi.cmake b/build/cmake_macros/oneapi.cmake new file mode 100644 index 0000000000..7328c85e30 --- /dev/null +++ b/build/cmake_macros/oneapi.cmake @@ -0,0 +1,61 @@ +string(APPEND CFLAGS " -qno-opt-dynamic-align -fp-model precise -std=gnu99") +if (compile_threaded) + string(APPEND CFLAGS " -qopenmp") +endif() +if (NOT DEBUG) + string(APPEND CFLAGS " -O2 -debug minimal") +endif() +if (DEBUG) + string(APPEND CFLAGS " -O0 -g") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DCPRINTEL") +string(APPEND CXX_LDFLAGS " -cxxlib") +set(CXX_LINKER "FORTRAN") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -qno-opt-dynamic-align -convert big_endian -assume byterecl -ftz -traceback -assume realloc_lhs -fp-model source") +if (compile_threaded) + string(APPEND FFLAGS " -qopenmp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -check uninit -check bounds -check pointers -fpe0 -check noarg_temp_created") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2 -debug minimal") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-fixed") +set(FREEFLAGS "-free") +if (compile_threaded) + string(APPEND LDFLAGS " -qopenmp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "icc") +set(SCXX "icpc") +set(SFC "ifort") +if (MPILIB STREQUAL mpich) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpich2) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mvapich) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mvapich2) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpt) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL openmpi) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL impi) + string(APPEND SLIBS " -mkl=cluster") +endif() +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -mkl") +endif() +set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi-gpu.cmake b/build/cmake_macros/pgi-gpu.cmake new file mode 100644 index 0000000000..856574795e --- /dev/null +++ b/build/cmake_macros/pgi-gpu.cmake @@ -0,0 +1,46 @@ +string(APPEND CFLAGS " -gopt -time") +if (compile_threaded) + string(APPEND CFLAGS " -mp") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") +set(CXX_LINKER "CXX") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") +if (compile_threaded) + string(APPEND FFLAGS " -mp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") +endif() +if (COMP_NAME STREQUAL datm) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dlnd) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL drof) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dwav) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dice) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL docn) + string(APPEND FFLAGS " -Mnovect") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-Mfixed") +set(FREEFLAGS "-Mfree") +set(HAS_F2008_CONTIGUOUS "FALSE") +set(LDFLAGS "-time -Wl,--allow-multiple-definition") +if (compile_threaded) + string(APPEND LDFLAGS " -mp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "pgcc") +set(SCXX "pgc++") +set(SFC "pgf95") diff --git a/build/cmake_macros/pgi-gpu_casper.cmake b/build/cmake_macros/pgi-gpu_casper.cmake new file mode 100644 index 0000000000..600521a1bb --- /dev/null +++ b/build/cmake_macros/pgi-gpu_casper.cmake @@ -0,0 +1,15 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O -tp=skylake -Mnofma") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") +if (NOT DEBUG) + string(APPEND LDFLAGS " -O -tp=skylake -Mnofma -acc -ta=tesla:cc70,lineinfo,nofma -Minfo=accel") +endif() +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/pgi.cmake b/build/cmake_macros/pgi.cmake new file mode 100644 index 0000000000..856574795e --- /dev/null +++ b/build/cmake_macros/pgi.cmake @@ -0,0 +1,46 @@ +string(APPEND CFLAGS " -gopt -time") +if (compile_threaded) + string(APPEND CFLAGS " -mp") +endif() +string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") +set(CXX_LINKER "CXX") +set(FC_AUTO_R8 "-r8") +string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") +if (compile_threaded) + string(APPEND FFLAGS " -mp") +endif() +if (DEBUG) + string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") +endif() +if (COMP_NAME STREQUAL datm) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dlnd) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL drof) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dwav) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL dice) + string(APPEND FFLAGS " -Mnovect") +endif() +if (COMP_NAME STREQUAL docn) + string(APPEND FFLAGS " -Mnovect") +endif() +set(FFLAGS_NOOPT "-O0") +set(FIXEDFLAGS "-Mfixed") +set(FREEFLAGS "-Mfree") +set(HAS_F2008_CONTIGUOUS "FALSE") +set(LDFLAGS "-time -Wl,--allow-multiple-definition") +if (compile_threaded) + string(APPEND LDFLAGS " -mp") +endif() +set(MPICC "mpicc") +set(MPICXX "mpicxx") +set(MPIFC "mpif90") +set(SCC "pgcc") +set(SCXX "pgc++") +set(SFC "pgf95") diff --git a/build/cmake_macros/pgi_bluewaters.cmake b/build/cmake_macros/pgi_bluewaters.cmake new file mode 100644 index 0000000000..ff5f160388 --- /dev/null +++ b/build/cmake_macros/pgi_bluewaters.cmake @@ -0,0 +1,10 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +string(APPEND CFLAGS " -nofma") +set(CXX_LIBS "-lmpichf90_pgi $ENV{PGI_PATH}/linux86-64/$ENV{PGI_VERSION}/lib/f90main.o") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +string(APPEND FFLAGS " -nofma") +set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi_casper.cmake b/build/cmake_macros/pgi_casper.cmake new file mode 100644 index 0000000000..f3eb207d1e --- /dev/null +++ b/build/cmake_macros/pgi_casper.cmake @@ -0,0 +1,15 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O -tp=skylake -Mnofma") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") +if (NOT DEBUG) + string(APPEND LDFLAGS " -O -tp=skylake -Mnofma") +endif() +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() +string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/pgi_cheyenne.cmake b/build/cmake_macros/pgi_cheyenne.cmake new file mode 100644 index 0000000000..e3769dd9d7 --- /dev/null +++ b/build/cmake_macros/pgi_cheyenne.cmake @@ -0,0 +1,4 @@ +string(APPEND SLIBS " -llapack -lblas") +if (MPILIB STREQUAL mpi-serial) + string(APPEND SLIBS " -ldl") +endif() diff --git a/build/cmake_macros/pgi_constance.cmake b/build/cmake_macros/pgi_constance.cmake new file mode 100644 index 0000000000..1a1dcf69b3 --- /dev/null +++ b/build/cmake_macros/pgi_constance.cmake @@ -0,0 +1,11 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +string(APPEND CPPDEFS " -DLINUX") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDF_HOME}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pgi_daint.cmake b/build/cmake_macros/pgi_daint.cmake new file mode 100644 index 0000000000..9c9661883e --- /dev/null +++ b/build/cmake_macros/pgi_daint.cmake @@ -0,0 +1,3 @@ +string(APPEND FFLAGS " -I/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/build/lib/mct -I/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/build/lib/psmile.MPI1") +string(APPEND SLIBS " -llapack -lblas") +string(APPEND SLIBS " -L/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/lib -lpsmile.MPI1 -lscrip -lmct_oasis -lmpeu_oasis") diff --git a/build/cmake_macros/pgi_eastwind.cmake b/build/cmake_macros/pgi_eastwind.cmake new file mode 100644 index 0000000000..6384e42c21 --- /dev/null +++ b/build/cmake_macros/pgi_eastwind.cmake @@ -0,0 +1,20 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +if (NOT compile_threaded) + string(APPEND CFLAGS " -nomp") +endif() +set(CONFIG_ARGS "--host=cray") +string(APPEND CPPDEFS " -DLINUX") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +if (NOT compile_threaded) + string(APPEND FFLAGS " -nomp") +endif() +if (NOT compile_threaded) + string(APPEND LDFLAGS " -nomp") +endif() +set(NETCDF_PATH "$ENV{NETCDF_HOME}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pgi_euler2.cmake b/build/cmake_macros/pgi_euler2.cmake new file mode 100644 index 0000000000..be865e50f9 --- /dev/null +++ b/build/cmake_macros/pgi_euler2.cmake @@ -0,0 +1,6 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() diff --git a/build/cmake_macros/pgi_euler3.cmake b/build/cmake_macros/pgi_euler3.cmake new file mode 100644 index 0000000000..be865e50f9 --- /dev/null +++ b/build/cmake_macros/pgi_euler3.cmake @@ -0,0 +1,6 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() diff --git a/build/cmake_macros/pgi_euler4.cmake b/build/cmake_macros/pgi_euler4.cmake new file mode 100644 index 0000000000..be865e50f9 --- /dev/null +++ b/build/cmake_macros/pgi_euler4.cmake @@ -0,0 +1,6 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() diff --git a/build/cmake_macros/pgi_hobart.cmake b/build/cmake_macros/pgi_hobart.cmake new file mode 100644 index 0000000000..d3daece90a --- /dev/null +++ b/build/cmake_macros/pgi_hobart.cmake @@ -0,0 +1,10 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O0") +endif() +if (NOT DEBUG) + string(APPEND FFLAGS " -O0") +endif() +string(APPEND LDFLAGS " -lgomp") +string(APPEND LDFLAGS " -Wl,-R${NETCDF_PATH}/lib") +string(APPEND LDFLAGS " -Wl,-R$ENV{COMPILER_PATH}/lib") +string(APPEND LDFLAGS " -Wl,-R$ENV{COMPILER_PATH}/libso") diff --git a/build/cmake_macros/pgi_izumi.cmake b/build/cmake_macros/pgi_izumi.cmake new file mode 100644 index 0000000000..3cb6b34e86 --- /dev/null +++ b/build/cmake_macros/pgi_izumi.cmake @@ -0,0 +1,2 @@ +set(CXX_LINKER "FORTRAN") +set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi_olympus.cmake b/build/cmake_macros/pgi_olympus.cmake new file mode 100644 index 0000000000..1ee0816812 --- /dev/null +++ b/build/cmake_macros/pgi_olympus.cmake @@ -0,0 +1,11 @@ +if (NOT DEBUG) + string(APPEND CFLAGS " -O2") +endif() +set(CONFIG_ARGS "--host=cray") +string(APPEND CPPDEFS " -DLINUX") +if (NOT DEBUG) + string(APPEND FFLAGS " -O2") +endif() +set(NETCDF_PATH "$ENV{NETCDF_LIB}/..") +set(PIO_FILESYSTEM_HINTS "lustre") +set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pleiades-bro.cmake b/build/cmake_macros/pleiades-bro.cmake new file mode 100644 index 0000000000..f3e3bf82dd --- /dev/null +++ b/build/cmake_macros/pleiades-bro.cmake @@ -0,0 +1,6 @@ +string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +set(MPICC "icc") +set(MPI_PATH "$ENV{MPI_ROOT}") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-has.cmake b/build/cmake_macros/pleiades-has.cmake new file mode 100644 index 0000000000..f3e3bf82dd --- /dev/null +++ b/build/cmake_macros/pleiades-has.cmake @@ -0,0 +1,6 @@ +string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +set(MPICC "icc") +set(MPI_PATH "$ENV{MPI_ROOT}") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-ivy.cmake b/build/cmake_macros/pleiades-ivy.cmake new file mode 100644 index 0000000000..f3e3bf82dd --- /dev/null +++ b/build/cmake_macros/pleiades-ivy.cmake @@ -0,0 +1,6 @@ +string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +set(MPICC "icc") +set(MPI_PATH "$ENV{MPI_ROOT}") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-san.cmake b/build/cmake_macros/pleiades-san.cmake new file mode 100644 index 0000000000..f3e3bf82dd --- /dev/null +++ b/build/cmake_macros/pleiades-san.cmake @@ -0,0 +1,6 @@ +string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") +set(MPICC "icc") +set(MPI_PATH "$ENV{MPI_ROOT}") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/stampede2-knl.cmake b/build/cmake_macros/stampede2-knl.cmake new file mode 100644 index 0000000000..ed1c0d299b --- /dev/null +++ b/build/cmake_macros/stampede2-knl.cmake @@ -0,0 +1,4 @@ +string(APPEND CPPDEFS " -DHAVE_NANOTIME") +set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") diff --git a/build/cmake_macros/stampede2-skx.cmake b/build/cmake_macros/stampede2-skx.cmake new file mode 100644 index 0000000000..ed1c0d299b --- /dev/null +++ b/build/cmake_macros/stampede2-skx.cmake @@ -0,0 +1,4 @@ +string(APPEND CPPDEFS " -DHAVE_NANOTIME") +set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") +set(PIO_FILESYSTEM_HINTS "lustre") +set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") diff --git a/build/cmake_macros/theta.cmake b/build/cmake_macros/theta.cmake new file mode 100644 index 0000000000..81db81ed2c --- /dev/null +++ b/build/cmake_macros/theta.cmake @@ -0,0 +1,4 @@ +string(APPEND CFLAGS " -xMIC-AVX512") +string(APPEND FFLAGS " -xMIC-AVX512") +set(CONFIG_ARGS "--host=cray") +string(APPEND SLIBS " -L$(NETCDF_DIR)/lib -lnetcdff -L$(NETCDF_DIR)/lib -lnetcdf -Wl,-rpath -Wl,$(NETCDF_DIR)/lib") diff --git a/build/cmake_macros/universal.cmake b/build/cmake_macros/universal.cmake new file mode 100644 index 0000000000..a1acb1ac17 --- /dev/null +++ b/build/cmake_macros/universal.cmake @@ -0,0 +1,18 @@ +string(APPEND CPPDEFS " -DCESMCOUPLED") +if (COMP_NAME STREQUAL pop) + string(APPEND CPPDEFS " -D_USE_FLOW_CONTROL") +endif() +if (COMP_NAME STREQUAL ufsatm) + string(APPEND CPPDEFS " -DSPMD") +endif() +if (COMP_NAME STREQUAL ufsatm) + string(APPEND INCLDIR " -I$(EXEROOT)/atm/obj/FMS") +endif() +if (COMP_NAME STREQUAL ufsatm) + string(APPEND FFLAGS " $(FC_AUTO_R8)") +endif() +if (COMP_NAME STREQUAL mom) + string(APPEND FFLAGS " $(FC_AUTO_R8) ") + string(APPEND CPPDEFS " -Duse_LARGEFILE") +endif() +set(SUPPORTS_CXX "FALSE") diff --git a/build/cmake_macros/userdefined.cmake b/build/cmake_macros/userdefined.cmake new file mode 100644 index 0000000000..798dcc9714 --- /dev/null +++ b/build/cmake_macros/userdefined.cmake @@ -0,0 +1,9 @@ +set(CONFIG_ARGS "") +string(APPEND CPPDEFS " ") +set(ESMF_LIBDIR "") +set(MPI_LIB_NAME "") +set(MPI_PATH "") +set(NETCDF_PATH "USERDEFINED_MUST_EDIT_THIS") +set(PNETCDF_PATH "") +execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) +string(APPEND SLIBS " # USERDEFINED ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0}") diff --git a/build/cmake_macros/zeus.cmake b/build/cmake_macros/zeus.cmake new file mode 100644 index 0000000000..8c24e3dc9b --- /dev/null +++ b/build/cmake_macros/zeus.cmake @@ -0,0 +1,8 @@ +set(PIO_FILESYSTEM_HINTS "gpfs") +set(NETCDF_PATH "$ENV{NETCDF}") +set(PNETCDF_PATH "$ENV{PNETCDF}") +string(APPEND CPPDEFS " -DNO_R16 -DHAVE_NANOTIME") +if (COMP_NAME STREQUAL nemo) + string(APPEND FFLAGS " $(FC_AUTO_R8) -O3 -assume norealloc_lhs") +endif() +execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs) diff --git a/build/env_mach_specific.xml b/build/env_mach_specific.xml new file mode 100644 index 0000000000..dc1c9f88e9 --- /dev/null +++ b/build/env_mach_specific.xml @@ -0,0 +1,32 @@ + + +
+ These variables control the machine dependent environment including + the paths to compilers and libraries external to cime such as netcdf, + environment variables for use in the running job should also be set here. +
+ + + char + executable name + + + char + redirect for job output + + + + + /Users/afoster/esmf/esmf-8.4.0/lib/libg/Darwin.gfortranclang.64.openmpi.default/esmf.mk + + + mpirun + + -np $TOTALPES + --tag-output + + + + + +
diff --git a/test_list.xml b/test_list.xml new file mode 100644 index 0000000000..41719be6c2 --- /dev/null +++ b/test_list.xml @@ -0,0 +1,7 @@ + + + + unit_testing/test/radiation_test + + + diff --git a/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 b/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 index 21ca8c57df..042f5e71e2 100644 --- a/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 +++ b/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 @@ -13,68 +13,41 @@ program FatesUnitTestRadiation implicit none ! LOCALS: - character(len=256) :: param_file, patch_file, out_file ! file names - integer :: numpft, numSWb - ! real(r8) :: rhol(num_pft,num_swb) ! leaf reflectance (0-1) - ! real(r8) :: rhos(num_pft,num_swb) ! stem reflectance (0-1) - ! real(r8) :: taul(num_pft,num_swb) ! leaf transmittance (0-1) - ! real(r8) :: taus(num_pft,num_swb) ! stem transmittance (0-1) - ! real(r8) :: xl(num_pft) ! leaf/stem orientation index (-1-1) - ! real(r8) :: clumping_index(num_pft) ! clumping index (0-1) - ! real(r8) :: fcansno ! fraction of canopy covered by snow - ! real(r8) :: canopy_area_profile(num_can,num_pft,nlevleaf) ! fraction of crown area per canopy area in each layer - ! real(r8) :: elai_profile(num_can,num_pft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer - ! real(r8) :: esai_profile(num_can,num_pft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer - ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft - ! integer :: nrad(num_can,num_pft) ! number of exposed leaf layers for each canopy layer and pft - ! real(r8) :: k_dir(num_pft,48) ! direct beam extinction coefficient - ! real(SHR_KIND_R8) :: eccen ! orbital eccentricity - ! real(SHR_KIND_R8) :: mvelp ! moving vernal equinox long - ! real(SHR_KIND_R8) :: obliqr ! Earths obliquity in rad - ! real(SHR_KIND_R8) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) - ! real(SHR_KIND_R8) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) - ! real(SHR_KIND_R8) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) - ! real(SHR_KIND_R8) :: calday ! calendar day (including fraction) - ! real(SHR_KIND_R8) :: declin ! solar declination (radians) - ! real(SHR_KIND_R8) :: cosz(48) ! cosine of solar zenith angle (radians) - ! real(r8) :: lat, lon - ! integer :: jday ! julian day - ! integer :: year ! year - ! integer :: i ! looping index + character(len=MAX_PATH) :: param_file, patch_file, out_file ! file names + integer :: numSWb ! number of shortwave bands to simulate + integer :: year, jday ! year and day of year to simulate + real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] + real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] interface - subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & - out_file) + subroutine read_radiation_namelist(numSWb, year, jday, lat, lon, fcansno, & + param_file, patch_file, out_file) use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file implicit none - character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names - integer, intent(out) :: numpft, numSWb + character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file + integer, intent(out) :: numSWb, year, jday + real(r8), intent(out) :: lat, lon + real(r8), intent(out) :: fcansno end subroutine read_radiation_namelist end interface - print *, 'Hello, unit test' - - ! file_names - ! logf = open_file("log.txt") - - ! ! set julian day, year, and lat/lon here - ! jday = 165 - ! year = 2000 - ! lat = 45.76_r8*pi_const/180.0_r8 - ! lon = 237.67_r8*pi_const/180.0_r8 - ! fcansno = 0.0_r8 - - ! ! get patch and parameter values, as well as orbital parameters - ! call get_parameters(file_in, rhol, rhos, taul, taus, xl, clumping_index) + call read_radiation_namelist(numSWB, year, jday, lat, lon, fcansno, & + param_file, patch_file, out_file) + + ! open log file + logf = open_file("log.txt") + + ! get patch and parameter values, as well as orbital parameters + !call get_parameters(param_file, rhol, rhos, taul, taus, xl, clumping_index) + ! call read_patch_data(patch_file, canopy_area_profile, elai_profile, & ! esai_profile, nrad_r) - ! nrad = int(nrad_r) ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) ! cosz(:) = 0.0 @@ -100,8 +73,8 @@ end program FatesUnitTestRadiation !:.............................................................................: -subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & - out_file) +subroutine read_radiation_namelist(numSWb, year, jday, lat, lon, fcansno, & + param_file, patch_file, out_file) use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file @@ -115,7 +88,10 @@ subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & ! ARGUMENTS: character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names - integer, intent(out) :: numpft, numSWb + integer, intent(out) :: numSWb ! number of shortwave bands + integer, intent(out) :: year, jday ! year and day of year + real(r8), intent(out) :: lat, lon ! latitude and longitude [degrees] + real(r8), intent(out) :: fcansno ! fraction of canopy covered by snow [0-1] ! LOCALS: character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name @@ -126,8 +102,8 @@ subroutine read_radiation_namelist(numpft, numSWb, param_file, patch_file, & ! Namelist of radiation parameters - namelist /radiation/ numpft, numSWb, param_file, patch_file, out_file - + namelist /radiation/ numSWb, year, jday, lat, lon, fcansno, param_file, & + patch_file, out_file ! Now read parameters namelist rad_nl_file = open_file(trim(rad_nl), 'r') diff --git a/unit_testing/test/radiation_test/radiation_nl b/unit_testing/test/radiation_test/radiation_nl new file mode 100644 index 0000000000..9b33dbf6e3 --- /dev/null +++ b/unit_testing/test/radiation_test/radiation_nl @@ -0,0 +1,13 @@ +&radiation +! parameters for the radiation unit test +! see FatesUnitTestRadiation.F90 +numSWb = 2 +year = 2000 +jday = 165 +lat = 45.0 +lon = 238.0 +fcansno = 0.0 +param_file = '/Users/afoster/Documents/ncar/fates/albedo_calib/fates_params_default.nc' +patch_file = 'patch_data.nc' +out_file = 'radiation_out.nc' +/ From 41ee71fd8b7ead4ec90ca9f85f9539d151d044ed Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Apr 2023 09:20:04 -0600 Subject: [PATCH 043/125] accidentally added build --- build/.env_mach_specific.csh | 8 - build/.env_mach_specific.sh | 8 - build/Depends.gnu | 2 - build/Macros.cmake | 37 - .../__command_line_test__/CMakeCache.txt | 492 -------- .../CMakeFiles/3.25.2/CMakeCCompiler.cmake | 72 -- .../3.25.2/CMakeDetermineCompilerABI_C.bin | Bin 16688 -> 0 bytes .../CMakeDetermineCompilerABI_Fortran.bin | Bin 33512 -> 0 bytes .../3.25.2/CMakeFortranCompiler.cmake | 62 - .../CMakeFiles/3.25.2/CMakeSystem.cmake | 15 - .../3.25.2/CompilerIdC/CMakeCCompilerId.c | 868 ------------- .../CMakeFortranCompilerId.F | 1114 ----------------- .../CMakeDirectoryInformation.cmake | 16 - .../CMakeFiles/Makefile.cmake | 141 --- .../CMakeFiles/Makefile2 | 206 --- .../CMakeFiles/Progress/1 | 1 - .../CMakeFiles/Progress/2 | 1 - .../CMakeFiles/Progress/3 | 1 - .../CMakeFiles/Progress/4 | 1 - .../CMakeFiles/Progress/6 | 1 - .../CMakeFiles/Progress/7 | 1 - .../CMakeFiles/Progress/8 | 1 - .../CMakeFiles/Progress/9 | 1 - .../CMakeFiles/Progress/count.txt | 1 - .../CMakeFiles/TargetDirectories.txt | 17 - .../CMakeFiles/cmake.check_cache | 1 - .../CMakeFiles/progress.marks | 1 - .../CMakeFiles/utils.dir/DependInfo.cmake | 37 - .../CMakeFiles/utils.dir/build.make | 140 --- .../CMakeFiles/utils.dir/cmake_clean.cmake | 12 - .../utils.dir/cmake_clean_Fortran.cmake | 14 - .../utils.dir/cmake_clean_target.cmake | 3 - .../CMakeFiles/utils.dir/compiler_depend.make | 2 - .../CMakeFiles/utils.dir/compiler_depend.ts | 2 - .../CMakeFiles/utils.dir/depend.internal | 9 - .../CMakeFiles/utils.dir/depend.make | 25 - .../utils.dir/fatesconstantsmod.mod.stamp | Bin 2256 -> 0 bytes .../utils.dir/fatesunittestiomod.mod.stamp | Bin 24087 -> 0 bytes .../fatesunittestorbitalmod.mod.stamp | Bin 25076 -> 0 bytes .../CMakeFiles/utils.dir/flags.make | 10 - .../CMakeFiles/utils.dir/fortran.internal | 5 - .../CMakeFiles/utils.dir/link.txt | 2 - .../FatesConstantsMod.F90.o.provides.build | 0 .../CMakeFiles/utils.dir/progress.make | 5 - .../FatesUnitTestIOMod.F90.o.provides.build | 0 ...tesUnitTestOrbitalMod.F90.o.provides.build | 0 .../__command_line_test__/CTestTestfile.cmake | 9 - .../__command_line_test__/Macros.cmake | 1 - .../__command_line_test__/Makefile | 260 ---- .../__command_line_test__/cmake_install.cmake | 57 - .../__command_line_test__/libutils.a | Bin 40264 -> 0 bytes .../CMakeDirectoryInformation.cmake | 16 - .../main/CMakeFiles/progress.marks | 1 - .../main/CTestTestfile.cmake | 6 - .../__command_line_test__/main/Makefile | 151 --- .../main/cmake_install.cmake | 39 - .../CMakeDirectoryInformation.cmake | 16 - .../test/CMakeFiles/progress.marks | 1 - .../unit_testing/test/CTestTestfile.cmake | 7 - .../unit_testing/test/Makefile | 151 --- .../unit_testing/test/cmake_install.cmake | 45 - .../CMakeDirectoryInformation.cmake | 16 - .../FATES_rad_test.dir/DependInfo.cmake | 37 - .../FatesConstantsMod.F90.o.provides.build | 0 .../FatesUnitTestIOMod.F90.o.provides.build | 0 ...tesUnitTestOrbitalMod.F90.o.provides.build | 0 .../CMakeFiles/FATES_rad_test.dir/build.make | 154 --- .../FATES_rad_test.dir/cmake_clean.cmake | 13 - .../cmake_clean_Fortran.cmake | 14 - .../FATES_rad_test.dir/compiler_depend.make | 2 - .../FATES_rad_test.dir/compiler_depend.ts | 2 - .../FATES_rad_test.dir/depend.internal | 11 - .../CMakeFiles/FATES_rad_test.dir/depend.make | 27 - .../fatesconstantsmod.mod.stamp | Bin 2256 -> 0 bytes .../fatesunittestiomod.mod.stamp | Bin 24087 -> 0 bytes .../fatesunittestorbitalmod.mod.stamp | Bin 25076 -> 0 bytes .../CMakeFiles/FATES_rad_test.dir/flags.make | 10 - .../FATES_rad_test.dir/fortran.internal | 5 - .../CMakeFiles/FATES_rad_test.dir/link.txt | 1 - .../FATES_rad_test.dir/progress.make | 6 - .../radiation_test/CMakeFiles/progress.marks | 1 - .../test/radiation_test/CTestTestfile.cmake | 8 - .../unit_testing/test/radiation_test/Makefile | 274 ---- .../test/radiation_test/cmake_install.cmake | 39 - .../CMakeDirectoryInformation.cmake | 16 - .../utils/CMakeFiles/progress.marks | 1 - .../unit_testing/utils/CTestTestfile.cmake | 6 - .../unit_testing/utils/Makefile | 151 --- .../unit_testing/utils/cmake_install.cmake | 39 - build/cmake_macros/CMakeLists.txt | 4 - build/cmake_macros/CNL.cmake | 14 - build/cmake_macros/Darwin.cmake | 1 - build/cmake_macros/Macros.cmake | 37 - build/cmake_macros/arm.cmake | 0 build/cmake_macros/armgcc.cmake | 0 build/cmake_macros/athena.cmake | 0 build/cmake_macros/bluewaters.cmake | 0 build/cmake_macros/casper.cmake | 0 build/cmake_macros/centos7-linux.cmake | 1 - build/cmake_macros/cheyenne.cmake | 6 - build/cmake_macros/container.cmake | 7 - build/cmake_macros/cray.cmake | 37 - build/cmake_macros/cray_daint.cmake | 2 - build/cmake_macros/euler2.cmake | 5 - build/cmake_macros/euler3.cmake | 5 - build/cmake_macros/euler4.cmake | 5 - build/cmake_macros/frontera.cmake | 9 - build/cmake_macros/gnu.cmake | 43 - build/cmake_macros/gnu_cheyenne.cmake | 4 - build/cmake_macros/gnu_coeus.cmake | 2 - build/cmake_macros/gnu_fleabone.cmake | 27 - build/cmake_macros/gnu_hobart.cmake | 1 - build/cmake_macros/gnu_homebrew.cmake | 1 - build/cmake_macros/gnu_lobata.cmake | 15 - build/cmake_macros/gnu_melvin.cmake | 13 - build/cmake_macros/gnu_modex.cmake | 5 - build/cmake_macros/gust.cmake | 10 - build/cmake_macros/hobart.cmake | 9 - build/cmake_macros/ibm.cmake | 38 - build/cmake_macros/ibm_AIX.cmake | 18 - build/cmake_macros/ibm_BGQ.cmake | 11 - build/cmake_macros/intel.cmake | 61 - build/cmake_macros/intel_Darwin.cmake | 3 - build/cmake_macros/intel_aleph.cmake | 8 - build/cmake_macros/intel_athena.cmake | 20 - build/cmake_macros/intel_aws-hpc6a.cmake | 8 - build/cmake_macros/intel_bluewaters.cmake | 3 - build/cmake_macros/intel_casper.cmake | 9 - build/cmake_macros/intel_cheyenne.cmake | 12 - build/cmake_macros/intel_constance.cmake | 11 - build/cmake_macros/intel_cori-haswell.cmake | 9 - build/cmake_macros/intel_cori-knl.cmake | 9 - build/cmake_macros/intel_eastwind.cmake | 11 - build/cmake_macros/intel_edison.cmake | 11 - build/cmake_macros/intel_euler2.cmake | 7 - build/cmake_macros/intel_euler3.cmake | 7 - build/cmake_macros/intel_euler4.cmake | 7 - .../intel_greenplanet-sib29.cmake | 3 - .../intel_greenplanet-sky24.cmake | 3 - build/cmake_macros/intel_gust.cmake | 6 - build/cmake_macros/intel_hobart.cmake | 16 - build/cmake_macros/intel_izumi.cmake | 3 - build/cmake_macros/intel_laramie.cmake | 5 - build/cmake_macros/intel_lawrencium-lr3.cmake | 12 - build/cmake_macros/intel_sandiatoss3.cmake | 12 - build/cmake_macros/intel_stampede2-knl.cmake | 10 - build/cmake_macros/intel_stampede2-skx.cmake | 10 - build/cmake_macros/intel_theia.cmake | 4 - build/cmake_macros/intel_zeus.cmake | 18 - build/cmake_macros/izumi.cmake | 9 - build/cmake_macros/laramie.cmake | 6 - build/cmake_macros/lonestar5.cmake | 6 - build/cmake_macros/nag.cmake | 30 - build/cmake_macros/nvhpc-gpu.cmake | 46 - build/cmake_macros/nvhpc-gpu_casper.cmake | 15 - build/cmake_macros/nvhpc.cmake | 51 - build/cmake_macros/nvhpc_casper.cmake | 15 - build/cmake_macros/nvhpc_cheyenne.cmake | 4 - build/cmake_macros/nvhpc_gust.cmake | 3 - build/cmake_macros/oneapi.cmake | 61 - build/cmake_macros/pgi-gpu.cmake | 46 - build/cmake_macros/pgi-gpu_casper.cmake | 15 - build/cmake_macros/pgi.cmake | 46 - build/cmake_macros/pgi_bluewaters.cmake | 10 - build/cmake_macros/pgi_casper.cmake | 15 - build/cmake_macros/pgi_cheyenne.cmake | 4 - build/cmake_macros/pgi_constance.cmake | 11 - build/cmake_macros/pgi_daint.cmake | 3 - build/cmake_macros/pgi_eastwind.cmake | 20 - build/cmake_macros/pgi_euler2.cmake | 6 - build/cmake_macros/pgi_euler3.cmake | 6 - build/cmake_macros/pgi_euler4.cmake | 6 - build/cmake_macros/pgi_hobart.cmake | 10 - build/cmake_macros/pgi_izumi.cmake | 2 - build/cmake_macros/pgi_olympus.cmake | 11 - build/cmake_macros/pleiades-bro.cmake | 6 - build/cmake_macros/pleiades-has.cmake | 6 - build/cmake_macros/pleiades-ivy.cmake | 6 - build/cmake_macros/pleiades-san.cmake | 6 - build/cmake_macros/stampede2-knl.cmake | 4 - build/cmake_macros/stampede2-skx.cmake | 4 - build/cmake_macros/theta.cmake | 4 - build/cmake_macros/universal.cmake | 18 - build/cmake_macros/userdefined.cmake | 9 - build/cmake_macros/zeus.cmake | 8 - build/env_mach_specific.xml | 32 - 186 files changed, 6116 deletions(-) delete mode 100644 build/.env_mach_specific.csh delete mode 100644 build/.env_mach_specific.sh delete mode 100644 build/Depends.gnu delete mode 100644 build/Macros.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeCache.txt delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake delete mode 100755 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin delete mode 100755 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeFortranCompiler.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeSystem.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdC/CMakeCCompilerId.c delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/CTestTestfile.cmake delete mode 120000 build/__command_line_test__/__command_line_test__/Macros.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/Makefile delete mode 100644 build/__command_line_test__/__command_line_test__/cmake_install.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/libutils.a delete mode 100644 build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks delete mode 100644 build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/main/Makefile delete mode 100644 build/__command_line_test__/__command_line_test__/main/cmake_install.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile delete mode 100644 build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake delete mode 100644 build/cmake_macros/CMakeLists.txt delete mode 100644 build/cmake_macros/CNL.cmake delete mode 100644 build/cmake_macros/Darwin.cmake delete mode 100644 build/cmake_macros/Macros.cmake delete mode 100644 build/cmake_macros/arm.cmake delete mode 100644 build/cmake_macros/armgcc.cmake delete mode 100644 build/cmake_macros/athena.cmake delete mode 100644 build/cmake_macros/bluewaters.cmake delete mode 100644 build/cmake_macros/casper.cmake delete mode 100644 build/cmake_macros/centos7-linux.cmake delete mode 100644 build/cmake_macros/cheyenne.cmake delete mode 100644 build/cmake_macros/container.cmake delete mode 100644 build/cmake_macros/cray.cmake delete mode 100644 build/cmake_macros/cray_daint.cmake delete mode 100644 build/cmake_macros/euler2.cmake delete mode 100644 build/cmake_macros/euler3.cmake delete mode 100644 build/cmake_macros/euler4.cmake delete mode 100644 build/cmake_macros/frontera.cmake delete mode 100644 build/cmake_macros/gnu.cmake delete mode 100644 build/cmake_macros/gnu_cheyenne.cmake delete mode 100644 build/cmake_macros/gnu_coeus.cmake delete mode 100644 build/cmake_macros/gnu_fleabone.cmake delete mode 100644 build/cmake_macros/gnu_hobart.cmake delete mode 100644 build/cmake_macros/gnu_homebrew.cmake delete mode 100644 build/cmake_macros/gnu_lobata.cmake delete mode 100644 build/cmake_macros/gnu_melvin.cmake delete mode 100644 build/cmake_macros/gnu_modex.cmake delete mode 100644 build/cmake_macros/gust.cmake delete mode 100644 build/cmake_macros/hobart.cmake delete mode 100644 build/cmake_macros/ibm.cmake delete mode 100644 build/cmake_macros/ibm_AIX.cmake delete mode 100644 build/cmake_macros/ibm_BGQ.cmake delete mode 100644 build/cmake_macros/intel.cmake delete mode 100644 build/cmake_macros/intel_Darwin.cmake delete mode 100644 build/cmake_macros/intel_aleph.cmake delete mode 100644 build/cmake_macros/intel_athena.cmake delete mode 100644 build/cmake_macros/intel_aws-hpc6a.cmake delete mode 100644 build/cmake_macros/intel_bluewaters.cmake delete mode 100644 build/cmake_macros/intel_casper.cmake delete mode 100644 build/cmake_macros/intel_cheyenne.cmake delete mode 100644 build/cmake_macros/intel_constance.cmake delete mode 100644 build/cmake_macros/intel_cori-haswell.cmake delete mode 100644 build/cmake_macros/intel_cori-knl.cmake delete mode 100644 build/cmake_macros/intel_eastwind.cmake delete mode 100644 build/cmake_macros/intel_edison.cmake delete mode 100644 build/cmake_macros/intel_euler2.cmake delete mode 100644 build/cmake_macros/intel_euler3.cmake delete mode 100644 build/cmake_macros/intel_euler4.cmake delete mode 100644 build/cmake_macros/intel_greenplanet-sib29.cmake delete mode 100644 build/cmake_macros/intel_greenplanet-sky24.cmake delete mode 100644 build/cmake_macros/intel_gust.cmake delete mode 100644 build/cmake_macros/intel_hobart.cmake delete mode 100644 build/cmake_macros/intel_izumi.cmake delete mode 100644 build/cmake_macros/intel_laramie.cmake delete mode 100644 build/cmake_macros/intel_lawrencium-lr3.cmake delete mode 100644 build/cmake_macros/intel_sandiatoss3.cmake delete mode 100644 build/cmake_macros/intel_stampede2-knl.cmake delete mode 100644 build/cmake_macros/intel_stampede2-skx.cmake delete mode 100644 build/cmake_macros/intel_theia.cmake delete mode 100644 build/cmake_macros/intel_zeus.cmake delete mode 100644 build/cmake_macros/izumi.cmake delete mode 100644 build/cmake_macros/laramie.cmake delete mode 100644 build/cmake_macros/lonestar5.cmake delete mode 100644 build/cmake_macros/nag.cmake delete mode 100644 build/cmake_macros/nvhpc-gpu.cmake delete mode 100644 build/cmake_macros/nvhpc-gpu_casper.cmake delete mode 100644 build/cmake_macros/nvhpc.cmake delete mode 100644 build/cmake_macros/nvhpc_casper.cmake delete mode 100644 build/cmake_macros/nvhpc_cheyenne.cmake delete mode 100644 build/cmake_macros/nvhpc_gust.cmake delete mode 100644 build/cmake_macros/oneapi.cmake delete mode 100644 build/cmake_macros/pgi-gpu.cmake delete mode 100644 build/cmake_macros/pgi-gpu_casper.cmake delete mode 100644 build/cmake_macros/pgi.cmake delete mode 100644 build/cmake_macros/pgi_bluewaters.cmake delete mode 100644 build/cmake_macros/pgi_casper.cmake delete mode 100644 build/cmake_macros/pgi_cheyenne.cmake delete mode 100644 build/cmake_macros/pgi_constance.cmake delete mode 100644 build/cmake_macros/pgi_daint.cmake delete mode 100644 build/cmake_macros/pgi_eastwind.cmake delete mode 100644 build/cmake_macros/pgi_euler2.cmake delete mode 100644 build/cmake_macros/pgi_euler3.cmake delete mode 100644 build/cmake_macros/pgi_euler4.cmake delete mode 100644 build/cmake_macros/pgi_hobart.cmake delete mode 100644 build/cmake_macros/pgi_izumi.cmake delete mode 100644 build/cmake_macros/pgi_olympus.cmake delete mode 100644 build/cmake_macros/pleiades-bro.cmake delete mode 100644 build/cmake_macros/pleiades-has.cmake delete mode 100644 build/cmake_macros/pleiades-ivy.cmake delete mode 100644 build/cmake_macros/pleiades-san.cmake delete mode 100644 build/cmake_macros/stampede2-knl.cmake delete mode 100644 build/cmake_macros/stampede2-skx.cmake delete mode 100644 build/cmake_macros/theta.cmake delete mode 100644 build/cmake_macros/universal.cmake delete mode 100644 build/cmake_macros/userdefined.cmake delete mode 100644 build/cmake_macros/zeus.cmake delete mode 100644 build/env_mach_specific.xml diff --git a/build/.env_mach_specific.csh b/build/.env_mach_specific.csh deleted file mode 100644 index 35e5a959f4..0000000000 --- a/build/.env_mach_specific.csh +++ /dev/null @@ -1,8 +0,0 @@ -# This file is for user convenience only and is not used by the model -# Changes to this file will be ignored and overwritten -# Changes to the environment should be made in env_mach_specific.xml -# Run ./case.setup --reset to regenerate this file -setenv COMPILER gnu -setenv MPILIB mpi-serial -setenv DEBUG TRUE -setenv OS Ventura diff --git a/build/.env_mach_specific.sh b/build/.env_mach_specific.sh deleted file mode 100644 index 4adbda012f..0000000000 --- a/build/.env_mach_specific.sh +++ /dev/null @@ -1,8 +0,0 @@ -# This file is for user convenience only and is not used by the model -# Changes to this file will be ignored and overwritten -# Changes to the environment should be made in env_mach_specific.xml -# Run ./case.setup --reset to regenerate this file -export COMPILER=gnu -export MPILIB=mpi-serial -export DEBUG=TRUE -export OS=Ventura diff --git a/build/Depends.gnu b/build/Depends.gnu deleted file mode 100644 index 2d53247217..0000000000 --- a/build/Depends.gnu +++ /dev/null @@ -1,2 +0,0 @@ -geopk.o:geopk.F90 - $(FC) -c $(INCLDIR) $(INCS) $(FFLAGS) $(FREEFLAGS) -fcray-pointer $< diff --git a/build/Macros.cmake b/build/Macros.cmake deleted file mode 100644 index b089f58058..0000000000 --- a/build/Macros.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# -# Use this file to include the relevant macros based on -# machine/compiler settings. This file gets copied to CASEROOT -# and that's the one that gets included by the build system. Feel free -# to modify this file in the CASEROOT. -# -set(MACROS_DIR ${CASEROOT}/cmake_macros) - -set(UNIVERSAL_MACRO ${MACROS_DIR}/universal.cmake) -set(COMPILER_MACRO ${MACROS_DIR}/${COMPILER}.cmake) -set(OS_MACRO ${MACROS_DIR}/${OS}.cmake) -set(MACHINE_MACRO ${MACROS_DIR}/${MACH}.cmake) -set(COMPILER_OS_MACRO ${MACROS_DIR}/${COMPILER}_${OS}.cmake) -set(COMPILER_MACHINE_MACRO ${MACROS_DIR}/${COMPILER}_${MACH}.cmake) - -if (CONVERT_TO_MAKE) - get_cmake_property(VARS_BEFORE_BUILD_INTERNAL_IGNORE VARIABLES) -endif() - -# Include order defines precedence -foreach (MACRO_FILE ${UNIVERSAL_MACRO} ${COMPILER_MACRO} ${OS_MACRO} ${MACHINE_MACRO} ${COMPILER_OS_MACRO} ${COMPILER_MACHINE_MACRO}) - if (EXISTS ${MACRO_FILE}) - include(${MACRO_FILE}) - else() - message("No macro file found: ${MACRO_FILE}") - endif() -endforeach() - -if (CONVERT_TO_MAKE) - get_cmake_property(VARS_AFTER VARIABLES) - - foreach (VAR_AFTER IN LISTS VARS_AFTER) - if (NOT VAR_AFTER IN_LIST VARS_BEFORE_BUILD_INTERNAL_IGNORE) - message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}") - endif() - endforeach() -endif() diff --git a/build/__command_line_test__/__command_line_test__/CMakeCache.txt b/build/__command_line_test__/__command_line_test__/CMakeCache.txt deleted file mode 100644 index c99fedf020..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeCache.txt +++ /dev/null @@ -1,492 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ -# It was generated by CMake: /usr/local/Cellar/cmake/3.25.2/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//No help, variable specified on the command line. -CASEROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/src/fates/build - -//No help, variable specified on the command line. -CIMEROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/scripts/fortran_unit_testing/../.. - -//No help, variable specified on the command line. -CIME_CMAKE_MODULE_DIRECTORY:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=CMAKE_ADDR2LINE-NOTFOUND - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=CESM_DEBUG - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - -//Flags used by the C compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the C compiler during CESM_DEBUG builds. -CMAKE_C_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the C compiler during DEBUG builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the C compiler during RELEASE builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker during all build types. -CMAKE_EXE_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib - -//Flags used by the linker during CESM_DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= - -//Value Computed by CMake. -CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/pkgRedirects - -//Fortran compiler -CMAKE_Fortran_COMPILER:FILEPATH=/usr/local/bin/gfortran - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_Fortran_COMPILER_AR:FILEPATH=CMAKE_Fortran_COMPILER_AR-NOTFOUND - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_Fortran_COMPILER_RANLIB:FILEPATH=CMAKE_Fortran_COMPILER_RANLIB-NOTFOUND - -//Flags used by the Fortran compiler during all build types. -CMAKE_Fortran_FLAGS:STRING= - -//Flags used by the Fortran compiler during CESM_DEBUG builds. -CMAKE_Fortran_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the Fortran compiler during DEBUG builds. -CMAKE_Fortran_FLAGS_DEBUG:STRING=-g - -//Flags used by the Fortran compiler during MINSIZEREL builds. -CMAKE_Fortran_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -Os - -//Flags used by the Fortran compiler during RELEASE builds. -CMAKE_Fortran_FLAGS_RELEASE:STRING=-O3 -DNDEBUG -O3 - -//Flags used by the Fortran compiler during RELWITHDEBINFO builds. -CMAKE_Fortran_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Path to a program. -CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/local/bin/gmake - -//Flags used by the linker during the creation of modules during -// all build types. -CMAKE_MODULE_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib - -//Flags used by the linker during the creation of modules during -// CESM_DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Build architectures for OSX -CMAKE_OSX_ARCHITECTURES:STRING= - -//Minimum OS X version to target for deployment (at runtime); newer -// APIs weak linked. Set to empty string for default value. -CMAKE_OSX_DEPLOYMENT_TARGET:STRING= - -//The product will be built against the headers and libraries located -// inside the indicated SDK. -CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk - -//No help, variable specified on the command line. -CMAKE_PROGRAM_PATH:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM/cime/scripts/fortran_unit_testing/../../CIME/non_py/externals/genf90 - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=radiation_tests - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Path to a program. -CMAKE_READELF:FILEPATH=CMAKE_READELF-NOTFOUND - -//Flags used by the linker during the creation of shared libraries -// during all build types. -CMAKE_SHARED_LINKER_FLAGS:STRING=-L/usr/local/opt/lapack/lib - -//Flags used by the linker during the creation of shared libraries -// during CESM_DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during CESM_DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//No help, variable specified on the command line. -COMPILER:UNINITIALIZED=gnu - -//No help, variable specified on the command line. -DEBUG:UNINITIALIZED=TRUE - -//Use genf90.pl to regenerate out-of-date Fortran files from .in -// files. -ENABLE_GENF90:BOOL=ON - -//Path to a program. -GENF90:FILEPATH=/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/externals/genf90/genf90.pl - -//No help, variable specified on the command line. -MACH:UNINITIALIZED=fleabone - -//No help, variable specified on the command line. -MPILIB:UNINITIALIZED=mpi-serial - -//Path to a file. -NETCDFC_FOUND:PATH=/usr/local/Cellar/netcdf/4.9.2/lib - -//Path to a file. -NETCDFF_FOUND:PATH=/usr/local/Cellar/netcdf-fortran/4.6.0/lib - -//Netcdf Library Names(s) -NETCDF_C_LIBS:STRING=netcdff;netcdf - -//No help, variable specified on the command line. -OS:UNINITIALIZED=Ventura - -//Path to a file. -PFUNIT_INCLUDE_DIR:PATH=/Users/afoster/pFUnit/include - -//Path to a library. -PFUNIT_LIBRARY:FILEPATH=/Users/afoster/pFUnit/lib/libpfunit.a - -//Path to a file. -PFUNIT_MODULE_DIR:PATH=/Users/afoster/pFUnit/mod - -//No help, variable specified on the command line. -PFUNIT_MPIRUN:UNINITIALIZED= - -//Path to a program. -PFUNIT_PARSER:FILEPATH=/Users/afoster/pFUnit/bin/pFUnitParser.py - -//No help, variable specified on the command line. -PFUNIT_PATH:UNINITIALIZED=/Users/afoster/pFUnit/ - -//No help, variable specified on the command line. -SRC_ROOT:UNINITIALIZED=/Users/afoster/Documents/ncar/CTSM - -//Allow color from the build output. -USE_COLOR:BOOL=ON - -//No help, variable specified on the command line. -USE_MPI_SERIAL:UNINITIALIZED=ON - -//No help, variable specified on the command line. -compile_threaded:UNINITIALIZED=FALSE - -//Value Computed by CMake -radiation_tests_BINARY_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -//Value Computed by CMake -radiation_tests_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -radiation_tests_SOURCE_DIR:STATIC=/Users/afoster/Documents/ncar/CTSM/src/fates - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=25 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/ctest -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_CESM_DEBUG -CMAKE_C_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.25.2/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=MACHO -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG -CMAKE_EXE_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//ADVANCED property for variable: CMAKE_Fortran_COMPILER -CMAKE_Fortran_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_COMPILER_AR -CMAKE_Fortran_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_COMPILER_RANLIB -CMAKE_Fortran_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS -CMAKE_Fortran_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS_CESM_DEBUG -CMAKE_Fortran_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS_DEBUG -CMAKE_Fortran_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS_MINSIZEREL -CMAKE_Fortran_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELEASE -CMAKE_Fortran_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELWITHDEBINFO -CMAKE_Fortran_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/Users/afoster/Documents/ncar/CTSM/src/fates -//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL -CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG -CMAKE_MODULE_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=5 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/local/Cellar/cmake/3.25.2/share/cmake -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG -CMAKE_SHARED_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG -CMAKE_STATIC_LINKER_FLAGS_CESM_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/usr/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Details about finding pFUnit -FIND_PACKAGE_MESSAGE_DETAILS_pFUnit:INTERNAL=[/Users/afoster/pFUnit/lib/libpfunit.a][/Users/afoster/pFUnit/include][/Users/afoster/pFUnit/mod][/Users/afoster/pFUnit/bin/pFUnitParser.py][v()] -//ADVANCED property for variable: PFUNIT_INCLUDE_DIR -PFUNIT_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: PFUNIT_LIBRARY -PFUNIT_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: PFUNIT_MODULE_DIR -PFUNIT_MODULE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: PFUNIT_PARSER -PFUNIT_PARSER-ADVANCED:INTERNAL=1 - diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake deleted file mode 100644 index b02d92f9f2..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeCCompiler.cmake +++ /dev/null @@ -1,72 +0,0 @@ -set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "AppleClang") -set(CMAKE_C_COMPILER_VERSION "14.0.0.14000029") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -set(CMAKE_C17_COMPILE_FEATURES "c_std_17") -set(CMAKE_C23_COMPILE_FEATURES "c_std_23") - -set(CMAKE_C_PLATFORM_ID "Darwin") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "") -set(CMAKE_C_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_C_COMPILER_AR "") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_C_COMPILER_RANLIB "") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "") -set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/include;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/local/opt/lapack/lib;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/System/Library/Frameworks") diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_C.bin deleted file mode 100755 index 4656549879429703477a75be0e856ae37b97684a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16688 zcmeI3OKTHR6vuB&TkC_iE3qgTT!?nj)(03$(X@2h8EmJaMi4`}CY`ArNRyIGun{WV zh=d~eQHmRPZd`P!A40)Jgf5GS_&@U?8Ec^*;D6w79{1jJ&;8A8&zE06|D07Sl~zif zfet~l2;Qg+Jf%jVCRFSE%!2XESXq{AQc}tAzme3*Vx!gt<7pweB{-i;=2R5-BP}ZZ ziD>P++kWVWakAdw13U%`tI-yT`?}jD*zFCqUaM6b-Gcx2mwy=6dmbH+7<{dp z)t6q?(Oz}E7R1T^_M>{jR77Ioev)+gFIx5^W6p}%<-)#VPO+VgK8Bdc4N6~EYIpLa zOM3IU@Ow*7m!WyY1F-wByRa9ad8ml&5tVNv->COKgr^eu-!jmP(1~WFK2h^Hacyi6D1cU`LWMTBv%s2J)^Vw85zr-U!H1suiV3>$E_C^twLeZ(1tx{&Df|UGtO6o zN=YlT%QD-14_4I1T)Bw&G7~M+(IdfW$#xx;((0TXR%yMtq1|nFt%=Jw+!AhA{W8U_ zd!D22Z*aMlv6*V@@0E z;ag;V911ILAQ?>9AMZ1mwomk_gFa=DTsQn?S(h=Bj|YVtyL^#|1S~H%~${c diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CMakeDetermineCompilerABI_Fortran.bin deleted file mode 100755 index 332e100ff099bddf2017b5dc5af95bddaa46c149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33512 zcmeI5U2GIp6vyw-Z7JH8Me*B&eXs^K?6&121q8OAOrtFgv`Lkio9XVf-MC-Q%!bl{ zEY=z~Si_5n&-!Tmi1C3C1rnl_7d1Q>9*vQt321mQhE!xd=gtf}JCzut4?g@4oVoYh zd(WA3fA?^(upP^7DS9{LOepMlS(<-vwz^lfrAIQwO+J( z^DixqbA<*b$#R|#de)UL^)_n zX*;D!`%Y6h-sgMWcu#mEeA{=J%}U#C9YYAXJyqoRL$Oku%+naJ-@y?@iB-?O=YPaB6?NON~+@p%{u*#U@3&fB+~P?&l$YP` zmBGBYNyjHzA6$FCi`rtO8mVY#C2di4 z&PgPDt9L&t)k(~a5mFZ18q%8xxmIIFnH@T6J7zB4 z8}xge<{hKV*gu&q7-`dzJTo$ta6kWj=6;udA!TF}{-o7%Os7(b+3p>3$F?m-v6wZt zqz&sxCg0VW=r1=%iS$mGXt~KfNJSuhI_BndfEI!nT=m_5qwXA8vf=z$7+$z(rHdgp;f)QqTW-i_40eh$vl1O zqM|*2Jz6<_ORtn}=%>bSoEo6&_cSD?JQ_dbqVm;wI-)L?@8ib{H19K15tlAj+xOB` zs_jYj>{ZWx^&C`Bot}X+k$q-1Ygma?&Uo2OY>jtqk9Q^P8N)KYrr|=mlr`-{-!Kgr zbPtX86>`N)*0g$hhvI`f>7?Y)$l!rpc4p2jOv!Z7u?}~?M18S-(=k&{rjYNa!;aPU zoS%EPl~Pc$$tyQ{r8aj^XtPl*+OoF!G!3HjynF^zyh=;RlJ^}WTxpBGu_nStV_Tad z8EPOWGFaGejPx_Y!jh!Al2v}Ysk!Fojq-|U*?nEKOgo<>T2|+9sf>6wpARM}t0x{H z00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY z0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4ea|2cseMdWWk&ye!< z5&qQ!R8`*v=aPlLvF(ehM`?7@Z}ILspbG>v`gpfCL0TsLl=Md$LmzneKEy3;(~*WX zZHLe7QXGB+d5Su<5~OgUrnm$pS?&dB6NdxN;e_gk>MJ@<>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__open_xl__) && defined(__clang__) -# define COMPILER_ID "IBMClang" -# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) -# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) -# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) - - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TASKING__) -# define COMPILER_ID "Tasking" - # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) - # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) -# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) -# define COMPILER_ID "LCC" -# define COMPILER_VERSION_MAJOR DEC(1) -# if defined(__LCC__) -# define COMPILER_VERSION_MINOR DEC(__LCC__- 100) -# endif -# if defined(__LCC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) -# endif -# if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define SIMULATE_ID "GNU" -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(_ADI_COMPILER) -# define COMPILER_ID "ADSP" -#if defined(__VERSIONNUM__) - /* __VERSIONNUM__ = 0xVVRRPPTT */ -# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) -# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) -# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) -# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -# elif defined(_ADI_COMPILER) -# define PLATFORM_ID "ADSP" - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -# elif defined(__ADSPSHARC__) -# define ARCHITECTURE_ID "SHARC" - -# elif defined(__ADSPBLACKFIN__) -# define ARCHITECTURE_ID "Blackfin" - -#elif defined(__TASKING__) - -# if defined(__CTC__) || defined(__CPTC__) -# define ARCHITECTURE_ID "TriCore" - -# elif defined(__CMCS__) -# define ARCHITECTURE_ID "MCS" - -# elif defined(__CARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__CARC__) -# define ARCHITECTURE_ID "ARC" - -# elif defined(__C51__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__CPCP__) -# define ARCHITECTURE_ID "PCP" - -# else -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif __STDC_VERSION__ > 201710L -# define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L -# define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L -# define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F b/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F deleted file mode 100644 index 4e88c9ae60..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/3.25.2/CompilerIdFortran/CMakeFortranCompilerId.F +++ /dev/null @@ -1,1114 +0,0 @@ - PROGRAM CMakeFortranCompilerId -#if 0 -! Identify the compiler -#endif -#if defined(_MSC_VER) - PRINT *, 'INFO:simulate[MSVC]' -# if _MSC_VER >= 1900 - PRINT *, 'INFO:simulate_version[019.00]' -# elif _MSC_VER >= 1800 - PRINT *, 'INFO:simulate_version[018.00]' -# elif _MSC_VER >= 1700 - PRINT *, 'INFO:simulate_version[017.00]' -# elif _MSC_VER >= 1600 - PRINT *, 'INFO:simulate_version[016.00]' -# elif _MSC_VER >= 1500 - PRINT *, 'INFO:simulate_version[015.00]' -# elif _MSC_VER >= 1400 - PRINT *, 'INFO:simulate_version[014.00]' -# elif _MSC_VER >= 1310 - PRINT *, 'INFO:simulate_version[013.01]' -# else - PRINT *, 'INFO:simulate_version[013.00]' -# endif -#endif -#if defined(__INTEL_LLVM_COMPILER) - PRINT *, 'INFO:compiler[IntelLLVM]' -! __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and -! later. Look for 6 digit vs. 8 digit version number to decide encoding. -! VVVV is no smaller than the current year when a version is released. -# if __INTEL_LLVM_COMPILER < 1000000 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -# endif -#elif defined(__INTEL_COMPILER) && __INTEL_COMPILER == 201900 - PRINT *, 'INFO:compiler[IntelLLVM]' -! ifx 2021.1 forgot to define __INTEL_LLVM_COMPILER. -! Instead it defines __INTEL_COMPILER == 201900. -# define COMPILER_VERSION_MAJOR DEC(2021) -# define COMPILER_VERSION_MINOR DEC(1) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -#elif defined(__INTEL_COMPILER) || defined(__ICC) - PRINT *, 'INFO:compiler[Intel]' -! __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later. -# if __INTEL_COMPILER < 2021 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) -! The third version component from --version is an update index, -! but no macro is provided for it. -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -#elif defined(__SUNPRO_F95) - PRINT *, 'INFO:compiler[SunPro]' -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_F95>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_F95>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_F95 & 0xF) -#elif defined(__SUNPRO_F90) - PRINT *, 'INFO:compiler[SunPro]' -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_F90>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_F90>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_F90 & 0xF) -#elif defined(_CRAYFTN) - PRINT *, 'INFO:compiler[Cray]' -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) -# if defined(_RELEASE_PATCHLEVEL) -# define COMPILER_VERSION_PATCH DEC(_RELEASE_PATCHLEVEL) -# endif -#elif defined(__G95__) - PRINT *, 'INFO:compiler[G95]' -# define COMPILER_VERSION_MAJOR DEC(__G95__) -# define COMPILER_VERSION_MINOR DEC(__G95_MINOR__) -#elif defined(__PATHSCALE__) - PRINT *, 'INFO:compiler[PathScale]' -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif -#elif defined(__ABSOFT__) - PRINT *, 'INFO:compiler[Absoft]' -#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) - PRINT *, 'INFO:compiler[LCC]' -# define COMPILER_VERSION_MAJOR DEC(1) -# define COMPILER_VERSION_MINOR DEC(__LCC__ - 100) -# if defined(__LCC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) -# endif -#elif defined(__GNUC__) - PRINT *, 'INFO:compiler[GNU]' -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif -#elif defined(__IBMC__) -# if defined(__COMPILER_VER__) - PRINT *, 'INFO:compiler[zOS]' -# elif __IBMC__ >= 800 - PRINT *, 'INFO:compiler[XL]' -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# else - PRINT *, 'INFO:compiler[VisualAge]' -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# endif -#elif defined(__NVCOMPILER) || defined(__NVCOMPILER_LLVM__) - PRINT *, 'INFO:compiler[NVHPC]' -# if defined(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# else -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# endif -# if defined(__NVCOMPILER_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# else -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# endif -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# elif defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif -#elif defined(__PGI) - PRINT *, 'INFO:compiler[PGI]' -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif -#elif defined(__FLANG) - PRINT *, 'INFO:compiler[Flang]' -# define COMPILER_VERSION_MAJOR DEC(__FLANG_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__FLANG_MINOR__) -# if defined(__FLANG_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__FLANG_PATCHLEVEL__) -# endif -#elif defined(__flang__) - PRINT *, 'INFO:compiler[LLVMFlang]' -# define COMPILER_VERSION_MAJOR DEC(__flang_major__) -# define COMPILER_VERSION_MINOR DEC(__flang_minor__) -# if defined(__flang_patchlevel__) -# define COMPILER_VERSION_PATCH DEC(__flang_patchlevel__) -# endif -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) - PRINT *, 'INFO:compiler[VisualAge]' -#elif defined(__hpux) || defined(__hpux__) - PRINT *, 'INFO:compiler[HP]' -#elif defined(NAGFOR) - PRINT *, 'INFO:compiler[NAG]' -#define COMPILER_VERSION_MAJOR DEC(__NAG_COMPILER_RELEASE/10) -#define COMPILER_VERSION_MINOR DEC(__NAG_COMPILER_RELEASE % 10) -#define COMPILER_VERSION_PATCH DEC(__NAG_COMPILER_BUILD) -#elif defined(__FUJITSU) - PRINT *, 'INFO:compiler[Fujitsu]' -# if defined(__FRT_major__) -# define COMPILER_VERSION_MAJOR DEC(__FRT_major__) -# define COMPILER_VERSION_MINOR DEC(__FRT_minor__) -# define COMPILER_VERSION_PATCH DEC(__FRT_patchlevel__) -# elif defined(__FRT_version__) - PRINT *, 'INFO:compiler_version['//__FRT_version__//']' -# endif -#else - PRINT *, 'INFO:compiler[]' -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - PRINT *, 'INFO:compiler_wrapper[CrayPrgEnv]' -#endif - -#if 0 -! Identify the platform -#endif -#if defined(__linux) || defined(__linux__) || defined(linux) - PRINT *, 'INFO:platform[Linux]' -#elif defined(__CYGWIN__) - PRINT *, 'INFO:platform[Cygwin]' -#elif defined(__MINGW32__) - PRINT *, 'INFO:platform[MinGW]' -#elif defined(__APPLE__) - PRINT *, 'INFO:platform[Darwin]' -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) - PRINT *, 'INFO:platform[Windows]' -#elif defined(__FreeBSD__) || defined(__FreeBSD) - PRINT *, 'INFO:platform[FreeBSD]' -#elif defined(__NetBSD__) || defined(__NetBSD) - PRINT *, 'INFO:platform[NetBSD]' -#elif defined(__OpenBSD__) || defined(__OPENBSD) - PRINT *, 'INFO:platform[OpenBSD]' -#elif defined(__sun) || defined(sun) - PRINT *, 'INFO:platform[SunOS]' -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) - PRINT *, 'INFO:platform[AIX]' -#elif defined(__hpux) || defined(__hpux__) - PRINT *, 'INFO:platform[HP-UX]' -#elif defined(__HAIKU__) - PRINT *, 'INFO:platform[Haiku]' -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) - PRINT *, 'INFO:platform[BeOS]' -#elif defined(__QNX__) || defined(__QNXNTO__) - PRINT *, 'INFO:platform[QNX]' -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) - PRINT *, 'INFO:platform[Tru64]' -#elif defined(__riscos) || defined(__riscos__) - PRINT *, 'INFO:platform[RISCos]' -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) - PRINT *, 'INFO:platform[SINIX]' -#elif defined(__UNIX_SV__) - PRINT *, 'INFO:platform[UNIX_SV]' -#elif defined(__bsdos__) - PRINT *, 'INFO:platform[BSDOS]' -#elif defined(_MPRAS) || defined(MPRAS) - PRINT *, 'INFO:platform[MP-RAS]' -#elif defined(__osf) || defined(__osf__) - PRINT *, 'INFO:platform[OSF1]' -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) - PRINT *, 'INFO:platform[SCO_SV]' -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) - PRINT *, 'INFO:platform[ULTRIX]' -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) - PRINT *, 'INFO:platform[Xenix]' -#else - PRINT *, 'INFO:platform[]' -#endif -#if defined(_WIN32) && (defined(__INTEL_COMPILER) || defined(__ICC)) -# if defined(_M_IA64) - PRINT *, 'INFO:arch[IA64]' -# elif defined(_M_X64) || defined(_M_AMD64) - PRINT *, 'INFO:arch[x64]' -# elif defined(_M_IX86) - PRINT *, 'INFO:arch[X86]' -# endif -#endif - -#if 0 -! Encode compiler version digits -#endif -#define DEC_8(n) (((n) / 10000000) % 10) -#define DEC_7(n) (((n) / 1000000) % 10) -#define DEC_6(n) (((n) / 100000) % 10) -#define DEC_5(n) (((n) / 10000) % 10) -#define DEC_4(n) (((n) / 1000) % 10) -#define DEC_3(n) (((n) / 100) % 10) -#define DEC_2(n) (((n) / 10) % 10) -#define DEC_1(n) (((n) ) % 10) -#define HEX_8(n) ((n)>>28 & 0xF) -#define HEX_7(n) ((n)>>24 & 0xF) -#define HEX_6(n) ((n)>>20 & 0xF) -#define HEX_5(n) ((n)>>16 & 0xF) -#define HEX_4(n) ((n)>>12 & 0xF) -#define HEX_3(n) ((n)>>8 & 0xF) -#define HEX_2(n) ((n)>>4 & 0xF) -#define HEX_1(n) ((n) & 0xF) - -#if defined(COMPILER_VERSION_MAJOR) -# undef DEC -# undef HEX -# define DEC(n) DEC_1(n) -# define HEX(n) HEX_1(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_1[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_2(n) -# define HEX(n) HEX_2(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_2[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_3(n) -# define HEX(n) HEX_3(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_3[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_4(n) -# define HEX(n) HEX_4(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_4[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_5(n) -# define HEX(n) HEX_5(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_5[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_6(n) -# define HEX(n) HEX_6(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_6[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_7(n) -# define HEX(n) HEX_7(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_7[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_8(n) -# define HEX(n) HEX_8(n) -# if COMPILER_VERSION_MAJOR == 0 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[0]' -# elif COMPILER_VERSION_MAJOR == 1 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[1]' -# elif COMPILER_VERSION_MAJOR == 2 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[2]' -# elif COMPILER_VERSION_MAJOR == 3 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[3]' -# elif COMPILER_VERSION_MAJOR == 4 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[4]' -# elif COMPILER_VERSION_MAJOR == 5 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[5]' -# elif COMPILER_VERSION_MAJOR == 6 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[6]' -# elif COMPILER_VERSION_MAJOR == 7 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[7]' -# elif COMPILER_VERSION_MAJOR == 8 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[8]' -# elif COMPILER_VERSION_MAJOR == 9 - PRINT *, 'INFO:compiler_version_MAJOR_digit_8[9]' -# endif - -#endif -#if defined(COMPILER_VERSION_MINOR) -# undef DEC -# undef HEX -# define DEC(n) DEC_1(n) -# define HEX(n) HEX_1(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_1[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_2(n) -# define HEX(n) HEX_2(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_2[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_3(n) -# define HEX(n) HEX_3(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_3[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_4(n) -# define HEX(n) HEX_4(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_4[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_5(n) -# define HEX(n) HEX_5(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_5[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_6(n) -# define HEX(n) HEX_6(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_6[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_7(n) -# define HEX(n) HEX_7(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_7[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_8(n) -# define HEX(n) HEX_8(n) -# if COMPILER_VERSION_MINOR == 0 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[0]' -# elif COMPILER_VERSION_MINOR == 1 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[1]' -# elif COMPILER_VERSION_MINOR == 2 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[2]' -# elif COMPILER_VERSION_MINOR == 3 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[3]' -# elif COMPILER_VERSION_MINOR == 4 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[4]' -# elif COMPILER_VERSION_MINOR == 5 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[5]' -# elif COMPILER_VERSION_MINOR == 6 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[6]' -# elif COMPILER_VERSION_MINOR == 7 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[7]' -# elif COMPILER_VERSION_MINOR == 8 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[8]' -# elif COMPILER_VERSION_MINOR == 9 - PRINT *, 'INFO:compiler_version_MINOR_digit_8[9]' -# endif - -#endif -#if defined(COMPILER_VERSION_PATCH) -# undef DEC -# undef HEX -# define DEC(n) DEC_1(n) -# define HEX(n) HEX_1(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_1[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_2(n) -# define HEX(n) HEX_2(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_2[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_3(n) -# define HEX(n) HEX_3(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_3[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_4(n) -# define HEX(n) HEX_4(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_4[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_5(n) -# define HEX(n) HEX_5(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_5[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_6(n) -# define HEX(n) HEX_6(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_6[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_7(n) -# define HEX(n) HEX_7(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_7[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_8(n) -# define HEX(n) HEX_8(n) -# if COMPILER_VERSION_PATCH == 0 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[0]' -# elif COMPILER_VERSION_PATCH == 1 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[1]' -# elif COMPILER_VERSION_PATCH == 2 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[2]' -# elif COMPILER_VERSION_PATCH == 3 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[3]' -# elif COMPILER_VERSION_PATCH == 4 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[4]' -# elif COMPILER_VERSION_PATCH == 5 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[5]' -# elif COMPILER_VERSION_PATCH == 6 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[6]' -# elif COMPILER_VERSION_PATCH == 7 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[7]' -# elif COMPILER_VERSION_PATCH == 8 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[8]' -# elif COMPILER_VERSION_PATCH == 9 - PRINT *, 'INFO:compiler_version_PATCH_digit_8[9]' -# endif - -#endif -#if defined(COMPILER_VERSION_TWEAK) -# undef DEC -# undef HEX -# define DEC(n) DEC_1(n) -# define HEX(n) HEX_1(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_1[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_2(n) -# define HEX(n) HEX_2(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_2[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_3(n) -# define HEX(n) HEX_3(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_3[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_4(n) -# define HEX(n) HEX_4(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_4[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_5(n) -# define HEX(n) HEX_5(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_5[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_6(n) -# define HEX(n) HEX_6(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_6[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_7(n) -# define HEX(n) HEX_7(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_7[9]' -# endif - -# undef DEC -# undef HEX -# define DEC(n) DEC_8(n) -# define HEX(n) HEX_8(n) -# if COMPILER_VERSION_TWEAK == 0 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[0]' -# elif COMPILER_VERSION_TWEAK == 1 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[1]' -# elif COMPILER_VERSION_TWEAK == 2 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[2]' -# elif COMPILER_VERSION_TWEAK == 3 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[3]' -# elif COMPILER_VERSION_TWEAK == 4 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[4]' -# elif COMPILER_VERSION_TWEAK == 5 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[5]' -# elif COMPILER_VERSION_TWEAK == 6 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[6]' -# elif COMPILER_VERSION_TWEAK == 7 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[7]' -# elif COMPILER_VERSION_TWEAK == 8 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[8]' -# elif COMPILER_VERSION_TWEAK == 9 - PRINT *, 'INFO:compiler_version_TWEAK_digit_8[9]' -# endif - -#endif - - END diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 0626f191b1..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake deleted file mode 100644 index ab222437f3..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile.cmake +++ /dev/null @@ -1,141 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# The generator used is: -set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") - -# The top level Makefile was generated from the following files: -set(CMAKE_MAKEFILE_DEPENDS - "CMakeCache.txt" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/CIME_initial_setup.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/CIME_utils.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/Compilers.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/FindpFUnit.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/Sourcelist_utils.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/genf90_utils.cmake" - "/Users/afoster/Documents/ncar/CTSM/cime/CIME/non_py/src/CMake/pFUnit_utils.cmake" - "/Users/afoster/Documents/ncar/CTSM/src/fates/CMakeLists.txt" - "CMakeFiles/3.25.2/CMakeCCompiler.cmake" - "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" - "CMakeFiles/3.25.2/CMakeSystem.cmake" - "Macros.cmake" - "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/gnu.cmake" - "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/gnu_fleabone.cmake" - "/Users/afoster/Documents/ncar/CTSM/src/fates/build/cmake_macros/universal.cmake" - "/Users/afoster/Documents/ncar/CTSM/src/fates/main/CMakeLists.txt" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/CMakeLists.txt" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/CMakeLists.txt" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCCompiler.cmake.in" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCCompilerABI.c" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCInformation.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCommonLanguageInclude.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeCompilerIdDetection.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompileFeatures.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompilerABI.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineCompilerId.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineFortranCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeDetermineSystem.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFindBinUtils.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranCompiler.cmake.in" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranCompilerABI.F90" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeFortranInformation.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeGenericSystem.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeInitializeConfigs.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeLanguageInformation.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseArguments.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseImplicitIncludeInfo.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeParseLibraryArchitecture.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystem.cmake.in" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestCCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestCompilerCommon.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeTestFortranCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/CMakeUnixFindMake.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/AppleClang-C.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Clang.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU-Fortran.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/GNU.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/LCC-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Tasking-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/FindPackageMessage.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Internal/FeatureTesting.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-AppleClang-C.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-Clang-C.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-Clang.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-GNU-Fortran.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Apple-GNU.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Darwin-Initialize.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/Darwin.cmake" - "/usr/local/Cellar/cmake/3.25.2/share/cmake/Modules/Platform/UnixPaths.cmake" - ) - -# The corresponding makefile is: -set(CMAKE_MAKEFILE_OUTPUTS - "Makefile" - "CMakeFiles/cmake.check_cache" - ) - -# Byproducts of CMake generate step: -set(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/3.25.2/CMakeSystem.cmake" - "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" - "CMakeFiles/3.25.2/CMakeCCompiler.cmake" - "CMakeFiles/3.25.2/CMakeFortranCompiler.cmake" - "CMakeFiles/3.25.2/CMakeCCompiler.cmake" - "CMakeFiles/CMakeDirectoryInformation.cmake" - "main/CMakeFiles/CMakeDirectoryInformation.cmake" - "unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake" - "unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake" - "unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake" - ) - -# Dependency information for all targets: -set(CMAKE_DEPEND_INFO_FILES - "CMakeFiles/utils.dir/DependInfo.cmake" - "unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake" - ) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 deleted file mode 100644 index 966dd8971c..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Makefile2 +++ /dev/null @@ -1,206 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Directory level rules for the build root directory - -# The main recursive "all" target. -all: CMakeFiles/utils.dir/all -all: main/all -all: unit_testing/utils/all -all: unit_testing/test/all -.PHONY : all - -# The main recursive "preinstall" target. -preinstall: main/preinstall -preinstall: unit_testing/utils/preinstall -preinstall: unit_testing/test/preinstall -.PHONY : preinstall - -# The main recursive "clean" target. -clean: CMakeFiles/utils.dir/clean -clean: main/clean -clean: unit_testing/utils/clean -clean: unit_testing/test/clean -.PHONY : clean - -#============================================================================= -# Directory level rules for directory main - -# Recursive "all" directory target. -main/all: -.PHONY : main/all - -# Recursive "preinstall" directory target. -main/preinstall: -.PHONY : main/preinstall - -# Recursive "clean" directory target. -main/clean: -.PHONY : main/clean - -#============================================================================= -# Directory level rules for directory unit_testing/test - -# Recursive "all" directory target. -unit_testing/test/all: unit_testing/test/radiation_test/all -.PHONY : unit_testing/test/all - -# Recursive "preinstall" directory target. -unit_testing/test/preinstall: unit_testing/test/radiation_test/preinstall -.PHONY : unit_testing/test/preinstall - -# Recursive "clean" directory target. -unit_testing/test/clean: unit_testing/test/radiation_test/clean -.PHONY : unit_testing/test/clean - -#============================================================================= -# Directory level rules for directory unit_testing/test/radiation_test - -# Recursive "all" directory target. -unit_testing/test/radiation_test/all: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all -.PHONY : unit_testing/test/radiation_test/all - -# Recursive "preinstall" directory target. -unit_testing/test/radiation_test/preinstall: -.PHONY : unit_testing/test/radiation_test/preinstall - -# Recursive "clean" directory target. -unit_testing/test/radiation_test/clean: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean -.PHONY : unit_testing/test/radiation_test/clean - -#============================================================================= -# Directory level rules for directory unit_testing/utils - -# Recursive "all" directory target. -unit_testing/utils/all: -.PHONY : unit_testing/utils/all - -# Recursive "preinstall" directory target. -unit_testing/utils/preinstall: -.PHONY : unit_testing/utils/preinstall - -# Recursive "clean" directory target. -unit_testing/utils/clean: -.PHONY : unit_testing/utils/clean - -#============================================================================= -# Target rules for target CMakeFiles/utils.dir - -# All Build rule for target. -CMakeFiles/utils.dir/all: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/depend - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=6,7,8,9 "Built target utils" -.PHONY : CMakeFiles/utils.dir/all - -# Build rule for subdir invocation for target. -CMakeFiles/utils.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 4 - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/utils.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : CMakeFiles/utils.dir/rule - -# Convenience name for target. -utils: CMakeFiles/utils.dir/rule -.PHONY : utils - -# clean rule for target. -CMakeFiles/utils.dir/clean: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/clean -.PHONY : CMakeFiles/utils.dir/clean - -#============================================================================= -# Target rules for target unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir - -# All Build rule for target. -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all: - $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend - $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=1,2,3,4,5 "Built target FATES_rad_test" -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all - -# Build rule for subdir invocation for target. -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 5 - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule - -# Convenience name for target. -FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule -.PHONY : FATES_rad_test - -# clean rule for target. -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean: - $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/1 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/2 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/3 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/4 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/6 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/7 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/8 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 deleted file mode 100644 index 7b4d68d70f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/9 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt deleted file mode 100644 index ec635144f6..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/Progress/count.txt +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 949f360985..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,17 +0,0 @@ -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/edit_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/rebuild_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/edit_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/CMakeFiles/rebuild_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/edit_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/rebuild_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/edit_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/rebuild_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/test.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/edit_cache.dir -/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/rebuild_cache.dir diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache b/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73172..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks deleted file mode 100644 index ec635144f6..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake deleted file mode 100644 index 1dab08913a..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake +++ /dev/null @@ -1,37 +0,0 @@ - -# Consider dependencies only in project. -set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) - -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "Fortran" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_Fortran - "/Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" - ) -set(CMAKE_Fortran_COMPILER_ID "GNU") -set(CMAKE_Fortran_SUBMODULE_SEP "@") -set(CMAKE_Fortran_SUBMODULE_EXT ".smod") - -# The include file search paths: -set(CMAKE_Fortran_TARGET_INCLUDE_PATH - "/Users/afoster/pFUnit/include" - "/Users/afoster/pFUnit/mod" - "/usr/local/Cellar/netcdf/4.9.2/include" - "/usr/local/Cellar/netcdf-fortran/4.6.0/include" - "." - ) - -# The set of dependency files which are needed: -set(CMAKE_DEPENDS_DEPENDENCY_FILES - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make deleted file mode 100644 index e85a792b85..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/build.make +++ /dev/null @@ -1,140 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -# Include any dependencies generated for this target. -include CMakeFiles/utils.dir/depend.make -# Include any dependencies generated by the compiler for this target. -include CMakeFiles/utils.dir/compiler_depend.make - -# Include the progress variables for this target. -include CMakeFiles/utils.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/utils.dir/flags.make - -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o: CMakeFiles/utils.dir/flags.make -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building Fortran object CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o - -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 > CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i - -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: CMakeFiles/utils.dir/flags.make -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building Fortran object CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 > CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: CMakeFiles/utils.dir/flags.make -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Fortran object CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 > CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i - -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s" - /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s - -# Object files for target utils -utils_OBJECTS = \ -"CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" \ -"CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" \ -"CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" - -# External object files for target utils -utils_EXTERNAL_OBJECTS = - -libutils.a: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o -libutils.a: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o -libutils.a: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o -libutils.a: CMakeFiles/utils.dir/build.make -libutils.a: CMakeFiles/utils.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Linking Fortran static library libutils.a" - $(CMAKE_COMMAND) -P CMakeFiles/utils.dir/cmake_clean_target.cmake - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/utils.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/utils.dir/build: libutils.a -.PHONY : CMakeFiles/utils.dir/build - -CMakeFiles/utils.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/utils.dir/cmake_clean.cmake -.PHONY : CMakeFiles/utils.dir/clean - -CMakeFiles/utils.dir/depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/utils.dir/depend - diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake deleted file mode 100644 index 3c01a04cf5..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean.cmake +++ /dev/null @@ -1,12 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o" - "CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o" - "CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o" - "libutils.a" - "libutils.pdb" -) - -# Per-language clean rules from dependency scanning. -foreach(lang Fortran) - include(CMakeFiles/utils.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake deleted file mode 100644 index 820ee03e9b..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_Fortran.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# Remove fortran modules provided by this target. -FILE(REMOVE - "fatesconstantsmod.mod" - "FATESCONSTANTSMOD.mod" - "CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp" - - "fatesunittestiomod.mod" - "FATESUNITTESTIOMOD.mod" - "CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp" - - "fatesunittestorbitalmod.mod" - "FATESUNITTESTORBITALMOD.mod" - "CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp" - ) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake deleted file mode 100644 index 6da29f6b6f..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/cmake_clean_target.cmake +++ /dev/null @@ -1,3 +0,0 @@ -file(REMOVE_RECURSE - "libutils.a" -) diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make deleted file mode 100644 index ab29ade490..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.make +++ /dev/null @@ -1,2 +0,0 @@ -# Empty compiler generated dependencies file for utils. -# This may be replaced when dependencies are built. diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts deleted file mode 100644 index 92e446bc27..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/compiler_depend.ts +++ /dev/null @@ -1,2 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Timestamp file for compiler generated dependencies management for utils. diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal deleted file mode 100644 index f7c3988daa..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.internal +++ /dev/null @@ -1,9 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make deleted file mode 100644 index 304216def0..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/depend.make +++ /dev/null @@ -1,25 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Note that incremental build could trigger a call to cmake_copy_f90_mod on each re-build -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp -CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesconstantsmod.mod CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp GNU -CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build -CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o: /usr/local/Cellar/netcdf-fortran/4.6.0/include/netcdf.mod -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp -CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesunittestiomod.mod CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp GNU -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build -CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp -CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod fatesunittestorbitalmod.mod CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp GNU -CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build -CMakeFiles/utils.dir/build: CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesconstantsmod.mod.stamp deleted file mode 100644 index 2b4ac0b598d43fed2ea70fd8680dacf9fc821b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 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 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestiomod.mod.stamp deleted file mode 100644 index bac5e8f68dbed86771ad6e160e953b2ced9f2e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24087 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 P!!w~bQoeT*Pci-nwC<&` diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fatesunittestorbitalmod.mod.stamp deleted file mode 100644 index cb85e3a79588da53be704d893829e4e21f8807ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25076 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%0Du&QhFE5>J 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 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make deleted file mode 100644 index 97f3ac41ce..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/flags.make +++ /dev/null @@ -1,10 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# compile Fortran with /usr/local/bin/gfortran -Fortran_DEFINES = - -Fortran_INCLUDES = -I/Users/afoster/pFUnit/include -I/Users/afoster/pFUnit/mod -I/usr/local/Cellar/netcdf/4.9.2/include -I/usr/local/Cellar/netcdf-fortran/4.6.0/include -I/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -Fortran_FLAGS = -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk - diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal deleted file mode 100644 index 8030915fe2..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/fortran.internal +++ /dev/null @@ -1,5 +0,0 @@ -# The fortran modules provided by this target. -provides - fatesconstantsmod.mod - fatesunittestiomod.mod - fatesunittestorbitalmod.mod diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt deleted file mode 100644 index bac60900c6..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/link.txt +++ /dev/null @@ -1,2 +0,0 @@ -/usr/bin/ar qc libutils.a CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o -/usr/bin/ranlib libutils.a diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make deleted file mode 100644 index fdb0a7b084..0000000000 --- a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/progress.make +++ /dev/null @@ -1,5 +0,0 @@ -CMAKE_PROGRESS_1 = 6 -CMAKE_PROGRESS_2 = 7 -CMAKE_PROGRESS_3 = 8 -CMAKE_PROGRESS_4 = 9 - diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake deleted file mode 100644 index 2a25e968d2..0000000000 --- a/build/__command_line_test__/__command_line_test__/CTestTestfile.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates -# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -subdirs("main") -subdirs("unit_testing/utils") -subdirs("unit_testing/test") diff --git a/build/__command_line_test__/__command_line_test__/Macros.cmake b/build/__command_line_test__/__command_line_test__/Macros.cmake deleted file mode 120000 index d2c6ddac24..0000000000 --- a/build/__command_line_test__/__command_line_test__/Macros.cmake +++ /dev/null @@ -1 +0,0 @@ -/Users/afoster/Documents/ncar/CTSM/src/fates/build/Macros.cmake \ No newline at end of file diff --git a/build/__command_line_test__/__command_line_test__/Makefile b/build/__command_line_test__/__command_line_test__/Makefile deleted file mode 100644 index 261969932c..0000000000 --- a/build/__command_line_test__/__command_line_test__/Makefile +++ /dev/null @@ -1,260 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__//CMakeFiles/progress.marks - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named utils - -# Build rule for target. -utils: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 utils -.PHONY : utils - -# fast build rule for target. -utils/fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/build -.PHONY : utils/fast - -#============================================================================= -# Target rules for targets named FATES_rad_test - -# Build rule for target. -FATES_rad_test: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 FATES_rad_test -.PHONY : FATES_rad_test - -# fast build rule for target. -FATES_rad_test/fast: - $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build -.PHONY : FATES_rad_test/fast - -main/FatesConstantsMod.o: main/FatesConstantsMod.F90.o -.PHONY : main/FatesConstantsMod.o - -# target to build an object file -main/FatesConstantsMod.F90.o: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.o -.PHONY : main/FatesConstantsMod.F90.o - -main/FatesConstantsMod.i: main/FatesConstantsMod.F90.i -.PHONY : main/FatesConstantsMod.i - -# target to preprocess a source file -main/FatesConstantsMod.F90.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.i -.PHONY : main/FatesConstantsMod.F90.i - -main/FatesConstantsMod.s: main/FatesConstantsMod.F90.s -.PHONY : main/FatesConstantsMod.s - -# target to generate assembly for a file -main/FatesConstantsMod.F90.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/main/FatesConstantsMod.F90.s -.PHONY : main/FatesConstantsMod.F90.s - -unit_testing/utils/FatesUnitTestIOMod.o: unit_testing/utils/FatesUnitTestIOMod.F90.o -.PHONY : unit_testing/utils/FatesUnitTestIOMod.o - -# target to build an object file -unit_testing/utils/FatesUnitTestIOMod.F90.o: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.o -.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.o - -unit_testing/utils/FatesUnitTestIOMod.i: unit_testing/utils/FatesUnitTestIOMod.F90.i -.PHONY : unit_testing/utils/FatesUnitTestIOMod.i - -# target to preprocess a source file -unit_testing/utils/FatesUnitTestIOMod.F90.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.i -.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.i - -unit_testing/utils/FatesUnitTestIOMod.s: unit_testing/utils/FatesUnitTestIOMod.F90.s -.PHONY : unit_testing/utils/FatesUnitTestIOMod.s - -# target to generate assembly for a file -unit_testing/utils/FatesUnitTestIOMod.F90.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestIOMod.F90.s -.PHONY : unit_testing/utils/FatesUnitTestIOMod.F90.s - -unit_testing/utils/FatesUnitTestOrbitalMod.o: unit_testing/utils/FatesUnitTestOrbitalMod.F90.o -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.o - -# target to build an object file -unit_testing/utils/FatesUnitTestOrbitalMod.F90.o: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.o -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.o - -unit_testing/utils/FatesUnitTestOrbitalMod.i: unit_testing/utils/FatesUnitTestOrbitalMod.F90.i -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.i - -# target to preprocess a source file -unit_testing/utils/FatesUnitTestOrbitalMod.F90.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.i -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.i - -unit_testing/utils/FatesUnitTestOrbitalMod.s: unit_testing/utils/FatesUnitTestOrbitalMod.F90.s -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.s - -# target to generate assembly for a file -unit_testing/utils/FatesUnitTestOrbitalMod.F90.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/utils.dir/build.make CMakeFiles/utils.dir/unit_testing/utils/FatesUnitTestOrbitalMod.F90.s -.PHONY : unit_testing/utils/FatesUnitTestOrbitalMod.F90.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... test" - @echo "... FATES_rad_test" - @echo "... utils" - @echo "... main/FatesConstantsMod.o" - @echo "... main/FatesConstantsMod.i" - @echo "... main/FatesConstantsMod.s" - @echo "... unit_testing/utils/FatesUnitTestIOMod.o" - @echo "... unit_testing/utils/FatesUnitTestIOMod.i" - @echo "... unit_testing/utils/FatesUnitTestIOMod.s" - @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.o" - @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.i" - @echo "... unit_testing/utils/FatesUnitTestOrbitalMod.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/cmake_install.cmake deleted file mode 100644 index c8099b8c37..0000000000 --- a/build/__command_line_test__/__command_line_test__/cmake_install.cmake +++ /dev/null @@ -1,57 +0,0 @@ -# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "/usr/bin/objdump") -endif() - -if(NOT CMAKE_INSTALL_LOCAL_ONLY) - # Include the install script for each subdirectory. - include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake") - include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake") - include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake") - -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/build/__command_line_test__/__command_line_test__/libutils.a b/build/__command_line_test__/__command_line_test__/libutils.a deleted file mode 100644 index 801611e8e9d8fa8e4ac2679e58fcaf3a36e6b717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40264 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 UQt6UH7tf~(w7seEn0G4wA0CJvng9R* diff --git a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 0626f191b1..0000000000 --- a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks deleted file mode 100644 index 573541ac97..0000000000 --- a/build/__command_line_test__/__command_line_test__/main/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake deleted file mode 100644 index 09d92f9199..0000000000 --- a/build/__command_line_test__/__command_line_test__/main/CTestTestfile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/main -# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. diff --git a/build/__command_line_test__/__command_line_test__/main/Makefile b/build/__command_line_test__/__command_line_test__/main/Makefile deleted file mode 100644 index c0af35d7b3..0000000000 --- a/build/__command_line_test__/__command_line_test__/main/Makefile +++ /dev/null @@ -1,151 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/main//CMakeFiles/progress.marks - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main/preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... test" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake deleted file mode 100644 index 930efcb765..0000000000 --- a/build/__command_line_test__/__command_line_test__/main/cmake_install.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/main - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "/usr/bin/objdump") -endif() - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 0626f191b1..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks deleted file mode 100644 index 7ed6ff82de..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake deleted file mode 100644 index 9ed9c2cf62..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/CTestTestfile.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test -# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -subdirs("radiation_test") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile deleted file mode 100644 index 3b163f0e65..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/Makefile +++ /dev/null @@ -1,151 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test//CMakeFiles/progress.marks - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... test" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake deleted file mode 100644 index 6b3c9fb0cc..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/cmake_install.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "/usr/bin/objdump") -endif() - -if(NOT CMAKE_INSTALL_LOCAL_ONLY) - # Include the install script for each subdirectory. - include("/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake") - -endif() - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 0626f191b1..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake deleted file mode 100644 index 61a4a7133c..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake +++ /dev/null @@ -1,37 +0,0 @@ - -# Consider dependencies only in project. -set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) - -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "Fortran" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_Fortran - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" - "/Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" - "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90" "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" - ) -set(CMAKE_Fortran_COMPILER_ID "GNU") -set(CMAKE_Fortran_SUBMODULE_SEP "@") -set(CMAKE_Fortran_SUBMODULE_EXT ".smod") - -# The include file search paths: -set(CMAKE_Fortran_TARGET_INCLUDE_PATH - "/Users/afoster/pFUnit/include" - "/Users/afoster/pFUnit/mod" - "/usr/local/Cellar/netcdf/4.9.2/include" - "/usr/local/Cellar/netcdf-fortran/4.6.0/include" - ) - -# The set of dependency files which are needed: -set(CMAKE_DEPENDS_DEPENDENCY_FILES - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make deleted file mode 100644 index 7149be51cf..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make +++ /dev/null @@ -1,154 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -# Include any dependencies generated for this target. -include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make -# Include any dependencies generated by the compiler for this target. -include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make - -# Include the progress variables for this target. -include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make - -# Include the compile flags for this target's objects. -include unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 -o CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 > CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 -o CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o: /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building Fortran object unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -c /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing Fortran source to CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -E /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 > CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling Fortran source to assembly CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && /usr/local/bin/gfortran $(Fortran_DEFINES) $(Fortran_INCLUDES) $(Fortran_FLAGS) -S /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s - -# Object files for target FATES_rad_test -FATES_rad_test_OBJECTS = \ -"CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" \ -"CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" \ -"CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" \ -"CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" - -# External object files for target FATES_rad_test -FATES_rad_test_EXTERNAL_OBJECTS = - -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make -unit_testing/test/radiation_test/FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Linking Fortran executable FATES_rad_test" - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/FATES_rad_test.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/FATES_rad_test -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test && $(CMAKE_COMMAND) -P CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/clean - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/afoster/Documents/ncar/CTSM/src/fates /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake deleted file mode 100644 index 6b7063ba42..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean.cmake +++ /dev/null @@ -1,13 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o" - "CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o" - "CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o" - "CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o" - "FATES_rad_test" - "FATES_rad_test.pdb" -) - -# Per-language clean rules from dependency scanning. -foreach(lang Fortran) - include(CMakeFiles/FATES_rad_test.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake deleted file mode 100644 index bd62e20bc8..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/cmake_clean_Fortran.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# Remove fortran modules provided by this target. -FILE(REMOVE - "fatesconstantsmod.mod" - "FATESCONSTANTSMOD.mod" - "CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp" - - "fatesunittestiomod.mod" - "FATESUNITTESTIOMOD.mod" - "CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp" - - "fatesunittestorbitalmod.mod" - "FATESUNITTESTORBITALMOD.mod" - "CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp" - ) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make deleted file mode 100644 index 80afc53fef..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.make +++ /dev/null @@ -1,2 +0,0 @@ -# Empty compiler generated dependencies file for FATES_rad_test. -# This may be replaced when dependencies are built. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts deleted file mode 100644 index 57ac27d1ed..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/compiler_depend.ts +++ /dev/null @@ -1,2 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Timestamp file for compiler generated dependencies management for FATES_rad_test. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal deleted file mode 100644 index 46ca19ac45..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.internal +++ /dev/null @@ -1,11 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/main/FatesConstantsMod.F90 -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestIOMod.F90 -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o - /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils/FatesUnitTestOrbitalMod.F90 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make deleted file mode 100644 index daa358a424..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/depend.make +++ /dev/null @@ -1,27 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Note that incremental build could trigger a call to cmake_copy_f90_mod on each re-build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesconstantsmod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp GNU -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o.provides.build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o: /usr/local/Cellar/netcdf-fortran/4.6.0/include/netcdf.mod -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesunittestiomod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp GNU -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o.provides.build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o - $(CMAKE_COMMAND) -E cmake_copy_f90_mod unit_testing/test/radiation_test/fatesunittestorbitalmod.mod unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp GNU -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build: - $(CMAKE_COMMAND) -E touch unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o.provides.build diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesconstantsmod.mod.stamp deleted file mode 100644 index 2b4ac0b598d43fed2ea70fd8680dacf9fc821b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 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 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestiomod.mod.stamp deleted file mode 100644 index bac5e8f68dbed86771ad6e160e953b2ced9f2e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24087 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 P!!w~bQoeT*Pci-nwC<&` diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fatesunittestorbitalmod.mod.stamp deleted file mode 100644 index cb85e3a79588da53be704d893829e4e21f8807ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25076 zcmZU(18^tL7d;whW81cEXJgwoH_pa(HnwfscCx|7*=S>9WBg~ozlVDDQnyaJdiqX( zditK*r+bDd`U}W^e`psy_AdL9iHt8feL>sj&pT-4kCl#Re?1?$FJlCZ;~zJBoXN10 zA>3TTNzD^a8{W?pDSv-46RrQEL=UpqwDFCLSY}RDJ0(RsBjq{o^JXaC|MTYTDoyb< zJk7rIEtxPb>)qiwl-ZE}3hCq}S&*Ix>9y>@zuz!k=!&zfuWW1)DZFdOy664uW7q%v zs}!c8-*edk$A`c2$AKc;6W!bMZSK&o78A2uhhGf~6 zrR$2($67+JjSH;kWu){H{mv4@uo9`tIbSKos=p^oAAFdi^r3pNE$H4f(<-YaPO`gc zr1a*E$tE-hDwU&1V*M9=hNmU$vesz}3?+t>^=cC;ktJZ1HWl|O86}Of2dR@x>RP8} z1tTg`B~XRl6*DRuCGN5pX}t9EjqE1Ye-_G1=4DM&M;T*var@Yft&>VHWa-j07-|f( zb{x`{8EOpI>s==nB1@8F%Tg7XapQ>wIPz1tJESe6_;NaE4jO&6TF|(+22+^`Y9}3H?_0-WCn=U_dD{`-y&NfbGc$ z8^C;_2aTj4ZX9M12NRXud4=#HlED~>`X(_@Xr|mut&7emr5WHEDtm@i8+rkqSfSvTXn-)Jlv;ok zo=i3FBKg~81+Ed@> z)AOt2$Hx}ZHdEin)aUa{pTCap>*vP>)3)#3);5;m=hObmXV1&-QJ??o{^{KI$Hm4K z;QzS&=F$7@2Kw`;O^DI$fh^Jd*->jjc%VOt2~tkcSQwRA1aevlR8_4XAA?yMa$3dM zSe(9=i@`@SrcvdFpH(6K4w+rj*?QQvVfk}dqn z5HDK&&k!+!y+)+dCe-QjettV@isbXt`?>cm$1>L@J~t;Fb{>Z9;fg+S5k<3PVO~M) zFG`?;M+=~^A*y?+u^iovNL6F+Q=rlVl1)9FRcAB0d2opLnb-BVB9<`m>qLhXX^HRqo z*uIvHlC}}PEOQ(M_84l6skKbXNUM?7b6xGeGTUsdIm~DygsFB=1O0$jsu8^`b7~0# zN1AzzuHBf&R{D!eb4Mjuu%V8Uy3w`l8LUA}>QPYkph}D2(U(S-3DF>MvVrZ?9eAm0 zh+;NK!?~ET>&_m2o6((BVpHhM6)z+BX@O}SC&XgtLjw#>GozS_hzm7N;ySiTLf5)B zxRV<_XiR!fXjYKF#ITcc`+QMp_%oI)%|kw%Mht=XZpLrv|3j?N8B+i+d>Q$JBVDRCXgn{>HY#z%pNK1B)>_P!C! zR6EcyzduN=P{}ay%(k+3dfXS1g0-ilKTK&5TsWDSU|Rk)KQ2zGMy*147js?C9R)a+aKp-4>SG%rA%6!nhO#lODa(r@z;UGzj9JWf zH|Bq<(V=!iOdj#XR%#R8O8xpnZam7N(FWIM6}bE@|67h0^)({8Cp2s~_(4EBUAEUq ztCj=;4F|&3A3X(Z$_6+%$k{-!BjG@oe17D|P`0{soRZ^W4K(dhL6^gnaGrAlW~jp* zJnCx%HIT!CpSn?Wj5ZP#6|0jZD|(<7&LA_8wSizO!jLgmrczx?dYhSr2Kkv0hYQlB z9j>Iibv6Y996xt(t(*{C_jVKuI>;ZvPAal9qp-@8uqOf5^ajHb8uWR`-;INK_TjvWrHE&pdf{4Y!hM2qs)bWe31Q@d>y*X_h4W}%ju zUzwpeb|N)_IF$s`uFPT_=>_X4HnA5vQMq8_k*k#J2R1Xtm;~h<%;GJ=pE;~ZUKb;}#svZ;Qp`&C2NtnrIbkFy*%_q)m4mGba-!4yEZO zjY->duP2{# z4F(|JXh@vgV7F2uY^nVIb2)604u`Ty0Dc(<>M^#e5@83;;tK7xABU4sG*e=AV*xLP zf={R_i2~2({A+HZO3K|Vyfiq}O|E_6ABYez zy;-2!GXYl?J}C9eOO92n3N}2>MR_fPaN2lIn=vbJ`+?1K7apmGD&{CDZAl5KV^*h=+%2Lq|1dV=d_A=Ix8h=b6BsD1E=x$W1Lxh;+2l|>D zom!4XM9RB}$g*=-@2cqAM=&={;2atlHur>kVpLpXr*oYx!ZtQ>T4ApkszM=4jNvTP zLo?a)642(;I~45(s9JZ>bgv^Bo`x}fOyC3?7<^1p{Vc(a`4bkUv$}>c^-SOx8z9qG zgXruA1Y3;4b(0)FQcv(VNOqOcI5TjJ1`-;fu6~0%gHK{?O4$aqPt1Vix*i*{97$dT zX=UMoXgTx;fd)WA+c|$sBJywA;vJ0BWM-3ondi;_BHA3vFosx5|Hw0%{?%HakrUd) zg%|)jQ@`o>Z*^B6MFtUG{d2tZzM$X0%jSa?tp=={2|ckug;I-2D@xrQ?~}+B7x`B$ z1RDFn*+0)wTp#-8c9^*I9?kOMe9^)UGv;Rw?h_I&6s zWN1V^XjfwG2oGI$oIAwn^+-amuhA(5ao~ArE8;GW^;K73(+U{iHidomIzWqT=E<0sqr;JhZ>!d#Kyf>P>-A@bh2|E<9?o4)$qfTuECDyT9=mrgzfP z^RIp-dDdS?Lq8feiruicwa8uwe=Vf*!swzG}-J3~2*69_*y z2q8X*W1vTZ_~-%;2S-+^%FgJKw%PB2H@E!Se#q+`Fi$7YZt%Skb=TBl+wv8*jMpl` zzUWH=IbxHBzN65DFC*plk#u4DSVUrJw%Xw#B?{V=vnckPjA;ba|y@pc9fu0bQP zH0QN1%k0^3wv(Lw!=7hch>RAXeySLKzW%@)Tnb`c3d)oc044fX#cecyZ-&zUffN}c z^p7^G#WG5-6G}}cw7(!k6Q9pWoUb*JLIT_SzugGyfjB3;p3&#cD#^bs!{Rt|trN5Q z3w#0hZ;1x^EezsF9KeN4{xh|s&mo<#)P2OP5juDp|B=`jO19_A4g$nA6qqNt2rxf< zmtmQhfSJ~jBC8!XLPN4?PDuQ7=fUsC`?6C8onlKXW)CZ?xL*2gjgvYLEv%zTL^F^N zxu4(*ZWcd?bIuv9Z2UTX3k~HrQ^8|B^}qyl_Hx?#FmP@V(6>Mk3vue&aV;BVt;(!z zZ$rUbpV_)`h*jGlP<2RNn*Kis^(w)T>#b6!Cen6G0p4f!&*QH4wPhfF_4#G=oHT*v zaF@dM!d>G~jnh7bh?i*pgVt@U5L z;G%bodcBntjo!jZ2_h~y?gMUW{*I6;uJPkhd;ZAe>PId(7~H3P@7z+WV= zJeMF8%Y{a-4^~o&4iE^bk3@Dy8RQg|AVltJx2({kQr#u~6DdqOkx57aHuYh=QB-}U zy!=Fc=A-rpT$|Qdwr0OVtqDY?miRJ(t<@J*dz;GcErcKk)$Sx2-Ag2OeIivSR<+{| zDfyOA2BsbIdSn;P&MGvg64g#UWxV=Py>@`UiL_#f?*SD=n8L9)DL@m%(23Xds0KpU zkz(~b-N2!)wDZw`O8m;a?_-S{gURA7lW@O3#m`Yc6Btf(+4>@_AchgtbDC8290vR? zUxJp}(gZ_<5ZF+tTri)3iWuL8MAFc4<)%qxD&uoE;m{woe`YYX_ z*zH8p;BjT9fq6*&NIZ-FuZPvKgSA@PvVz$Yl-n8jbaM;ej6Jf;V*3kLqu?DRR_7Q8 z!rUVnsw`DuRD>K+)A#}uNkpPihcSI4XF6#yQHwuvm@piBy#7czW`RbFhGCjV^gyB6 zai+KHh2>UiGVx8sPV|AIhVJ0QB4!~`uKF_5nDFGzDl)CN$GTp0h&mu1gz0}li~mLk z3+ice!sji>d)qUJRd`3uYbTWMiB7;tELRV19K`SiEiaFU`?QYN=0IVGTbi6?f(QEE zq8`Z@_2&yr2hCNv#928K8_XFax`vN19U&eaC5f%9u2kX+U7UBhYWWqhcy12VC&nrf z>g#!-DXfLUY+`58?`G><6oU-3)lXJSiv%2ZxY5=@;(om=C702aDYw{->;Z)|9F9QI zsZ27!9oU3JTz zN(tqp^`;U`Udli1#guRr(#g2q@7iPb$`B9&TlYa$#+)()g|G=U=oyopKZ?fH7#oG{ z(}-ajBHQn^@cEA-!G=|%t1&vMbuJ-n{KJYR0?6R;zZAfM+Mp8?sv6D6KdF5A!GqA8 zC?%E`6Qe`I7Rx$x7g^2F^K+!INHTrJp6`)5)B?5u2R%~+0G)Z^rA2vSYSLzF&$B^v zFm`I;U;z5}ay9agtPI?EeD@Rc8OW`agD@!okf?xBtbn|Wf*7;s+Yk-FgtSryKx;S+ zoR7IkqFJ(9Pme@69L$v(fNIzoRnS)Kx&5>}x<5xseuxJE)czpiC<5o;EZZ4{HI!N? zA{USWAi8)>xMnurkj+?9q3K7-SM9xy=zbS0T8nXLMsQv}^qyGyBb|SQYxo`{&|Dy5FLf8w^`E%@c%JVyz(~rAp3fV!urzCQ_bXu|D(@*KXGK zCUS_08vh`JyUD0^tcY7AV3#f8k2;u_9Jj^O)+ARI zYNlw7*XJo)1O2yJ_`1)H&k0mEuDlW+tiq0C;EsY9i z^e8huGnsbTZiDY_f~8eyTTr2I?Sds=-}v5+n%9Ibh-QoXK5owX{NS)p!ZbeEO!ZMe zF6($Y>ik|_`g&*lHi+i6&Ax?PJs*Z&`M#zBY|8l#&xFzRV2PZ^2l2B-T-U8p(Hh7hWYu0cBemcjc^;J zWxMeCt zrCly~@#E$uy;ZxY$kbfCtX!tZ#kWmJ&&gY9n;z?(HXdy=n%4m&_2~C_V@j0S^TBmF zKbn>!7m<7ZPeb?5^dPBTR06b`NgBzf&kH-;*5yK>EE|8r?yWa_^Q7o<-Wo7O3sgIU zc`(SF1s0~5@SDXGvm#o~`fnOz_h~fMxr}J#GX4zM_I`>Rouct^sw=aq6y{jj2A8G% z<*FlVyhZoMus*z&`Z!{p&}@kOEf}lo)*H?<$69V#Tk26q@9zE{X$phv7s;yJcRZ~Z zH4QO2qze>Nn5K#58-raoXKRjaC-2sGCtznr+1~k+aP8Yd0(DnZ#tI(Rr?kqD&*z5j zNlJEw^5AMQl|7byeD;Ff=Z2IGIqnLbHg{`6pJC2>XW??Mt-4@Np)0{CMkg#P=-12w zJ1i#3d^DyYyqyL3mEwi3Vx10dcu zqx@CF{{NY0uvUuwFviqapa+FD{pHUB>7qzAOn#Qe3g-VTs<99U)I^#_n@Q`Y-U~PW zq9CfiM1>j)UY8ay^+VYPLB{La-)9V4J$k}N?X!J=KHPfwLcjHSdE?9I;0tNt3oBV8Dz%=SJk{!o+WZYZZ@&#_Tz?eK*AfS-3~Y?U zI+9iGaejl!iz=;r*V6Ew&>Nk(9E$jBWH5&QQI!Bf3lsA|quNS+a50rqkfXlSw-L>G z`Qo)Wk`U|HWnz^;*xa(uR_SLBP3??r)n=yvPU}fV~ zrU?g8NTq_6?XPf!n%~asqKtJ{`OKf{#vfIKRUNQ(hn0Ia4x_=7lMU+^y7~7k0y`DQ z5y#I#gr~^eNmVj)+6^1A*Kwym3=NidX5IuVe;vS;1U@=p{2o&GMACd#v0ideN$Z?f zEpdMHWux6#!NLXi#SRsW8EjU>P@9-wQ&2~BoH%*hx9<6_MI>nsiiu^1(a8k6g@qxr zAAfK*SR~ofXwOUet1Mc#8JA6kgI5oifKi`UuQD}GXIzTPGPJj6I?&J2MH=gOs-&ZA zQCmsU?FWTNT{Ab`HzgM`UgRaxmF-R|$pjJeV>%&gm$xxa0fjxY(LO)cqN=H0q}Q~r z3wD#di*U=(fJry7-dCD;Hy3_+QE|h_WuMV+e>HO~6Mm`k#xBLxiSKoCcSNB@owOZE zTY}byLB%&-zkPi$RfuTk$YdaHG6H5GckV5j($6xurmg z3KqrWnvlq$LWDS%Rq^9AIk_^SGemh<;E}F`*ImEDHpcy|%)0#BBF~*%?1Gs))m96i z^hPmz#>i3&pE|<%;_KhbdmCzpkY>~^iK!LqlD^ypYw^}T)Jm5P1UDVx>c}55ytiI% zzh-#J{>}|qu(H+5muXhhem7zDN;7P+&`8NjuC$AMO&fyDFkyjN3n3yk|kW}Vg7m1Ev7H@hqXa^h0bS!+7VmFM9zm!OBg9dN(fS4~!NPq3Ah z-CO&&3nzTlm)D0av`IrK7SwM{FFd`e-4Cx!`8Ip(*C!-5Y`c&nQ`ktt`D!gS(MnZ~ z?n?U#>f$CMAtx#->W;Iou6P!MhIyI;#K1+XOr1jB@>~*3KFnGNUnpCd;YwNLAIuZR z?N%Gp=;WV0IZ!2xH0rS}2@9@;^ZK}jHaW4$f;C8J2`X8nb=2xm!;5zoxOhoQ`c$>* zkfrEHn--4?-dnyQDyIv3za$b}Jw9K(X&J*#C$Y;XnM%6C-CvFAAKl%Qe@O5D#g3If zXXk8KM7$f-&nUH9`(>t&kug#CUVX`F@6jen)gJf#WBr7(jjkwcM4;)!_MHQpwzSlfg+)%4t)SS4lZYL;GEorgX1?eGHE=Y7d zISi5SBt3aCXU3hgjPGlyt9k28i?Q(um$yhg6)c_KLDdCe6hz&@59GO*;ek360z|pc(pF}F1uIGr(L~#3dnthL|_}e+X;>1a6(7JI{ zL7r4qd$;P;N}^-?7Nf`&!8p}Io0zIFIe7+Ku6}^3Qh&qgb(Rd{WP_nPQqf41yEw#N zx}{kY?(?g=$}arqVk%r-_cXTWFAghR#5ow3VAnlKO%nX!ueKrUMd1qu0knAOsRvXxV%95+b~VB2fZF>Rs|L~{ za`K5&vfQsI=AQDXuWDQsWZTv3XCs&2r` z!9IbbF+?<&wy)gE-E z`D;Z?sI{!Ks-$gA_C+jled75|a{1SR*5uOncC+6UP;T5&VG;C!Y5gGzf_(V=%trq_ zLv5{ypDGDGXT;4Q>U)1-k~Jir{cz6hipK3*>Ai~nDA*!KGO z`^6fL&B#iQ^to4K7o18ZsfI5=Ok%i5t`JNIzj}E5f{P zzkwH>(RQ0@Rz@TsZ0sGpbJ6>wl%-xtD(FBFR3{C%o@*|s*j)7(Z;2YjC3;^WoY7*2 zag?65mi*ToQ)ZvDoA$1->S*BD%B|Qns}grJ^w3*ev6C#ov69s({&i^aCAn=cHz zj{-=)geQsJv_db~#QanTbx9a6S1Tv4)~NgY5Ft5t6x$RtWX-%IRN>Awx4|Dhjre;VFT6RjXdlTm1;O-ab0)Hr+@mPt-g zdn$3V`~k9Wro&^7inpke)M|8q%q}C7nwU6k*-)vjQuilHA}N`cJXC&zfz!Ute9@h} zpZgaDWK@02z5+jEs879Z*GTP!M#`EP!53`{! z%O1y?4%-q*>hq&pd(HtP`ykO{pqTOC^n}o>Z`{OXA{jXH={1~n+}ZO_8KNzwEAF;V zqPS)@lQ7n^l|4?g)$-I;W%nlzY61f_45cLQ_HC;zTRPcc$8~E9hGL|{w`~ai3_^DJ z7z~C#2P2OY6QNyZs?j(Ii4b=@dhOb(w%*&(3zB#U?A9F`th?MwazVgik|?qzzn1;P zI5yO=TXFEEAstHzE+h3eAd)P__aPy=XQ*L%)SZ*qmrt5nJ?A$(Z$C!Xy^7!qyu<98-e{cS-z!TFawuT09X)S7W^rs7>qaP%9p9MR*vT>*wSx`a zq;Q344?)zO?GjI&PUkvKd@){kcX_0-uX(zQBRy3>@c+JY_a|C{?fp%0Du&QhFE5>J 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 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make deleted file mode 100644 index 0dcb8e6e9a..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/flags.make +++ /dev/null @@ -1,10 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# compile Fortran with /usr/local/bin/gfortran -Fortran_DEFINES = - -Fortran_INCLUDES = -I/Users/afoster/pFUnit/include -I/Users/afoster/pFUnit/mod -I/usr/local/Cellar/netcdf/4.9.2/include -I/usr/local/Cellar/netcdf-fortran/4.6.0/include - -Fortran_FLAGS = -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal deleted file mode 100644 index 8030915fe2..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/fortran.internal +++ /dev/null @@ -1,5 +0,0 @@ -# The fortran modules provided by this target. -provides - fatesconstantsmod.mod - fatesunittestiomod.mod - fatesunittestorbitalmod.mod diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt deleted file mode 100644 index 2d1f965f41..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/usr/local/bin/gfortran -framework Accelerate -DCESMCOUPLED -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds -fallow-argument-mismatch -fallow-invalid-boz -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o -o FATES_rad_test -L/usr/local/Cellar/netcdf/4.9.2/lib -L/usr/local/Cellar/netcdf-fortran/4.6.0/lib diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make deleted file mode 100644 index 33e6bffba3..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/progress.make +++ /dev/null @@ -1,6 +0,0 @@ -CMAKE_PROGRESS_1 = 1 -CMAKE_PROGRESS_2 = 2 -CMAKE_PROGRESS_3 = 3 -CMAKE_PROGRESS_4 = 4 -CMAKE_PROGRESS_5 = 5 - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks deleted file mode 100644 index 7ed6ff82de..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake deleted file mode 100644 index cb5f7e2cb4..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/CTestTestfile.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test -# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -add_test(rad_test "FATES_rad_test") -set_tests_properties(rad_test PROPERTIES _BACKTRACE_TRIPLES "/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt;37;add_test;/Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test/CMakeLists.txt;0;") diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile deleted file mode 100644 index f12b8509d6..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/Makefile +++ /dev/null @@ -1,274 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test//CMakeFiles/progress.marks - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -# Convenience name for target. -unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule -.PHONY : unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule - -# Convenience name for target. -FATES_rad_test: unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/rule -.PHONY : FATES_rad_test - -# fast build rule for target. -FATES_rad_test/fast: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build -.PHONY : FATES_rad_test/fast - -FatesUnitTestRadiation.o: FatesUnitTestRadiation.F90.o -.PHONY : FatesUnitTestRadiation.o - -# target to build an object file -FatesUnitTestRadiation.F90.o: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.o -.PHONY : FatesUnitTestRadiation.F90.o - -FatesUnitTestRadiation.i: FatesUnitTestRadiation.F90.i -.PHONY : FatesUnitTestRadiation.i - -# target to preprocess a source file -FatesUnitTestRadiation.F90.i: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.i -.PHONY : FatesUnitTestRadiation.F90.i - -FatesUnitTestRadiation.s: FatesUnitTestRadiation.F90.s -.PHONY : FatesUnitTestRadiation.s - -# target to generate assembly for a file -FatesUnitTestRadiation.F90.s: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/FatesUnitTestRadiation.F90.s -.PHONY : FatesUnitTestRadiation.F90.s - -__/__/__/main/FatesConstantsMod.o: __/__/__/main/FatesConstantsMod.F90.o -.PHONY : __/__/__/main/FatesConstantsMod.o - -# target to build an object file -__/__/__/main/FatesConstantsMod.F90.o: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.o -.PHONY : __/__/__/main/FatesConstantsMod.F90.o - -__/__/__/main/FatesConstantsMod.i: __/__/__/main/FatesConstantsMod.F90.i -.PHONY : __/__/__/main/FatesConstantsMod.i - -# target to preprocess a source file -__/__/__/main/FatesConstantsMod.F90.i: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.i -.PHONY : __/__/__/main/FatesConstantsMod.F90.i - -__/__/__/main/FatesConstantsMod.s: __/__/__/main/FatesConstantsMod.F90.s -.PHONY : __/__/__/main/FatesConstantsMod.s - -# target to generate assembly for a file -__/__/__/main/FatesConstantsMod.F90.s: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/__/main/FatesConstantsMod.F90.s -.PHONY : __/__/__/main/FatesConstantsMod.F90.s - -__/__/utils/FatesUnitTestIOMod.o: __/__/utils/FatesUnitTestIOMod.F90.o -.PHONY : __/__/utils/FatesUnitTestIOMod.o - -# target to build an object file -__/__/utils/FatesUnitTestIOMod.F90.o: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.o -.PHONY : __/__/utils/FatesUnitTestIOMod.F90.o - -__/__/utils/FatesUnitTestIOMod.i: __/__/utils/FatesUnitTestIOMod.F90.i -.PHONY : __/__/utils/FatesUnitTestIOMod.i - -# target to preprocess a source file -__/__/utils/FatesUnitTestIOMod.F90.i: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.i -.PHONY : __/__/utils/FatesUnitTestIOMod.F90.i - -__/__/utils/FatesUnitTestIOMod.s: __/__/utils/FatesUnitTestIOMod.F90.s -.PHONY : __/__/utils/FatesUnitTestIOMod.s - -# target to generate assembly for a file -__/__/utils/FatesUnitTestIOMod.F90.s: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestIOMod.F90.s -.PHONY : __/__/utils/FatesUnitTestIOMod.F90.s - -__/__/utils/FatesUnitTestOrbitalMod.o: __/__/utils/FatesUnitTestOrbitalMod.F90.o -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.o - -# target to build an object file -__/__/utils/FatesUnitTestOrbitalMod.F90.o: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.o -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.o - -__/__/utils/FatesUnitTestOrbitalMod.i: __/__/utils/FatesUnitTestOrbitalMod.F90.i -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.i - -# target to preprocess a source file -__/__/utils/FatesUnitTestOrbitalMod.F90.i: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.i -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.i - -__/__/utils/FatesUnitTestOrbitalMod.s: __/__/utils/FatesUnitTestOrbitalMod.F90.s -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.s - -# target to generate assembly for a file -__/__/utils/FatesUnitTestOrbitalMod.F90.s: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/build.make unit_testing/test/radiation_test/CMakeFiles/FATES_rad_test.dir/__/__/utils/FatesUnitTestOrbitalMod.F90.s -.PHONY : __/__/utils/FatesUnitTestOrbitalMod.F90.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... test" - @echo "... FATES_rad_test" - @echo "... FatesUnitTestRadiation.o" - @echo "... FatesUnitTestRadiation.i" - @echo "... FatesUnitTestRadiation.s" - @echo "... __/__/__/main/FatesConstantsMod.o" - @echo "... __/__/__/main/FatesConstantsMod.i" - @echo "... __/__/__/main/FatesConstantsMod.s" - @echo "... __/__/utils/FatesUnitTestIOMod.o" - @echo "... __/__/utils/FatesUnitTestIOMod.i" - @echo "... __/__/utils/FatesUnitTestIOMod.s" - @echo "... __/__/utils/FatesUnitTestOrbitalMod.o" - @echo "... __/__/utils/FatesUnitTestOrbitalMod.i" - @echo "... __/__/utils/FatesUnitTestOrbitalMod.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake deleted file mode 100644 index 7f8055d555..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/cmake_install.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/test/radiation_test - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "/usr/bin/objdump") -endif() - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 0626f191b1..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/afoster/Documents/ncar/CTSM/src/fates") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks deleted file mode 100644 index 573541ac97..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake deleted file mode 100644 index 6e2fdc5a3d..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/utils/CTestTestfile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils -# Build directory: /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile b/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile deleted file mode 100644 index b1f822e9bf..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/utils/Makefile +++ /dev/null @@ -1,151 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.25 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.25.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.25.2/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /usr/local/Cellar/cmake/3.25.2/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.25.2/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.25.2/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/unit_testing/utils//CMakeFiles/progress.marks - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unit_testing/utils/preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... test" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - cd /Users/afoster/Documents/ncar/CTSM/src/fates/build/__command_line_test__/__command_line_test__ && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake b/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake deleted file mode 100644 index 42c88ffb10..0000000000 --- a/build/__command_line_test__/__command_line_test__/unit_testing/utils/cmake_install.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Install script for directory: /Users/afoster/Documents/ncar/CTSM/src/fates/unit_testing/utils - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "CESM_DEBUG") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "/usr/bin/objdump") -endif() - diff --git a/build/cmake_macros/CMakeLists.txt b/build/cmake_macros/CMakeLists.txt deleted file mode 100644 index c2ebcb51be..0000000000 --- a/build/cmake_macros/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_policy(SET CMP0057 NEW) -cmake_minimum_required(VERSION 3.5) -project(cime LANGUAGES C Fortran) -include(../Macros.cmake) diff --git a/build/cmake_macros/CNL.cmake b/build/cmake_macros/CNL.cmake deleted file mode 100644 index 7202f78196..0000000000 --- a/build/cmake_macros/CNL.cmake +++ /dev/null @@ -1,14 +0,0 @@ -set(CMAKE_OPTS "-DCMAKE_SYSTEM_NAME=Catamount") -string(APPEND CPPDEFS " -DLINUX") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(MPICC "cc") -set(MPICXX "CC") -set(MPIFC "ftn") -set(NETCDF_PATH "$ENV{NETCDF_DIR}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PARALLEL_NETCDF_DIR}") -set(SCC "cc") -set(SCXX "CC") -set(SFC "ftn") diff --git a/build/cmake_macros/Darwin.cmake b/build/cmake_macros/Darwin.cmake deleted file mode 100644 index 89fd4bdc07..0000000000 --- a/build/cmake_macros/Darwin.cmake +++ /dev/null @@ -1 +0,0 @@ -string(APPEND CPPDEFS " -DSYSDARWIN") diff --git a/build/cmake_macros/Macros.cmake b/build/cmake_macros/Macros.cmake deleted file mode 100644 index b089f58058..0000000000 --- a/build/cmake_macros/Macros.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# -# Use this file to include the relevant macros based on -# machine/compiler settings. This file gets copied to CASEROOT -# and that's the one that gets included by the build system. Feel free -# to modify this file in the CASEROOT. -# -set(MACROS_DIR ${CASEROOT}/cmake_macros) - -set(UNIVERSAL_MACRO ${MACROS_DIR}/universal.cmake) -set(COMPILER_MACRO ${MACROS_DIR}/${COMPILER}.cmake) -set(OS_MACRO ${MACROS_DIR}/${OS}.cmake) -set(MACHINE_MACRO ${MACROS_DIR}/${MACH}.cmake) -set(COMPILER_OS_MACRO ${MACROS_DIR}/${COMPILER}_${OS}.cmake) -set(COMPILER_MACHINE_MACRO ${MACROS_DIR}/${COMPILER}_${MACH}.cmake) - -if (CONVERT_TO_MAKE) - get_cmake_property(VARS_BEFORE_BUILD_INTERNAL_IGNORE VARIABLES) -endif() - -# Include order defines precedence -foreach (MACRO_FILE ${UNIVERSAL_MACRO} ${COMPILER_MACRO} ${OS_MACRO} ${MACHINE_MACRO} ${COMPILER_OS_MACRO} ${COMPILER_MACHINE_MACRO}) - if (EXISTS ${MACRO_FILE}) - include(${MACRO_FILE}) - else() - message("No macro file found: ${MACRO_FILE}") - endif() -endforeach() - -if (CONVERT_TO_MAKE) - get_cmake_property(VARS_AFTER VARIABLES) - - foreach (VAR_AFTER IN LISTS VARS_AFTER) - if (NOT VAR_AFTER IN_LIST VARS_BEFORE_BUILD_INTERNAL_IGNORE) - message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}") - endif() - endforeach() -endif() diff --git a/build/cmake_macros/arm.cmake b/build/cmake_macros/arm.cmake deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/cmake_macros/armgcc.cmake b/build/cmake_macros/armgcc.cmake deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/cmake_macros/athena.cmake b/build/cmake_macros/athena.cmake deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/cmake_macros/bluewaters.cmake b/build/cmake_macros/bluewaters.cmake deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/cmake_macros/casper.cmake b/build/cmake_macros/casper.cmake deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/build/cmake_macros/centos7-linux.cmake b/build/cmake_macros/centos7-linux.cmake deleted file mode 100644 index 4dc3995df5..0000000000 --- a/build/cmake_macros/centos7-linux.cmake +++ /dev/null @@ -1 +0,0 @@ -string(APPEND SLIBS " -L$(NETCDF_PATH)/lib -Wl,-rpath,$(NETCDF_PATH)/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/cheyenne.cmake b/build/cmake_macros/cheyenne.cmake deleted file mode 100644 index 35c2d3c33e..0000000000 --- a/build/cmake_macros/cheyenne.cmake +++ /dev/null @@ -1,6 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "gpfs") -set(PNETCDF_PATH "$ENV{PNETCDF}") diff --git a/build/cmake_macros/container.cmake b/build/cmake_macros/container.cmake deleted file mode 100644 index 82b8a1428d..0000000000 --- a/build/cmake_macros/container.cmake +++ /dev/null @@ -1,7 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(NETCDF_PATH "/usr/local") -set(PNETCDF_PATH "/usr/local") -set(LDFLAGS "") -string(APPEND SLIBS " -lnetcdf -lnetcdff -llapack -lblas") diff --git a/build/cmake_macros/cray.cmake b/build/cmake_macros/cray.cmake deleted file mode 100644 index 89c27843d7..0000000000 --- a/build/cmake_macros/cray.cmake +++ /dev/null @@ -1,37 +0,0 @@ -if (NOT compile_threaded) - string(APPEND CFLAGS " -h noomp") -endif() -if (compile_threaded) - string(APPEND CFLAGS " -fopenmp") -endif() -if (DEBUG) - string(APPEND CFLAGS " -g -O0") -endif() -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_R16 -DCPRCRAY") -if (COMP_NAME STREQUAL pop) - string(APPEND CPPDEFS " -DDIR=NOOP") -endif() -if (COMP_NAME STREQUAL moby) - string(APPEND CPPDEFS " -DDIR=NOOP") -endif() -set(FC_AUTO_R8 "-s real64") -string(APPEND FFLAGS " -f free -N 255 -h byteswapio -x dir -ef") -if (NOT compile_threaded) - string(APPEND FFLAGS " -h noomp") -endif() -if (compile_threaded) - string(APPEND FFLAGS " -h omp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -g -O0 -K trap=fp -m1") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2,ipa2 -em") -endif() -set(FFLAGS_NOOPT "-O1,fp2,ipa0,scalar0,vector0") -set(HAS_F2008_CONTIGUOUS "TRUE") -set(LDFLAGS "-Wl,--allow-multiple-definition -h byteswapio") -string(APPEND LDFLAGS " -h omp") diff --git a/build/cmake_macros/cray_daint.cmake b/build/cmake_macros/cray_daint.cmake deleted file mode 100644 index 5929a1be65..0000000000 --- a/build/cmake_macros/cray_daint.cmake +++ /dev/null @@ -1,2 +0,0 @@ -string(APPEND FFLAGS " -I/project/s824/edavin/OASIS3-MCT_2.0/build.cray/build/lib/mct -I/project/s824/edavin/OASIS3-MCT_2.0/build.cray/build/lib/psmile.MPI1") -string(APPEND SLIBS " -L/project/s824/edavin/OASIS3-MCT_2.0/build.cray/lib -lpsmile.MPI1 -lscrip -lmct_oasis -lmpeu_oasis") diff --git a/build/cmake_macros/euler2.cmake b/build/cmake_macros/euler2.cmake deleted file mode 100644 index 63ca8a325f..0000000000 --- a/build/cmake_macros/euler2.cmake +++ /dev/null @@ -1,5 +0,0 @@ -string(APPEND CPPDEFS " -DLINUX") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PNETCDF}") -set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/euler3.cmake b/build/cmake_macros/euler3.cmake deleted file mode 100644 index 63ca8a325f..0000000000 --- a/build/cmake_macros/euler3.cmake +++ /dev/null @@ -1,5 +0,0 @@ -string(APPEND CPPDEFS " -DLINUX") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PNETCDF}") -set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/euler4.cmake b/build/cmake_macros/euler4.cmake deleted file mode 100644 index 63ca8a325f..0000000000 --- a/build/cmake_macros/euler4.cmake +++ /dev/null @@ -1,5 +0,0 @@ -string(APPEND CPPDEFS " -DLINUX") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PNETCDF}") -set(SLIBS "-L$ENV{NETCDF}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/frontera.cmake b/build/cmake_macros/frontera.cmake deleted file mode 100644 index bbdb959a39..0000000000 --- a/build/cmake_macros/frontera.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(HAS_F2008_CONTIGUOUS "TRUE") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") -string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/gnu.cmake b/build/cmake_macros/gnu.cmake deleted file mode 100644 index 621740c595..0000000000 --- a/build/cmake_macros/gnu.cmake +++ /dev/null @@ -1,43 +0,0 @@ -string(APPEND CFLAGS " -std=gnu99") -if (compile_threaded) - string(APPEND CFLAGS " -fopenmp") -endif() -if (DEBUG) - string(APPEND CFLAGS " -g -Wall -Og -fbacktrace -ffpe-trap=invalid,zero,overflow -fcheck=bounds") -endif() -if (NOT DEBUG) - string(APPEND CFLAGS " -O") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU") -set(CXX_LINKER "FORTRAN") -set(FC_AUTO_R8 "-fdefault-real-8 -fdefault-double-8") -string(APPEND FFLAGS " -fconvert=big-endian -ffree-line-length-none -ffixed-line-length-none") -if (compile_threaded) - string(APPEND FFLAGS " -fopenmp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -g -Wall -Og -fbacktrace -ffpe-trap=zero,overflow -fcheck=bounds") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-ffixed-form") -set(FREEFLAGS "-ffree-form") -set(HAS_F2008_CONTIGUOUS "FALSE") -if (compile_threaded) - string(APPEND LDFLAGS " -fopenmp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "gcc") -set(SCXX "g++") -set(SFC "gfortran") -set(SUPPORTS_CXX "TRUE") - -message("C compiler version is ${CMAKE_C_COMPILER_VERSION}") -message("Fortran compiler version is ${CMAKE_Fortran_COMPILER_VERSION}") -if (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 10) - string(APPEND FFLAGS " -fallow-argument-mismatch -fallow-invalid-boz ") -endif() diff --git a/build/cmake_macros/gnu_cheyenne.cmake b/build/cmake_macros/gnu_cheyenne.cmake deleted file mode 100644 index 988fbb33be..0000000000 --- a/build/cmake_macros/gnu_cheyenne.cmake +++ /dev/null @@ -1,4 +0,0 @@ -if (COMP_NAME STREQUAL pio1) - string(APPEND CPPDEFS " -DNO_MPIMOD") -endif() -string(APPEND SLIBS " -ldl") diff --git a/build/cmake_macros/gnu_coeus.cmake b/build/cmake_macros/gnu_coeus.cmake deleted file mode 100644 index f2c24ef9e8..0000000000 --- a/build/cmake_macros/gnu_coeus.cmake +++ /dev/null @@ -1,2 +0,0 @@ -set(NETCDF_PATH "/vol/apps/hpc/stow/netcdf/4.4.1.1/gcc-6.3.0") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/gnu_fleabone.cmake b/build/cmake_macros/gnu_fleabone.cmake deleted file mode 100644 index d2f1e44096..0000000000 --- a/build/cmake_macros/gnu_fleabone.cmake +++ /dev/null @@ -1,27 +0,0 @@ -set(NETCDF_C_PATH "/usr/local/Cellar/netcdf/4.9.2") -set(NETCDF_FORTRAN_PATH "/usr/local/Cellar/netcdf-fortran/4.6.0") - -# These LDFLAGS provide lapack and blas support on a Mac. This may require installation of -# the Apple Developer Tools. -string(APPEND LDFLAGS " -framework Accelerate") - -#string(APPEND FFLAGS " -Wunused") - -# Trying to produce a backtrace leads to a hang, so don't even try -#string(APPEND CFLAGS " -fno-backtrace") -#string(APPEND FFLAGS " -fno-backtrace") - -# This is needed to run the Fortran unit tests; -# this isn't needed to build and run CESM. -#if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) -set(PFUNIT_PATH "/Users/afoster/pFUnit/") -#endif() - -# Most of the following paths aren't necessary on my machine because I have my PATH set so -# that the right compilers are picked up by default. But it doesn't hurt to be explicit. -set(SFC "/usr/local/bin/gfortran") -set(SCC "/usr/bin/gcc") -set(SCXX "/usr/bin/g++") -set(MPIFC "/usr/local/bin/mpif90") -set(MPICC "/usr/local/bin/mpicc") -set(MPICXX "/usr/local/bin/mpic++") diff --git a/build/cmake_macros/gnu_hobart.cmake b/build/cmake_macros/gnu_hobart.cmake deleted file mode 100644 index 35929dcc37..0000000000 --- a/build/cmake_macros/gnu_hobart.cmake +++ /dev/null @@ -1 +0,0 @@ -string(APPEND SLIBS " -lm -ldl") diff --git a/build/cmake_macros/gnu_homebrew.cmake b/build/cmake_macros/gnu_homebrew.cmake deleted file mode 100644 index 9e468c1276..0000000000 --- a/build/cmake_macros/gnu_homebrew.cmake +++ /dev/null @@ -1 +0,0 @@ -string(APPEND LDFLAGS " -framework Accelerate -Wl,-rpath $(NETCDF)/lib") diff --git a/build/cmake_macros/gnu_lobata.cmake b/build/cmake_macros/gnu_lobata.cmake deleted file mode 100644 index 60aeb9c8a8..0000000000 --- a/build/cmake_macros/gnu_lobata.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(SUPPORTS_CXX "TRUE") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_TIMES -DHAVE_GETTIMEOFDAY -DHAVE_BACKTRACE") -endif() -string(APPEND SLIBS " -L$ENV{NETCDF_FORTRAN_PATH}/lib/ -lnetcdff -L$ENV{NETCDF_C_PATH}/lib/ -lnetcdf -lcurl -llapack -lblas") -if (DEBUG) - string(APPEND FFLAGS " -g -fbacktrace -fbounds-check -ffpe-trap=invalid,zero,overflow") -else() - string(APPEND FFLAGS " -fno-unsafe-math-optimizations") -endif() -if (MPILIB STREQUAL mpi-serial) - set(SCC "gcc") - set(SFC "gfortran") -endif() -string(APPEND CXX_LIBS " -lstdc++") diff --git a/build/cmake_macros/gnu_melvin.cmake b/build/cmake_macros/gnu_melvin.cmake deleted file mode 100644 index 668d542c96..0000000000 --- a/build/cmake_macros/gnu_melvin.cmake +++ /dev/null @@ -1,13 +0,0 @@ -set(ALBANY_PATH "/projects/install/rhel6-x86_64/ACME/AlbanyTrilinos/Albany/build/install") -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -set(CXX_LIBS "-lstdc++ -lmpi_cxx") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDFROOT}") -set(PNETCDF_PATH "$ENV{PNETCDFROOT}") -execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) -string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -lblas -llapack") diff --git a/build/cmake_macros/gnu_modex.cmake b/build/cmake_macros/gnu_modex.cmake deleted file mode 100644 index 83a692512a..0000000000 --- a/build/cmake_macros/gnu_modex.cmake +++ /dev/null @@ -1,5 +0,0 @@ -string(APPEND SLIBS " -L$ENV{HDF5_HOME}/lib -lhdf5_fortran -lhdf5 -lhdf5_hl -lhdf5hl_fortran") -string(APPEND SLIBS " -L$ENV{NETCDF_PATH}/lib/ -lnetcdff -lnetcdf -lcurl -lblas -llapack") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_GETTIMEOFDAY -DHAVE_BACKTRACE") -endif() diff --git a/build/cmake_macros/gust.cmake b/build/cmake_macros/gust.cmake deleted file mode 100644 index 5332d19c9e..0000000000 --- a/build/cmake_macros/gust.cmake +++ /dev/null @@ -1,10 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PNETCDF}") -# If we want to use cray-libsci instead of mkl uncomment this line as well as the module in config_machines.xml -#string(REPLACE "-mkl=cluster" "" SLIBS "${SLIBS}") -string(REPLACE "-mkl=cluster" "-qmkl=cluster" SLIBS "${SLIBS}") -#string(APPEND CPPDEFS " -DNO_SHR_VMATH ") \ No newline at end of file diff --git a/build/cmake_macros/hobart.cmake b/build/cmake_macros/hobart.cmake deleted file mode 100644 index 8894b6a383..0000000000 --- a/build/cmake_macros/hobart.cmake +++ /dev/null @@ -1,9 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(LAPACK_LIBDIR "/usr/lib64") -if (MPILIB STREQUAL mvapich2) - set(MPI_LIB_NAME "mpich") -endif() -set(NETCDF_PATH "$ENV{NETCDF_PATH}") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/ibm.cmake b/build/cmake_macros/ibm.cmake deleted file mode 100644 index 37daaf31e5..0000000000 --- a/build/cmake_macros/ibm.cmake +++ /dev/null @@ -1,38 +0,0 @@ -string(APPEND CFLAGS " -g -qfullpath -qmaxmem=-1") -if (NOT DEBUG) - string(APPEND CFLAGS " -O3") -endif() -if (compile_threaded) - string(APPEND CFLAGS " -qsmp=omp") -endif() -if (DEBUG AND compile_threaded) - string(APPEND CFLAGS " -qsmp=omp:noopt") -endif() -string(APPEND CPPDEFS " -DFORTRAN_SAME -DCPRIBM") -set(CPRE "-WF,-D") -set(FC_AUTO_R8 "-qrealsize=8") -string(APPEND FFLAGS " -g -qfullpath -qmaxmem=-1") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2 -qstrict -qinline=auto") -endif() -if (compile_threaded) - string(APPEND FFLAGS " -qsmp=omp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -qinitauto=7FF7FFFF -qflttrap=ov:zero:inv:en") -endif() -if (DEBUG AND compile_threaded) - string(APPEND FFLAGS " -qsmp=omp:noopt") -endif() -if (DEBUG AND COMP_NAME STREQUAL pop) - string(APPEND FFLAGS " -C") -endif() -set(FIXEDFLAGS "-qsuffix=f=f -qfixed=132") -set(FREEFLAGS "-qsuffix=f=f90:cpp=F90") -set(HAS_F2008_CONTIGUOUS "TRUE") -if (compile_threaded) - string(APPEND LDFLAGS " -qsmp=omp") -endif() -if (DEBUG AND compile_threaded) - string(APPEND LDFLAGS " -qsmp=omp:noopt") -endif() diff --git a/build/cmake_macros/ibm_AIX.cmake b/build/cmake_macros/ibm_AIX.cmake deleted file mode 100644 index ec2293afb9..0000000000 --- a/build/cmake_macros/ibm_AIX.cmake +++ /dev/null @@ -1,18 +0,0 @@ -string(APPEND CFLAGS " -qarch=auto -qtune=auto -qcache=auto") -set(CONFIG_SHELL "/usr/bin/bash") -string(APPEND FFLAGS " -qarch=auto -qtune=auto -qcache=auto -qsclk=micro") -if (COMP_NAME STREQUAL cam) - string(APPEND FFLAGS " -qspill=6000") -endif() -if (DEBUG) - string(APPEND LDFLAGS " -qsigtrap=xl__trcedump") -endif() -string(APPEND LDFLAGS " -bdatapsize:64K -bstackpsize:64K -btextpsize:32K") -set(MPICC "mpcc_r") -set(MPIFC "mpxlf2003_r") -set(SCC "cc_r") -set(SFC "xlf2003_r") -string(APPEND SLIBS " -lmassv -lessl") -if (NOT DEBUG) - string(APPEND SLIBS " -lmass") -endif() diff --git a/build/cmake_macros/ibm_BGQ.cmake b/build/cmake_macros/ibm_BGQ.cmake deleted file mode 100644 index 0f113a90fe..0000000000 --- a/build/cmake_macros/ibm_BGQ.cmake +++ /dev/null @@ -1,11 +0,0 @@ -set(CONFIG_ARGS "--build=powerpc-bgp-linux --host=powerpc64-suse-linux") -string(APPEND CPPDEFS " -DLINUX") -string(APPEND FFLAGS " -g -qfullpath -qmaxmem=-1 -qspillsize=2500 -qextname=flush") -if (NOT DEBUG) - string(APPEND FFLAGS " -O3 -qstrict -qinline=auto") -endif() -if (NOT DEBUG AND compile_threaded) -endif() -if (DEBUG AND compile_threaded) -endif() -set(LDFLAGS "-Wl,--relax -Wl,--allow-multiple-definition") diff --git a/build/cmake_macros/intel.cmake b/build/cmake_macros/intel.cmake deleted file mode 100644 index 7328c85e30..0000000000 --- a/build/cmake_macros/intel.cmake +++ /dev/null @@ -1,61 +0,0 @@ -string(APPEND CFLAGS " -qno-opt-dynamic-align -fp-model precise -std=gnu99") -if (compile_threaded) - string(APPEND CFLAGS " -qopenmp") -endif() -if (NOT DEBUG) - string(APPEND CFLAGS " -O2 -debug minimal") -endif() -if (DEBUG) - string(APPEND CFLAGS " -O0 -g") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DCPRINTEL") -string(APPEND CXX_LDFLAGS " -cxxlib") -set(CXX_LINKER "FORTRAN") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -qno-opt-dynamic-align -convert big_endian -assume byterecl -ftz -traceback -assume realloc_lhs -fp-model source") -if (compile_threaded) - string(APPEND FFLAGS " -qopenmp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -check uninit -check bounds -check pointers -fpe0 -check noarg_temp_created") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2 -debug minimal") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-fixed") -set(FREEFLAGS "-free") -if (compile_threaded) - string(APPEND LDFLAGS " -qopenmp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "icc") -set(SCXX "icpc") -set(SFC "ifort") -if (MPILIB STREQUAL mpich) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpich2) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mvapich) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mvapich2) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpt) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL openmpi) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL impi) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -mkl") -endif() -set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/intel_Darwin.cmake b/build/cmake_macros/intel_Darwin.cmake deleted file mode 100644 index 7a2450e00f..0000000000 --- a/build/cmake_macros/intel_Darwin.cmake +++ /dev/null @@ -1,3 +0,0 @@ -if (NOT compile_threaded) - string(APPEND FFLAGS " -heap-arrays") -endif() diff --git a/build/cmake_macros/intel_aleph.cmake b/build/cmake_macros/intel_aleph.cmake deleted file mode 100644 index 76985f0ede..0000000000 --- a/build/cmake_macros/intel_aleph.cmake +++ /dev/null @@ -1,8 +0,0 @@ -set(CONFIG_ARGS "--host=cray") -string(APPEND CFLAGS " -xCORE-AVX2") -string(APPEND FFLAGS " -xCORE-AVX2") -string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_PAPI -DHAVE_SLASHPROC") -endif() -string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_athena.cmake b/build/cmake_macros/intel_athena.cmake deleted file mode 100644 index b558b0fd4d..0000000000 --- a/build/cmake_macros/intel_athena.cmake +++ /dev/null @@ -1,20 +0,0 @@ -string(APPEND CFLAGS " -xHost") -string(APPEND CPPDEFS " -DINTEL_MKL -DHAVE_SSE2") -string(APPEND FFLAGS " -xHost") -if (COMP_NAME STREQUAL nemo) - string(APPEND FFLAGS " $(FC_AUTO_R8) -O3 -assume norealloc_lhs") -endif() -execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) -string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0}") -if (MPILIB STREQUAL mpich2) - set(MPICXX "mpiicpc") -endif() -if (MPILIB STREQUAL mpich2) - set(MPICC "mpiicc") -endif() -if (MPILIB STREQUAL mpich2) - set(MPIFC "mpiifort") -endif() -if (MPILIB STREQUAL mpich2) - set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") -endif() diff --git a/build/cmake_macros/intel_aws-hpc6a.cmake b/build/cmake_macros/intel_aws-hpc6a.cmake deleted file mode 100644 index 0e4d281538..0000000000 --- a/build/cmake_macros/intel_aws-hpc6a.cmake +++ /dev/null @@ -1,8 +0,0 @@ -string(APPEND CFLAGS " -qopt-report -march=core-avx2 -mtune=core-avx2 -no-fma") -string(APPEND FFLAGS " -qopt-report -march=core-avx2 -mtune=core-avx2 -no-fma") -if (DEBUG) - string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") -endif() -set(SLIBS "-lnetcdf -lnetcdff -lpnetcdf -lblas -llapack -lpthread -lm -ldl") -string(APPEND CPPDEFS " -DNO_SHR_VMATH") - diff --git a/build/cmake_macros/intel_bluewaters.cmake b/build/cmake_macros/intel_bluewaters.cmake deleted file mode 100644 index 29b1da06da..0000000000 --- a/build/cmake_macros/intel_bluewaters.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(HAS_F2008_CONTIGUOUS "FALSE") -string(APPEND FFLAGS " -dynamic -mkl=sequential -no-fma") -string(APPEND CFLAGS " -dynamic -mkl=sequential -no-fma") diff --git a/build/cmake_macros/intel_casper.cmake b/build/cmake_macros/intel_casper.cmake deleted file mode 100644 index 7ee1c8b71d..0000000000 --- a/build/cmake_macros/intel_casper.cmake +++ /dev/null @@ -1,9 +0,0 @@ -string(APPEND CFLAGS " -qopt-report -xCORE_AVX2 -no-fma") -string(APPEND FFLAGS " -qopt-report -xCORE_AVX2 -no-fma") -if (DEBUG) - string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") -endif() -if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) - set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_noMPI_noOpenMP") -endif() -set(HAS_F2008_CONTIGUOUS "TRUE") diff --git a/build/cmake_macros/intel_cheyenne.cmake b/build/cmake_macros/intel_cheyenne.cmake deleted file mode 100644 index f83ba0ebd2..0000000000 --- a/build/cmake_macros/intel_cheyenne.cmake +++ /dev/null @@ -1,12 +0,0 @@ -string(APPEND CFLAGS " -qopt-report -xCORE_AVX2 -no-fma") -string(APPEND FFLAGS " -qopt-report -xCORE_AVX2 -no-fma") -if (DEBUG) - string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") -endif() -if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) - set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_noMPI_noOpenMP") -endif() -if (MPILIB STREQUAL mpt AND compile_threaded) - set(PFUNIT_PATH "$ENV{CESMDATAROOT}/tools/pFUnit/pFUnit3.2.8_cheyenne_Intel17.0.1_MPI_openMP") -endif() -set(HAS_F2008_CONTIGUOUS "TRUE") diff --git a/build/cmake_macros/intel_constance.cmake b/build/cmake_macros/intel_constance.cmake deleted file mode 100644 index 5733786855..0000000000 --- a/build/cmake_macros/intel_constance.cmake +++ /dev/null @@ -1,11 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -string(APPEND CPPDEFS " -DLINUX") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDF_HOME}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi -L$ENV{MKL_PATH} -lmkl_rt") diff --git a/build/cmake_macros/intel_cori-haswell.cmake b/build/cmake_macros/intel_cori-haswell.cmake deleted file mode 100644 index 6fe65eb1d9..0000000000 --- a/build/cmake_macros/intel_cori-haswell.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(CONFIG_ARGS "--host=cray") -string(APPEND CFLAGS " -xCORE-AVX2") -string(APPEND FFLAGS " -xCORE-AVX2") -string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_SLASHPROC") -endif() -string(APPEND LDFLAGS " -mkl") -set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_cori-knl.cmake b/build/cmake_macros/intel_cori-knl.cmake deleted file mode 100644 index 683c1a8068..0000000000 --- a/build/cmake_macros/intel_cori-knl.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(CONFIG_ARGS "--host=cray") -string(APPEND CFLAGS " -xMIC-AVX512") -string(APPEND FFLAGS " -xMIC-AVX512") -string(APPEND SLIBS " -L$(NETCDF_DIR) -lnetcdff -Wl,--as-needed,-L$(NETCDF_DIR)/lib -lnetcdff -lnetcdf") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_SLASHPROC") -endif() -string(APPEND LDFLAGS " -mkl -lmemkind -zmuldefs") -set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_eastwind.cmake b/build/cmake_macros/intel_eastwind.cmake deleted file mode 100644 index 1a1dcf69b3..0000000000 --- a/build/cmake_macros/intel_eastwind.cmake +++ /dev/null @@ -1,11 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -string(APPEND CPPDEFS " -DLINUX") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDF_HOME}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/intel_edison.cmake b/build/cmake_macros/intel_edison.cmake deleted file mode 100644 index 3f41409deb..0000000000 --- a/build/cmake_macros/intel_edison.cmake +++ /dev/null @@ -1,11 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_PAPI") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -string(APPEND SLIBS " -L$ENV{NETCDF_DIR} -lnetcdff -Wl,--as-needed,-L$ENV{NETCDF_DIR}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/intel_euler2.cmake b/build/cmake_macros/intel_euler2.cmake deleted file mode 100644 index 42580b2a64..0000000000 --- a/build/cmake_macros/intel_euler2.cmake +++ /dev/null @@ -1,7 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -xCORE-AVX2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -xCORE-AVX2") -endif() -string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_euler3.cmake b/build/cmake_macros/intel_euler3.cmake deleted file mode 100644 index 42580b2a64..0000000000 --- a/build/cmake_macros/intel_euler3.cmake +++ /dev/null @@ -1,7 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -xCORE-AVX2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -xCORE-AVX2") -endif() -string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_euler4.cmake b/build/cmake_macros/intel_euler4.cmake deleted file mode 100644 index 42580b2a64..0000000000 --- a/build/cmake_macros/intel_euler4.cmake +++ /dev/null @@ -1,7 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -xCORE-AVX2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -xCORE-AVX2") -endif() -string(APPEND LDFLAGS " -mkl") diff --git a/build/cmake_macros/intel_greenplanet-sib29.cmake b/build/cmake_macros/intel_greenplanet-sib29.cmake deleted file mode 100644 index e445abd253..0000000000 --- a/build/cmake_macros/intel_greenplanet-sib29.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(NETCDF_PATH "$ENV{NCDIR}") -set(PNETCDF_PATH "$ENV{PNDIR}") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/intel_greenplanet-sky24.cmake b/build/cmake_macros/intel_greenplanet-sky24.cmake deleted file mode 100644 index e445abd253..0000000000 --- a/build/cmake_macros/intel_greenplanet-sky24.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(NETCDF_PATH "$ENV{NCDIR}") -set(PNETCDF_PATH "$ENV{PNDIR}") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/intel_gust.cmake b/build/cmake_macros/intel_gust.cmake deleted file mode 100644 index f3943efe8e..0000000000 --- a/build/cmake_macros/intel_gust.cmake +++ /dev/null @@ -1,6 +0,0 @@ -set(CONFIG_ARGS "--host=cray") -string(APPEND CFLAGS " -march=core-avx2") -string(APPEND FFLAGS " -march=core-avx2") -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_SLASHPROC") -endif() diff --git a/build/cmake_macros/intel_hobart.cmake b/build/cmake_macros/intel_hobart.cmake deleted file mode 100644 index e9ac234fd1..0000000000 --- a/build/cmake_macros/intel_hobart.cmake +++ /dev/null @@ -1,16 +0,0 @@ -string(APPEND CFLAGS " -lifcore") -string(APPEND FFLAGS " -lifcore") -if (MPILIB STREQUAL mpi-serial) - string(APPEND FFLAGS " -mcmodel medium") -endif() -string(APPEND LDFLAGS " -lquadmath") -string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") -string(APPEND LDFLAGS " -Wl,-rpath,$ENV{COMPILER_PATH}/lib/intel64") -string(APPEND LDFLAGS " -Wl,-rpath,$ENV{COMPILER_PATH}/mkl/lib/intel64") -string(APPEND LDFLAGS " -Wl,-rpath,$ENV{MPI_PATH}/lib") -string(APPEND LDFLAGS " -lifcore") -if (MPILIB STREQUAL mvapich2) -endif() -if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) - set(PFUNIT_PATH "/fs/cgd/csm/tools/pFUnit/pFUnit3.2.8_hobart_Intel15.0.2_noMPI_noOpenMP") -endif() diff --git a/build/cmake_macros/intel_izumi.cmake b/build/cmake_macros/intel_izumi.cmake deleted file mode 100644 index 13f2e3be28..0000000000 --- a/build/cmake_macros/intel_izumi.cmake +++ /dev/null @@ -1,3 +0,0 @@ -if (MPILIB STREQUAL mpi-serial AND NOT compile_threaded) - set(PFUNIT_PATH "/fs/cgd/csm/tools/pFUnit/pFUnit3.3.3_izumi_Intel19.0.1_noMPI_noOpenMP") -endif() diff --git a/build/cmake_macros/intel_laramie.cmake b/build/cmake_macros/intel_laramie.cmake deleted file mode 100644 index ba6a09daa2..0000000000 --- a/build/cmake_macros/intel_laramie.cmake +++ /dev/null @@ -1,5 +0,0 @@ -string(APPEND CFLAGS " -vec-report") -string(APPEND FFLAGS " -vec-report") -if (DEBUG) - string(APPEND CMAKE_OPTS " -DPIO_ENABLE_LOGGING=ON") -endif() diff --git a/build/cmake_macros/intel_lawrencium-lr3.cmake b/build/cmake_macros/intel_lawrencium-lr3.cmake deleted file mode 100644 index 8830234902..0000000000 --- a/build/cmake_macros/intel_lawrencium-lr3.cmake +++ /dev/null @@ -1,12 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_VPRINTF -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -string(APPEND SLIBS " -lnetcdff -lnetcdf -mkl") -if (DEBUG) - string(APPEND FFLAGS " -ftrapuv") -endif() -if (DEBUG) - string(APPEND CFLAGS " -ftrapuv") -endif() -set(NETCDF_PATH "$ENV{NETCDF_DIR}") -set(LAPACK_LIBDIR "/global/software/sl-6.x86_64/modules/intel/2016.1.150/lapack/3.6.0-intel/lib") diff --git a/build/cmake_macros/intel_sandiatoss3.cmake b/build/cmake_macros/intel_sandiatoss3.cmake deleted file mode 100644 index 8356ac5e73..0000000000 --- a/build/cmake_macros/intel_sandiatoss3.cmake +++ /dev/null @@ -1,12 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -set(ESMF_LIBDIR "/projects/ccsm/esmf-6.3.0rp1/lib/libO/Linux.intel.64.openmpi.default") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDFROOT}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{PNETCDFROOT}") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -L/projects/ccsm/BLAS-intel -lblas_LINUX") diff --git a/build/cmake_macros/intel_stampede2-knl.cmake b/build/cmake_macros/intel_stampede2-knl.cmake deleted file mode 100644 index 6cdd9fe9c1..0000000000 --- a/build/cmake_macros/intel_stampede2-knl.cmake +++ /dev/null @@ -1,10 +0,0 @@ -string(APPEND CFLAGS " -xCOMMON-AVX512 -no-fma") -string(APPEND FFLAGS " -xCOMMON-AVX512 -no-fma") -if (MPILIB STREQUAL mpi-serial) - string(APPEND FFLAGS " -mcmodel medium") -endif() -string(APPEND LDFLAGS " -L$ENV{TACC_HDF5_LIB} -lhdf5 $(MKL) -zmuldefs -xCOMMON-AVX512") -execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) -string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -L$ENV{TACC_HDF5_LIB} -lhdf5") -set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") -set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_stampede2-skx.cmake b/build/cmake_macros/intel_stampede2-skx.cmake deleted file mode 100644 index 6cdd9fe9c1..0000000000 --- a/build/cmake_macros/intel_stampede2-skx.cmake +++ /dev/null @@ -1,10 +0,0 @@ -string(APPEND CFLAGS " -xCOMMON-AVX512 -no-fma") -string(APPEND FFLAGS " -xCOMMON-AVX512 -no-fma") -if (MPILIB STREQUAL mpi-serial) - string(APPEND FFLAGS " -mcmodel medium") -endif() -string(APPEND LDFLAGS " -L$ENV{TACC_HDF5_LIB} -lhdf5 $(MKL) -zmuldefs -xCOMMON-AVX512") -execute_process(COMMAND ${NETCDF_PATH}/bin/nf-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) -string(APPEND SLIBS " ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0} -L$ENV{TACC_HDF5_LIB} -lhdf5") -set(TRILINOS_PATH "$ENV{TRILINOS_PATH}") -set(HAS_F2008_CONTIGUOUS "FALSE") diff --git a/build/cmake_macros/intel_theia.cmake b/build/cmake_macros/intel_theia.cmake deleted file mode 100644 index 6a09fe8c2c..0000000000 --- a/build/cmake_macros/intel_theia.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set(MPICC "mpiicc") -set(MPICXX "mpiicpc") -set(MPIFC "mpiifort") -set(NETCDF_PATH "/apps/netcdf/4.3.0-intel") diff --git a/build/cmake_macros/intel_zeus.cmake b/build/cmake_macros/intel_zeus.cmake deleted file mode 100644 index 281ae04b18..0000000000 --- a/build/cmake_macros/intel_zeus.cmake +++ /dev/null @@ -1,18 +0,0 @@ -set(AR "xiar") -set(ARFLAGS "cru") -if (MPILIB STREQUAL mpi-serial) - string(APPEND FFLAGS " -mcmodel medium") - string(APPEND FFLAGS " -mkl -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") - string(APPEND CFLAGS " -mkl -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") - string(APPEND LDFLAGS " -mkl -lstdc++") - string(APPEND SLIBS " -lstdc++") -endif() -if (MPILIB STREQUAL impi) - string(APPEND FFLAGS " -mkl=cluster -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") - string(APPEND CFLAGS " -mkl=cluster -xSKYLAKE-AVX512 -qopt-zmm-usage=high -no-fma") - string(APPEND LDFLAGS " -mkl=cluster") - string(APPEND SLIBS " -lstdc++") -endif() -set(MPICC "mpiicc") -set(MPICXX "mpiicpc") -set(MPIFC "mpiifort") diff --git a/build/cmake_macros/izumi.cmake b/build/cmake_macros/izumi.cmake deleted file mode 100644 index 8894b6a383..0000000000 --- a/build/cmake_macros/izumi.cmake +++ /dev/null @@ -1,9 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(LAPACK_LIBDIR "/usr/lib64") -if (MPILIB STREQUAL mvapich2) - set(MPI_LIB_NAME "mpich") -endif() -set(NETCDF_PATH "$ENV{NETCDF_PATH}") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/laramie.cmake b/build/cmake_macros/laramie.cmake deleted file mode 100644 index 35c2d3c33e..0000000000 --- a/build/cmake_macros/laramie.cmake +++ /dev/null @@ -1,6 +0,0 @@ -if (COMP_NAME STREQUAL gptl) - string(APPEND CPPDEFS " -DHAVE_NANOTIME -DBIT64 -DHAVE_VPRINTF -DHAVE_BACKTRACE -DHAVE_SLASHPROC -DHAVE_COMM_F2C -DHAVE_TIMES -DHAVE_GETTIMEOFDAY") -endif() -set(NETCDF_PATH "$ENV{NETCDF}") -set(PIO_FILESYSTEM_HINTS "gpfs") -set(PNETCDF_PATH "$ENV{PNETCDF}") diff --git a/build/cmake_macros/lonestar5.cmake b/build/cmake_macros/lonestar5.cmake deleted file mode 100644 index 0c5eec8054..0000000000 --- a/build/cmake_macros/lonestar5.cmake +++ /dev/null @@ -1,6 +0,0 @@ -string(APPEND CPPDEFS " -DHAVE_NANOTIME") -set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") -string(APPEND LDFLAGS " -Wl,-rpath,${NETCDF_PATH}/lib") -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdff -lnetcdf") diff --git a/build/cmake_macros/nag.cmake b/build/cmake_macros/nag.cmake deleted file mode 100644 index 6a2d97c87a..0000000000 --- a/build/cmake_macros/nag.cmake +++ /dev/null @@ -1,30 +0,0 @@ -string(APPEND CFLAGS " -std=gnu99") -if (DEBUG) - string(APPEND CFLAGS " -g") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_CRAY_POINTERS -DNO_SHR_VMATH -DCPRNAG -DNO_R16") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -Wp,-macro=no_com -convert=BIG_ENDIAN ") -string(APPEND FFLAGS "-indirect ${SRCROOT}/ccs_config/machines/nag_mpi_argument.txt") -if (NOT DEBUG) - string(APPEND FFLAGS " -ieee=full -O2") -endif() -if (DEBUG) - string(APPEND FFLAGS " -C=all -g -time -f2003 -ieee=stop") -endif() -if (DEBUG AND NOT compile_threaded) - string(APPEND FFLAGS " -gline") -endif() -if (COMP_NAME STREQUAL cism) - string(APPEND FFLAGS " -mismatch_all") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-fixed") -set(FREEFLAGS "-free") -set(HAS_F2008_CONTIGUOUS "FALSE") -set(MPICC "mpicc") -set(MPIFC "mpif90") -set(SCC "gcc") -set(SFC "nagfor") -string(APPEND LDFLAGS " -lpthread") -string(APPEND CONFIG_ARGS " FCLIBS='-Wl,--as-needed,--allow-shlib-undefined -L$(COMPILER_PATH)/lib/NAG_Fortran -lf62rts'") diff --git a/build/cmake_macros/nvhpc-gpu.cmake b/build/cmake_macros/nvhpc-gpu.cmake deleted file mode 100644 index 679e81b2f4..0000000000 --- a/build/cmake_macros/nvhpc-gpu.cmake +++ /dev/null @@ -1,46 +0,0 @@ -string(APPEND CFLAGS " -gopt -time") -if (compile_threaded) - string(APPEND CFLAGS " -mp") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") -set(CXX_LINKER "CXX") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") -if (compile_threaded) - string(APPEND FFLAGS " -mp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") -endif() -if (COMP_NAME STREQUAL datm) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dlnd) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL drof) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dwav) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dice) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL docn) - string(APPEND FFLAGS " -Mnovect") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-Mfixed") -set(FREEFLAGS "-Mfree") -set(HAS_F2008_CONTIGUOUS "FALSE") -set(LDFLAGS "-time -Wl,--allow-multiple-definition") -if (compile_threaded) - string(APPEND LDFLAGS " -mp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "nvc") -set(SCXX "nvc++") -set(SFC "nvfortran") diff --git a/build/cmake_macros/nvhpc-gpu_casper.cmake b/build/cmake_macros/nvhpc-gpu_casper.cmake deleted file mode 100644 index ed2adbc6c9..0000000000 --- a/build/cmake_macros/nvhpc-gpu_casper.cmake +++ /dev/null @@ -1,15 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O -tp=skylake -Mnofma") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") -if (NOT DEBUG) - string(APPEND LDFLAGS " -O -tp=skylake -Mnofma -acc -gpu=cc70,lineinfo,nofma -Minfo=accel") -endif() -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/nvhpc.cmake b/build/cmake_macros/nvhpc.cmake deleted file mode 100644 index 3e1b451624..0000000000 --- a/build/cmake_macros/nvhpc.cmake +++ /dev/null @@ -1,51 +0,0 @@ -string(APPEND CFLAGS " -gopt -time") -if (compile_threaded) - string(APPEND CFLAGS " -mp") -endif() -if (NOT DEBUG) - string(APPEND CFLAGS " -O ") - string(APPEND FFLAGS " -O -Mnofma") -endif() - -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") -set(CXX_LINKER "CXX") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") -if (compile_threaded) - string(APPEND FFLAGS " -mp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") -endif() -if (COMP_NAME STREQUAL datm) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dlnd) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL drof) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dwav) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dice) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL docn) - string(APPEND FFLAGS " -Mnovect") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-Mfixed") -set(FREEFLAGS "-Mfree") -set(HAS_F2008_CONTIGUOUS "FALSE") -set(LDFLAGS "-time -Wl,--allow-multiple-definition") -if (compile_threaded) - string(APPEND LDFLAGS " -mp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "nvc") -set(SCXX "nvc++") -set(SFC "nvfortran") diff --git a/build/cmake_macros/nvhpc_casper.cmake b/build/cmake_macros/nvhpc_casper.cmake deleted file mode 100644 index f3eb207d1e..0000000000 --- a/build/cmake_macros/nvhpc_casper.cmake +++ /dev/null @@ -1,15 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O -tp=skylake -Mnofma") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") -if (NOT DEBUG) - string(APPEND LDFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/nvhpc_cheyenne.cmake b/build/cmake_macros/nvhpc_cheyenne.cmake deleted file mode 100644 index e3769dd9d7..0000000000 --- a/build/cmake_macros/nvhpc_cheyenne.cmake +++ /dev/null @@ -1,4 +0,0 @@ -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() diff --git a/build/cmake_macros/nvhpc_gust.cmake b/build/cmake_macros/nvhpc_gust.cmake deleted file mode 100644 index 461137315d..0000000000 --- a/build/cmake_macros/nvhpc_gust.cmake +++ /dev/null @@ -1,3 +0,0 @@ -if (NOT DEBUG) - string(APPEND FFLAGS " -target=zen3") -endif() diff --git a/build/cmake_macros/oneapi.cmake b/build/cmake_macros/oneapi.cmake deleted file mode 100644 index 7328c85e30..0000000000 --- a/build/cmake_macros/oneapi.cmake +++ /dev/null @@ -1,61 +0,0 @@ -string(APPEND CFLAGS " -qno-opt-dynamic-align -fp-model precise -std=gnu99") -if (compile_threaded) - string(APPEND CFLAGS " -qopenmp") -endif() -if (NOT DEBUG) - string(APPEND CFLAGS " -O2 -debug minimal") -endif() -if (DEBUG) - string(APPEND CFLAGS " -O0 -g") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DCPRINTEL") -string(APPEND CXX_LDFLAGS " -cxxlib") -set(CXX_LINKER "FORTRAN") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -qno-opt-dynamic-align -convert big_endian -assume byterecl -ftz -traceback -assume realloc_lhs -fp-model source") -if (compile_threaded) - string(APPEND FFLAGS " -qopenmp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -check uninit -check bounds -check pointers -fpe0 -check noarg_temp_created") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2 -debug minimal") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-fixed") -set(FREEFLAGS "-free") -if (compile_threaded) - string(APPEND LDFLAGS " -qopenmp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "icc") -set(SCXX "icpc") -set(SFC "ifort") -if (MPILIB STREQUAL mpich) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpich2) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mvapich) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mvapich2) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpt) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL openmpi) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL impi) - string(APPEND SLIBS " -mkl=cluster") -endif() -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -mkl") -endif() -set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi-gpu.cmake b/build/cmake_macros/pgi-gpu.cmake deleted file mode 100644 index 856574795e..0000000000 --- a/build/cmake_macros/pgi-gpu.cmake +++ /dev/null @@ -1,46 +0,0 @@ -string(APPEND CFLAGS " -gopt -time") -if (compile_threaded) - string(APPEND CFLAGS " -mp") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") -set(CXX_LINKER "CXX") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") -if (compile_threaded) - string(APPEND FFLAGS " -mp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") -endif() -if (COMP_NAME STREQUAL datm) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dlnd) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL drof) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dwav) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dice) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL docn) - string(APPEND FFLAGS " -Mnovect") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-Mfixed") -set(FREEFLAGS "-Mfree") -set(HAS_F2008_CONTIGUOUS "FALSE") -set(LDFLAGS "-time -Wl,--allow-multiple-definition") -if (compile_threaded) - string(APPEND LDFLAGS " -mp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "pgcc") -set(SCXX "pgc++") -set(SFC "pgf95") diff --git a/build/cmake_macros/pgi-gpu_casper.cmake b/build/cmake_macros/pgi-gpu_casper.cmake deleted file mode 100644 index 600521a1bb..0000000000 --- a/build/cmake_macros/pgi-gpu_casper.cmake +++ /dev/null @@ -1,15 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O -tp=skylake -Mnofma") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") -if (NOT DEBUG) - string(APPEND LDFLAGS " -O -tp=skylake -Mnofma -acc -ta=tesla:cc70,lineinfo,nofma -Minfo=accel") -endif() -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/pgi.cmake b/build/cmake_macros/pgi.cmake deleted file mode 100644 index 856574795e..0000000000 --- a/build/cmake_macros/pgi.cmake +++ /dev/null @@ -1,46 +0,0 @@ -string(APPEND CFLAGS " -gopt -time") -if (compile_threaded) - string(APPEND CFLAGS " -mp") -endif() -string(APPEND CPPDEFS " -DFORTRANUNDERSCORE -DNO_SHR_VMATH -DNO_R16 -DCPRPGI") -set(CXX_LINKER "CXX") -set(FC_AUTO_R8 "-r8") -string(APPEND FFLAGS " -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee") -if (compile_threaded) - string(APPEND FFLAGS " -mp") -endif() -if (DEBUG) - string(APPEND FFLAGS " -O0 -g -Ktrap=fp -Mbounds -Kieee") -endif() -if (COMP_NAME STREQUAL datm) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dlnd) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL drof) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dwav) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL dice) - string(APPEND FFLAGS " -Mnovect") -endif() -if (COMP_NAME STREQUAL docn) - string(APPEND FFLAGS " -Mnovect") -endif() -set(FFLAGS_NOOPT "-O0") -set(FIXEDFLAGS "-Mfixed") -set(FREEFLAGS "-Mfree") -set(HAS_F2008_CONTIGUOUS "FALSE") -set(LDFLAGS "-time -Wl,--allow-multiple-definition") -if (compile_threaded) - string(APPEND LDFLAGS " -mp") -endif() -set(MPICC "mpicc") -set(MPICXX "mpicxx") -set(MPIFC "mpif90") -set(SCC "pgcc") -set(SCXX "pgc++") -set(SFC "pgf95") diff --git a/build/cmake_macros/pgi_bluewaters.cmake b/build/cmake_macros/pgi_bluewaters.cmake deleted file mode 100644 index ff5f160388..0000000000 --- a/build/cmake_macros/pgi_bluewaters.cmake +++ /dev/null @@ -1,10 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -string(APPEND CFLAGS " -nofma") -set(CXX_LIBS "-lmpichf90_pgi $ENV{PGI_PATH}/linux86-64/$ENV{PGI_VERSION}/lib/f90main.o") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -string(APPEND FFLAGS " -nofma") -set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi_casper.cmake b/build/cmake_macros/pgi_casper.cmake deleted file mode 100644 index f3eb207d1e..0000000000 --- a/build/cmake_macros/pgi_casper.cmake +++ /dev/null @@ -1,15 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O -tp=skylake -Mnofma") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND FFLAGS " -I$(EXEROOT)/ocn/obj/FMS") -if (NOT DEBUG) - string(APPEND LDFLAGS " -O -tp=skylake -Mnofma") -endif() -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() -string(APPEND SLIBS " -L${NETCDF_PATH}/lib -lnetcdf -lnetcdff") diff --git a/build/cmake_macros/pgi_cheyenne.cmake b/build/cmake_macros/pgi_cheyenne.cmake deleted file mode 100644 index e3769dd9d7..0000000000 --- a/build/cmake_macros/pgi_cheyenne.cmake +++ /dev/null @@ -1,4 +0,0 @@ -string(APPEND SLIBS " -llapack -lblas") -if (MPILIB STREQUAL mpi-serial) - string(APPEND SLIBS " -ldl") -endif() diff --git a/build/cmake_macros/pgi_constance.cmake b/build/cmake_macros/pgi_constance.cmake deleted file mode 100644 index 1a1dcf69b3..0000000000 --- a/build/cmake_macros/pgi_constance.cmake +++ /dev/null @@ -1,11 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -string(APPEND CPPDEFS " -DLINUX") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDF_HOME}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pgi_daint.cmake b/build/cmake_macros/pgi_daint.cmake deleted file mode 100644 index 9c9661883e..0000000000 --- a/build/cmake_macros/pgi_daint.cmake +++ /dev/null @@ -1,3 +0,0 @@ -string(APPEND FFLAGS " -I/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/build/lib/mct -I/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/build/lib/psmile.MPI1") -string(APPEND SLIBS " -llapack -lblas") -string(APPEND SLIBS " -L/project/s824/edavin/OASIS3-MCT_2.0/build.pgi/lib -lpsmile.MPI1 -lscrip -lmct_oasis -lmpeu_oasis") diff --git a/build/cmake_macros/pgi_eastwind.cmake b/build/cmake_macros/pgi_eastwind.cmake deleted file mode 100644 index 6384e42c21..0000000000 --- a/build/cmake_macros/pgi_eastwind.cmake +++ /dev/null @@ -1,20 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -if (NOT compile_threaded) - string(APPEND CFLAGS " -nomp") -endif() -set(CONFIG_ARGS "--host=cray") -string(APPEND CPPDEFS " -DLINUX") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -if (NOT compile_threaded) - string(APPEND FFLAGS " -nomp") -endif() -if (NOT compile_threaded) - string(APPEND LDFLAGS " -nomp") -endif() -set(NETCDF_PATH "$ENV{NETCDF_HOME}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pgi_euler2.cmake b/build/cmake_macros/pgi_euler2.cmake deleted file mode 100644 index be865e50f9..0000000000 --- a/build/cmake_macros/pgi_euler2.cmake +++ /dev/null @@ -1,6 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() diff --git a/build/cmake_macros/pgi_euler3.cmake b/build/cmake_macros/pgi_euler3.cmake deleted file mode 100644 index be865e50f9..0000000000 --- a/build/cmake_macros/pgi_euler3.cmake +++ /dev/null @@ -1,6 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() diff --git a/build/cmake_macros/pgi_euler4.cmake b/build/cmake_macros/pgi_euler4.cmake deleted file mode 100644 index be865e50f9..0000000000 --- a/build/cmake_macros/pgi_euler4.cmake +++ /dev/null @@ -1,6 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() diff --git a/build/cmake_macros/pgi_hobart.cmake b/build/cmake_macros/pgi_hobart.cmake deleted file mode 100644 index d3daece90a..0000000000 --- a/build/cmake_macros/pgi_hobart.cmake +++ /dev/null @@ -1,10 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O0") -endif() -if (NOT DEBUG) - string(APPEND FFLAGS " -O0") -endif() -string(APPEND LDFLAGS " -lgomp") -string(APPEND LDFLAGS " -Wl,-R${NETCDF_PATH}/lib") -string(APPEND LDFLAGS " -Wl,-R$ENV{COMPILER_PATH}/lib") -string(APPEND LDFLAGS " -Wl,-R$ENV{COMPILER_PATH}/libso") diff --git a/build/cmake_macros/pgi_izumi.cmake b/build/cmake_macros/pgi_izumi.cmake deleted file mode 100644 index 3cb6b34e86..0000000000 --- a/build/cmake_macros/pgi_izumi.cmake +++ /dev/null @@ -1,2 +0,0 @@ -set(CXX_LINKER "FORTRAN") -set(SUPPORTS_CXX "TRUE") diff --git a/build/cmake_macros/pgi_olympus.cmake b/build/cmake_macros/pgi_olympus.cmake deleted file mode 100644 index 1ee0816812..0000000000 --- a/build/cmake_macros/pgi_olympus.cmake +++ /dev/null @@ -1,11 +0,0 @@ -if (NOT DEBUG) - string(APPEND CFLAGS " -O2") -endif() -set(CONFIG_ARGS "--host=cray") -string(APPEND CPPDEFS " -DLINUX") -if (NOT DEBUG) - string(APPEND FFLAGS " -O2") -endif() -set(NETCDF_PATH "$ENV{NETCDF_LIB}/..") -set(PIO_FILESYSTEM_HINTS "lustre") -set(SLIBS "-L${NETCDF_PATH}/lib -lnetcdf -lnetcdff -lpmi") diff --git a/build/cmake_macros/pleiades-bro.cmake b/build/cmake_macros/pleiades-bro.cmake deleted file mode 100644 index f3e3bf82dd..0000000000 --- a/build/cmake_macros/pleiades-bro.cmake +++ /dev/null @@ -1,6 +0,0 @@ -string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -set(MPICC "icc") -set(MPI_PATH "$ENV{MPI_ROOT}") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-has.cmake b/build/cmake_macros/pleiades-has.cmake deleted file mode 100644 index f3e3bf82dd..0000000000 --- a/build/cmake_macros/pleiades-has.cmake +++ /dev/null @@ -1,6 +0,0 @@ -string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -set(MPICC "icc") -set(MPI_PATH "$ENV{MPI_ROOT}") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-ivy.cmake b/build/cmake_macros/pleiades-ivy.cmake deleted file mode 100644 index f3e3bf82dd..0000000000 --- a/build/cmake_macros/pleiades-ivy.cmake +++ /dev/null @@ -1,6 +0,0 @@ -string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -set(MPICC "icc") -set(MPI_PATH "$ENV{MPI_ROOT}") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/pleiades-san.cmake b/build/cmake_macros/pleiades-san.cmake deleted file mode 100644 index f3e3bf82dd..0000000000 --- a/build/cmake_macros/pleiades-san.cmake +++ /dev/null @@ -1,6 +0,0 @@ -string(APPEND CFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -string(APPEND FFLAGS " -axCORE-AVX2 -xSSE4.2 -no-fma") -set(MPICC "icc") -set(MPI_PATH "$ENV{MPI_ROOT}") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PNETCDF_PATH "/home6/fvitt/pnetcdf/pnetcdf-1.12.2") diff --git a/build/cmake_macros/stampede2-knl.cmake b/build/cmake_macros/stampede2-knl.cmake deleted file mode 100644 index ed1c0d299b..0000000000 --- a/build/cmake_macros/stampede2-knl.cmake +++ /dev/null @@ -1,4 +0,0 @@ -string(APPEND CPPDEFS " -DHAVE_NANOTIME") -set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") diff --git a/build/cmake_macros/stampede2-skx.cmake b/build/cmake_macros/stampede2-skx.cmake deleted file mode 100644 index ed1c0d299b..0000000000 --- a/build/cmake_macros/stampede2-skx.cmake +++ /dev/null @@ -1,4 +0,0 @@ -string(APPEND CPPDEFS " -DHAVE_NANOTIME") -set(NETCDF_PATH "$ENV{TACC_NETCDF_DIR}") -set(PIO_FILESYSTEM_HINTS "lustre") -set(PNETCDF_PATH "$ENV{TACC_PNETCDF_DIR}") diff --git a/build/cmake_macros/theta.cmake b/build/cmake_macros/theta.cmake deleted file mode 100644 index 81db81ed2c..0000000000 --- a/build/cmake_macros/theta.cmake +++ /dev/null @@ -1,4 +0,0 @@ -string(APPEND CFLAGS " -xMIC-AVX512") -string(APPEND FFLAGS " -xMIC-AVX512") -set(CONFIG_ARGS "--host=cray") -string(APPEND SLIBS " -L$(NETCDF_DIR)/lib -lnetcdff -L$(NETCDF_DIR)/lib -lnetcdf -Wl,-rpath -Wl,$(NETCDF_DIR)/lib") diff --git a/build/cmake_macros/universal.cmake b/build/cmake_macros/universal.cmake deleted file mode 100644 index a1acb1ac17..0000000000 --- a/build/cmake_macros/universal.cmake +++ /dev/null @@ -1,18 +0,0 @@ -string(APPEND CPPDEFS " -DCESMCOUPLED") -if (COMP_NAME STREQUAL pop) - string(APPEND CPPDEFS " -D_USE_FLOW_CONTROL") -endif() -if (COMP_NAME STREQUAL ufsatm) - string(APPEND CPPDEFS " -DSPMD") -endif() -if (COMP_NAME STREQUAL ufsatm) - string(APPEND INCLDIR " -I$(EXEROOT)/atm/obj/FMS") -endif() -if (COMP_NAME STREQUAL ufsatm) - string(APPEND FFLAGS " $(FC_AUTO_R8)") -endif() -if (COMP_NAME STREQUAL mom) - string(APPEND FFLAGS " $(FC_AUTO_R8) ") - string(APPEND CPPDEFS " -Duse_LARGEFILE") -endif() -set(SUPPORTS_CXX "FALSE") diff --git a/build/cmake_macros/userdefined.cmake b/build/cmake_macros/userdefined.cmake deleted file mode 100644 index 798dcc9714..0000000000 --- a/build/cmake_macros/userdefined.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(CONFIG_ARGS "") -string(APPEND CPPDEFS " ") -set(ESMF_LIBDIR "") -set(MPI_LIB_NAME "") -set(MPI_PATH "") -set(NETCDF_PATH "USERDEFINED_MUST_EDIT_THIS") -set(PNETCDF_PATH "") -execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs OUTPUT_VARIABLE SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0 OUTPUT_STRIP_TRAILING_WHITESPACE) -string(APPEND SLIBS " # USERDEFINED ${SHELL_CMD_OUTPUT_BUILD_INTERNAL_IGNORE0}") diff --git a/build/cmake_macros/zeus.cmake b/build/cmake_macros/zeus.cmake deleted file mode 100644 index 8c24e3dc9b..0000000000 --- a/build/cmake_macros/zeus.cmake +++ /dev/null @@ -1,8 +0,0 @@ -set(PIO_FILESYSTEM_HINTS "gpfs") -set(NETCDF_PATH "$ENV{NETCDF}") -set(PNETCDF_PATH "$ENV{PNETCDF}") -string(APPEND CPPDEFS " -DNO_R16 -DHAVE_NANOTIME") -if (COMP_NAME STREQUAL nemo) - string(APPEND FFLAGS " $(FC_AUTO_R8) -O3 -assume norealloc_lhs") -endif() -execute_process(COMMAND ${NETCDF_PATH}/bin/nc-config --flibs) diff --git a/build/env_mach_specific.xml b/build/env_mach_specific.xml deleted file mode 100644 index dc1c9f88e9..0000000000 --- a/build/env_mach_specific.xml +++ /dev/null @@ -1,32 +0,0 @@ - - -
- These variables control the machine dependent environment including - the paths to compilers and libraries external to cime such as netcdf, - environment variables for use in the running job should also be set here. -
- - - char - executable name - - - char - redirect for job output - - - - - /Users/afoster/esmf/esmf-8.4.0/lib/libg/Darwin.gfortranclang.64.openmpi.default/esmf.mk - - - mpirun - - -np $TOTALPES - --tag-output - - - - - -
From 5dd504fbeaaf59ffc51d3321f17d2758fd78c271 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Apr 2023 22:40:45 -0600 Subject: [PATCH 044/125] updates to add more modules --- CMakeLists.txt | 49 ++- main/CMakeLists.txt | 12 +- main/EDPftvarcon.F90 | 1 - parteh/CMakeLists.txt | 6 + unit_testing/radiation_test/CMakeLists.txt | 29 ++ unit_testing/radiation_test/FATES_rad_test | Bin 0 -> 73392 bytes .../radiation_test/FatesUnitTestRadiation.F90 | 235 +++++++++++++ unit_testing/radiation_test/log.txt | 1 + .../{test => }/radiation_test/radiation_nl | 1 - unit_testing/run_FATES_tests.py | 35 ++ unit_testing/test/CMakeLists.txt | 1 - .../test/radiation_test/CMakeLists.txt | 40 --- .../radiation_test/FatesUnitTestRadiation.F90 | 122 ------- unit_testing/utils/FatesUnitTestIOMod.F90 | 321 +++++++----------- 14 files changed, 464 insertions(+), 389 deletions(-) create mode 100644 parteh/CMakeLists.txt create mode 100644 unit_testing/radiation_test/CMakeLists.txt create mode 100755 unit_testing/radiation_test/FATES_rad_test create mode 100644 unit_testing/radiation_test/FatesUnitTestRadiation.F90 create mode 100644 unit_testing/radiation_test/log.txt rename unit_testing/{test => }/radiation_test/radiation_nl (96%) create mode 100644 unit_testing/run_FATES_tests.py delete mode 100644 unit_testing/test/CMakeLists.txt delete mode 100644 unit_testing/test/radiation_test/CMakeLists.txt delete mode 100644 unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 213a44115a..6a640e8bb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,42 +1,39 @@ cmake_minimum_required(VERSION 3.4) -project(radiation_tests Fortran C) +list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) +include(CIME_initial_setup) + +project(FATES_tests Fortran C) enable_language(Fortran) -list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) -include(CIME_initial_setup) include(CIME_utils) set(CLM_ROOT "../../") -add_subdirectory(${CLM_ROOT}/src/fates/main) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/test) -set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") -set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") -MESSAGE(">> CISM_NETCDF_C_DIR set to : ${NETCDF_C_DIR}") -MESSAGE(">> CISM_NETCDF_FORTRAN_DIR set to : ${NETCDF_FORTRAN_DIR}") +# Add source directories from other share code (csm_share, etc.) +add_subdirectory(${CLM_ROOT}/share/src csm_share) -FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) -FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) -MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") -MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") +# Add FATES source directories +add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) +add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils fates_test_utils) -IF (${NETCDFC_FOUND} STREQUAL ${NETCDF_C_DIR}/lib ) - SET(NETCDF_C_LIBS "netcdff;netcdf" CACHE STRING "Netcdf Library Names(s)") -ELSE() - SET(NETCDF_C_LIBS "netcdf" CACHE STRING "Netcdf Library Names(s)") -ENDIF() -MESSAGE(">> NETCDF_LIBS Library(s) set to : ${NETCDF_C_LIBS}") +# Build libraries containing stuff needed for the unit tests. +# Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. +add_library(csm_share ${share_sources}) +declare_generated_dependencies(csm_share "${share_genf90_sources}") +add_library(fates ${fates_sources}) +add_library(utils ${utils_sources}) +add_dependencies(fates csm_share) -include_directories(${NETCDF_C_DIR}/include - ${NETCDF_FORTRAN_DIR}/include) -link_directories(${NETCDF_C_DIR}/lib - ${NETCDF_FORTRAN_DIR}/lib) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) -add_library(utils ${utils_sources}) +# We need to look for header files here, in order to pick up shr_assert.h +include_directories(${CLM_ROOT}/share/include) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -link_directories(${CMAKE_CURRENT_BINARY_DIR}) \ No newline at end of file +link_directories(${CMAKE_CURRENT_BINARY_DIR}) + +# Add the test directories diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 2d7863eb91..8c65b32513 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -11,8 +11,14 @@ list(APPEND clm_sources FatesUtilsMod.F90 ) -list(APPEND utils_sources - FatesConstantsMod.F90) +list(APPEND fates_sources + FatesConstantsMod.F90 + EDPftvarcon.F90 + EDParamsMod.F90 + FatesGlobals.F90 + FatesInterfaceTypesMod.F90 + FatesParametersInterface.F90 + ) sourcelist_to_parent(clm_sources) -sourcelist_to_parent(utils_sources) +sourcelist_to_parent(fates_sources) diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90 index ad6c87c38c..2b7eda73e2 100644 --- a/main/EDPftvarcon.F90 +++ b/main/EDPftvarcon.F90 @@ -7,7 +7,6 @@ module EDPftvarcon ! ! !USES: use EDParamsMod , only : maxSWb, ivis, inir - use EDParamsMod , only : n_uptake_mode, p_uptake_mode use FatesConstantsMod, only : r8 => fates_r8 use FatesConstantsMod, only : nearzero use FatesConstantsMod, only : itrue, ifalse diff --git a/parteh/CMakeLists.txt b/parteh/CMakeLists.txt new file mode 100644 index 0000000000..218608e794 --- /dev/null +++ b/parteh/CMakeLists.txt @@ -0,0 +1,6 @@ +list(APPEND fates_sources + PRTGenericMod.F90 + PRTParametersMod.F90 + ) + + sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/unit_testing/radiation_test/CMakeLists.txt b/unit_testing/radiation_test/CMakeLists.txt new file mode 100644 index 0000000000..2d72ae6b9b --- /dev/null +++ b/unit_testing/radiation_test/CMakeLists.txt @@ -0,0 +1,29 @@ +# Local files +set(rad_sources FatesUnitTestRadiation.F90) + +set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") +set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") + +FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) +FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) +MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") +MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") + +include_directories(${NETCDF_C_DIR}/include + ${NETCDF_FORTRAN_DIR}/include) +link_directories(${NETCDF_C_DIR}/lib + ${NETCDF_FORTRAN_DIR}/lib) + +add_executable(FATES_rad_test ${rad_sources}) + +target_link_libraries(FATES_rad_test + netcdff + netcdf + fates + utils + csm_share) + +add_test(rad_test FATES_rad_test) + +# Tell CTest how to figure out that "STOP 1" fails for the current +define_Fortran_stop_failure(rad_test) diff --git a/unit_testing/radiation_test/FATES_rad_test b/unit_testing/radiation_test/FATES_rad_test new file mode 100755 index 0000000000000000000000000000000000000000..bdc660e5b40c7d5c2c876a13bd76bc77e79a2bee GIT binary patch literal 73392 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 fates_r8 + use EDPftvarcon, only : EDPftvarcon_type + !use EDParamsMod, only : nlevleaf, nclmax + + implicit none + + ! LOCALS: + character(len=MAX_PATH) :: param_file ! parameter file name + character(len=MAX_PATH) :: patch_file ! patch data file name + character(len=MAX_PATH) :: out_file ! output file name + integer :: year, jday ! year and day of year to simulate + real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] + real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] + real(r8), allocatable :: rhol(:,:) ! leaf reflectance [0-1] + real(r8), allocatable :: rhos(:,:) ! stem reflectance [0-1] + real(r8), allocatable :: taul(:,:) ! leaf transmittance [0-1] + real(r8), allocatable :: taus(:,:) ! stem transmittance [0-1] + real(r8), allocatable :: xl(:) ! leaf orientation index + real(r8), allocatable :: ci(:) ! clumping index + + ! PARAMETERS + integer, parameter :: numSWb = 2 ! number of shortwave bands to simulate + + interface + + subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, & + param_file, patch_file, out_file) + + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file + use FatesConstantsMod, only : r8 => fates_r8 + + implicit none + + character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file + integer, intent(out) :: year, jday + real(r8), intent(out) :: lat, lon + real(r8), intent(out) :: fcansno + + end subroutine read_radiation_namelist + + subroutine read_radiation_params(file, numSWb, rhol, rhos, taul, taus, xl, & + ci) + + use FatesUnitTestIOMod, only : MAX_PATH, check, read_in_parameter + use FatesConstantsMod, only : r8 => fates_r8 + use netcdf + + implicit none + + character(len=MAX_PATH), intent(in) :: file + integer, intent(in) :: numSWb + real(r8), allocatable, intent(out) :: rhol(:,:) + real(r8), allocatable, intent(out) :: rhos(:,:) + real(r8), allocatable, intent(out) :: taul(:,:) + real(r8), allocatable, intent(out) :: taus(:,:) + real(r8), allocatable, intent(out) :: xl(:) + real(r8), allocatable, intent(out) :: ci(:) + + end subroutine read_radiation_params + + end interface + + call read_radiation_namelist(year, jday, lat, lon, fcansno, & + param_file, patch_file, out_file) + + ! open log file + logf = open_file("log.txt") + + ! read in FATES parameter file + call read_radiation_params(param_file, numSWb, rhol, rhos, taul, taus, xl, ci) + + ! read in patch data + call read_patch_data(patch_file, canopy_area_profile, elai_profile, & + esai_profile, nrad_r) + + ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) + + ! cosz(:) = 0.0 + ! k_dir(:,:) = 0.0 + + ! ! for each half-hourly time step in the day + ! do i = 0, 47 + ! calday = jday + i*0.02083333_SHR_KIND_R8 + ! call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) + ! cosz(i) = shr_orb_cosz(calday, lat, lon, declin) + + ! if (cosz(i) > 0.0_r8) then + ! ! call norman radiation scheme + ! call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & + ! canopy_area_profile, elai_profile, esai_profile, fcansno, & + ! cosz(i), nrad, 2, k_dir(:,i)) + ! end if + ! end do + + ! call write_radiation_data(out_file, k_dir, cosz) + + close(logf) + +end program FatesUnitTestRadiation + +!:.............................................................................: + +subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & + patch_file, out_file) + ! + ! DESCRIPTION: + ! read in the namelist associated with the radiation unit tests and + ! initialize values + ! + + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file + use FatesConstantsMod, only : r8 => fates_r8 + + implicit none + + ! ARGUMENTS: + character(len=MAX_PATH), intent(out) :: param_file ! parameter file name + character(len=MAX_PATH), intent(out) :: patch_file ! patch data file name + character(len=MAX_PATH), intent(out) :: out_file ! output file name + integer, intent(out) :: year, jday ! year and day of year + real(r8), intent(out) :: lat, lon ! latitude and longitude [degrees] + real(r8), intent(out) :: fcansno ! fraction of canopy covered by snow [0-1] + + ! LOCALS: + character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name + character(len=MAX_CHAR) :: message ! Error message + character(len=MAX_CHAR) :: msg ! I/O Error message + integer :: rad_nl_file ! unit number for namelist + integer :: ios ! I/O status + + + ! Namelist of radiation parameters + namelist /radiation/ year, jday, lat, lon, fcansno, param_file, patch_file, & + out_file + + ! Now read parameters namelist + rad_nl_file = open_file(trim(rad_nl), 'r') + read(rad_nl_file, radiation, iostat=ios, iomsg=msg) + + if (ios /= 0) then + ! Problem reading file - tell user. + write(message, '(A, I6, A, A)') "Error reading radiation namelist file", & + ios, "IOMSG: ", msg + write(*,*) message + stop "Stopped" + end if + + close(rad_nl_file) + +end subroutine read_radiation_namelist + +!:.............................................................................: + +subroutine read_radiation_params(file, numSWb, rhol, rhos, taul, taus, xl, ci) + ! + ! DESCRIPTION: + ! read in the parameters we need for this test + ! + + use FatesUnitTestIOMod, only : MAX_PATH, check, read_in_parameter + use FatesConstantsMod, only : r8 => fates_r8 + use netcdf + + implicit none + + ! ARGUMENTS: + character(len=MAX_PATH), intent(in) :: file ! parameter file name + integer, intent(in) :: numSWb ! number of shortwave bands to simulate + real(r8), allocatable, intent(out) :: rhol(:,:) ! leaf reflectance [0-1] + real(r8), allocatable, intent(out) :: rhos(:,:) ! stem reflectance [0-1] + real(r8), allocatable, intent(out) :: taul(:,:) ! leaf transmittance [0-1] + real(r8), allocatable, intent(out) :: taus(:,:) ! stem transmittance [0-1] + real(r8), allocatable, intent(out) :: xl(:) ! leaf orientation index + real(r8), allocatable, intent(out) :: ci(:) ! clumping index + + ! LOCALS: + integer :: funit ! file unit number + real(r8), allocatable :: rholvis(:) ! leaf visible reflectance [0-1] + real(r8), allocatable :: rholnir(:) ! leaf NIR reflectance [0-1] + real(r8), allocatable :: rhosvis(:) ! stem visible reflectance [0-1] + real(r8), allocatable :: rhosnir(:) ! stem NIR reflectance [0-1] + real(r8), allocatable :: taulvis(:) ! leaf visible transmittance [0-1] + real(r8), allocatable :: taulnir(:) ! leaf NIR transmittance [0-1] + real(r8), allocatable :: tausvis(:) ! stem visible transmittance [0-1] + real(r8), allocatable :: tausnir(:) ! stem NIR transmittance [0-1] + + ! open file + call check(nf90_open(trim(file), 0, funit)) + + ! read in parameters + call read_in_parameter(funit, 'fates_rad_leaf_rhovis', 'fates_pft', rholvis) + call read_in_parameter(funit, 'fates_rad_leaf_rhonir', 'fates_pft', rholnir) + call read_in_parameter(funit, 'fates_rad_stem_rhovis', 'fates_pft', rhosvis) + call read_in_parameter(funit, 'fates_rad_stem_rhonir', 'fates_pft', rhosnir) + call read_in_parameter(funit, 'fates_rad_leaf_tauvis', 'fates_pft', taulvis) + call read_in_parameter(funit, 'fates_rad_leaf_taunir', 'fates_pft', taulnir) + call read_in_parameter(funit, 'fates_rad_stem_tauvis', 'fates_pft', tausvis) + call read_in_parameter(funit, 'fates_rad_stem_taunir', 'fates_pft', tausnir) + call read_in_parameter(funit, 'fates_rad_leaf_xl', 'fates_pft', xl) + call read_in_parameter(funit, 'fates_rad_leaf_clumping_index', 'fates_pft', & + ci) + + ! allocate the arrays correctly + allocate(rhol(size(rholvis, 1), numSWb)) + allocate(rhos(size(rhosvis, 1), numSWb)) + allocate(taul(size(taulvis, 1), numSWb)) + allocate(taus(size(tausvis, 1), numSWb)) + + ! put arrays together + rhol(:,1) = rholvis + rhol(:,2) = rholnir + rhos(:,1) = rhosvis + rhos(:,2) = rhosnir + taul(:,1) = taulvis + taul(:,2) = taulnir + taus(:,1) = tausvis + taus(:,2) = tausnir + + ! close file + call check(nf90_close(funit)) + +end subroutine read_radiation_params + + + diff --git a/unit_testing/radiation_test/log.txt b/unit_testing/radiation_test/log.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/unit_testing/radiation_test/log.txt @@ -0,0 +1 @@ + diff --git a/unit_testing/test/radiation_test/radiation_nl b/unit_testing/radiation_test/radiation_nl similarity index 96% rename from unit_testing/test/radiation_test/radiation_nl rename to unit_testing/radiation_test/radiation_nl index 9b33dbf6e3..3d0d608175 100644 --- a/unit_testing/test/radiation_test/radiation_nl +++ b/unit_testing/radiation_test/radiation_nl @@ -1,7 +1,6 @@ &radiation ! parameters for the radiation unit test ! see FatesUnitTestRadiation.F90 -numSWb = 2 year = 2000 jday = 165 lat = 45.0 diff --git a/unit_testing/run_FATES_tests.py b/unit_testing/run_FATES_tests.py new file mode 100644 index 0000000000..cd3d1206d3 --- /dev/null +++ b/unit_testing/run_FATES_tests.py @@ -0,0 +1,35 @@ +import os +import sys + +# +_CTSM_PYTHON = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "..", "..", "python") +) +sys.path.insert(1, _CTSM_PYTHON) + +from ctsm import add_cime_to_path +from CIME.utils import run_cmd_no_fail + +from shutil import rmtree, copy + +def main(): + os.chdir("..") + if os.path.isdir("build"): + rmtree("build") + + ## super hacky right now!! + run_command = ["../../cime/scripts/fortran_unit_testing/run_tests.py", + "--build-dir", "build"] + run_cmd_no_fail(" ".join(run_command), combine_output=True) + + copy("build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/FATES_rad_test", + "unit_testing/test/radiation_test/") + + os.chdir("unit_testing/test/radiation_test") + run_command = ["./FATES_rad_test"] + output = run_cmd_no_fail(" ".join(run_command), combine_output=True) + print(output) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/unit_testing/test/CMakeLists.txt b/unit_testing/test/CMakeLists.txt deleted file mode 100644 index 6b1f8471cf..0000000000 --- a/unit_testing/test/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(radiation_test) \ No newline at end of file diff --git a/unit_testing/test/radiation_test/CMakeLists.txt b/unit_testing/test/radiation_test/CMakeLists.txt deleted file mode 100644 index cd6f767d2b..0000000000 --- a/unit_testing/test/radiation_test/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -# Local files -set(test_sources FatesUnitTestRadiation.F90) - -#Add sources we need from other directories -set(sources_needed - FatesUnitTestIOMod.F90 - FatesUnitTestOrbitalMod.F90 - FatesConstantsMod.F90) - -extract_sources("${sources_needed}" "${utils_sources}" test_sources) - -set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") -set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") -MESSAGE(">> CISM_NETCDF_C_DIR set to : ${NETCDF_C_DIR}") -MESSAGE(">> CISM_NETCDF_FORTRAN_DIR set to : ${NETCDF_FORTRAN_DIR}") - -FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) -FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) -MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") -MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") - -IF (${NETCDFC_FOUND} STREQUAL ${NETCDF_C_DIR}/lib ) - SET(NETCDF_C_LIBS "netcdff;netcdf" CACHE STRING "Netcdf Library Names(s)") -ELSE() - SET(NETCDF_C_LIBS "netcdf" CACHE STRING "Netcdf Library Names(s)") -ENDIF() -MESSAGE(">> NETCDF_LIBS Library(s) set to : ${NETCDF_C_LIBS}") - - -include_directories(${NETCDF_C_DIR}/include - ${NETCDF_FORTRAN_DIR}/include) -link_directories(${NETCDF_C_DIR}/lib - ${NETCDF_FORTRAN_DIR}/lib) - -add_executable(FATES_rad_test ${test_sources}) - -add_test(rad_test FATES_rad_test) - -# Tell CTest how to figure out that "STOP 1" fails for the current -define_Fortran_stop_failure(rad_test) diff --git a/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 b/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 deleted file mode 100644 index 042f5e71e2..0000000000 --- a/unit_testing/test/radiation_test/FatesUnitTestRadiation.F90 +++ /dev/null @@ -1,122 +0,0 @@ -program FatesUnitTestRadiation - ! - ! DESCRIPTION: - ! Test the FATES radiation schemes - ! - - use FatesUnitTestIOMod, only : logf, MAX_PATH - use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 - use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz - use FatesUnitTestOrbitalMod, only : shr_orb_decl - !use EDParamsMod, only : nlevleaf, nclmax - - implicit none - - ! LOCALS: - character(len=MAX_PATH) :: param_file, patch_file, out_file ! file names - integer :: numSWb ! number of shortwave bands to simulate - integer :: year, jday ! year and day of year to simulate - real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] - real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] - - interface - - subroutine read_radiation_namelist(numSWb, year, jday, lat, lon, fcansno, & - param_file, patch_file, out_file) - - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file - - implicit none - - character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file - integer, intent(out) :: numSWb, year, jday - real(r8), intent(out) :: lat, lon - real(r8), intent(out) :: fcansno - - end subroutine read_radiation_namelist - - end interface - - call read_radiation_namelist(numSWB, year, jday, lat, lon, fcansno, & - param_file, patch_file, out_file) - - ! open log file - logf = open_file("log.txt") - - ! get patch and parameter values, as well as orbital parameters - !call get_parameters(param_file, rhol, rhos, taul, taus, xl, clumping_index) - - ! call read_patch_data(patch_file, canopy_area_profile, elai_profile, & - ! esai_profile, nrad_r) - ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) - - ! cosz(:) = 0.0 - ! k_dir(:,:) = 0.0 - - ! ! for each half-hourly time step in the day - ! do i = 0, 47 - ! calday = jday + i*0.02083333_SHR_KIND_R8 - ! call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) - ! cosz(i) = shr_orb_cosz(calday, lat, lon, declin) - - ! if (cosz(i) > 0.0_r8) then - ! ! call norman radiation scheme - ! call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & - ! canopy_area_profile, elai_profile, esai_profile, fcansno, & - ! cosz(i), nrad, 2, k_dir(:,i)) - ! end if - ! end do - - ! call write_radiation_data(out_file, k_dir, cosz) - -end program FatesUnitTestRadiation - -!:.............................................................................: - -subroutine read_radiation_namelist(numSWb, year, jday, lat, lon, fcansno, & - param_file, patch_file, out_file) - - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file - - implicit none - - ! - ! DESCRIPTION: - ! read in the namelist associated with the radiation unit tests and - ! initialize values - ! - - ! ARGUMENTS: - character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file ! file names - integer, intent(out) :: numSWb ! number of shortwave bands - integer, intent(out) :: year, jday ! year and day of year - real(r8), intent(out) :: lat, lon ! latitude and longitude [degrees] - real(r8), intent(out) :: fcansno ! fraction of canopy covered by snow [0-1] - - ! LOCALS: - character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name - character(len=MAX_PATH) :: message ! Error message - character(len=MAX_PATH) :: msg ! I/O Error message - integer :: rad_nl_file ! unit number for namelist - integer :: ios ! I/O status - - - ! Namelist of radiation parameters - namelist /radiation/ numSWb, year, jday, lat, lon, fcansno, param_file, & - patch_file, out_file - - ! Now read parameters namelist - rad_nl_file = open_file(trim(rad_nl), 'r') - read(rad_nl_file, radiation, iostat=ios, iomsg=msg) - - if (ios /= 0) then - ! Problem reading file - tell user. - write(message, '(A, I6, A, A)') "Error reading radiation namelist file", & - ios, "IOMSG: ", msg - write(*,*) message - stop "Stopped" - end if - - close(rad_nl_file) - -end subroutine read_radiation_namelist \ No newline at end of file diff --git a/unit_testing/utils/FatesUnitTestIOMod.F90 b/unit_testing/utils/FatesUnitTestIOMod.F90 index 0cc004f7a4..a065f3e37a 100644 --- a/unit_testing/utils/FatesUnitTestIOMod.F90 +++ b/unit_testing/utils/FatesUnitTestIOMod.F90 @@ -24,12 +24,12 @@ integer function unit_number() save if (first) then - ! Set first to false and iunit to base unit on first call - iunit = BASE_UNIT - first = .false. + ! Set first to false and iunit to base unit on first call + iunit = BASE_UNIT + first = .false. else - ! Otherwise, increment - iunit = iunit + 1 + ! Otherwise, increment + iunit = iunit + 1 endif ! Set to output @@ -54,7 +54,6 @@ integer function open_file(filename, mode) character(len = 9) :: fmode ! File open mode logical :: file_exists ! Does the file exist? character(len = MAX_PATH) :: fname ! Local filename (trimmed) - character(len = MAX_CHAR) :: message ! Error message integer :: i ! Looping index integer :: ios ! I/O status integer :: iunit = BASE_UNIT ! File unit number @@ -63,33 +62,33 @@ integer function open_file(filename, mode) ! Get mode of open (read, write, or read/write) ! Defaults to read/write if (present(mode)) then - select case(mode) - case ('r', 'R') - fmode = 'read' - case ('w', 'W') - fmode = 'write' - case ('rw', 'RW', 'wr', 'WR') - fmode = 'readwrite' - case DEFAULT - fmode = 'readwrite' - end select - else + select case(mode) + case ('r', 'R') + fmode = 'read' + case ('w', 'W') + fmode = 'write' + case ('rw', 'RW', 'wr', 'WR') + fmode = 'readwrite' + case DEFAULT fmode = 'readwrite' + end select + else + fmode = 'readwrite' endif ! trim filename of whitespace fname = trim(adjustl(filename)) if (fmode == 'read' .or. fmode == 'readwrite') then - ! Check for valid name of file - farray = 0 - do i = 1, len_trim(fname) - farray(i) = ichar(fname(i:i)) - enddo - if (any(farray > 126)) then - write(*,*) "Invalid filename" - stop "Stopped" - endif + ! Check for valid name of file + farray = 0 + do i = 1, len_trim(fname) + farray(i) = ichar(fname(i:i)) + enddo + if (any(farray > 126)) then + write(logf,'(A)') "Invalid filename" + stop + endif endif ! Does the file exist? @@ -97,32 +96,116 @@ integer function open_file(filename, mode) ! Open file if conditions are correct if (file_exists .and. fmode == 'write') then - write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & - " exists. Cannot open write only." - write(*,*) message - stop "Stopped" + write(logf,'(A,A,A)') "File ", fname(1:len_trim(fname)), & + " exists. Cannot open write only." + stop else if (.not. file_exists .and. fmode == 'read') then - write(message, '(A,A,A)') "File ", fname(1:len_trim(fname)), & - " does not exist. Can't read." - write(*,*) message - stop "Stopped" + write(logf, '(A,A,A)') "File ", fname(1:len_trim(fname)), & + " does not exist. Can't read." + stop else - iunit = unit_number() - open(iunit, file=fname, action=fmode, iostat=ios) - if (ios /= 0) then - write(message, '(A,A,A,I6)') "Problem opening", & - fname(1:len_trim(fname)), " ios: ", ios - write(*,*) message - stop "Stopped" - endif + iunit = unit_number() + open(iunit, file=fname, action=fmode, iostat=ios) + if (ios /= 0) then + write(logf,'(A,A,A,I6)') "Problem opening", & + fname(1:len_trim(fname)), " ios: ", ios + stop + endif endif open_file = iunit - end function open_file + end function open_file + + !:.........................................................................: + + subroutine check(status) + ! + ! DESCRIPTION: + ! Checks status of netcdf operations + + ! ARGUMENTS: + integer, intent (in) :: status ! return status code from a netcdf procedure + + if (status /= nf90_noerr) then + write(logf,*) trim(nf90_strerror(status)) + stop + end if + + end subroutine check + + !:.........................................................................: + + subroutine read_in_parameter(funit, param_name, bounds, out_array) + ! + ! DESCRIPTION: + ! Reads in parameters from the FATES parameter file + ! + + ! ARGUMENTS: + integer, intent(in) :: funit ! file unit number + character(len=*), intent(in) :: param_name ! parameter name + character(len=*), intent(in) :: bounds ! bounds name + real(r8), allocatable, intent(out) :: out_array(:) ! parameter values + + ! LOCALS: + integer :: paramID ! parameter ID + integer :: dimID_axis_nbounds ! dimension ID + integer :: nbounds ! parameter bounds + + ! get axis id + call check(nf90_inq_dimid(funit, trim(bounds), dimID_axis_nbounds)) + + ! get parameter bounds + call check(nf90_inquire_dimension(funit, dimID_axis_nbounds, len=nbounds)) + + ! read parameter values + call check(nf90_inq_varid(funit, trim(param_name), paramID)) + + ! allocate + allocate(out_array(nbounds)) + call check(nf90_get_var(funit, paramID, out_array)) + + end subroutine read_in_parameter + + ! subroutine read_patch_data(file, canopy_area, elai, esai, nrad) + ! ! + ! ! DESCRIPTION: + ! ! Reads and return patch data + + ! ! ARGUMENTS: + ! character(len=MAX_PATH), intent(in) :: file ! patch file name + ! real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile + ! real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile + ! real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile + ! real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers + + ! ! LOCALS: + ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers + ! integer :: fidA, varID + + ! ! open file + ! call check(nf90_open(trim(file), 0, fidA)) + + ! ! read patch data values + ! call check(nf90_inq_varid(fidA, "can_area", varID)) + ! call check(nf90_get_var(fidA, varID, canopy_area)) + + ! call check(nf90_inq_varid(fidA, "elai", varID)) + ! call check(nf90_get_var(fidA, varID, elai)) + + ! call check(nf90_inq_varid(fidA, "esai", varID)) + ! call check(nf90_get_var(fidA, varID, esai)) + + ! call check(nf90_inq_varid(fidA, "nrad", varID)) + ! call check(nf90_get_var(fidA, varID, nrad)) + + ! end subroutine read_patch_data !:.........................................................................: + + ! subroutine write_radiation_data(file, kdir, declin) ! ! ! ! DESCRIPTION: @@ -166,156 +249,4 @@ end function open_file ! end subroutine write_radiation_data - ! !:.........................................................................: - - ! subroutine check(status) - ! ! - ! ! DESCRIPTION: - ! ! Checks status of netcdf operations - - ! ! ARGUMENTS: - ! integer, intent (in) :: status ! return status code from a netcdf procedure - - ! if (status /= nf90_noerr) then - ! print *, trim(nf90_strerror(status)) - ! stop "Stopped" - ! end if - - ! end subroutine check - - ! !:.........................................................................: - - ! subroutine read_patch_data(file, canopy_area, elai, esai, nrad) - ! ! - ! ! DESCRIPTION: - ! ! Reads and return patch data - - ! ! ARGUMENTS: - ! character(len=MAX_PATH), intent(in) :: file ! patch file name - ! real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile - ! real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile - ! real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile - ! real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers - - ! ! Data dictionary: declare variable types, definitions, and units - ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers - ! integer :: fidA, varID - - ! ! open file - ! call check(nf90_open(trim(file), 0, fidA)) - - ! ! read patch data values - ! call check(nf90_inq_varid(fidA, "can_area", varID)) - ! call check(nf90_get_var(fidA, varID, canopy_area)) - - ! call check(nf90_inq_varid(fidA, "elai", varID)) - ! call check(nf90_get_var(fidA, varID, elai)) - - ! call check(nf90_inq_varid(fidA, "esai", varID)) - ! call check(nf90_get_var(fidA, varID, esai)) - - ! call check(nf90_inq_varid(fidA, "nrad", varID)) - ! call check(nf90_get_var(fidA, varID, nrad)) - - ! end subroutine read_patch_data - - ! !:.........................................................................: - - ! subroutine get_parameters(file, rhol, rhos, taul, taus, xl, ci) - ! ! - ! ! Purpose: - ! ! Returns parameter values - ! ! - ! ! Record of revisions: - ! ! Date Programmer Description of change - ! ! ======== ============= ===================== - ! ! 03/20/23 A. C. Foster Original code - ! ! - - ! ! Data dictionary: declare calling parameter types & definitions - ! character(len=100), intent(in) :: file ! parameter file name - ! real(r8), intent(out) :: rhol(num_pft,num_swb) ! leaf reflectance - ! real(r8), intent(out) :: rhos(num_pft,num_swb) ! stem reflectance - ! real(r8), intent(out) :: taul(num_pft,num_swb) ! leaf transmittance - ! real(r8), intent(out) :: taus(num_pft,num_swb) ! stem transmittance - ! real(r8), intent(out) :: xl(num_pft) ! leaf orientation index - ! real(r8), intent(out) :: ci(num_pft) ! clumping index - - ! ! read in all parameters - ! call read_param_netcdf(file, rhol(:,1), rhol(:,2), rhos(:,1), rhos(:,2), & - ! taul(:,1), taul(:,2), taus(:,1), taus(:,2), xl, ci) - - ! end subroutine get_parameters - - ! !:...........................................................................: - - ! subroutine read_param_netcdf(file, rholvis, rholnir, rhosvis, rhosnir, & - ! taulvis, taulnir, tausvis, tausnir, xl, ci) - ! ! - ! ! Purpose: - ! ! Reads a FATES netcdf parameter file - ! ! - ! ! Record of revisions: - ! ! Date Programmer Description of change - ! ! ======== ============= ===================== - ! ! 03/20/23 A. C. Foster Original code - ! ! - - ! ! Data dictionary: declare calling parameter types & definitions - ! character(len=100), intent(in) :: file ! parameter file name - ! real(r8), intent(out) :: rholvis(num_pft) ! vis leaf reflectance - ! real(r8), intent(out) :: rholnir(num_pft) ! nir leaf reflectance - ! real(r8), intent(out) :: rhosvis(num_pft) ! vis stem reflectance - ! real(r8), intent(out) :: rhosnir(num_pft) ! nir stem reflectance - ! real(r8), intent(out) :: taulvis(num_pft) ! vis leaf transmittance - ! real(r8), intent(out) :: taulnir(num_pft) ! nir leaf transmittance - ! real(r8), intent(out) :: tausvis(num_pft) ! vis stem transmittance - ! real(r8), intent(out) :: tausnir(num_pft) ! nir stem transmittance - ! real(r8), intent(out) :: xl(num_pft) ! leaf orientation index - ! real(r8), intent(out) :: ci(num_pft) ! clumping index - - ! ! Data dictionary: declare variable types, definitions, and units - ! integer :: fidA, paramID - - ! ! open file - ! call check(nf90_open(trim(file), 0, fidA)) - - ! ! read parameter values - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhovis", paramID)) - ! call check(nf90_get_var(fidA, paramID, rholvis)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_rhonir", paramID)) - ! call check(nf90_get_var(fidA, paramID, rholnir)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_stem_rhovis", paramID)) - ! call check(nf90_get_var(fidA, paramID, rhosvis)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_stem_rhonir", paramID)) - ! call check(nf90_get_var(fidA, paramID, rhosnir)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_tauvis", paramID)) - ! call check(nf90_get_var(fidA, paramID, taulvis)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_taunir", paramID)) - ! call check(nf90_get_var(fidA, paramID, taulnir)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_stem_tauvis", paramID)) - ! call check(nf90_get_var(fidA, paramID, tausvis)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_stem_taunir", paramID)) - ! call check(nf90_get_var(fidA, paramID, tausnir)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_xl", paramID)) - ! call check(nf90_get_var(fidA, paramID, xl)) - - ! call check(nf90_inq_varid(fidA, "fates_rad_leaf_clumping_index", paramID)) - ! call check(nf90_get_var(fidA, paramID, ci)) - - ! ! close file - ! call check(nf90_close(fidA)) - - ! end subroutine read_param_netcdf - - ! !:...........................................................................: - end module FatesUnitTestIOMod \ No newline at end of file From a9a28a4431895958286611077cd9df0ece25c2eb Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Apr 2023 22:41:13 -0600 Subject: [PATCH 045/125] move test directories --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a640e8bb7..16bb777d48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,8 +28,6 @@ add_library(fates ${fates_sources}) add_library(utils ${utils_sources}) add_dependencies(fates csm_share) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) - # We need to look for header files here, in order to pick up shr_assert.h include_directories(${CLM_ROOT}/share/include) @@ -37,3 +35,4 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) link_directories(${CMAKE_CURRENT_BINARY_DIR}) # Add the test directories +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) From cbba0d34b92886feb5940e546ee23eb50b27275b Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 14 Apr 2023 08:07:24 -0600 Subject: [PATCH 046/125] trying to get share to work --- CMakeLists.txt | 10 +++++++--- unit_testing/radiation_test/CMakeLists.txt | 11 ++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16bb777d48..c7da878060 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,14 +14,20 @@ set(CLM_ROOT "../../") # Add source directories from other share code (csm_share, etc.) add_subdirectory(${CLM_ROOT}/share/src csm_share) +set (csm_share_sources_needed + shr_log_mod.F90 + ) +extract_sources("${csm_share_sources_needed}" "${share_sources}" share_sources_needed) + # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils fates_test_utils) +add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) # Build libraries containing stuff needed for the unit tests. # Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. -add_library(csm_share ${share_sources}) +add_library(csm_share ${share_sources_needed}) declare_generated_dependencies(csm_share "${share_genf90_sources}") add_library(fates ${fates_sources}) @@ -34,5 +40,3 @@ include_directories(${CLM_ROOT}/share/include) include_directories(${CMAKE_CURRENT_BINARY_DIR}) link_directories(${CMAKE_CURRENT_BINARY_DIR}) -# Add the test directories -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) diff --git a/unit_testing/radiation_test/CMakeLists.txt b/unit_testing/radiation_test/CMakeLists.txt index 2d72ae6b9b..aafadb5c1c 100644 --- a/unit_testing/radiation_test/CMakeLists.txt +++ b/unit_testing/radiation_test/CMakeLists.txt @@ -14,16 +14,21 @@ include_directories(${NETCDF_C_DIR}/include link_directories(${NETCDF_C_DIR}/lib ${NETCDF_FORTRAN_DIR}/lib) -add_executable(FATES_rad_test ${rad_sources}) +add_executable(FATES_rad_exe ${rad_sources}) -target_link_libraries(FATES_rad_test +target_link_libraries(FATES_rad_exe PUBLIC netcdff netcdf fates utils csm_share) -add_test(rad_test FATES_rad_test) +target_include_directories(FATES_rad_exe PUBLIC + "${PROJECT_BINARY_DIR}" + "${PROJECT_SOURCE_DIR}/fates_main" + ) + +add_test(rad_test FATES_rad_exe) # Tell CTest how to figure out that "STOP 1" fails for the current define_Fortran_stop_failure(rad_test) From 0ff67f3c660da581886d19a0fe9fcc7c7fb700b5 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 14 Apr 2023 08:56:08 -0600 Subject: [PATCH 047/125] rearranging structure --- CMakeLists.txt | 68 +++++++++++++++--- biogeophys/test/CMakeLists.txt | 2 + .../test/solar_rad_test}/CMakeLists.txt | 12 ++-- .../FatesUnitTestRadiation.F90 | 0 .../test/solar_rad_test}/log.txt | 0 .../test/solar_rad_test}/radiation_nl | 0 .../run_FATES_tests.py | 0 .../utils => unit_test_shr}/CMakeLists.txt | 4 +- .../FatesUnitTestIOMod.F90 | 0 .../FatesUnitTestOrbitalMod.F90 | 0 unit_testing/radiation_test/FATES_rad_test | Bin 73392 -> 0 bytes 11 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 biogeophys/test/CMakeLists.txt rename {unit_testing/radiation_test => biogeophys/test/solar_rad_test}/CMakeLists.txt (79%) rename {unit_testing/radiation_test => biogeophys/test/solar_rad_test}/FatesUnitTestRadiation.F90 (100%) rename {unit_testing/radiation_test => biogeophys/test/solar_rad_test}/log.txt (100%) rename {unit_testing/radiation_test => biogeophys/test/solar_rad_test}/radiation_nl (100%) rename {unit_testing => functional_unit_testing}/run_FATES_tests.py (100%) rename {unit_testing/utils => unit_test_shr}/CMakeLists.txt (70%) rename {unit_testing/utils => unit_test_shr}/FatesUnitTestIOMod.F90 (100%) rename {unit_testing/utils => unit_test_shr}/FatesUnitTestOrbitalMod.F90 (100%) delete mode 100755 unit_testing/radiation_test/FATES_rad_test diff --git a/CMakeLists.txt b/CMakeLists.txt index c7da878060..55422d596e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include(CIME_initial_setup) project(FATES_tests Fortran C) -enable_language(Fortran) +#enable_language(Fortran) include(CIME_utils) @@ -14,24 +14,66 @@ set(CLM_ROOT "../../") # Add source directories from other share code (csm_share, etc.) add_subdirectory(${CLM_ROOT}/share/src csm_share) -set (csm_share_sources_needed - shr_log_mod.F90 - ) -extract_sources("${csm_share_sources_needed}" "${share_sources}" share_sources_needed) +## shr sources we need +## shr_log_mod.F90 +## shr_infnan_mod.F90.in +## shr_kind_mod.F90 +## shr_strconvert_mod + +# Extract just the files we need from csm_share +set (shr_sources_needed_base + shr_log_mod.F90 + shr_infnan_mod.F90 + shr_kind_mod.F90 + shr_sys_mod.F90 + shr_abort_mod.F90 + shr_strconvert_mod.F90 + ) +extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/utils fates_test_utils) -add_subdirectory(${CLM_ROOT}/src/fates/unit_testing/radiation_test fates_testing) + +# Add general unit test directories (stubbed out files, etc.) +add_subdirectory(${CLM_ROOT}/src/fates/unit_test_shr) + +# Remove shr_mpi_mod from share_sources. +# This is needed because we want to use the mock shr_mpi_mod in place of the real one +# +# TODO: this should be moved into a general-purpose function in Sourcelist_utils. +# Then this block of code could be replaced with a single call, like: +# remove_source_file(${share_sources} "shr_mpi_mod.F90") +foreach (sourcefile ${share_sources}) + string(REGEX MATCH "shr_mpi_mod.F90" match_found ${sourcefile}) + if(match_found) + list(REMOVE_ITEM share_sources ${sourcefile}) + endif() +endforeach() + +# Remove shr_cal_mod from share_sources. +# +# shr_cal_mod depends on ESMF (or the lightweight esmf wrf timemgr, at +# least). Since CTSM doesn't currently use shr_cal_mod, we're avoiding +# the extra overhead of including esmf_wrf_timemgr sources in this +# build. +# +# TODO: like above, this should be moved into a general-purpose function +# in Sourcelist_utils. Then this block of code could be replaced with a +# single call, like: remove_source_file(${share_sources} +# "shr_cal_mod.F90") +foreach (sourcefile ${share_sources}) + string(REGEX MATCH "shr_cal_mod.F90" match_found ${sourcefile}) + if(match_found) + list(REMOVE_ITEM share_sources ${sourcefile}) + endif() +endforeach() # Build libraries containing stuff needed for the unit tests. # Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. -add_library(csm_share ${share_sources_needed}) +add_library(csm_share ${shr_sources_needed}) declare_generated_dependencies(csm_share "${share_genf90_sources}") - add_library(fates ${fates_sources}) -add_library(utils ${utils_sources}) add_dependencies(fates csm_share) # We need to look for header files here, in order to pick up shr_assert.h @@ -40,3 +82,9 @@ include_directories(${CLM_ROOT}/share/include) include_directories(${CMAKE_CURRENT_BINARY_DIR}) link_directories(${CMAKE_CURRENT_BINARY_DIR}) +# Add the test directories +# Note: it's possible that these could be added by each source directory that +# has tests in it. However, it appears that the order needs to be done +# carefully: for example, include_directories and link_directories needs to be +# done before adding the tests themselves. +add_subdirectory(${CLM_ROOT}/src/fates/biogeophys/test fates_biogeophys_test) diff --git a/biogeophys/test/CMakeLists.txt b/biogeophys/test/CMakeLists.txt new file mode 100644 index 0000000000..76e7f575a3 --- /dev/null +++ b/biogeophys/test/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(solar_rad_test) + diff --git a/unit_testing/radiation_test/CMakeLists.txt b/biogeophys/test/solar_rad_test/CMakeLists.txt similarity index 79% rename from unit_testing/radiation_test/CMakeLists.txt rename to biogeophys/test/solar_rad_test/CMakeLists.txt index aafadb5c1c..415894202c 100644 --- a/unit_testing/radiation_test/CMakeLists.txt +++ b/biogeophys/test/solar_rad_test/CMakeLists.txt @@ -1,4 +1,3 @@ -# Local files set(rad_sources FatesUnitTestRadiation.F90) set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") @@ -16,17 +15,16 @@ link_directories(${NETCDF_C_DIR}/lib add_executable(FATES_rad_exe ${rad_sources}) -target_link_libraries(FATES_rad_exe PUBLIC +target_link_libraries(FATES_rad_exe netcdff netcdf fates - utils csm_share) -target_include_directories(FATES_rad_exe PUBLIC - "${PROJECT_BINARY_DIR}" - "${PROJECT_SOURCE_DIR}/fates_main" - ) +#target_include_directories(FATES_rad_exe PUBLIC +# "${PROJECT_BINARY_DIR}" +# "${PROJECT_SOURCE_DIR}/fates_main" +# ) add_test(rad_test FATES_rad_exe) diff --git a/unit_testing/radiation_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 similarity index 100% rename from unit_testing/radiation_test/FatesUnitTestRadiation.F90 rename to biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 diff --git a/unit_testing/radiation_test/log.txt b/biogeophys/test/solar_rad_test/log.txt similarity index 100% rename from unit_testing/radiation_test/log.txt rename to biogeophys/test/solar_rad_test/log.txt diff --git a/unit_testing/radiation_test/radiation_nl b/biogeophys/test/solar_rad_test/radiation_nl similarity index 100% rename from unit_testing/radiation_test/radiation_nl rename to biogeophys/test/solar_rad_test/radiation_nl diff --git a/unit_testing/run_FATES_tests.py b/functional_unit_testing/run_FATES_tests.py similarity index 100% rename from unit_testing/run_FATES_tests.py rename to functional_unit_testing/run_FATES_tests.py diff --git a/unit_testing/utils/CMakeLists.txt b/unit_test_shr/CMakeLists.txt similarity index 70% rename from unit_testing/utils/CMakeLists.txt rename to unit_test_shr/CMakeLists.txt index c78cf7f05d..783299e740 100644 --- a/unit_testing/utils/CMakeLists.txt +++ b/unit_test_shr/CMakeLists.txt @@ -1,7 +1,7 @@ # Append sources from this directory to the list. -list(APPEND utils_sources +list(APPEND fates_sources FatesUnitTestIOMod.F90 FatesUnitTestOrbitalMod.F90) # Export source list to parent -sourcelist_to_parent(utils_sources) \ No newline at end of file +sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/unit_testing/utils/FatesUnitTestIOMod.F90 b/unit_test_shr/FatesUnitTestIOMod.F90 similarity index 100% rename from unit_testing/utils/FatesUnitTestIOMod.F90 rename to unit_test_shr/FatesUnitTestIOMod.F90 diff --git a/unit_testing/utils/FatesUnitTestOrbitalMod.F90 b/unit_test_shr/FatesUnitTestOrbitalMod.F90 similarity index 100% rename from unit_testing/utils/FatesUnitTestOrbitalMod.F90 rename to unit_test_shr/FatesUnitTestOrbitalMod.F90 diff --git a/unit_testing/radiation_test/FATES_rad_test b/unit_testing/radiation_test/FATES_rad_test deleted file mode 100755 index bdc660e5b40c7d5c2c876a13bd76bc77e79a2bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73392 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 Date: Fri, 14 Apr 2023 11:23:52 -0600 Subject: [PATCH 048/125] working now --- CMakeLists.txt | 24 ++++++++++++++++--- biogeochem/CMakeLists.txt | 5 ++++ biogeophys/test/solar_rad_test/CMakeLists.txt | 5 ---- .../solar_rad_test/FatesUnitTestRadiation.F90 | 4 ++-- main/FatesParametersInterface.F90 | 20 ++++------------ 5 files changed, 33 insertions(+), 25 deletions(-) create mode 100644 biogeochem/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 55422d596e..78c6945656 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,12 +13,16 @@ set(CLM_ROOT "../../") # Add source directories from other share code (csm_share, etc.) add_subdirectory(${CLM_ROOT}/share/src csm_share) +add_subdirectory(${CLM_ROOT}/share/unit_test_stubs/util csm_share_stubs) +#add_subdirectory(${CLM_ROOT}/src/unit_test_shr clm_unit_shr) +#add_subdirectory(${CLM_ROOT}/src/unit_test_stubs clm_unit_stubs) ## shr sources we need ## shr_log_mod.F90 -## shr_infnan_mod.F90.in +## shr_infnan_mod.F90 ## shr_kind_mod.F90 -## shr_strconvert_mod +## shr_strconvert_mod.F90 +## shr_sys_mod.F90 # Extract just the files we need from csm_share set (shr_sources_needed_base @@ -26,13 +30,14 @@ set (shr_sources_needed_base shr_infnan_mod.F90 shr_kind_mod.F90 shr_sys_mod.F90 - shr_abort_mod.F90 shr_strconvert_mod.F90 + shr_abort_mod.abortthrows.F90 ) extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) +add_subdirectory(${CLM_ROOT}/src/fates/biogeochem fates_biogeochem) add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) # Add general unit test directories (stubbed out files, etc.) @@ -79,6 +84,19 @@ add_dependencies(fates csm_share) # We need to look for header files here, in order to pick up shr_assert.h include_directories(${CLM_ROOT}/share/include) +set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") +set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") + +FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) +FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) +MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") +MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") + +include_directories(${NETCDF_C_DIR}/include + ${NETCDF_FORTRAN_DIR}/include) +link_directories(${NETCDF_C_DIR}/lib + ${NETCDF_FORTRAN_DIR}/lib) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) link_directories(${CMAKE_CURRENT_BINARY_DIR}) diff --git a/biogeochem/CMakeLists.txt b/biogeochem/CMakeLists.txt new file mode 100644 index 0000000000..692e22d9dc --- /dev/null +++ b/biogeochem/CMakeLists.txt @@ -0,0 +1,5 @@ +list(APPEND fates_sources + FatesLitterMod.F90 + ) + +sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/biogeophys/test/solar_rad_test/CMakeLists.txt b/biogeophys/test/solar_rad_test/CMakeLists.txt index 415894202c..896cfc024e 100644 --- a/biogeophys/test/solar_rad_test/CMakeLists.txt +++ b/biogeophys/test/solar_rad_test/CMakeLists.txt @@ -21,11 +21,6 @@ target_link_libraries(FATES_rad_exe fates csm_share) -#target_include_directories(FATES_rad_exe PUBLIC -# "${PROJECT_BINARY_DIR}" -# "${PROJECT_SOURCE_DIR}/fates_main" -# ) - add_test(rad_test FATES_rad_exe) # Tell CTest how to figure out that "STOP 1" fails for the current diff --git a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 index ba869803b6..05210b52df 100644 --- a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 +++ b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 @@ -80,8 +80,8 @@ end subroutine read_radiation_params call read_radiation_params(param_file, numSWb, rhol, rhos, taul, taus, xl, ci) ! read in patch data - call read_patch_data(patch_file, canopy_area_profile, elai_profile, & - esai_profile, nrad_r) + !call read_patch_data(patch_file, canopy_area_profile, elai_profile, & + ! esai_profile, nrad_r) ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) diff --git a/main/FatesParametersInterface.F90 b/main/FatesParametersInterface.F90 index aa13150c4a..b19817a091 100644 --- a/main/FatesParametersInterface.F90 +++ b/main/FatesParametersInterface.F90 @@ -4,7 +4,7 @@ module FatesParametersInterface ! depend on any host modules. use FatesConstantsMod, only : r8 => fates_r8 - use FatesGlobals, only : fates_log + use FatesGlobals, only : fates_log, fates_endrun implicit none private ! Modules are private by default @@ -172,8 +172,6 @@ end subroutine RetrieveParameterScalar !----------------------------------------------------------------------- subroutine RetrieveParameter1D(this, name, data) - use abortutils, only : endrun - implicit none class(fates_parameters_type), intent(inout) :: this @@ -192,7 +190,7 @@ subroutine RetrieveParameter1D(this, name, data) do d = 1, max_dimensions write(fates_log(), *) this%parameters(i)%dimension_names(d), ', ', this%parameters(i)%dimension_sizes(d) end do - call endrun(msg='size error retreiving 1d parameter.') + call fates_endrun(msg='size error retreiving 1d parameter.') end if data = this%parameters(i)%data(:, 1) @@ -201,8 +199,6 @@ end subroutine RetrieveParameter1D !----------------------------------------------------------------------- subroutine RetrieveParameter2D(this, name, data) - use abortutils, only : endrun - implicit none class(fates_parameters_type), intent(inout) :: this @@ -225,7 +221,7 @@ subroutine RetrieveParameter2D(this, name, data) do d = 1, max_dimensions write(fates_log(), *) this%parameters(i)%dimension_names(d), ', ', this%parameters(i)%dimension_sizes(d) end do - call endrun(msg='size error retreiving 2d parameter.') + call fates_endrun(msg='size error retreiving 2d parameter.') end if data = this%parameters(i)%data @@ -234,8 +230,6 @@ end subroutine RetrieveParameter2D !----------------------------------------------------------------------- subroutine RetrieveParameter1DAllocate(this, name, data) - use abortutils, only : endrun - implicit none class(fates_parameters_type), intent(inout) :: this @@ -255,8 +249,6 @@ end subroutine RetrieveParameter1DAllocate !----------------------------------------------------------------------- subroutine RetrieveParameter2DAllocate(this, name, data) - use abortutils, only : endrun - implicit none class(fates_parameters_type), intent(inout) :: this @@ -439,9 +431,7 @@ end subroutine SetDataScalar !----------------------------------------------------------------------- subroutine SetData1D(this, index, data) - - use abortutils, only : endrun - + implicit none class(fates_parameters_type), intent(inout) :: this @@ -460,7 +450,7 @@ subroutine SetData1D(this, index, data) do d = 1, max_dimensions write(fates_log(), *) this%parameters(index)%dimension_names(d), ', ', this%parameters(index)%dimension_sizes(d) end do - call endrun(msg='size error setting 1d parameter.') + call fates_endrun(msg='size error setting 1d parameter.') end if allocate(this%parameters(index)%data(size_dim_1, 1)) From a78f44f79cc962f0dc3d6748b504ae9cc67b074c Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 21 Apr 2023 09:21:35 -0600 Subject: [PATCH 049/125] more cmake stuff --- CMakeLists.txt | 15 +++++---------- biogeochem/CMakeLists.txt | 3 +++ biogeophys/CMakeLists.txt | 8 ++++++++ fire/CMakeLists.txt | 8 ++++++++ main/CMakeLists.txt | 9 +++++++++ main/FatesInterfaceMod.F90 | 15 ++++++++++----- parteh/CMakeLists.txt | 3 +++ 7 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 biogeophys/CMakeLists.txt create mode 100644 fire/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 78c6945656..8c772fdf05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,15 +14,8 @@ set(CLM_ROOT "../../") # Add source directories from other share code (csm_share, etc.) add_subdirectory(${CLM_ROOT}/share/src csm_share) add_subdirectory(${CLM_ROOT}/share/unit_test_stubs/util csm_share_stubs) -#add_subdirectory(${CLM_ROOT}/src/unit_test_shr clm_unit_shr) -#add_subdirectory(${CLM_ROOT}/src/unit_test_stubs clm_unit_stubs) - -## shr sources we need -## shr_log_mod.F90 -## shr_infnan_mod.F90 -## shr_kind_mod.F90 -## shr_strconvert_mod.F90 -## shr_sys_mod.F90 +add_subdirectory(${CLM_ROOT}/src/utils clm_utils) +add_subdirectory(${CLM_ROOT}/src/main clm_main) # Extract just the files we need from csm_share set (shr_sources_needed_base @@ -38,9 +31,11 @@ extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_need # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) add_subdirectory(${CLM_ROOT}/src/fates/biogeochem fates_biogeochem) +add_subdirectory(${CLM_ROOT}/src/fates/biogeophys fates_biogephys) add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) +add_subdirectory(${CLM_ROOT}/src/fates/fire fates_fire) -# Add general unit test directories (stubbed out files, etc.) +# Add general unit test directories add_subdirectory(${CLM_ROOT}/src/fates/unit_test_shr) # Remove shr_mpi_mod from share_sources. diff --git a/biogeochem/CMakeLists.txt b/biogeochem/CMakeLists.txt index 692e22d9dc..b9a6889443 100644 --- a/biogeochem/CMakeLists.txt +++ b/biogeochem/CMakeLists.txt @@ -1,5 +1,8 @@ list(APPEND fates_sources FatesLitterMod.F90 + FatesAllometryMod.F90 + DamageMainMod.F90 + FatesPatchMod.F90 ) sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/biogeophys/CMakeLists.txt b/biogeophys/CMakeLists.txt new file mode 100644 index 0000000000..037dd49fa7 --- /dev/null +++ b/biogeophys/CMakeLists.txt @@ -0,0 +1,8 @@ +# Note that this is just used for unit testing; hence, we only need to add +# source files that are currently used in unit tests + +list(APPEND fates_sources + FatesHydroWTFMod.F90 + ) + +sourcelist_to_parent(fates_sources) diff --git a/fire/CMakeLists.txt b/fire/CMakeLists.txt new file mode 100644 index 0000000000..0cec31a6a6 --- /dev/null +++ b/fire/CMakeLists.txt @@ -0,0 +1,8 @@ +# Note that this is just used for unit testing; hence, we only need to add +# source files that are currently used in unit tests + +list(APPEND fates_sources + SFParamsMod.F90 + ) + +sourcelist_to_parent(fates_sources) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 8c65b32513..6cbca40357 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -13,11 +13,20 @@ list(APPEND clm_sources list(APPEND fates_sources FatesConstantsMod.F90 + EDTypesMod.F90 EDPftvarcon.F90 EDParamsMod.F90 FatesGlobals.F90 FatesInterfaceTypesMod.F90 FatesParametersInterface.F90 + FatesParameterDerivedMod.F90 + FatesHydraulicsMemMod.F90 + FatesRunningMeanMod.F90 + FatesCohortMod.F90 + FatesSizeAgeTypeIndicesMod.F90 + FatesIntegratorsMod.F90 + FatesUtilsMod.F90 + FatesSynchronizedParamsMod.F90 ) sourcelist_to_parent(clm_sources) diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index 41ae7798d0..72950c5cdb 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -95,6 +95,7 @@ module FatesInterfaceMod ! CIME Globals use shr_log_mod , only : errMsg => shr_log_errMsg use shr_infnan_mod , only : nan => shr_infnan_nan, assignment(=) + use shr_kind_mod , only : SHR_KIND_CL ! Just use everything from FatesInterfaceTypesMod, this is ! its sister code @@ -723,7 +724,8 @@ end subroutine set_bcs ! =================================================================================== - subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft) + subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft, & + masterproc, paramfile, fates_paramfile) ! -------------------------------------------------------------------------------- ! @@ -735,16 +737,19 @@ subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft) implicit none - logical,intent(in) :: use_fates ! Is fates turned on? - integer,intent(in) :: surf_numpft ! Number of PFTs in surface dataset - integer,intent(in) :: surf_numcft ! Number of CFTs in surface dataset + logical, intent(in) :: use_fates ! Is fates turned on? + logical, intent(in) :: masterproc ! proc 0 logical for printing msgs + integer, intent(in) :: surf_numpft ! Number of PFTs in surface dataset + integer, intent(in) :: surf_numcft ! Number of CFTs in surface dataset + character(len=SHR_KIND_CL), intent(in) :: paramfile ! ASCII data file (host model) + character(len=SHR_KIND_CL), intent(in) :: fates_paramfile ! ASCII data file with PFT physiological constants (FATES) integer :: fates_numpft ! Number of PFTs tracked in FATES if (use_fates) then ! Self explanatory, read the fates parameter file - call FatesReadParameters() + call FatesReadParameters(paramfile, fates_paramfile, masterproc) fates_numpft = size(prt_params%wood_density,dim=1) diff --git a/parteh/CMakeLists.txt b/parteh/CMakeLists.txt index 218608e794..f04d622092 100644 --- a/parteh/CMakeLists.txt +++ b/parteh/CMakeLists.txt @@ -1,6 +1,9 @@ list(APPEND fates_sources PRTGenericMod.F90 PRTParametersMod.F90 + PRTParamsFATESMod.F90 + PRTAllometricCarbonMod.F90 + PRTAllometricCNPMod.F90 ) sourcelist_to_parent(fates_sources) \ No newline at end of file From 05f52dd9cc80f6e2e425a9a009135867f0da5a49 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 21 Apr 2023 16:50:25 -0700 Subject: [PATCH 050/125] continuing to add updates and debug --- tools/luh2mod.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index efb40ef752..c33ad6f0b7 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -34,7 +34,8 @@ def main(): regrid_luh2["LATIXY"] = ds_regridtarget["LATIXY"] # Write the files - outputfile = os.path.join() + outputfile = os.path.join(os.getcwd(),'LUH2_states_transitions_management.timeseries_4x5_hist_simyr1850-2015_c230415.nc') + regrid_luh2.to_netcdf(outputfile) # Example of file naming scheme @@ -179,14 +180,17 @@ def BoundsVariableFixLUH2(inputdataset): # The user will need to use a surface data set to regrid from, but the surface datasets # need to have their dimensions renamed to something recognizable by xESMF -def DimensionFixSurfData(surfdataset): +def DimensionFixSurfData(inputdataset): # Rename the surface dataset dimensions to something recognizable by xESMF. - inputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + # inputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + inputdataset = inputdataset.rename_dims(dims_dict={'lsmlat':'lat','lsmlon':'lon'}) # Populate the new surface dataset with the actual lat/lon values - inputdataset['longitude'] = outputdataset.LONGXY.isel(latitude=0) - inputdataset['latitude'] = outputdataset.LATIXY.isel(longitude=0) + # inputdataset['longitude'] = inputdataset.LONGXY.isel(latitude=0) + # inputdataset['latitude'] = inputdataset.LATIXY.isel(longitude=0) + inputdataset['lon'] = inputdataset.LONGXY.isel(lat=0) + inputdataset['lat'] = inputdataset.LATIXY.isel(lon=0) print("Surface dataset dimensions renamed for xESMF") From 924ec76948ac86457f922386848b722bda0c1447 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 24 Apr 2023 13:50:45 -0600 Subject: [PATCH 051/125] put use statements back --- .../solar_rad_test/FatesUnitTestRadiation.F90 | 111 ++---------------- main/FatesInterfaceMod.F90 | 5 +- 2 files changed, 11 insertions(+), 105 deletions(-) diff --git a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 index 05210b52df..7f7e87d4b5 100644 --- a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 +++ b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 @@ -21,12 +21,6 @@ program FatesUnitTestRadiation integer :: year, jday ! year and day of year to simulate real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] - real(r8), allocatable :: rhol(:,:) ! leaf reflectance [0-1] - real(r8), allocatable :: rhos(:,:) ! stem reflectance [0-1] - real(r8), allocatable :: taul(:,:) ! leaf transmittance [0-1] - real(r8), allocatable :: taus(:,:) ! stem transmittance [0-1] - real(r8), allocatable :: xl(:) ! leaf orientation index - real(r8), allocatable :: ci(:) ! clumping index ! PARAMETERS integer, parameter :: numSWb = 2 ! number of shortwave bands to simulate @@ -48,36 +42,20 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, & end subroutine read_radiation_namelist - subroutine read_radiation_params(file, numSWb, rhol, rhos, taul, taus, xl, & - ci) - - use FatesUnitTestIOMod, only : MAX_PATH, check, read_in_parameter - use FatesConstantsMod, only : r8 => fates_r8 - use netcdf - - implicit none - - character(len=MAX_PATH), intent(in) :: file - integer, intent(in) :: numSWb - real(r8), allocatable, intent(out) :: rhol(:,:) - real(r8), allocatable, intent(out) :: rhos(:,:) - real(r8), allocatable, intent(out) :: taul(:,:) - real(r8), allocatable, intent(out) :: taus(:,:) - real(r8), allocatable, intent(out) :: xl(:) - real(r8), allocatable, intent(out) :: ci(:) - - end subroutine read_radiation_params - end interface - call read_radiation_namelist(year, jday, lat, lon, fcansno, & - param_file, patch_file, out_file) + !:...........................................................................: ! open log file logf = open_file("log.txt") - ! read in FATES parameter file - call read_radiation_params(param_file, numSWb, rhol, rhos, taul, taus, xl, ci) + ! read in namelist to get some runtime parameters + call read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & + patch_file, out_file) + + ! read in parameter file and initialize EDPFTvarcon_inst + + ! read in patch data !call read_patch_data(patch_file, canopy_area_profile, elai_profile, & @@ -149,9 +127,8 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & if (ios /= 0) then ! Problem reading file - tell user. - write(message, '(A, I6, A, A)') "Error reading radiation namelist file", & + write(logf, '(A, I6, A, A)') "Error reading radiation namelist file", & ios, "IOMSG: ", msg - write(*,*) message stop "Stopped" end if @@ -161,75 +138,5 @@ end subroutine read_radiation_namelist !:.............................................................................: -subroutine read_radiation_params(file, numSWb, rhol, rhos, taul, taus, xl, ci) - ! - ! DESCRIPTION: - ! read in the parameters we need for this test - ! - - use FatesUnitTestIOMod, only : MAX_PATH, check, read_in_parameter - use FatesConstantsMod, only : r8 => fates_r8 - use netcdf - - implicit none - - ! ARGUMENTS: - character(len=MAX_PATH), intent(in) :: file ! parameter file name - integer, intent(in) :: numSWb ! number of shortwave bands to simulate - real(r8), allocatable, intent(out) :: rhol(:,:) ! leaf reflectance [0-1] - real(r8), allocatable, intent(out) :: rhos(:,:) ! stem reflectance [0-1] - real(r8), allocatable, intent(out) :: taul(:,:) ! leaf transmittance [0-1] - real(r8), allocatable, intent(out) :: taus(:,:) ! stem transmittance [0-1] - real(r8), allocatable, intent(out) :: xl(:) ! leaf orientation index - real(r8), allocatable, intent(out) :: ci(:) ! clumping index - - ! LOCALS: - integer :: funit ! file unit number - real(r8), allocatable :: rholvis(:) ! leaf visible reflectance [0-1] - real(r8), allocatable :: rholnir(:) ! leaf NIR reflectance [0-1] - real(r8), allocatable :: rhosvis(:) ! stem visible reflectance [0-1] - real(r8), allocatable :: rhosnir(:) ! stem NIR reflectance [0-1] - real(r8), allocatable :: taulvis(:) ! leaf visible transmittance [0-1] - real(r8), allocatable :: taulnir(:) ! leaf NIR transmittance [0-1] - real(r8), allocatable :: tausvis(:) ! stem visible transmittance [0-1] - real(r8), allocatable :: tausnir(:) ! stem NIR transmittance [0-1] - - ! open file - call check(nf90_open(trim(file), 0, funit)) - - ! read in parameters - call read_in_parameter(funit, 'fates_rad_leaf_rhovis', 'fates_pft', rholvis) - call read_in_parameter(funit, 'fates_rad_leaf_rhonir', 'fates_pft', rholnir) - call read_in_parameter(funit, 'fates_rad_stem_rhovis', 'fates_pft', rhosvis) - call read_in_parameter(funit, 'fates_rad_stem_rhonir', 'fates_pft', rhosnir) - call read_in_parameter(funit, 'fates_rad_leaf_tauvis', 'fates_pft', taulvis) - call read_in_parameter(funit, 'fates_rad_leaf_taunir', 'fates_pft', taulnir) - call read_in_parameter(funit, 'fates_rad_stem_tauvis', 'fates_pft', tausvis) - call read_in_parameter(funit, 'fates_rad_stem_taunir', 'fates_pft', tausnir) - call read_in_parameter(funit, 'fates_rad_leaf_xl', 'fates_pft', xl) - call read_in_parameter(funit, 'fates_rad_leaf_clumping_index', 'fates_pft', & - ci) - - ! allocate the arrays correctly - allocate(rhol(size(rholvis, 1), numSWb)) - allocate(rhos(size(rhosvis, 1), numSWb)) - allocate(taul(size(taulvis, 1), numSWb)) - allocate(taus(size(tausvis, 1), numSWb)) - - ! put arrays together - rhol(:,1) = rholvis - rhol(:,2) = rholnir - rhos(:,1) = rhosvis - rhos(:,2) = rhosnir - taul(:,1) = taulvis - taul(:,2) = taulnir - taus(:,1) = tausvis - taus(:,2) = tausnir - - ! close file - call check(nf90_close(funit)) - -end subroutine read_radiation_params - diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index 72950c5cdb..164661c148 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -724,8 +724,7 @@ end subroutine set_bcs ! =================================================================================== - subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft, & - masterproc, paramfile, fates_paramfile) + subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft) ! -------------------------------------------------------------------------------- ! @@ -749,7 +748,7 @@ subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft, & if (use_fates) then ! Self explanatory, read the fates parameter file - call FatesReadParameters(paramfile, fates_paramfile, masterproc) + call FatesReadParameters() fates_numpft = size(prt_params%wood_density,dim=1) From 23e5b9f918aabedd8110c403ce13edf9badc90e1 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 26 Apr 2023 20:27:34 -0600 Subject: [PATCH 052/125] trying to add parameters --- CMakeLists.txt | 26 ++-- .../solar_rad_test/FatesUnitTestRadiation.F90 | 3 +- unit_test_shr/FatesUnitTestIOMod.F90 | 134 +++++++++++++++--- 3 files changed, 129 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c772fdf05..893c300823 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,19 +14,17 @@ set(CLM_ROOT "../../") # Add source directories from other share code (csm_share, etc.) add_subdirectory(${CLM_ROOT}/share/src csm_share) add_subdirectory(${CLM_ROOT}/share/unit_test_stubs/util csm_share_stubs) -add_subdirectory(${CLM_ROOT}/src/utils clm_utils) -add_subdirectory(${CLM_ROOT}/src/main clm_main) # Extract just the files we need from csm_share -set (shr_sources_needed_base - shr_log_mod.F90 - shr_infnan_mod.F90 - shr_kind_mod.F90 - shr_sys_mod.F90 - shr_strconvert_mod.F90 - shr_abort_mod.abortthrows.F90 - ) -extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) +# set (shr_sources_needed_base +# shr_log_mod.F90 +# shr_infnan_mod.F90 +# shr_kind_mod.F90 +# shr_sys_mod.F90 +# shr_strconvert_mod.F90 +# shr_abort_mod.abortthrows.F90 +# ) +# extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) @@ -35,6 +33,10 @@ add_subdirectory(${CLM_ROOT}/src/fates/biogeophys fates_biogephys) add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) add_subdirectory(${CLM_ROOT}/src/fates/fire fates_fire) +# Add general unit test directories (stubbed out files, etc.) +add_subdirectory(${CLM_ROOT}/src/unit_test_stubs clm_stubs) +add_subdirectory(${CLM_ROOT}/src/unit_test_shr clm_tests) + # Add general unit test directories add_subdirectory(${CLM_ROOT}/src/fates/unit_test_shr) @@ -71,7 +73,7 @@ endforeach() # Build libraries containing stuff needed for the unit tests. # Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. -add_library(csm_share ${shr_sources_needed}) +add_library(csm_share ${share_sources}) declare_generated_dependencies(csm_share "${share_genf90_sources}") add_library(fates ${fates_sources}) add_dependencies(fates csm_share) diff --git a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 index 7f7e87d4b5..83c5a68964 100644 --- a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 +++ b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 @@ -96,7 +96,7 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & ! initialize values ! - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf use FatesConstantsMod, only : r8 => fates_r8 implicit none @@ -111,7 +111,6 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & ! LOCALS: character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name - character(len=MAX_CHAR) :: message ! Error message character(len=MAX_CHAR) :: msg ! I/O Error message integer :: rad_nl_file ! unit number for namelist integer :: ios ! I/O status diff --git a/unit_test_shr/FatesUnitTestIOMod.F90 b/unit_test_shr/FatesUnitTestIOMod.F90 index a065f3e37a..d7f1bb8726 100644 --- a/unit_test_shr/FatesUnitTestIOMod.F90 +++ b/unit_test_shr/FatesUnitTestIOMod.F90 @@ -1,5 +1,12 @@ module FatesUnitTestIOMod - use FatesConstantsMod, only : r8 => fates_r8 + use FatesConstantsMod, only : r8 => fates_r8 + use FatesParametersInterface, only : fates_parameters_type + use FatesParametersInterface, only : param_string_length, max_used_dimensions + use EDParamsMod, only : FatesRegisterParams, FatesReceiveParams + use SFParamsMod, only : SpitFireRegisterParams, SpitFireReceiveParams + use PRTInitParamsFATESMod, only : PRTRegisterParams, PRTReceiveParams + use shr_kind_mod, only : SHR_KIND_CL + use FatesSynchronizedParamsMod, only : FatesSynchronizedParamsInst use netcdf implicit none @@ -136,37 +143,124 @@ end subroutine check !:.........................................................................: - subroutine read_in_parameter(funit, param_name, bounds, out_array) + subroutine read_parameters(fates_paramfile) ! ! DESCRIPTION: ! Reads in parameters from the FATES parameter file ! ! ARGUMENTS: - integer, intent(in) :: funit ! file unit number - character(len=*), intent(in) :: param_name ! parameter name - character(len=*), intent(in) :: bounds ! bounds name - real(r8), allocatable, intent(out) :: out_array(:) ! parameter values + character(len=SHR_KIND_CL), intent(in) :: fates_paramfile ! parameter file name + + ! LOCALS: + class(fates_parameters_type), allocatable :: fates_params + + allocate(fates_params) + call fates_params%Init() + call FatesRegisterParams(fates_params) + call SpitFireRegisterParams(fates_params) + call PRTRegisterParams(fates_params) + call FatesSynchronizedParamsInst%RegisterParams(fates_params) + + end subroutine read_parameters + + !:.........................................................................: + + subroutine read_netcdf_params(filename, fates_params) + ! + ! DESCRIPTION: + ! Calls actual netcdf library methods for reading FATES parameters from netcdf + ! + + ! ARGUMENTS: + character(len=*), intent(in) :: filename ! full path of parameter file + class(fates_parameters_type), intent(inout) :: fates_params ! fates parameters type ! LOCALS: - integer :: paramID ! parameter ID - integer :: dimID_axis_nbounds ! dimension ID - integer :: nbounds ! parameter bounds + logical :: file_exists ! does the file exist? + integer :: ncid ! netcdf file unit number + integer :: max_dim_size ! + + ! check if file is on disk + inquire(file=trim(adjustl(filename)), exist=file_exists) + if (.not. file_exists) then + write(logf,'(a)') 'File ', filename, ' does not exist.' + stop "Stopping" + end if + + ! open the file + call check(nf90_open(trim(adjustl(filename)), 0, ncid)) + + ! get and set the correct dimensions for the parameters + call set_param_dimensions(ncid, fates_params) + + ! max_dim_size = fates_params%GetMaxDimensionSize() + ! num_params = fates_params%num_params() + ! do i = 1, num_params + ! call fates_params%GetMetaData(i, name, dimension_shape, dimension_sizes, dimension_names, is_host_param) + ! if (is_host_file .eqv. is_host_param) then + ! select case(dimension_shape) + ! case(dimension_shape_scalar) + ! size_dim_1 = 1 + ! size_dim_2 = 1 + ! case(dimension_shape_1d) + ! size_dim_1 = dimension_sizes(1) + ! size_dim_2 = 1 + ! case(dimension_shape_2d) + ! size_dim_1 = dimension_sizes(1) + ! size_dim_2 = dimension_sizes(2) + ! case default + ! write(fates_log(),*) 'dimension shape:',dimension_shape + ! call endrun(msg='unsupported number of dimensions reading parameters.') + + ! end select + ! if (masterproc) then + ! write(fates_log(), *) 'clmfates_interfaceMod.F90:: reading '//trim(name) + ! end if + ! call readNcdio(ncid, name, dimension_shape, dimension_names, subname, data(1:size_dim_1, 1:size_dim_2)) + ! call fates_params%SetData(i, data(1:size_dim_1, 1:size_dim_2)) + ! end if + ! end do + ! deallocate(data) + ! call ncd_pio_closefile(ncid) + + end subroutine read_netcdf_params + + !:.........................................................................: - ! get axis id - call check(nf90_inq_dimid(funit, trim(bounds), dimID_axis_nbounds)) + subroutine set_param_dimensions(ncid, fates_params) + ! + ! DESCRIPTION: + ! get the list of dimensions used by the FATES parameters + ! - ! get parameter bounds - call check(nf90_inquire_dimension(funit, dimID_axis_nbounds, len=nbounds)) - - ! read parameter values - call check(nf90_inq_varid(funit, trim(param_name), paramID)) + ! ARGUMENTS: + integer, intent(inout) :: ncid ! netcdf unit number + class(fates_parameters_type), intent(inout) :: fates_params ! fates parameters - ! allocate - allocate(out_array(nbounds)) - call check(nf90_get_var(funit, paramID, out_array)) + ! LOCALS: + integer :: num_dimensions + character(len=param_string_length) :: dimension_names(max_used_dimensions) + integer :: dimension_sizes(max_used_dimensions) + integer :: d + integer :: dim_id - end subroutine read_in_parameter + dimension_sizes(:) = 0 + + call fates_params%GetUsedDimensions(.false., num_dimensions, & + dimension_names) + + do d = 1, num_dimensions + call check(nf90_inq_dimid(ncid, dimension_names(d), dim_id)) + call check(nf90_inquire_dimension(ncid, dim_id, len=dimension_sizes(d))) + end do + + call fates_params%SetDimensionSizes(.false., num_dimensions, & + dimension_names, dimension_sizes) + + end subroutine set_param_dimensions + + !:.........................................................................: ! subroutine read_patch_data(file, canopy_area, elai, esai, nrad) ! ! From bf079500ef5cc181fbd93b77c93c738b90a763e2 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 1 May 2023 15:02:06 -0700 Subject: [PATCH 053/125] add year variable as copy of time dimension This is necessary due to a ncd_io read requirement set in dynsubgrid. --- tools/luh2mod.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index c33ad6f0b7..27174a2b13 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -33,6 +33,9 @@ def main(): regrid_luh2["LONGXY"] = ds_regridtarget["LONGXY"] regrid_luh2["LATIXY"] = ds_regridtarget["LATIXY"] + # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension + regrid_luh2["YEAR"] = regrid_luh2.time + # Write the files outputfile = os.path.join(os.getcwd(),'LUH2_states_transitions_management.timeseries_4x5_hist_simyr1850-2015_c230415.nc') From 915a0e1d35d9095c5cb016893242b83bb1c0b621 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 2 May 2023 12:17:40 -0600 Subject: [PATCH 054/125] update unit test --- functional_unit_testing/run_FATES_tests.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/functional_unit_testing/run_FATES_tests.py b/functional_unit_testing/run_FATES_tests.py index cd3d1206d3..29b2df5667 100644 --- a/functional_unit_testing/run_FATES_tests.py +++ b/functional_unit_testing/run_FATES_tests.py @@ -12,24 +12,24 @@ from shutil import rmtree, copy -def main(): +def main(build_dir): os.chdir("..") - if os.path.isdir("build"): - rmtree("build") + if os.path.isdir(build_dir): + rmtree(build_dir) ## super hacky right now!! run_command = ["../../cime/scripts/fortran_unit_testing/run_tests.py", - "--build-dir", "build"] + "--build-dir", "build.temp"] run_cmd_no_fail(" ".join(run_command), combine_output=True) - copy("build/__command_line_test__/__command_line_test__/unit_testing/test/radiation_test/FATES_rad_test", - "unit_testing/test/radiation_test/") + copy(os.path.join(build_dir, "__command_line_test__/__command_line_test__/fates_biogeophys_test/solar_rad_test/FATES_rad_exe"), + "biogeophys/test/solar_rad_test/") - os.chdir("unit_testing/test/radiation_test") - run_command = ["./FATES_rad_test"] + os.chdir("biogeophys/test/solar_rad_test") + run_command = ["./FATES_rad_exe"] output = run_cmd_no_fail(" ".join(run_command), combine_output=True) print(output) if __name__ == "__main__": - main() \ No newline at end of file + main("build.temp") \ No newline at end of file From de31624cc6fa33938aa1d1445e5ab6e44e29b556 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 2 May 2023 13:29:56 -0600 Subject: [PATCH 055/125] update unit test --- CMakeLists.txt | 22 +- biogeochem/FatesPatchMod.F90 | 98 ++++-- biogeophys/test/solar_rad_test/FATES_rad_exe | Bin 0 -> 978808 bytes .../solar_rad_test/FatesUnitTestRadiation.F90 | 206 +++++++++-- biogeophys/test/solar_rad_test/log.txt | 1 - biogeophys/test/solar_rad_test/pft_nlfile | 14 + biogeophys/test/solar_rad_test/radiation_nl | 2 +- main/FatesGlobals.F90 | 5 +- main/FatesInterfaceMod.F90 | 5 +- unit_test_shr/FatesUnitTestIOMod.F90 | 330 +++++++++++------- 10 files changed, 484 insertions(+), 199 deletions(-) create mode 100755 biogeophys/test/solar_rad_test/FATES_rad_exe delete mode 100644 biogeophys/test/solar_rad_test/log.txt create mode 100644 biogeophys/test/solar_rad_test/pft_nlfile diff --git a/CMakeLists.txt b/CMakeLists.txt index 893c300823..750173fc34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,16 +15,16 @@ set(CLM_ROOT "../../") add_subdirectory(${CLM_ROOT}/share/src csm_share) add_subdirectory(${CLM_ROOT}/share/unit_test_stubs/util csm_share_stubs) -# Extract just the files we need from csm_share -# set (shr_sources_needed_base -# shr_log_mod.F90 -# shr_infnan_mod.F90 -# shr_kind_mod.F90 -# shr_sys_mod.F90 -# shr_strconvert_mod.F90 -# shr_abort_mod.abortthrows.F90 -# ) -# extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) +#Extract just the files we need from csm_share +set (shr_sources_needed_base + shr_log_mod.F90 + shr_infnan_mod.F90 + shr_kind_mod.F90 + shr_sys_mod.F90 + shr_strconvert_mod.F90 + shr_abort_mod.abortthrows.F90 + ) +extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) # Add FATES source directories add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) @@ -73,7 +73,7 @@ endforeach() # Build libraries containing stuff needed for the unit tests. # Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. -add_library(csm_share ${share_sources}) +add_library(csm_share ${shr_sources_needed}) declare_generated_dependencies(csm_share "${share_genf90_sources}") add_library(fates ${fates_sources}) add_dependencies(fates csm_share) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 90dd592ad1..4447c0804f 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -203,12 +203,14 @@ module FatesPatchMod procedure :: create procedure :: dump procedure :: check_vars + procedure :: init_running_means + procedure :: init_litter end type fates_patch_type contains - subroutine init(this, numSWb, numpft, nlevsoil, current_tod) + subroutine init(this, numSWb, nlevsoil) ! ! DESCRIPTION: ! Initialize a new patch @@ -217,16 +219,11 @@ subroutine init(this, numSWb, numpft, nlevsoil, current_tod) ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object integer, intent(in) :: numSWb ! number of shortwave broad-bands to track - integer, intent(in) :: numpft ! number of pfts to simulate integer, intent(in) :: nlevsoil ! number of soil layers - integer, intent(in) :: current_tod ! time of day [seconds past 0Z] ! LOCAL VARIABLES: integer :: el ! element loop index - ! Until bc's are pointed to by sites give veg a default temp [K] - real(r8), parameter :: temp_init_veg = 15._r8 + t_water_freeze_k_1atm - ! allocate arrays allocate(this%tr_soil_dir(numSWb)) allocate(this%tr_soil_dif(numSWb)) @@ -237,10 +234,6 @@ subroutine init(this, numSWb, numpft, nlevsoil, current_tod) allocate(this%sabs_dir(numSWb)) allocate(this%sabs_dif(numSWb)) allocate(this%fragmentation_scaler(nlevsoil)) - allocate(this%tveg24) - allocate(this%tveg_lpa) - allocate(this%tveg_longterm) - allocate(this%litter(num_elements)) ! initialize values to nan call this%nan_values() @@ -248,23 +241,7 @@ subroutine init(this, numSWb, numpft, nlevsoil, current_tod) ! zero values that should be zeroed call this%zero_values() - ! set initial values for running means - call this%tveg24%InitRMean(fixed_24hr, init_value=temp_init_veg, & - init_offset=real(current_tod, r8)) - call this%tveg_lpa%InitRmean(ema_lpa, init_value=temp_init_veg) - call this%tveg_longterm%InitRmean(ema_longterm, init_value=temp_init_veg) - - ! set initial values for litter - do el = 1, num_elements - call this%litter(el)%InitAllocate(numpft, nlevsoil, element_list(el)) - call this%litter(el)%ZeroFlux() - call this%litter(el)%InitConditions(init_leaf_fines=fates_unset_r8, & - init_root_fines=fates_unset_r8, init_ag_cwd=fates_unset_r8, & - init_bg_cwd=fates_unset_r8, init_seed=fates_unset_r8, & - init_seed_germ=fates_unset_r8) - end do - - end subroutine init + end subroutine init !:.........................................................................: @@ -468,6 +445,63 @@ end subroutine zero_values !:.........................................................................: + subroutine init_running_means(this, current_tod) + ! + ! DESCRIPTION: + ! set initial values for patch running means + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this ! patch object + integer, intent(in) :: current_tod ! time of day [seconds past 0Z] + + ! PARAMETERS: + ! Until bc's are pointed to by sites give veg a default temp [K] + real(r8), parameter :: temp_init_veg = 15._r8 + t_water_freeze_k_1atm + + allocate(this%tveg24) + allocate(this%tveg_lpa) + allocate(this%tveg_longterm) + + ! set initial values for running means + call this%tveg24%InitRMean(fixed_24hr, init_value=temp_init_veg, & + init_offset=real(current_tod, r8)) + call this%tveg_lpa%InitRmean(ema_lpa, init_value=temp_init_veg) + call this%tveg_longterm%InitRmean(ema_longterm, init_value=temp_init_veg) + + end subroutine init_running_means + + !:.........................................................................: + + subroutine init_litter(this, numpft, nlevsoil) + ! + ! DESCRIPTION: + ! set initial values for litter + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this ! patch object + integer, intent(in) :: numpft ! number of pfts to simulate + integer, intent(in) :: nlevsoil ! number of soil layers + + ! LOCALS: + integer :: el ! looping index + + allocate(this%litter(num_elements)) + + do el = 1, num_elements + call this%litter(el)%InitAllocate(numpft, nlevsoil, element_list(el)) + call this%litter(el)%ZeroFlux() + call this%litter(el)%InitConditions(init_leaf_fines=fates_unset_r8, & + init_root_fines=fates_unset_r8, init_ag_cwd=fates_unset_r8, & + init_bg_cwd=fates_unset_r8, init_seed=fates_unset_r8, & + init_seed_germ=fates_unset_r8) + end do + + end subroutine init_litter + + !:.........................................................................: + subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & nlevsoil, current_tod) ! @@ -487,8 +521,14 @@ subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & integer, intent(in) :: current_tod ! time of day [seconds past 0Z] ! initialize patch - ! also sets all values to nan, then some values to zero - call this%init(numSWb, numpft, nlevsoil, current_tod) + ! sets all values to nan, then some values to zero + call this%init(numSWb, nlevsoil) + + ! initialize running means for patch + call this%init_running_means(current_tod) + + ! initialize litter + call this%init_litter(numpft, nlevsoil) ! assign known patch attributes this%age = age diff --git a/biogeophys/test/solar_rad_test/FATES_rad_exe b/biogeophys/test/solar_rad_test/FATES_rad_exe new file mode 100755 index 0000000000000000000000000000000000000000..bdff0705d16b6f977db37b78dead936d7c56de92 GIT binary patch literal 978808 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ⅈA-RA4P@XB)zM&71Vqaz-h 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

WzbwN^?+ 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 literal 0 HcmV?d00001 diff --git a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 index 83c5a68964..3caac90a38 100644 --- a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 +++ b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 @@ -4,44 +4,82 @@ program FatesUnitTestRadiation ! Test the FATES radiation schemes ! - use FatesUnitTestIOMod, only : logf, MAX_PATH, open_file - use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 - use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz - use FatesUnitTestOrbitalMod, only : shr_orb_decl - use FatesConstantsMod, only : r8 => fates_r8 - use EDPftvarcon, only : EDPftvarcon_type - !use EDParamsMod, only : nlevleaf, nclmax + use FatesUnitTestIOMod, only : logf, MAX_PATH, open_file, read_patch_data + use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 + use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz + use FatesUnitTestOrbitalMod, only : shr_orb_decl + use FatesConstantsMod, only : r8 => fates_r8 + use EDPftvarcon, only : EDPftvarcon_inst + use FatesParametersInterface, only : fates_parameters_type + use FatesPatchMod, only : fates_patch_type + use PRTGenericMod, only : num_elements, element_list, element_pos + use PRTGenericMod, only : carbon12_element implicit none ! LOCALS: - character(len=MAX_PATH) :: param_file ! parameter file name - character(len=MAX_PATH) :: patch_file ! patch data file name - character(len=MAX_PATH) :: out_file ! output file name - integer :: year, jday ! year and day of year to simulate - real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] - real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] + type(fates_patch_type), pointer :: fates_patch ! patch object + character(len=MAX_PATH) :: patch_file ! patch data file name + character(len=MAX_PATH) :: out_file ! output file name + integer :: year, jday ! year and day of year to simulate + integer :: num_pft ! number of pfts + real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] + real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] + real(r8), allocatable :: canopy_area(:,:,:) ! canopy area profile + real(r8), allocatable :: elai(:,:,:) ! exposed lai profile + real(r8), allocatable :: esai(:,:,:) ! exposed sai profile + integer, allocatable :: nrad(:,:) ! number of exposed leaf layers ! PARAMETERS - integer, parameter :: numSWb = 2 ! number of shortwave bands to simulate + integer, parameter :: numSWB = 2 ! number of shortwave bands to simulate + integer, parameter :: nlevsoil = 5 ! this shouldn't really matter + integer, parameter :: current_tod = 0 ! current time [seconds past 0Z] interface - subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, & - param_file, patch_file, out_file) + subroutine read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & + patch_file, out_file) use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file use FatesConstantsMod, only : r8 => fates_r8 implicit none - character(len=MAX_PATH), intent(out) :: param_file, patch_file, out_file - integer, intent(out) :: year, jday + character(len=MAX_PATH), intent(out) :: patch_file, out_file + integer, intent(out) :: year, jday + integer, intent(out) :: num_pft real(r8), intent(out) :: lat, lon real(r8), intent(out) :: fcansno end subroutine read_radiation_namelist + subroutine read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) + + use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf + use FatesConstantsMod, only : r8 => fates_r8 + + implicit none + + integer, intent(in) :: num_pft + integer, intent(in) :: numSWB + real(r8), intent(out) :: clumping_index(num_pft) + real(r8), intent(out) :: xl(num_pft) + real(r8), intent(out) :: rhol(num_pft,numSWB) + + end subroutine read_pft_namelist + subroutine init_pft_data(num_pft, numSWB) + + use EDPftvarcon, only : EDPftvarcon_inst + use FatesParametersInterface, only : fates_parameters_type + use FatesConstantsMod, only : r8 => fates_r8 + + implicit none + + integer, intent(in) :: num_pft + integer, intent(in) :: numSWB + + end subroutine init_pft_data + end interface !:...........................................................................: @@ -50,16 +88,22 @@ end subroutine read_radiation_namelist logf = open_file("log.txt") ! read in namelist to get some runtime parameters - call read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & + call read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & patch_file, out_file) - - ! read in parameter file and initialize EDPFTvarcon_inst - - + ! initialize pft data + call init_pft_data(num_pft, numSWB) + ! read in patch data - !call read_patch_data(patch_file, canopy_area_profile, elai_profile, & - ! esai_profile, nrad_r) + call read_patch_data(patch_file, num_pft, canopy_area, elai, esai, nrad) + + ! initialize a patch and set values + allocate(fates_patch) + call fates_patch%init(numSWB, nlevsoil) + fates_patch%canopy_area_profile = canopy_area + fates_patch%elai_profile = elai + fates_patch%esai_profile = esai + fates_patch%nrad = nrad ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) @@ -88,7 +132,7 @@ end program FatesUnitTestRadiation !:.............................................................................: -subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & +subroutine read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & patch_file, out_file) ! ! DESCRIPTION: @@ -102,10 +146,10 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & implicit none ! ARGUMENTS: - character(len=MAX_PATH), intent(out) :: param_file ! parameter file name character(len=MAX_PATH), intent(out) :: patch_file ! patch data file name character(len=MAX_PATH), intent(out) :: out_file ! output file name integer, intent(out) :: year, jday ! year and day of year + integer, intent(out) :: num_pft ! number of pfts real(r8), intent(out) :: lat, lon ! latitude and longitude [degrees] real(r8), intent(out) :: fcansno ! fraction of canopy covered by snow [0-1] @@ -115,9 +159,8 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & integer :: rad_nl_file ! unit number for namelist integer :: ios ! I/O status - ! Namelist of radiation parameters - namelist /radiation/ year, jday, lat, lon, fcansno, param_file, patch_file, & + namelist /radiation/ year, jday, lat, lon, num_pft, fcansno, patch_file, & out_file ! Now read parameters namelist @@ -127,7 +170,7 @@ subroutine read_radiation_namelist(year, jday, lat, lon, fcansno, param_file, & if (ios /= 0) then ! Problem reading file - tell user. write(logf, '(A, I6, A, A)') "Error reading radiation namelist file", & - ios, "IOMSG: ", msg + ios, " IOMSG: ", msg stop "Stopped" end if @@ -137,5 +180,108 @@ end subroutine read_radiation_namelist !:.............................................................................: +subroutine read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) +! +! DESCRIPTION: +! read in the namelist associated with the pft-specific parameters +! + +use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf +use FatesConstantsMod, only : r8 => fates_r8 + +implicit none + +! ARGUMENTS: +integer, intent(in) :: num_pft ! number of pfts +integer, intent(in) :: numSWB ! number of shortwave bands to simulate +real(r8), intent(out) :: clumping_index(num_pft) ! clumping index +real(r8), intent(out) :: xl(num_pft) ! leaf-stem orientation index +real(r8), intent(out) :: rhol(num_pft,numSWB) ! leaf reflectance [0-1] + +! LOCALS: +character(len=MAX_PATH) :: pft_nl = 'pft_nlfile' ! pft namelist name +character(len=MAX_CHAR) :: msg ! I/O Error message +integer :: pft_nl_file ! unit number for namelist +integer :: ios ! I/O status +real(r8) :: leaf_rhonir(num_pft) ! leaf NIR reflectance [0-1] +real(r8) :: leaf_taunir(num_pft) ! leaf NIR transmittance [0-1] +real(r8) :: leaf_rhovis(num_pft) ! leaf visible reflectance [0-1] +real(r8) :: leaf_tauvis(num_pft) ! leaf visible transmittance [0-1] +real(r8) :: stem_rhonir(num_pft) ! stem NIR reflectance [0-1] +real(r8) :: stem_taunir(num_pft) ! stem NIR transmittance [0-1] +real(r8) :: stem_rhovis(num_pft) ! stem visible reflectance [0-1] +real(r8) :: stem_tauvis(num_pft) ! stem visible transmittance [0-1] + +! Namelist of pft-specific parameters +namelist /params/ clumping_index, xl, leaf_rhonir, leaf_taunir, leaf_rhovis, & + leaf_tauvis, stem_rhonir, stem_taunir, stem_rhovis, stem_tauvis + +! Now read parameters namelist +pft_nl_file = open_file(trim(pft_nl), 'r') +read(pft_nl_file, params, iostat=ios, iomsg=msg) + +if (ios /= 0) then + ! Problem reading file - tell user. + write(logf, '(A, I6, A, A)') "Error reading pft namelist file", & + ios, " IOMSG: ", msg + stop "Stopped" +end if + +! combine arrays +rhol(:,1) = leaf_rhovis +rhol(:,2) = leaf_rhonir + +close(pft_nl_file) + +end subroutine read_pft_namelist + +!:.............................................................................: + +subroutine init_pft_data(num_pft, numSWB) + ! + ! DESCRIPTION: + ! read in the namelist associated with the pft-specific parameters and + ! initialize data + ! + + use EDPftvarcon, only : EDPftvarcon_inst + use FatesParametersInterface, only : fates_parameters_type + use FatesConstantsMod, only : r8 => fates_r8 + + implicit none + + ! ARGUMENTS: + integer, intent(in) :: num_pft ! number of pfts + integer, intent(in) :: numSWB ! number of shortwave bands to simulate + + ! LOCALS: + class(fates_parameters_type), allocatable :: fates_params ! FATES input parameters + real(r8) :: clumping_index(num_pft) ! clumping index + real(r8) :: xl(num_pft) ! leaf-stem orientation index + real(r8) :: rhol(num_pft,numSWB) ! leaf reflectance [0-1] + real(r8) :: rhos(num_pft,numSWB) ! stem reflectance [0-1] + real(r8) :: taul(num_pft,numSWB) ! leaf transmittance [0-1] + real(r8) :: taus(num_pft,numSWB) ! stem transmittance [0-1] + + ! initialize EDPFTvarcon_inst and fates_params + call EDPftvarcon_inst%Init() + allocate(fates_params) + call fates_params%Init() + call EDPftvarcon_inst%Register(fates_params) + + ! read in parameter values + call read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) + + ! set values + ! TODO: make this read in from a parameter file, this is hacky + EDPftvarcon_inst%clumping_index = clumping_index + EDPftvarcon_inst%xl = xl + EDPftvarcon_inst%rhol = rhol + EDPftvarcon_inst%rhos = rhos + EDPftvarcon_inst%taul = taul + EDPftvarcon_inst%taus = taus + +end subroutine init_pft_data + diff --git a/biogeophys/test/solar_rad_test/log.txt b/biogeophys/test/solar_rad_test/log.txt deleted file mode 100644 index 8b13789179..0000000000 --- a/biogeophys/test/solar_rad_test/log.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/biogeophys/test/solar_rad_test/pft_nlfile b/biogeophys/test/solar_rad_test/pft_nlfile new file mode 100644 index 0000000000..bce144acef --- /dev/null +++ b/biogeophys/test/solar_rad_test/pft_nlfile @@ -0,0 +1,14 @@ +¶ms +! parameters for the radiation unit test +! see FatesUnitTestRadiation.F90 +leaf_rhonir = 0.46 0.41 0.39 0.46 0.41 0.41 0.46 0.41 0.41 0.28 0.28 0.28 +leaf_taunir = 0.33 0.32 0.42 0.33 0.43 0.43 0.33 0.43 0.43 0.40 0.40 0.40 +leaf_rhovis = 0.11 0.09 0.08 0.11 0.08 0.08 0.11 0.08 0.08 0.05 0.05 0.05 +leaf_tauvis = 0.06 0.04 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.05 0.05 0.05 +stem_rhovis = 0.21 0.12 0.12 0.21 0.21 0.21 0.21 0.21 0.21 0.31 0.31 0.31 +stem_rhonir = 0.49 0.36 0.36 0.49 0.49 0.49 0.49 0.49 0.49 0.53 0.53 0.53 +stem_tauvis = 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.120 0.120 0.120 +stem_taunir = 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.250 0.250 0.250 +xl = 0.32 0.01 0.01 0.32 0.20 0.59 0.32 0.59 0.59 -0.23 -0.23 -0.23 +clumping_index = 0.85 0.85 0.80 0.85 0.85 0.90 0.85 0.90 0.90 0.75 0.75 0.75 +/ diff --git a/biogeophys/test/solar_rad_test/radiation_nl b/biogeophys/test/solar_rad_test/radiation_nl index 3d0d608175..5c5cdf4c1f 100644 --- a/biogeophys/test/solar_rad_test/radiation_nl +++ b/biogeophys/test/solar_rad_test/radiation_nl @@ -5,8 +5,8 @@ year = 2000 jday = 165 lat = 45.0 lon = 238.0 +num_pft = 12 fcansno = 0.0 -param_file = '/Users/afoster/Documents/ncar/fates/albedo_calib/fates_params_default.nc' patch_file = 'patch_data.nc' out_file = 'radiation_out.nc' / diff --git a/main/FatesGlobals.F90 b/main/FatesGlobals.F90 index ebc0f326ff..56d381377c 100644 --- a/main/FatesGlobals.F90 +++ b/main/FatesGlobals.F90 @@ -83,7 +83,7 @@ subroutine fates_endrun(msg) ! This subroutine was derived from CLM's ! endrun_vanilla() in abortutils.F90 ! - use shr_sys_mod , only: shr_sys_abort + !use shr_sys_mod , only: shr_sys_abort ! ! !ARGUMENTS: implicit none @@ -91,7 +91,8 @@ subroutine fates_endrun(msg) !----------------------------------------------------------------------- write(fates_log(),*)'ENDRUN:', msg - call shr_sys_abort() + !call shr_sys_abort() + stop end subroutine fates_endrun diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index 164661c148..2d23ca3346 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -737,12 +737,9 @@ subroutine SetFatesGlobalElements1(use_fates,surf_numpft,surf_numcft) implicit none logical, intent(in) :: use_fates ! Is fates turned on? - logical, intent(in) :: masterproc ! proc 0 logical for printing msgs integer, intent(in) :: surf_numpft ! Number of PFTs in surface dataset integer, intent(in) :: surf_numcft ! Number of CFTs in surface dataset - character(len=SHR_KIND_CL), intent(in) :: paramfile ! ASCII data file (host model) - character(len=SHR_KIND_CL), intent(in) :: fates_paramfile ! ASCII data file with PFT physiological constants (FATES) - + integer :: fates_numpft ! Number of PFTs tracked in FATES if (use_fates) then diff --git a/unit_test_shr/FatesUnitTestIOMod.F90 b/unit_test_shr/FatesUnitTestIOMod.F90 index d7f1bb8726..47f88080b4 100644 --- a/unit_test_shr/FatesUnitTestIOMod.F90 +++ b/unit_test_shr/FatesUnitTestIOMod.F90 @@ -1,12 +1,6 @@ module FatesUnitTestIOMod - use FatesConstantsMod, only : r8 => fates_r8 - use FatesParametersInterface, only : fates_parameters_type - use FatesParametersInterface, only : param_string_length, max_used_dimensions - use EDParamsMod, only : FatesRegisterParams, FatesReceiveParams - use SFParamsMod, only : SpitFireRegisterParams, SpitFireReceiveParams - use PRTInitParamsFATESMod, only : PRTRegisterParams, PRTReceiveParams - use shr_kind_mod, only : SHR_KIND_CL - use FatesSynchronizedParamsMod, only : FatesSynchronizedParamsInst + use FatesConstantsMod, only : r8 => fates_r8 + use shr_kind_mod, only : SHR_KIND_CL use netcdf implicit none @@ -16,6 +10,15 @@ module FatesUnitTestIOMod integer, parameter :: MAX_PATH = 256 ! Maximum path length integer, parameter :: MAX_CHAR = 80 ! Maximum length for messages integer :: logf ! Unit number for output log file + + interface get_var + module procedure get_var1D_real + module procedure get_var2D_real + module procedure get_var3D_real + module procedure get_var1D_int + module procedure get_var2D_int + module procedure get_var3D_int + end interface contains @@ -142,163 +145,248 @@ subroutine check(status) end subroutine check !:.........................................................................: - - subroutine read_parameters(fates_paramfile) + + subroutine read_patch_data(file, num_pft, canopy_area, elai, esai, nrad) ! ! DESCRIPTION: - ! Reads in parameters from the FATES parameter file + ! Reads and return patch data ! ! ARGUMENTS: - character(len=SHR_KIND_CL), intent(in) :: fates_paramfile ! parameter file name - + character(len=MAX_PATH), intent(in) :: file ! patch file name + integer, intent(in) :: num_pft ! number of PFTs + real(r8), allocatable, intent(out) :: canopy_area(:,:,:) ! canopy area profile + real(r8), allocatable, intent(out) :: elai(:,:,:) ! exposed lai profile + real(r8), allocatable, intent(out) :: esai(:,:,:) ! exposed sai profile + integer, allocatable, intent(out) :: nrad(:,:) ! number of exposed leaf layers + ! LOCALS: - class(fates_parameters_type), allocatable :: fates_params + integer :: ncid ! netcdf file unit number + + ! open file + call check(nf90_open(trim(file), 0, ncid)) + + ! read in data + call get_var(ncid, 'can_area', canopy_area) + call get_var(ncid, 'elai', elai) + call get_var(ncid, 'esai', esai) + call get_var(ncid, 'nrad', nrad) - allocate(fates_params) - call fates_params%Init() - call FatesRegisterParams(fates_params) - call SpitFireRegisterParams(fates_params) - call PRTRegisterParams(fates_params) - call FatesSynchronizedParamsInst%RegisterParams(fates_params) + ! close file + call check(nf90_close(ncid)) - end subroutine read_parameters + end subroutine read_patch_data !:.........................................................................: - subroutine read_netcdf_params(filename, fates_params) + subroutine get_dims(ncid, varID, dim_lens) ! ! DESCRIPTION: - ! Calls actual netcdf library methods for reading FATES parameters from netcdf + ! Get dimensions for a netcdf variable + ! + + ! ARGUMENTS + integer, intent(in) :: ncid ! netcdf file unit ID + integer, intent(in) :: varID ! variable ID + integer, allocatable, intent(out) :: dim_lens(:) ! dimension lengths + + ! LOCALS: + integer :: numDims ! number of dimensions + integer, allocatable :: dimIDs(:) ! dimension IDs + integer :: i ! looping index + + ! find dimensions of data + call check(nf90_inquire_variable(ncid, varID, ndims=numDims)) + + ! allocate data to grab dimension information + allocate(dim_lens(numDims)) + allocate(dimIDs(numDims)) + + ! get dimIDs + call check(nf90_inquire_variable(ncid, varID, dimids=dimIDs)) + + ! grab these dimensions + do i = 1, numDims + call check(nf90_inquire_dimension(ncid, dimIDs(i), len=dim_lens(i))) + end do + + end subroutine get_dims + + !:.........................................................................: + + subroutine get_var1D_real(ncid, var_name, data) + ! + ! DESCRIPTION: + ! Read in variables for 1D real data ! ! ARGUMENTS: - character(len=*), intent(in) :: filename ! full path of parameter file - class(fates_parameters_type), intent(inout) :: fates_params ! fates parameters type - + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + real(r8), allocatable, intent(out) :: data(:) ! data values + ! LOCALS: - logical :: file_exists ! does the file exist? - integer :: ncid ! netcdf file unit number - integer :: max_dim_size ! - - ! check if file is on disk - inquire(file=trim(adjustl(filename)), exist=file_exists) - if (.not. file_exists) then - write(logf,'(a)') 'File ', filename, ' does not exist.' - stop "Stopping" - end if - - ! open the file - call check(nf90_open(trim(adjustl(filename)), 0, ncid)) - - ! get and set the correct dimensions for the parameters - call set_param_dimensions(ncid, fates_params) - - ! max_dim_size = fates_params%GetMaxDimensionSize() - ! num_params = fates_params%num_params() - ! do i = 1, num_params - ! call fates_params%GetMetaData(i, name, dimension_shape, dimension_sizes, dimension_names, is_host_param) - ! if (is_host_file .eqv. is_host_param) then - ! select case(dimension_shape) - ! case(dimension_shape_scalar) - ! size_dim_1 = 1 - ! size_dim_2 = 1 - ! case(dimension_shape_1d) - ! size_dim_1 = dimension_sizes(1) - ! size_dim_2 = 1 - ! case(dimension_shape_2d) - ! size_dim_1 = dimension_sizes(1) - ! size_dim_2 = dimension_sizes(2) - ! case default - ! write(fates_log(),*) 'dimension shape:',dimension_shape - ! call endrun(msg='unsupported number of dimensions reading parameters.') - - ! end select - ! if (masterproc) then - ! write(fates_log(), *) 'clmfates_interfaceMod.F90:: reading '//trim(name) - ! end if - ! call readNcdio(ncid, name, dimension_shape, dimension_names, subname, data(1:size_dim_1, 1:size_dim_2)) - ! call fates_params%SetData(i, data(1:size_dim_1, 1:size_dim_2)) - ! end if - ! end do - ! deallocate(data) - ! call ncd_pio_closefile(ncid) - - end subroutine read_netcdf_params + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths + + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) + + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) + + ! read data + allocate(data(dim_lens(1))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var1D_real !:.........................................................................: - subroutine set_param_dimensions(ncid, fates_params) + subroutine get_var1D_int(ncid, var_name, data) ! ! DESCRIPTION: - ! get the list of dimensions used by the FATES parameters + ! Read in variables for 1D integer data ! ! ARGUMENTS: - integer, intent(inout) :: ncid ! netcdf unit number - class(fates_parameters_type), intent(inout) :: fates_params ! fates parameters + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + integer, allocatable, intent(out) :: data(:) ! data values ! LOCALS: - integer :: num_dimensions - character(len=param_string_length) :: dimension_names(max_used_dimensions) - integer :: dimension_sizes(max_used_dimensions) - integer :: d - integer :: dim_id - - dimension_sizes(:) = 0 + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths - call fates_params%GetUsedDimensions(.false., num_dimensions, & - dimension_names) + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) - do d = 1, num_dimensions - call check(nf90_inq_dimid(ncid, dimension_names(d), dim_id)) - call check(nf90_inquire_dimension(ncid, dim_id, len=dimension_sizes(d))) - end do + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) - call fates_params%SetDimensionSizes(.false., num_dimensions, & - dimension_names, dimension_sizes) + ! read data + allocate(data(dim_lens(1))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var1D_int - end subroutine set_param_dimensions + !:.........................................................................: + + subroutine get_var2D_real(ncid, var_name, data) + ! + ! DESCRIPTION: + ! Read in variables for 2D real data + ! + + ! ARGUMENTS: + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + real(r8), allocatable, intent(out) :: data(:,:) ! data values + + ! LOCALS: + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths + + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) + + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) + + ! read data + allocate(data(dim_lens(1), dim_lens(2))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var2D_real !:.........................................................................: - ! subroutine read_patch_data(file, canopy_area, elai, esai, nrad) - ! ! - ! ! DESCRIPTION: - ! ! Reads and return patch data - - ! ! ARGUMENTS: - ! character(len=MAX_PATH), intent(in) :: file ! patch file name - ! real(r8), intent(out) :: canopy_area(num_can,num_pft,nlevleaf) ! canopy area profile - ! real(r8), intent(out) :: elai(num_can,num_pft,nlevleaf) ! exposed lai profile - ! real(r8), intent(out) :: esai(num_can,num_pft,nlevleaf) ! exposed sai profile - ! real(r8), intent(out) :: nrad(num_can,num_pft) ! number of exposed leaf layers + subroutine get_var2D_int(ncid, var_name, data) + ! + ! DESCRIPTION: + ! Read in variables for 2D integer data + ! - ! ! LOCALS: - ! real(r8) :: nrad_r(num_can,num_pft) ! number of exposed leaf layers - ! integer :: fidA, varID + ! ARGUMENTS: + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + integer, allocatable, intent(out) :: data(:,:) ! data values - ! ! open file - ! call check(nf90_open(trim(file), 0, fidA)) + ! LOCALS: + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths + + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) + + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) + + ! read data + allocate(data(dim_lens(1), dim_lens(2))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var2D_int + + !:.........................................................................: + + subroutine get_var3D_real(ncid, var_name, data) + ! + ! DESCRIPTION: + ! Read in variables for 3D real data + ! - ! ! read patch data values - ! call check(nf90_inq_varid(fidA, "can_area", varID)) - ! call check(nf90_get_var(fidA, varID, canopy_area)) + ! ARGUMENTS: + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + real(r8), allocatable, intent(out) :: data(:,:,:) ! data values - ! call check(nf90_inq_varid(fidA, "elai", varID)) - ! call check(nf90_get_var(fidA, varID, elai)) + ! LOCALS: + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths - ! call check(nf90_inq_varid(fidA, "esai", varID)) - ! call check(nf90_get_var(fidA, varID, esai)) + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) - ! call check(nf90_inq_varid(fidA, "nrad", varID)) - ! call check(nf90_get_var(fidA, varID, nrad)) + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) - ! end subroutine read_patch_data + ! read data + allocate(data(dim_lens(1), dim_lens(2), dim_lens(3))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var3D_real !:.........................................................................: - + subroutine get_var3D_int(ncid, var_name, data) + ! + ! DESCRIPTION: + ! Read in variables for 3D integer data + ! + + ! ARGUMENTS: + integer, intent(in) :: ncid ! netcdf file unit ID + character(len=*), intent(in) :: var_name ! variable name + integer, allocatable, intent(out) :: data(:,:,:) ! data values + + ! LOCALS: + integer :: varID ! variable ID + integer, allocatable :: dim_lens(:) ! dimension lengths + + ! find variable ID first + call check(nf90_inq_varid(ncid, var_name, varID)) + + ! get dimensions of data + call get_dims(ncid, varID, dim_lens) + + ! read data + allocate(data(dim_lens(1), dim_lens(2), dim_lens(3))) + call check(nf90_get_var(ncid, varID, data)) + + end subroutine get_var3D_int + + !:.........................................................................: ! subroutine write_radiation_data(file, kdir, declin) ! ! From db98e2a46ec06a97944bc8f1b483ab4d702c441f Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 2 May 2023 13:30:54 -0600 Subject: [PATCH 056/125] just refactor stuff --- biogeophys/test/CMakeLists.txt | 2 - biogeophys/test/solar_rad_test/CMakeLists.txt | 27 - biogeophys/test/solar_rad_test/FATES_rad_exe | Bin 978808 -> 0 bytes .../solar_rad_test/FatesUnitTestRadiation.F90 | 287 --------- biogeophys/test/solar_rad_test/pft_nlfile | 14 - biogeophys/test/solar_rad_test/radiation_nl | 12 - test_list.xml | 7 - unit_test_shr/CMakeLists.txt | 7 - unit_test_shr/FatesUnitTestIOMod.F90 | 434 ------------- unit_test_shr/FatesUnitTestOrbitalMod.F90 | 581 ------------------ 10 files changed, 1371 deletions(-) delete mode 100644 biogeophys/test/CMakeLists.txt delete mode 100644 biogeophys/test/solar_rad_test/CMakeLists.txt delete mode 100755 biogeophys/test/solar_rad_test/FATES_rad_exe delete mode 100644 biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 delete mode 100644 biogeophys/test/solar_rad_test/pft_nlfile delete mode 100644 biogeophys/test/solar_rad_test/radiation_nl delete mode 100644 test_list.xml delete mode 100644 unit_test_shr/CMakeLists.txt delete mode 100644 unit_test_shr/FatesUnitTestIOMod.F90 delete mode 100644 unit_test_shr/FatesUnitTestOrbitalMod.F90 diff --git a/biogeophys/test/CMakeLists.txt b/biogeophys/test/CMakeLists.txt deleted file mode 100644 index 76e7f575a3..0000000000 --- a/biogeophys/test/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(solar_rad_test) - diff --git a/biogeophys/test/solar_rad_test/CMakeLists.txt b/biogeophys/test/solar_rad_test/CMakeLists.txt deleted file mode 100644 index 896cfc024e..0000000000 --- a/biogeophys/test/solar_rad_test/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -set(rad_sources FatesUnitTestRadiation.F90) - -set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") -set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") - -FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) -FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) -MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") -MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") - -include_directories(${NETCDF_C_DIR}/include - ${NETCDF_FORTRAN_DIR}/include) -link_directories(${NETCDF_C_DIR}/lib - ${NETCDF_FORTRAN_DIR}/lib) - -add_executable(FATES_rad_exe ${rad_sources}) - -target_link_libraries(FATES_rad_exe - netcdff - netcdf - fates - csm_share) - -add_test(rad_test FATES_rad_exe) - -# Tell CTest how to figure out that "STOP 1" fails for the current -define_Fortran_stop_failure(rad_test) diff --git a/biogeophys/test/solar_rad_test/FATES_rad_exe b/biogeophys/test/solar_rad_test/FATES_rad_exe deleted file mode 100755 index bdff0705d16b6f977db37b78dead936d7c56de92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 978808 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ⅈA-RA4P@XB)zM&71Vqaz-h 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

WzbwN^?+ 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 diff --git a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 b/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 deleted file mode 100644 index 3caac90a38..0000000000 --- a/biogeophys/test/solar_rad_test/FatesUnitTestRadiation.F90 +++ /dev/null @@ -1,287 +0,0 @@ -program FatesUnitTestRadiation - ! - ! DESCRIPTION: - ! Test the FATES radiation schemes - ! - - use FatesUnitTestIOMod, only : logf, MAX_PATH, open_file, read_patch_data - use FatesUnitTestOrbitalMod, only : SHR_KIND_R8 - use FatesUnitTestOrbitalMod, only : get_orbital_vals, shr_orb_cosz - use FatesUnitTestOrbitalMod, only : shr_orb_decl - use FatesConstantsMod, only : r8 => fates_r8 - use EDPftvarcon, only : EDPftvarcon_inst - use FatesParametersInterface, only : fates_parameters_type - use FatesPatchMod, only : fates_patch_type - use PRTGenericMod, only : num_elements, element_list, element_pos - use PRTGenericMod, only : carbon12_element - - implicit none - - ! LOCALS: - type(fates_patch_type), pointer :: fates_patch ! patch object - character(len=MAX_PATH) :: patch_file ! patch data file name - character(len=MAX_PATH) :: out_file ! output file name - integer :: year, jday ! year and day of year to simulate - integer :: num_pft ! number of pfts - real(r8) :: lat, lon ! latitude/longitude to simulate [degrees] - real(r8) :: fcansno ! fraction of canopy covered by snow [0-1] - real(r8), allocatable :: canopy_area(:,:,:) ! canopy area profile - real(r8), allocatable :: elai(:,:,:) ! exposed lai profile - real(r8), allocatable :: esai(:,:,:) ! exposed sai profile - integer, allocatable :: nrad(:,:) ! number of exposed leaf layers - - ! PARAMETERS - integer, parameter :: numSWB = 2 ! number of shortwave bands to simulate - integer, parameter :: nlevsoil = 5 ! this shouldn't really matter - integer, parameter :: current_tod = 0 ! current time [seconds past 0Z] - - interface - - subroutine read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & - patch_file, out_file) - - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file - use FatesConstantsMod, only : r8 => fates_r8 - - implicit none - - character(len=MAX_PATH), intent(out) :: patch_file, out_file - integer, intent(out) :: year, jday - integer, intent(out) :: num_pft - real(r8), intent(out) :: lat, lon - real(r8), intent(out) :: fcansno - - end subroutine read_radiation_namelist - - subroutine read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) - - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf - use FatesConstantsMod, only : r8 => fates_r8 - - implicit none - - integer, intent(in) :: num_pft - integer, intent(in) :: numSWB - real(r8), intent(out) :: clumping_index(num_pft) - real(r8), intent(out) :: xl(num_pft) - real(r8), intent(out) :: rhol(num_pft,numSWB) - - end subroutine read_pft_namelist - subroutine init_pft_data(num_pft, numSWB) - - use EDPftvarcon, only : EDPftvarcon_inst - use FatesParametersInterface, only : fates_parameters_type - use FatesConstantsMod, only : r8 => fates_r8 - - implicit none - - integer, intent(in) :: num_pft - integer, intent(in) :: numSWB - - end subroutine init_pft_data - - end interface - - !:...........................................................................: - - ! open log file - logf = open_file("log.txt") - - ! read in namelist to get some runtime parameters - call read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & - patch_file, out_file) - - ! initialize pft data - call init_pft_data(num_pft, numSWB) - - ! read in patch data - call read_patch_data(patch_file, num_pft, canopy_area, elai, esai, nrad) - - ! initialize a patch and set values - allocate(fates_patch) - call fates_patch%init(numSWB, nlevsoil) - fates_patch%canopy_area_profile = canopy_area - fates_patch%elai_profile = elai - fates_patch%esai_profile = esai - fates_patch%nrad = nrad - - ! call get_orbital_vals(year, logf, eccen, mvelp, obliqr, lambm0, mvelpp) - - ! cosz(:) = 0.0 - ! k_dir(:,:) = 0.0 - - ! ! for each half-hourly time step in the day - ! do i = 0, 47 - ! calday = jday + i*0.02083333_SHR_KIND_R8 - ! call shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, declin, eccf) - ! cosz(i) = shr_orb_cosz(calday, lat, lon, declin) - - ! if (cosz(i) > 0.0_r8) then - ! ! call norman radiation scheme - ! call PatchNormanRadiation(rhol, rhos, taul, taus, xl, clumping_index, & - ! canopy_area_profile, elai_profile, esai_profile, fcansno, & - ! cosz(i), nrad, 2, k_dir(:,i)) - ! end if - ! end do - - ! call write_radiation_data(out_file, k_dir, cosz) - - close(logf) - -end program FatesUnitTestRadiation - -!:.............................................................................: - -subroutine read_radiation_namelist(year, jday, lat, lon, num_pft, fcansno, & - patch_file, out_file) - ! - ! DESCRIPTION: - ! read in the namelist associated with the radiation unit tests and - ! initialize values - ! - - use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf - use FatesConstantsMod, only : r8 => fates_r8 - - implicit none - - ! ARGUMENTS: - character(len=MAX_PATH), intent(out) :: patch_file ! patch data file name - character(len=MAX_PATH), intent(out) :: out_file ! output file name - integer, intent(out) :: year, jday ! year and day of year - integer, intent(out) :: num_pft ! number of pfts - real(r8), intent(out) :: lat, lon ! latitude and longitude [degrees] - real(r8), intent(out) :: fcansno ! fraction of canopy covered by snow [0-1] - - ! LOCALS: - character(len=MAX_PATH) :: rad_nl = 'radiation_nl' ! radiation namelist name - character(len=MAX_CHAR) :: msg ! I/O Error message - integer :: rad_nl_file ! unit number for namelist - integer :: ios ! I/O status - - ! Namelist of radiation parameters - namelist /radiation/ year, jday, lat, lon, num_pft, fcansno, patch_file, & - out_file - - ! Now read parameters namelist - rad_nl_file = open_file(trim(rad_nl), 'r') - read(rad_nl_file, radiation, iostat=ios, iomsg=msg) - - if (ios /= 0) then - ! Problem reading file - tell user. - write(logf, '(A, I6, A, A)') "Error reading radiation namelist file", & - ios, " IOMSG: ", msg - stop "Stopped" - end if - - close(rad_nl_file) - -end subroutine read_radiation_namelist - -!:.............................................................................: - -subroutine read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) -! -! DESCRIPTION: -! read in the namelist associated with the pft-specific parameters -! - -use FatesUnitTestIOMod, only : MAX_PATH, MAX_CHAR, open_file, logf -use FatesConstantsMod, only : r8 => fates_r8 - -implicit none - -! ARGUMENTS: -integer, intent(in) :: num_pft ! number of pfts -integer, intent(in) :: numSWB ! number of shortwave bands to simulate -real(r8), intent(out) :: clumping_index(num_pft) ! clumping index -real(r8), intent(out) :: xl(num_pft) ! leaf-stem orientation index -real(r8), intent(out) :: rhol(num_pft,numSWB) ! leaf reflectance [0-1] - -! LOCALS: -character(len=MAX_PATH) :: pft_nl = 'pft_nlfile' ! pft namelist name -character(len=MAX_CHAR) :: msg ! I/O Error message -integer :: pft_nl_file ! unit number for namelist -integer :: ios ! I/O status -real(r8) :: leaf_rhonir(num_pft) ! leaf NIR reflectance [0-1] -real(r8) :: leaf_taunir(num_pft) ! leaf NIR transmittance [0-1] -real(r8) :: leaf_rhovis(num_pft) ! leaf visible reflectance [0-1] -real(r8) :: leaf_tauvis(num_pft) ! leaf visible transmittance [0-1] -real(r8) :: stem_rhonir(num_pft) ! stem NIR reflectance [0-1] -real(r8) :: stem_taunir(num_pft) ! stem NIR transmittance [0-1] -real(r8) :: stem_rhovis(num_pft) ! stem visible reflectance [0-1] -real(r8) :: stem_tauvis(num_pft) ! stem visible transmittance [0-1] - -! Namelist of pft-specific parameters -namelist /params/ clumping_index, xl, leaf_rhonir, leaf_taunir, leaf_rhovis, & - leaf_tauvis, stem_rhonir, stem_taunir, stem_rhovis, stem_tauvis - -! Now read parameters namelist -pft_nl_file = open_file(trim(pft_nl), 'r') -read(pft_nl_file, params, iostat=ios, iomsg=msg) - -if (ios /= 0) then - ! Problem reading file - tell user. - write(logf, '(A, I6, A, A)') "Error reading pft namelist file", & - ios, " IOMSG: ", msg - stop "Stopped" -end if - -! combine arrays -rhol(:,1) = leaf_rhovis -rhol(:,2) = leaf_rhonir - -close(pft_nl_file) - -end subroutine read_pft_namelist - -!:.............................................................................: - -subroutine init_pft_data(num_pft, numSWB) - ! - ! DESCRIPTION: - ! read in the namelist associated with the pft-specific parameters and - ! initialize data - ! - - use EDPftvarcon, only : EDPftvarcon_inst - use FatesParametersInterface, only : fates_parameters_type - use FatesConstantsMod, only : r8 => fates_r8 - - implicit none - - ! ARGUMENTS: - integer, intent(in) :: num_pft ! number of pfts - integer, intent(in) :: numSWB ! number of shortwave bands to simulate - - ! LOCALS: - class(fates_parameters_type), allocatable :: fates_params ! FATES input parameters - real(r8) :: clumping_index(num_pft) ! clumping index - real(r8) :: xl(num_pft) ! leaf-stem orientation index - real(r8) :: rhol(num_pft,numSWB) ! leaf reflectance [0-1] - real(r8) :: rhos(num_pft,numSWB) ! stem reflectance [0-1] - real(r8) :: taul(num_pft,numSWB) ! leaf transmittance [0-1] - real(r8) :: taus(num_pft,numSWB) ! stem transmittance [0-1] - - ! initialize EDPFTvarcon_inst and fates_params - call EDPftvarcon_inst%Init() - allocate(fates_params) - call fates_params%Init() - call EDPftvarcon_inst%Register(fates_params) - - ! read in parameter values - call read_pft_namelist(num_pft, numSWB, clumping_index, xl, rhol) - - ! set values - ! TODO: make this read in from a parameter file, this is hacky - EDPftvarcon_inst%clumping_index = clumping_index - EDPftvarcon_inst%xl = xl - EDPftvarcon_inst%rhol = rhol - EDPftvarcon_inst%rhos = rhos - EDPftvarcon_inst%taul = taul - EDPftvarcon_inst%taus = taus - -end subroutine init_pft_data - - - diff --git a/biogeophys/test/solar_rad_test/pft_nlfile b/biogeophys/test/solar_rad_test/pft_nlfile deleted file mode 100644 index bce144acef..0000000000 --- a/biogeophys/test/solar_rad_test/pft_nlfile +++ /dev/null @@ -1,14 +0,0 @@ -¶ms -! parameters for the radiation unit test -! see FatesUnitTestRadiation.F90 -leaf_rhonir = 0.46 0.41 0.39 0.46 0.41 0.41 0.46 0.41 0.41 0.28 0.28 0.28 -leaf_taunir = 0.33 0.32 0.42 0.33 0.43 0.43 0.33 0.43 0.43 0.40 0.40 0.40 -leaf_rhovis = 0.11 0.09 0.08 0.11 0.08 0.08 0.11 0.08 0.08 0.05 0.05 0.05 -leaf_tauvis = 0.06 0.04 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.05 0.05 0.05 -stem_rhovis = 0.21 0.12 0.12 0.21 0.21 0.21 0.21 0.21 0.21 0.31 0.31 0.31 -stem_rhonir = 0.49 0.36 0.36 0.49 0.49 0.49 0.49 0.49 0.49 0.53 0.53 0.53 -stem_tauvis = 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.120 0.120 0.120 -stem_taunir = 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.250 0.250 0.250 -xl = 0.32 0.01 0.01 0.32 0.20 0.59 0.32 0.59 0.59 -0.23 -0.23 -0.23 -clumping_index = 0.85 0.85 0.80 0.85 0.85 0.90 0.85 0.90 0.90 0.75 0.75 0.75 -/ diff --git a/biogeophys/test/solar_rad_test/radiation_nl b/biogeophys/test/solar_rad_test/radiation_nl deleted file mode 100644 index 5c5cdf4c1f..0000000000 --- a/biogeophys/test/solar_rad_test/radiation_nl +++ /dev/null @@ -1,12 +0,0 @@ -&radiation -! parameters for the radiation unit test -! see FatesUnitTestRadiation.F90 -year = 2000 -jday = 165 -lat = 45.0 -lon = 238.0 -num_pft = 12 -fcansno = 0.0 -patch_file = 'patch_data.nc' -out_file = 'radiation_out.nc' -/ diff --git a/test_list.xml b/test_list.xml deleted file mode 100644 index 41719be6c2..0000000000 --- a/test_list.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - unit_testing/test/radiation_test - - - diff --git a/unit_test_shr/CMakeLists.txt b/unit_test_shr/CMakeLists.txt deleted file mode 100644 index 783299e740..0000000000 --- a/unit_test_shr/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Append sources from this directory to the list. -list(APPEND fates_sources - FatesUnitTestIOMod.F90 - FatesUnitTestOrbitalMod.F90) - -# Export source list to parent -sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/unit_test_shr/FatesUnitTestIOMod.F90 b/unit_test_shr/FatesUnitTestIOMod.F90 deleted file mode 100644 index 47f88080b4..0000000000 --- a/unit_test_shr/FatesUnitTestIOMod.F90 +++ /dev/null @@ -1,434 +0,0 @@ -module FatesUnitTestIOMod - use FatesConstantsMod, only : r8 => fates_r8 - use shr_kind_mod, only : SHR_KIND_CL - use netcdf - - implicit none - - ! LOCALS - integer, parameter :: BASE_UNIT = 10 ! Base unit for files the first time unit_number is called - integer, parameter :: MAX_PATH = 256 ! Maximum path length - integer, parameter :: MAX_CHAR = 80 ! Maximum length for messages - integer :: logf ! Unit number for output log file - - interface get_var - module procedure get_var1D_real - module procedure get_var2D_real - module procedure get_var3D_real - module procedure get_var1D_int - module procedure get_var2D_int - module procedure get_var3D_int - end interface - - contains - - integer function unit_number() - ! - ! DESCRIPTION: - ! Generates a unit number to be used in opening files - ! The first time the function is called, it returns BASE_UNIT - ! - ! LOCALS: - integer :: iunit ! File unit (increments after first call) - logical :: first = .true. ! First time this has been called? - save - - if (first) then - ! Set first to false and iunit to base unit on first call - iunit = BASE_UNIT - first = .false. - else - ! Otherwise, increment - iunit = iunit + 1 - endif - - ! Set to output - unit_number = iunit - - end function unit_number - - !:.........................................................................: - - integer function open_file(filename, mode) - ! - ! DESCRIPTION: - ! Opens the file filename if it can, returns a unit number for it. - ! The first time the function is called, it returns BASE_UNIT - ! - - ! ARGUMENTS: - character(len = *), intent(in) :: filename ! Name of file to open - character(len = *), intent(in), optional :: mode ! Optional mode ('r', 'w', 'rw') - - ! LOCALS: - character(len = 9) :: fmode ! File open mode - logical :: file_exists ! Does the file exist? - character(len = MAX_PATH) :: fname ! Local filename (trimmed) - integer :: i ! Looping index - integer :: ios ! I/O status - integer :: iunit = BASE_UNIT ! File unit number - integer, dimension(MAX_PATH) :: farray ! Array of characters of file name - - ! Get mode of open (read, write, or read/write) - ! Defaults to read/write - if (present(mode)) then - select case(mode) - case ('r', 'R') - fmode = 'read' - case ('w', 'W') - fmode = 'write' - case ('rw', 'RW', 'wr', 'WR') - fmode = 'readwrite' - case DEFAULT - fmode = 'readwrite' - end select - else - fmode = 'readwrite' - endif - - ! trim filename of whitespace - fname = trim(adjustl(filename)) - - if (fmode == 'read' .or. fmode == 'readwrite') then - ! Check for valid name of file - farray = 0 - do i = 1, len_trim(fname) - farray(i) = ichar(fname(i:i)) - enddo - if (any(farray > 126)) then - write(logf,'(A)') "Invalid filename" - stop - endif - endif - - ! Does the file exist? - inquire(file = fname, exist = file_exists) - - ! Open file if conditions are correct - if (file_exists .and. fmode == 'write') then - write(logf,'(A,A,A)') "File ", fname(1:len_trim(fname)), & - " exists. Cannot open write only." - stop - else if (.not. file_exists .and. fmode == 'read') then - write(logf, '(A,A,A)') "File ", fname(1:len_trim(fname)), & - " does not exist. Can't read." - stop - else - iunit = unit_number() - open(iunit, file=fname, action=fmode, iostat=ios) - if (ios /= 0) then - write(logf,'(A,A,A,I6)') "Problem opening", & - fname(1:len_trim(fname)), " ios: ", ios - stop - endif - endif - - open_file = iunit - - end function open_file - - !:.........................................................................: - - subroutine check(status) - ! - ! DESCRIPTION: - ! Checks status of netcdf operations - - ! ARGUMENTS: - integer, intent (in) :: status ! return status code from a netcdf procedure - - if (status /= nf90_noerr) then - write(logf,*) trim(nf90_strerror(status)) - stop - end if - - end subroutine check - - !:.........................................................................: - - subroutine read_patch_data(file, num_pft, canopy_area, elai, esai, nrad) - ! - ! DESCRIPTION: - ! Reads and return patch data - ! - - ! ARGUMENTS: - character(len=MAX_PATH), intent(in) :: file ! patch file name - integer, intent(in) :: num_pft ! number of PFTs - real(r8), allocatable, intent(out) :: canopy_area(:,:,:) ! canopy area profile - real(r8), allocatable, intent(out) :: elai(:,:,:) ! exposed lai profile - real(r8), allocatable, intent(out) :: esai(:,:,:) ! exposed sai profile - integer, allocatable, intent(out) :: nrad(:,:) ! number of exposed leaf layers - - ! LOCALS: - integer :: ncid ! netcdf file unit number - - ! open file - call check(nf90_open(trim(file), 0, ncid)) - - ! read in data - call get_var(ncid, 'can_area', canopy_area) - call get_var(ncid, 'elai', elai) - call get_var(ncid, 'esai', esai) - call get_var(ncid, 'nrad', nrad) - - ! close file - call check(nf90_close(ncid)) - - end subroutine read_patch_data - - !:.........................................................................: - - subroutine get_dims(ncid, varID, dim_lens) - ! - ! DESCRIPTION: - ! Get dimensions for a netcdf variable - ! - - ! ARGUMENTS - integer, intent(in) :: ncid ! netcdf file unit ID - integer, intent(in) :: varID ! variable ID - integer, allocatable, intent(out) :: dim_lens(:) ! dimension lengths - - ! LOCALS: - integer :: numDims ! number of dimensions - integer, allocatable :: dimIDs(:) ! dimension IDs - integer :: i ! looping index - - ! find dimensions of data - call check(nf90_inquire_variable(ncid, varID, ndims=numDims)) - - ! allocate data to grab dimension information - allocate(dim_lens(numDims)) - allocate(dimIDs(numDims)) - - ! get dimIDs - call check(nf90_inquire_variable(ncid, varID, dimids=dimIDs)) - - ! grab these dimensions - do i = 1, numDims - call check(nf90_inquire_dimension(ncid, dimIDs(i), len=dim_lens(i))) - end do - - end subroutine get_dims - - !:.........................................................................: - - subroutine get_var1D_real(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 1D real data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - real(r8), allocatable, intent(out) :: data(:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var1D_real - - !:.........................................................................: - - subroutine get_var1D_int(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 1D integer data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - integer, allocatable, intent(out) :: data(:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var1D_int - - !:.........................................................................: - - subroutine get_var2D_real(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 2D real data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - real(r8), allocatable, intent(out) :: data(:,:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1), dim_lens(2))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var2D_real - - !:.........................................................................: - - subroutine get_var2D_int(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 2D integer data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - integer, allocatable, intent(out) :: data(:,:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1), dim_lens(2))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var2D_int - - !:.........................................................................: - - subroutine get_var3D_real(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 3D real data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - real(r8), allocatable, intent(out) :: data(:,:,:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1), dim_lens(2), dim_lens(3))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var3D_real - - !:.........................................................................: - - subroutine get_var3D_int(ncid, var_name, data) - ! - ! DESCRIPTION: - ! Read in variables for 3D integer data - ! - - ! ARGUMENTS: - integer, intent(in) :: ncid ! netcdf file unit ID - character(len=*), intent(in) :: var_name ! variable name - integer, allocatable, intent(out) :: data(:,:,:) ! data values - - ! LOCALS: - integer :: varID ! variable ID - integer, allocatable :: dim_lens(:) ! dimension lengths - - ! find variable ID first - call check(nf90_inq_varid(ncid, var_name, varID)) - - ! get dimensions of data - call get_dims(ncid, varID, dim_lens) - - ! read data - allocate(data(dim_lens(1), dim_lens(2), dim_lens(3))) - call check(nf90_get_var(ncid, varID, data)) - - end subroutine get_var3D_int - - !:.........................................................................: - - ! subroutine write_radiation_data(file, kdir, declin) - ! ! - ! ! DESCRIPTION: - ! ! Opens the file filename if it can, returns a unit number for it. - ! ! The first time the function is called, it returns BASE_UNIT - ! ! - - ! ! ARGUMENTS: - ! character(len=MAX_PATH), intent(in) :: file ! output file name - ! real(r8), intent(in) :: kdir(num_pft,48) ! direct beam extinction coefficient - ! real(r8), intent(in) :: declin(48) - - ! ! LOCALS: - ! integer :: ncid - ! integer :: pft_dimid, time_dimid - ! integer :: kdir_id, declin_id - ! integer :: dimids(2) - - ! ! Create the netCDF file. The nf90_clobber parameter tells netCDF to - ! ! overwrite this file, if it already exists. - ! call check(nf90_create(trim(file), NF90_CLOBBER, ncid)) - - ! ! define dimensions - ! call check(nf90_def_dim(ncid, "pft", num_pft, pft_dimid)) - ! call check(nf90_def_dim(ncid, "time", 48, time_dimid)) - - ! ! define the variables - ! dimids = (/ pft_dimid, time_dimid/) - ! call check(nf90_def_var(ncid, "kdir", NF90_REAL8, dimids, kdir_id)) - ! call check(nf90_def_var(ncid, "declin", NF90_REAL8, time_dimid, declin_id)) - - ! ! end define mode - ! call check(nf90_enddef(ncid)) - - ! ! write to file. - ! call check(nf90_put_var(ncid, kdir_id, kdir)) - ! call check(nf90_put_var(ncid, declin_id, declin)) - - ! ! close the file. - ! call check(nf90_close(ncid)) - - ! end subroutine write_radiation_data - -end module FatesUnitTestIOMod \ No newline at end of file diff --git a/unit_test_shr/FatesUnitTestOrbitalMod.F90 b/unit_test_shr/FatesUnitTestOrbitalMod.F90 deleted file mode 100644 index 843bf1e217..0000000000 --- a/unit_test_shr/FatesUnitTestOrbitalMod.F90 +++ /dev/null @@ -1,581 +0,0 @@ -module FatesUnitTestOrbitalMod - ! - ! DESCRIPTION: - ! Helper procedures for getting orbital values - ! Copied from shr_orb_mod from https://github.com/ESCOMP/CESM_share - ! - ! - - use FatesUnitTestIOMod - - implicit none - - integer, parameter :: SHR_KIND_R8 = selected_real_kind(12) ! 8 byte real - integer, parameter :: SHR_KIND_IN = kind(1) ! native integer - real(SHR_KIND_R8), parameter :: pi = 3.14159265358979323846_SHR_KIND_R8 - real(SHR_KIND_R8), parameter :: SHR_ORB_ECCEN_MIN = 0.0_SHR_KIND_R8 ! min value for eccen - real(SHR_KIND_R8), parameter :: SHR_ORB_ECCEN_MAX = 0.1_SHR_KIND_R8 ! max value for eccen - real(SHR_KIND_R8), parameter :: SHR_ORB_OBLIQ_MIN = -90.0_SHR_KIND_R8 ! min value for obliq - real(SHR_KIND_R8), parameter :: SHR_ORB_OBLIQ_MAX = +90.0_SHR_KIND_R8 ! max value for obliq - real(SHR_KIND_R8), parameter :: SHR_ORB_MVELP_MIN = 0.0_SHR_KIND_R8 ! min value for mvelp - real(SHR_KIND_R8), parameter :: SHR_ORB_MVELP_MAX = 360.0_SHR_KIND_R8 ! max value for mvelp - integer(SHR_KIND_IN), parameter :: SHR_ORB_UNDEF_INT = 2000000000 ! undefined int - real(SHR_KIND_R8), parameter :: SHR_ORB_UNDEF_REAL = 1.e36_SHR_KIND_R8 ! undefined real - - contains - - subroutine get_orbital_vals(iyear_AD, s_logunit, eccen, mvelp, obliqr, & - lambm0, mvelpp) - ! - ! Gets orbital values for a specific day - ! - - ! Data dictionary: calling arguments - integer(SHR_KIND_IN), intent(in) :: iyear_AD ! Year to calculate orbit for - integer, intent(in) :: s_logunit ! log file unit number - real(SHR_KIND_R8), intent(out) :: eccen ! orbital eccentricity - real(SHR_KIND_R8), intent(out) :: mvelp ! moving vernal equinox long - real(SHR_KIND_R8), intent(out) :: obliqr ! Earths obliquity in rad - real(SHR_KIND_R8), intent(out) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) - real(SHR_KIND_R8), intent(out) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) - - real(SHR_KIND_R8) :: obliq ! obliquity in degrees - - obliq = SHR_ORB_UNDEF_REAL - eccen = SHR_ORB_UNDEF_REAL - mvelp = SHR_ORB_UNDEF_REAL - - call shr_orb_params(iyear_AD, eccen, obliq, mvelp, obliqr, lambm0, & - mvelpp, s_logunit) - - end subroutine get_orbital_vals - - !:.........................................................................: - - subroutine shr_orb_params(iyear_AD, eccen, obliq, mvelp, & - obliqr, lambm0, mvelpp, s_logunit) - - !--------------------------------------------------------------------------- - ! - ! Calculate earths orbital parameters using Dave Threshers formula which - ! came from Berger, Andre. 1978 "A Simple Algorithm to Compute Long-Term - ! Variations of Daily Insolation". Contribution 18, Institute of Astronomy - ! and Geophysics, Universite Catholique de Louvain, Louvain-la-Neuve, Belgium - ! - !------------------------------Code history--------------------------------- - ! - ! Original Author: Erik Kluzek - ! Date: Oct/97 - ! - !--------------------------------------------------------------------------- - - !----------------------------- Arguments ----------------------------------- - integer(SHR_KIND_IN), intent(in) :: iyear_AD ! Year to calculate orbit for - real(SHR_KIND_R8), intent(inout) :: eccen ! orbital eccentricity - real(SHR_KIND_R8), intent(inout) :: obliq ! obliquity in degrees - real(SHR_KIND_R8), intent(inout) :: mvelp ! moving vernal equinox long - real(SHR_KIND_R8), intent(out) :: obliqr ! Earths obliquity in rad - real(SHR_KIND_R8), intent(out) :: lambm0 ! Mean long of perihelion at vernal equinox (radians) - real(SHR_KIND_R8), intent(out) :: mvelpp ! moving vernal equinox long of perihelion plus pi (rad) - integer, intent(in) :: s_logunit ! log file unit number - - !------------------------------ Parameters ---------------------------------- - integer(SHR_KIND_IN), parameter :: poblen = 47 ! # of elements in series wrt obliquity - integer(SHR_KIND_IN), parameter :: pecclen = 19 ! # of elements in series wrt eccentricity - integer(SHR_KIND_IN), parameter :: pmvelen = 78 ! # of elements in series wrt vernal equinox - real(SHR_KIND_R8), parameter :: psecdeg = 1.0_SHR_KIND_R8/3600.0_SHR_KIND_R8 ! arc sec to deg conversion - - real(SHR_KIND_R8) :: degrad = pi/180._SHR_KIND_R8 ! degree to radian conversion factor - real(SHR_KIND_R8) :: yb4_1950AD ! number of years before 1950 AD - - ! Cosine series data for computation of obliquity: amplitude (arc seconds), - ! rate (arc seconds/year), phase (degrees). - - real (SHR_KIND_R8), parameter :: obamp(poblen) = & ! amplitudes for obliquity cos series - & (/ -2462.2214466_SHR_KIND_R8, -857.3232075_SHR_KIND_R8, -629.3231835_SHR_KIND_R8, & - & -414.2804924_SHR_KIND_R8, -311.7632587_SHR_KIND_R8, 308.9408604_SHR_KIND_R8, & - & -162.5533601_SHR_KIND_R8, -116.1077911_SHR_KIND_R8, 101.1189923_SHR_KIND_R8, & - & -67.6856209_SHR_KIND_R8, 24.9079067_SHR_KIND_R8, 22.5811241_SHR_KIND_R8, & - & -21.1648355_SHR_KIND_R8, -15.6549876_SHR_KIND_R8, 15.3936813_SHR_KIND_R8, & - & 14.6660938_SHR_KIND_R8, -11.7273029_SHR_KIND_R8, 10.2742696_SHR_KIND_R8, & - & 6.4914588_SHR_KIND_R8, 5.8539148_SHR_KIND_R8, -5.4872205_SHR_KIND_R8, & - & -5.4290191_SHR_KIND_R8, 5.1609570_SHR_KIND_R8, 5.0786314_SHR_KIND_R8, & - & -4.0735782_SHR_KIND_R8, 3.7227167_SHR_KIND_R8, 3.3971932_SHR_KIND_R8, & - & -2.8347004_SHR_KIND_R8, -2.6550721_SHR_KIND_R8, -2.5717867_SHR_KIND_R8, & - & -2.4712188_SHR_KIND_R8, 2.4625410_SHR_KIND_R8, 2.2464112_SHR_KIND_R8, & - & -2.0755511_SHR_KIND_R8, -1.9713669_SHR_KIND_R8, -1.8813061_SHR_KIND_R8, & - & -1.8468785_SHR_KIND_R8, 1.8186742_SHR_KIND_R8, 1.7601888_SHR_KIND_R8, & - & -1.5428851_SHR_KIND_R8, 1.4738838_SHR_KIND_R8, -1.4593669_SHR_KIND_R8, & - & 1.4192259_SHR_KIND_R8, -1.1818980_SHR_KIND_R8, 1.1756474_SHR_KIND_R8, & - & -1.1316126_SHR_KIND_R8, 1.0896928_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: obrate(poblen) = & ! rates for obliquity cosine series - & (/ 31.609974_SHR_KIND_R8, 32.620504_SHR_KIND_R8, 24.172203_SHR_KIND_R8, & - & 31.983787_SHR_KIND_R8, 44.828336_SHR_KIND_R8, 30.973257_SHR_KIND_R8, & - & 43.668246_SHR_KIND_R8, 32.246691_SHR_KIND_R8, 30.599444_SHR_KIND_R8, & - & 42.681324_SHR_KIND_R8, 43.836462_SHR_KIND_R8, 47.439436_SHR_KIND_R8, & - & 63.219948_SHR_KIND_R8, 64.230478_SHR_KIND_R8, 1.010530_SHR_KIND_R8, & - & 7.437771_SHR_KIND_R8, 55.782177_SHR_KIND_R8, 0.373813_SHR_KIND_R8, & - & 13.218362_SHR_KIND_R8, 62.583231_SHR_KIND_R8, 63.593761_SHR_KIND_R8, & - & 76.438310_SHR_KIND_R8, 45.815258_SHR_KIND_R8, 8.448301_SHR_KIND_R8, & - & 56.792707_SHR_KIND_R8, 49.747842_SHR_KIND_R8, 12.058272_SHR_KIND_R8, & - & 75.278220_SHR_KIND_R8, 65.241008_SHR_KIND_R8, 64.604291_SHR_KIND_R8, & - & 1.647247_SHR_KIND_R8, 7.811584_SHR_KIND_R8, 12.207832_SHR_KIND_R8, & - & 63.856665_SHR_KIND_R8, 56.155990_SHR_KIND_R8, 77.448840_SHR_KIND_R8, & - & 6.801054_SHR_KIND_R8, 62.209418_SHR_KIND_R8, 20.656133_SHR_KIND_R8, & - & 48.344406_SHR_KIND_R8, 55.145460_SHR_KIND_R8, 69.000539_SHR_KIND_R8, & - & 11.071350_SHR_KIND_R8, 74.291298_SHR_KIND_R8, 11.047742_SHR_KIND_R8, & - & 0.636717_SHR_KIND_R8, 12.844549_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: obphas(poblen) = & ! phases for obliquity cosine series - & (/ 251.9025_SHR_KIND_R8, 280.8325_SHR_KIND_R8, 128.3057_SHR_KIND_R8, & - & 292.7252_SHR_KIND_R8, 15.3747_SHR_KIND_R8, 263.7951_SHR_KIND_R8, & - & 308.4258_SHR_KIND_R8, 240.0099_SHR_KIND_R8, 222.9725_SHR_KIND_R8, & - & 268.7809_SHR_KIND_R8, 316.7998_SHR_KIND_R8, 319.6024_SHR_KIND_R8, & - & 143.8050_SHR_KIND_R8, 172.7351_SHR_KIND_R8, 28.9300_SHR_KIND_R8, & - & 123.5968_SHR_KIND_R8, 20.2082_SHR_KIND_R8, 40.8226_SHR_KIND_R8, & - & 123.4722_SHR_KIND_R8, 155.6977_SHR_KIND_R8, 184.6277_SHR_KIND_R8, & - & 267.2772_SHR_KIND_R8, 55.0196_SHR_KIND_R8, 152.5268_SHR_KIND_R8, & - & 49.1382_SHR_KIND_R8, 204.6609_SHR_KIND_R8, 56.5233_SHR_KIND_R8, & - & 200.3284_SHR_KIND_R8, 201.6651_SHR_KIND_R8, 213.5577_SHR_KIND_R8, & - & 17.0374_SHR_KIND_R8, 164.4194_SHR_KIND_R8, 94.5422_SHR_KIND_R8, & - & 131.9124_SHR_KIND_R8, 61.0309_SHR_KIND_R8, 296.2073_SHR_KIND_R8, & - & 135.4894_SHR_KIND_R8, 114.8750_SHR_KIND_R8, 247.0691_SHR_KIND_R8, & - & 256.6114_SHR_KIND_R8, 32.1008_SHR_KIND_R8, 143.6804_SHR_KIND_R8, & - & 16.8784_SHR_KIND_R8, 160.6835_SHR_KIND_R8, 27.5932_SHR_KIND_R8, & - & 348.1074_SHR_KIND_R8, 82.6496_SHR_KIND_R8/) - - ! Cosine/sine series data for computation of eccentricity and fixed vernal - ! equinox longitude of perihelion (fvelp): amplitude, - ! rate (arc seconds/year), phase (degrees). - - real (SHR_KIND_R8), parameter :: ecamp (pecclen) = & ! ampl for eccen/fvelp cos/sin series - & (/ 0.01860798_SHR_KIND_R8, 0.01627522_SHR_KIND_R8, -0.01300660_SHR_KIND_R8, & - & 0.00988829_SHR_KIND_R8, -0.00336700_SHR_KIND_R8, 0.00333077_SHR_KIND_R8, & - & -0.00235400_SHR_KIND_R8, 0.00140015_SHR_KIND_R8, 0.00100700_SHR_KIND_R8, & - & 0.00085700_SHR_KIND_R8, 0.00064990_SHR_KIND_R8, 0.00059900_SHR_KIND_R8, & - & 0.00037800_SHR_KIND_R8, -0.00033700_SHR_KIND_R8, 0.00027600_SHR_KIND_R8, & - & 0.00018200_SHR_KIND_R8, -0.00017400_SHR_KIND_R8, -0.00012400_SHR_KIND_R8, & - & 0.00001250_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: ecrate(pecclen) = & ! rates for eccen/fvelp cos/sin series - & (/ 4.2072050_SHR_KIND_R8, 7.3460910_SHR_KIND_R8, 17.8572630_SHR_KIND_R8, & - & 17.2205460_SHR_KIND_R8, 16.8467330_SHR_KIND_R8, 5.1990790_SHR_KIND_R8, & - & 18.2310760_SHR_KIND_R8, 26.2167580_SHR_KIND_R8, 6.3591690_SHR_KIND_R8, & - & 16.2100160_SHR_KIND_R8, 3.0651810_SHR_KIND_R8, 16.5838290_SHR_KIND_R8, & - & 18.4939800_SHR_KIND_R8, 6.1909530_SHR_KIND_R8, 18.8677930_SHR_KIND_R8, & - & 17.4255670_SHR_KIND_R8, 6.1860010_SHR_KIND_R8, 18.4174410_SHR_KIND_R8, & - & 0.6678630_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: ecphas(pecclen) = & ! phases for eccen/fvelp cos/sin series - & (/ 28.620089_SHR_KIND_R8, 193.788772_SHR_KIND_R8, 308.307024_SHR_KIND_R8, & - & 320.199637_SHR_KIND_R8, 279.376984_SHR_KIND_R8, 87.195000_SHR_KIND_R8, & - & 349.129677_SHR_KIND_R8, 128.443387_SHR_KIND_R8, 154.143880_SHR_KIND_R8, & - & 291.269597_SHR_KIND_R8, 114.860583_SHR_KIND_R8, 332.092251_SHR_KIND_R8, & - & 296.414411_SHR_KIND_R8, 145.769910_SHR_KIND_R8, 337.237063_SHR_KIND_R8, & - & 152.092288_SHR_KIND_R8, 126.839891_SHR_KIND_R8, 210.667199_SHR_KIND_R8, & - & 72.108838_SHR_KIND_R8/) - - ! Sine series data for computation of moving vernal equinox longitude of - ! perihelion: amplitude (arc seconds), rate (arc sec/year), phase (degrees). - - real (SHR_KIND_R8), parameter :: mvamp (pmvelen) = & ! amplitudes for mvelp sine series - & (/ 7391.0225890_SHR_KIND_R8, 2555.1526947_SHR_KIND_R8, 2022.7629188_SHR_KIND_R8, & - & -1973.6517951_SHR_KIND_R8, 1240.2321818_SHR_KIND_R8, 953.8679112_SHR_KIND_R8, & - & -931.7537108_SHR_KIND_R8, 872.3795383_SHR_KIND_R8, 606.3544732_SHR_KIND_R8, & - & -496.0274038_SHR_KIND_R8, 456.9608039_SHR_KIND_R8, 346.9462320_SHR_KIND_R8, & - & -305.8412902_SHR_KIND_R8, 249.6173246_SHR_KIND_R8, -199.1027200_SHR_KIND_R8, & - & 191.0560889_SHR_KIND_R8, -175.2936572_SHR_KIND_R8, 165.9068833_SHR_KIND_R8, & - & 161.1285917_SHR_KIND_R8, 139.7878093_SHR_KIND_R8, -133.5228399_SHR_KIND_R8, & - & 117.0673811_SHR_KIND_R8, 104.6907281_SHR_KIND_R8, 95.3227476_SHR_KIND_R8, & - & 86.7824524_SHR_KIND_R8, 86.0857729_SHR_KIND_R8, 70.5893698_SHR_KIND_R8, & - & -69.9719343_SHR_KIND_R8, -62.5817473_SHR_KIND_R8, 61.5450059_SHR_KIND_R8, & - & -57.9364011_SHR_KIND_R8, 57.1899832_SHR_KIND_R8, -57.0236109_SHR_KIND_R8, & - & -54.2119253_SHR_KIND_R8, 53.2834147_SHR_KIND_R8, 52.1223575_SHR_KIND_R8, & - & -49.0059908_SHR_KIND_R8, -48.3118757_SHR_KIND_R8, -45.4191685_SHR_KIND_R8, & - & -42.2357920_SHR_KIND_R8, -34.7971099_SHR_KIND_R8, 34.4623613_SHR_KIND_R8, & - & -33.8356643_SHR_KIND_R8, 33.6689362_SHR_KIND_R8, -31.2521586_SHR_KIND_R8, & - & -30.8798701_SHR_KIND_R8, 28.4640769_SHR_KIND_R8, -27.1960802_SHR_KIND_R8, & - & 27.0860736_SHR_KIND_R8, -26.3437456_SHR_KIND_R8, 24.7253740_SHR_KIND_R8, & - & 24.6732126_SHR_KIND_R8, 24.4272733_SHR_KIND_R8, 24.0127327_SHR_KIND_R8, & - & 21.7150294_SHR_KIND_R8, -21.5375347_SHR_KIND_R8, 18.1148363_SHR_KIND_R8, & - & -16.9603104_SHR_KIND_R8, -16.1765215_SHR_KIND_R8, 15.5567653_SHR_KIND_R8, & - & 15.4846529_SHR_KIND_R8, 15.2150632_SHR_KIND_R8, 14.5047426_SHR_KIND_R8, & - & -14.3873316_SHR_KIND_R8, 13.1351419_SHR_KIND_R8, 12.8776311_SHR_KIND_R8, & - & 11.9867234_SHR_KIND_R8, 11.9385578_SHR_KIND_R8, 11.7030822_SHR_KIND_R8, & - & 11.6018181_SHR_KIND_R8, -11.2617293_SHR_KIND_R8, -10.4664199_SHR_KIND_R8, & - & 10.4333970_SHR_KIND_R8, -10.2377466_SHR_KIND_R8, 10.1934446_SHR_KIND_R8, & - & -10.1280191_SHR_KIND_R8, 10.0289441_SHR_KIND_R8, -10.0034259_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: mvrate(pmvelen) = & ! rates for mvelp sine series - & (/ 31.609974_SHR_KIND_R8, 32.620504_SHR_KIND_R8, 24.172203_SHR_KIND_R8, & - & 0.636717_SHR_KIND_R8, 31.983787_SHR_KIND_R8, 3.138886_SHR_KIND_R8, & - & 30.973257_SHR_KIND_R8, 44.828336_SHR_KIND_R8, 0.991874_SHR_KIND_R8, & - & 0.373813_SHR_KIND_R8, 43.668246_SHR_KIND_R8, 32.246691_SHR_KIND_R8, & - & 30.599444_SHR_KIND_R8, 2.147012_SHR_KIND_R8, 10.511172_SHR_KIND_R8, & - & 42.681324_SHR_KIND_R8, 13.650058_SHR_KIND_R8, 0.986922_SHR_KIND_R8, & - & 9.874455_SHR_KIND_R8, 13.013341_SHR_KIND_R8, 0.262904_SHR_KIND_R8, & - & 0.004952_SHR_KIND_R8, 1.142024_SHR_KIND_R8, 63.219948_SHR_KIND_R8, & - & 0.205021_SHR_KIND_R8, 2.151964_SHR_KIND_R8, 64.230478_SHR_KIND_R8, & - & 43.836462_SHR_KIND_R8, 47.439436_SHR_KIND_R8, 1.384343_SHR_KIND_R8, & - & 7.437771_SHR_KIND_R8, 18.829299_SHR_KIND_R8, 9.500642_SHR_KIND_R8, & - & 0.431696_SHR_KIND_R8, 1.160090_SHR_KIND_R8, 55.782177_SHR_KIND_R8, & - & 12.639528_SHR_KIND_R8, 1.155138_SHR_KIND_R8, 0.168216_SHR_KIND_R8, & - & 1.647247_SHR_KIND_R8, 10.884985_SHR_KIND_R8, 5.610937_SHR_KIND_R8, & - & 12.658184_SHR_KIND_R8, 1.010530_SHR_KIND_R8, 1.983748_SHR_KIND_R8, & - & 14.023871_SHR_KIND_R8, 0.560178_SHR_KIND_R8, 1.273434_SHR_KIND_R8, & - & 12.021467_SHR_KIND_R8, 62.583231_SHR_KIND_R8, 63.593761_SHR_KIND_R8, & - & 76.438310_SHR_KIND_R8, 4.280910_SHR_KIND_R8, 13.218362_SHR_KIND_R8, & - & 17.818769_SHR_KIND_R8, 8.359495_SHR_KIND_R8, 56.792707_SHR_KIND_R8, & - & 8.448301_SHR_KIND_R8, 1.978796_SHR_KIND_R8, 8.863925_SHR_KIND_R8, & - & 0.186365_SHR_KIND_R8, 8.996212_SHR_KIND_R8, 6.771027_SHR_KIND_R8, & - & 45.815258_SHR_KIND_R8, 12.002811_SHR_KIND_R8, 75.278220_SHR_KIND_R8, & - & 65.241008_SHR_KIND_R8, 18.870667_SHR_KIND_R8, 22.009553_SHR_KIND_R8, & - & 64.604291_SHR_KIND_R8, 11.498094_SHR_KIND_R8, 0.578834_SHR_KIND_R8, & - & 9.237738_SHR_KIND_R8, 49.747842_SHR_KIND_R8, 2.147012_SHR_KIND_R8, & - & 1.196895_SHR_KIND_R8, 2.133898_SHR_KIND_R8, 0.173168_SHR_KIND_R8/) - - real (SHR_KIND_R8), parameter :: mvphas(pmvelen) = & ! phases for mvelp sine series - & (/ 251.9025_SHR_KIND_R8, 280.8325_SHR_KIND_R8, 128.3057_SHR_KIND_R8, & - & 348.1074_SHR_KIND_R8, 292.7252_SHR_KIND_R8, 165.1686_SHR_KIND_R8, & - & 263.7951_SHR_KIND_R8, 15.3747_SHR_KIND_R8, 58.5749_SHR_KIND_R8, & - & 40.8226_SHR_KIND_R8, 308.4258_SHR_KIND_R8, 240.0099_SHR_KIND_R8, & - & 222.9725_SHR_KIND_R8, 106.5937_SHR_KIND_R8, 114.5182_SHR_KIND_R8, & - & 268.7809_SHR_KIND_R8, 279.6869_SHR_KIND_R8, 39.6448_SHR_KIND_R8, & - & 126.4108_SHR_KIND_R8, 291.5795_SHR_KIND_R8, 307.2848_SHR_KIND_R8, & - & 18.9300_SHR_KIND_R8, 273.7596_SHR_KIND_R8, 143.8050_SHR_KIND_R8, & - & 191.8927_SHR_KIND_R8, 125.5237_SHR_KIND_R8, 172.7351_SHR_KIND_R8, & - & 316.7998_SHR_KIND_R8, 319.6024_SHR_KIND_R8, 69.7526_SHR_KIND_R8, & - & 123.5968_SHR_KIND_R8, 217.6432_SHR_KIND_R8, 85.5882_SHR_KIND_R8, & - & 156.2147_SHR_KIND_R8, 66.9489_SHR_KIND_R8, 20.2082_SHR_KIND_R8, & - & 250.7568_SHR_KIND_R8, 48.0188_SHR_KIND_R8, 8.3739_SHR_KIND_R8, & - & 17.0374_SHR_KIND_R8, 155.3409_SHR_KIND_R8, 94.1709_SHR_KIND_R8, & - & 221.1120_SHR_KIND_R8, 28.9300_SHR_KIND_R8, 117.1498_SHR_KIND_R8, & - & 320.5095_SHR_KIND_R8, 262.3602_SHR_KIND_R8, 336.2148_SHR_KIND_R8, & - & 233.0046_SHR_KIND_R8, 155.6977_SHR_KIND_R8, 184.6277_SHR_KIND_R8, & - & 267.2772_SHR_KIND_R8, 78.9281_SHR_KIND_R8, 123.4722_SHR_KIND_R8, & - & 188.7132_SHR_KIND_R8, 180.1364_SHR_KIND_R8, 49.1382_SHR_KIND_R8, & - & 152.5268_SHR_KIND_R8, 98.2198_SHR_KIND_R8, 97.4808_SHR_KIND_R8, & - & 221.5376_SHR_KIND_R8, 168.2438_SHR_KIND_R8, 161.1199_SHR_KIND_R8, & - & 55.0196_SHR_KIND_R8, 262.6495_SHR_KIND_R8, 200.3284_SHR_KIND_R8, & - & 201.6651_SHR_KIND_R8, 294.6547_SHR_KIND_R8, 99.8233_SHR_KIND_R8, & - & 213.5577_SHR_KIND_R8, 154.1631_SHR_KIND_R8, 232.7153_SHR_KIND_R8, & - & 138.3034_SHR_KIND_R8, 204.6609_SHR_KIND_R8, 106.5938_SHR_KIND_R8, & - & 250.4676_SHR_KIND_R8, 332.3345_SHR_KIND_R8, 27.3039_SHR_KIND_R8/) - - !---------------------------Local variables---------------------------------- - integer(SHR_KIND_IN) :: i ! Index for series summations - real (SHR_KIND_R8) :: obsum ! Obliquity series summation - real (SHR_KIND_R8) :: cossum ! Cos series summation for eccentricity/fvelp - real (SHR_KIND_R8) :: sinsum ! Sin series summation for eccentricity/fvelp - real (SHR_KIND_R8) :: fvelp ! Fixed vernal equinox long of perihelion - real (SHR_KIND_R8) :: mvsum ! mvelp series summation - real (SHR_KIND_R8) :: beta ! Intermediate argument for lambm0 - real (SHR_KIND_R8) :: years ! Years to time of interest ( pos <=> future) - real (SHR_KIND_R8) :: eccen2 ! eccentricity squared - real (SHR_KIND_R8) :: eccen3 ! eccentricity cubed - - !-------------------------- Formats ----------------------------------------- - character(len=*),parameter :: F00 = "('(shr_orb_params) ',4a)" - character(len=*),parameter :: F01 = "('(shr_orb_params) ',a,i9)" - character(len=*),parameter :: F02 = "('(shr_orb_params) ',a,f6.3)" - character(len=*),parameter :: F03 = "('(shr_orb_params) ',a,es14.6)" - - !---------------------------------------------------------------------------- - ! radinp and algorithms below will need a degree to radian conversion factor - - ! Check for flag to use input orbit parameters - - IF ( iyear_AD == SHR_ORB_UNDEF_INT ) THEN - - ! Check input obliq, eccen, and mvelp to ensure reasonable - - if( obliq == SHR_ORB_UNDEF_REAL )then - write(s_logunit,F00) ' Have to specify orbital parameters:' - write(s_logunit,F00) 'Either set: iyear_AD, OR [obliq, eccen, and mvelp]:' - write(s_logunit,F00) 'iyear_AD is the year to simulate orbit for (ie. 1950): ' - write(s_logunit,F00) 'obliq, eccen, mvelp specify the orbit directly:' - write(s_logunit,F00) 'The AMIP II settings (for a 1995 orbit) are: ' - write(s_logunit,F00) ' obliq = 23.4441' - write(s_logunit,F00) ' eccen = 0.016715' - write(s_logunit,F00) ' mvelp = 102.7' - stop "Stopped" - end if - if( (obliq < SHR_ORB_OBLIQ_MIN).or.(obliq > SHR_ORB_OBLIQ_MAX) ) then - write(s_logunit,F03) 'Input obliquity unreasonable: ', obliq - stop "Stopped" - end if - if( (eccen < SHR_ORB_ECCEN_MIN).or.(eccen > SHR_ORB_ECCEN_MAX) ) then - write(s_logunit,F03) 'Input eccentricity unreasonable: ', eccen - stop "Stopped" - end if - if( (mvelp < SHR_ORB_MVELP_MIN).or.(mvelp > SHR_ORB_MVELP_MAX) ) then - write(s_logunit,F03) 'Input mvelp unreasonable: ' , mvelp - stop "Stopped" - end if - eccen2 = eccen*eccen - eccen3 = eccen2*eccen - - ELSE ! Otherwise calculate based on years before present - - yb4_1950AD = 1950.0_SHR_KIND_R8 - real(iyear_AD,SHR_KIND_R8) - if ( abs(yb4_1950AD) .gt. 1000000.0_SHR_KIND_R8 )then - write(s_logunit,F00) 'orbit only valid for years+-1000000' - write(s_logunit,F00) 'Relative to 1950 AD' - write(s_logunit,F03) '# of years before 1950: ',yb4_1950AD - write(s_logunit,F01) 'Year to simulate was : ',iyear_AD - stop "Stopped" - end if - - ! The following calculates the earths obliquity, orbital eccentricity - ! (and various powers of it) and vernal equinox mean longitude of - ! perihelion for years in the past (future = negative of years past), - ! using constants (see parameter section) given in the program of: - ! - ! Berger, Andre. 1978 A Simple Algorithm to Compute Long-Term Variations - ! of Daily Insolation. Contribution 18, Institute of Astronomy and - ! Geophysics, Universite Catholique de Louvain, Louvain-la-Neuve, Belgium. - ! - ! and formulas given in the paper (where less precise constants are also - ! given): - ! - ! Berger, Andre. 1978. Long-Term Variations of Daily Insolation and - ! Quaternary Climatic Changes. J. of the Atmo. Sci. 35:2362-2367 - ! - ! The algorithm is valid only to 1,000,000 years past or hence. - ! For a solution valid to 5-10 million years past see the above author. - ! Algorithm below is better for years closer to present than is the - ! 5-10 million year solution. - ! - ! Years to time of interest must be negative of years before present - ! (1950) in formulas that follow. - - years = - yb4_1950AD - - ! In the summations below, cosine or sine arguments, which end up in - ! degrees, must be converted to radians via multiplication by degrad. - ! - ! Summation of cosine series for obliquity (epsilon in Berger 1978) in - ! degrees. Convert the amplitudes and rates, which are in arc secs, into - ! degrees via multiplication by psecdeg (arc seconds to degrees conversion - ! factor). For obliq, first term is Berger 1978 epsilon star; second - ! term is series summation in degrees. - - obsum = 0.0_SHR_KIND_R8 - do i = 1, poblen - obsum = obsum + obamp(i)*psecdeg*cos((obrate(i)*psecdeg*years + & - & obphas(i))*degrad) - end do - obliq = 23.320556_SHR_KIND_R8 + obsum - - ! Summation of cosine and sine series for computation of eccentricity - ! (eccen; e in Berger 1978) and fixed vernal equinox longitude of - ! perihelion (fvelp; pi in Berger 1978), which is used for computation - ! of moving vernal equinox longitude of perihelion. Convert the rates, - ! which are in arc seconds, into degrees via multiplication by psecdeg. - - cossum = 0.0_SHR_KIND_R8 - do i = 1, pecclen - cossum = cossum+ecamp(i)*cos((ecrate(i)*psecdeg*years+ecphas(i))*degrad) - end do - - sinsum = 0.0_SHR_KIND_R8 - do i = 1, pecclen - sinsum = sinsum+ecamp(i)*sin((ecrate(i)*psecdeg*years+ecphas(i))*degrad) - end do - - ! Use summations to calculate eccentricity - - eccen2 = cossum*cossum + sinsum*sinsum - eccen = sqrt(eccen2) - eccen3 = eccen2*eccen - - ! A series of cases for fvelp, which is in radians. - if (abs(cossum) .le. 1.0E-8_SHR_KIND_R8) then - if (sinsum .eq. 0.0_SHR_KIND_R8) then - fvelp = 0.0_SHR_KIND_R8 - else if (sinsum .lt. 0.0_SHR_KIND_R8) then - fvelp = 1.5_SHR_KIND_R8*pi - else if (sinsum .gt. 0.0_SHR_KIND_R8) then - fvelp = .5_SHR_KIND_R8*pi - endif - else if (cossum .lt. 0.0_SHR_KIND_R8) then - fvelp = atan(sinsum/cossum) + pi - else ! cossum > 1.0e-8 - if (sinsum .lt. 0.0_SHR_KIND_R8) then - fvelp = atan(sinsum/cossum) + 2.0_SHR_KIND_R8*pi - else - fvelp = atan(sinsum/cossum) - endif - endif - - ! Summation of sin series for computation of moving vernal equinox long - ! of perihelion (mvelp; omega bar in Berger 1978) in degrees. For mvelp, - ! first term is fvelp in degrees; second term is Berger 1978 psi bar - ! times years and in degrees; third term is Berger 1978 zeta; fourth - ! term is series summation in degrees. Convert the amplitudes and rates, - ! which are in arc seconds, into degrees via multiplication by psecdeg. - ! Series summation plus second and third terms constitute Berger 1978 - ! psi, which is the general precession. - - mvsum = 0.0_SHR_KIND_R8 - do i = 1, pmvelen - mvsum = mvsum + mvamp(i)*psecdeg*sin((mvrate(i)*psecdeg*years + & - & mvphas(i))*degrad) - end do - mvelp = fvelp/degrad + 50.439273_SHR_KIND_R8*psecdeg*years + 3.392506_SHR_KIND_R8 + mvsum - - ! Cases to make sure mvelp is between 0 and 360. - - do while (mvelp .lt. 0.0_SHR_KIND_R8) - mvelp = mvelp + 360.0_SHR_KIND_R8 - end do - do while (mvelp .ge. 360.0_SHR_KIND_R8) - mvelp = mvelp - 360.0_SHR_KIND_R8 - end do - - END IF ! end of test on whether to calculate or use input orbital params - - ! Orbit needs the obliquity in radians - - obliqr = obliq*degrad - - ! 180 degrees must be added to mvelp since observations are made from the - ! earth and the sun is considered (wrongly for the algorithm) to go around - ! the earth. For a more graphic explanation see Appendix B in: - ! - ! A. Berger, M. Loutre and C. Tricot. 1993. Insolation and Earth Orbital - ! Periods. J. of Geophysical Research 98:10,341-10,362. - ! - ! Additionally, orbit will need this value in radians. So mvelp becomes - ! mvelpp (mvelp plus pi) - - mvelpp = (mvelp + 180._SHR_KIND_R8)*degrad - - ! Set up an argument used several times in lambm0 calculation ahead. - - beta = sqrt(1._SHR_KIND_R8 - eccen2) - - ! The mean longitude at the vernal equinox (lambda m nought in Berger - ! 1978; in radians) is calculated from the following formula given in - ! Berger 1978. At the vernal equinox the true longitude (lambda in Berger - ! 1978) is 0. - - lambm0 = 2._SHR_KIND_R8*((.5_SHR_KIND_R8*eccen + .125_SHR_KIND_R8*eccen3)*(1._SHR_KIND_R8 + beta)*sin(mvelpp) & - & - .250_SHR_KIND_R8*eccen2*(.5_SHR_KIND_R8 + beta)*sin(2._SHR_KIND_R8*mvelpp) & - & + .125_SHR_KIND_R8*eccen3*(1._SHR_KIND_R8/3._SHR_KIND_R8 + beta)*sin(3._SHR_KIND_R8*mvelpp)) - - end subroutine shr_orb_params - - !:..........................................................................: - - subroutine shr_orb_decl(calday, eccen, mvelpp, lambm0, obliqr, delta, eccf) - - !------------------------------------------------------------------------- - ! - ! Compute earth/orbit parameters using formula suggested by - ! Duane Thresher. - ! - !---------------------------Code history---------------------------------- - ! - ! Original version: Erik Kluzek - ! Date: Oct/1997 - ! - !------------------------------------------------------------------------- - - !------------------------------Arguments-------------------------------- - real(SHR_KIND_R8), intent(in) :: calday ! Calendar day, including fraction - real(SHR_KIND_R8), intent(in) :: eccen ! Eccentricity - real(SHR_KIND_R8), intent(in) :: obliqr ! Earths obliquity in radians - real(SHR_KIND_R8), intent(in) :: lambm0 ! Mean long of perihelion at the vernal equinox (radians) - real(SHR_KIND_R8), intent(in) :: mvelpp ! moving vernal equinox longitude of perihelion plus pi (radians) - real(SHR_KIND_R8), intent(out) :: delta ! Solar declination angle in rad - real(SHR_KIND_R8), intent(out) :: eccf ! Earth-sun distance factor (ie. (1/r)**2) - - !---------------------------Local variables----------------------------- - real(SHR_KIND_R8), parameter :: dayspy = 365.0_SHR_KIND_R8 ! days per year - real(SHR_KIND_R8), parameter :: ve = 80.5_SHR_KIND_R8 ! Calday of vernal equinox assumes Jan 1 = calday 1 - - real(SHR_KIND_R8) :: lambm ! Lambda m, mean long of perihelion (rad) - real(SHR_KIND_R8) :: lmm ! Intermediate argument involving lambm - real(SHR_KIND_R8) :: lamb ! Lambda, the earths long of perihelion - real(SHR_KIND_R8) :: invrho ! Inverse normalized sun/earth distance - real(SHR_KIND_R8) :: sinl ! Sine of lmm - - ! Compute eccentricity factor and solar declination using - ! day value where a round day (such as 213.0) refers to 0z at - ! Greenwich longitude. - ! - ! Use formulas from Berger, Andre 1978: Long-Term Variations of Daily - ! Insolation and Quaternary Climatic Changes. J. of the Atmo. Sci. - ! 35:2362-2367. - ! - ! To get the earths true longitude (position in orbit; lambda in Berger - ! 1978) which is necessary to find the eccentricity factor and declination, - ! must first calculate the mean longitude (lambda m in Berger 1978) at - ! the present day. This is done by adding to lambm0 (the mean longitude - ! at the vernal equinox, set as March 21 at noon, when lambda=0; in radians) - ! an increment (delta lambda m in Berger 1978) that is the number of - ! days past or before (a negative increment) the vernal equinox divided by - ! the days in a model year times the 2*pi radians in a complete orbit. - - lambm = lambm0 + (calday - ve)*2._SHR_KIND_R8*pi/dayspy - lmm = lambm - mvelpp - - ! The earths true longitude, in radians, is then found from - ! the formula in Berger 1978: - - sinl = sin(lmm) - lamb = lambm + eccen*(2._SHR_KIND_R8*sinl + & - eccen*(1.25_SHR_KIND_R8*sin(2._SHR_KIND_R8*lmm) + & - eccen*((13.0_SHR_KIND_R8/12.0_SHR_KIND_R8)* & - sin(3._SHR_KIND_R8*lmm) - 0.25_SHR_KIND_R8*sinl))) - - ! Using the obliquity, eccentricity, moving vernal equinox longitude of - ! perihelion (plus), and earths true longitude, the declination (delta) - ! and the normalized earth/sun distance (rho in Berger 1978; actually inverse - ! rho will be used), and thus the eccentricity factor (eccf), can be - ! calculated from formulas given in Berger 1978. - - invrho = (1._SHR_KIND_R8 + eccen*cos(lamb - mvelpp))/ & - (1._SHR_KIND_R8 - eccen*eccen) - - ! Set solar declination and eccentricity factor - - delta = asin(sin(obliqr)*sin(lamb)) - eccf = invrho*invrho - - return - - end subroutine shr_orb_decl - - !:---------------------------------------------------------------------------- - - real(SHR_KIND_R8) pure function shr_orb_cosz(jday, lat, lon, declin) - - !------------------------------------------------------------------------- - ! - ! FUNCTION to return the cosine of the solar zenith angle. - ! Assumes 365.0 days/year. - ! - !--------------- Code History -------------------------------------------- - ! - ! Original Author: Brian Kauffman - ! Date: Jan/98 - ! History: adapted from statement FUNCTION in share/orb_cosz.h - ! - !------------------------------------------------------------------------- - - real(SHR_KIND_R8), intent(in) :: jday ! Julian cal day (1.xx to 365.xx) - real(SHR_KIND_R8), intent(in) :: lat ! Centered latitude (radians) - real(SHR_KIND_R8), intent(in) :: lon ! Centered longitude (radians) - real(SHR_KIND_R8), intent(in) :: declin ! Solar declination (radians) - - !------------------------------------------------------------------------- - - shr_orb_cosz = sin(lat)*sin(declin) - cos(lat)*cos(declin) * & - cos((jday-floor(jday))*2.0_SHR_KIND_R8*pi + lon) - - end function shr_orb_cosz - -end module FatesUnitTestOrbitalMod \ No newline at end of file From 74cb26b282bc90bed80f50de69857399859b19ab Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 4 May 2023 10:39:37 -0600 Subject: [PATCH 057/125] refactor copy and dealloc --- biogeochem/EDCanopyStructureMod.F90 | 10 +- biogeochem/EDCohortDynamicsMod.F90 | 176 +------------- biogeochem/EDPatchDynamicsMod.F90 | 84 +------ biogeochem/EDPhysiologyMod.F90 | 3 +- biogeochem/FatesPatchMod.F90 | 336 +++++++++++++++++++------- main/FatesCohortMod.F90 | 358 +++++++++++++++++++--------- 6 files changed, 510 insertions(+), 457 deletions(-) diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 144dd14781..5c867b698a 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -15,7 +15,7 @@ module EDCanopyStructureMod use EDPftvarcon , only : EDPftvarcon_inst use PRTParametersMod , only : prt_params use FatesAllometryMod , only : carea_allom - use EDCohortDynamicsMod , only : copy_cohort, terminate_cohorts, terminate_cohort, fuse_cohorts + use EDCohortDynamicsMod , only : terminate_cohorts, terminate_cohort, fuse_cohorts use EDCohortDynamicsMod , only : InitPRTObject use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai @@ -670,7 +670,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) !allocate(copyc%tveg_lpa) !!allocate(copyc%l2fr_ema) ! Note, no need to give a starter value here, - ! that will be taken care of in copy_cohort() + ! that will be taken care of in copy() !!call copyc%l2fr_ema%InitRMean(ema_60day) ! Initialize the PARTEH object and point to the @@ -682,7 +682,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) call InitHydrCohort(currentSite,copyc) endif - call copy_cohort(currentCohort, copyc) + call currentCohort%copy(copyc) call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_loss @@ -1138,7 +1138,7 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) !!allocate(copyc%l2fr_ema) ! Note, no need to give a starter value here, - ! that will be taken care of in copy_cohort() + ! that will be taken care of in copy() !!call copyc%l2fr_ema%InitRMean(ema_60day) ! Initialize the PARTEH object and point to the @@ -1157,7 +1157,7 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) !call copyc%tveg_lpa%InitRMean(ema_lpa,& ! init_value=currentPatch%tveg_lpa%GetMean()) - call copy_cohort(currentCohort, copyc) !makes an identical copy... + call currentCohort%copy(copyc) !makes an identical copy... call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_gain !new area of existing cohort diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 7ed68711f1..a910bee762 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -1,9 +1,10 @@ Module EDCohortDynamicsMod ! - ! !DESCRIPTION: - ! Cohort stuctures in ED. + ! DESCRIPTION: + ! Cohort stuctures in FATES ! - ! !USES: + + ! USES: use FatesGlobals , only : endrun => fates_endrun use FatesGlobals , only : fates_log use FatesInterfaceTypesMod , only : hlm_freq_day @@ -49,7 +50,6 @@ Module EDCohortDynamicsMod use FatesInterfaceTypesMod , only : hlm_use_planthydro use FatesInterfaceTypesMod , only : hlm_parteh_mode use FatesPlantHydraulicsMod, only : FuseCohortHydraulics - use FatesPlantHydraulicsMod, only : CopyCohortHydraulics use FatesPlantHydraulicsMod, only : UpdateSizeDepPlantHydProps use FatesPlantHydraulicsMod, only : InitPlantHydStates use FatesPlantHydraulicsMod, only : InitHydrCohort @@ -122,7 +122,6 @@ Module EDCohortDynamicsMod public :: fuse_cohorts public :: insert_cohort public :: sort_cohorts - public :: copy_cohort public :: count_cohorts public :: InitPRTObject public :: SendCohortToLitter @@ -1449,172 +1448,7 @@ subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebi end subroutine insert_cohort !-------------------------------------------------------------------------------------! - subroutine copy_cohort( currentCohort,copyc ) - ! - ! !DESCRIPTION: - ! Copies all the variables in one cohort into another empty cohort - ! - ! !USES: - ! - ! !ARGUMENTS - type(fates_cohort_type), intent(inout) , target :: copyc ! New cohort argument. - type(fates_cohort_type), intent(in) , target :: currentCohort ! Old cohort argument. - ! - ! !LOCAL VARIABLES: - type(fates_cohort_type), pointer :: n,o ! New and old cohort pointers - !---------------------------------------------------------------------- - o => currentCohort - n => copyc - - n%indexnumber = fates_unset_int - - ! VEGETATION STRUCTURE - n%pft = o%pft - n%crowndamage = o%crowndamage - n%n = o%n - n%dbh = o%dbh - n%coage = o%coage - n%hite = o%hite - n%g_sb_laweight = o%g_sb_laweight - n%leaf_cost = o%leaf_cost - n%canopy_layer = o%canopy_layer - n%canopy_layer_yesterday = o%canopy_layer_yesterday - n%nv = o%nv - n%status_coh = o%status_coh - n%canopy_trim = o%canopy_trim - n%excl_weight = o%excl_weight - n%prom_weight = o%prom_weight - n%size_class = o%size_class - n%size_class_lasttimestep = o%size_class_lasttimestep - n%size_by_pft_class = o%size_by_pft_class - n%coage_class = o%coage_class - n%coage_by_pft_class = o%coage_by_pft_class - - ! This transfers the PRT objects over. - call n%prt%CopyPRTVartypes(o%prt) - n%l2fr = o%l2fr - - ! Leaf biophysical rates - n%vcmax25top = o%vcmax25top - n%jmax25top = o%jmax25top - n%tpu25top = o%tpu25top - n%kp25top = o%kp25top - - ! Copy over running means - if(hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then - n%cx_int = o%cx_int - n%ema_dcxdt = o%ema_dcxdt - n%cx0 = o%cx0 - end if - - ! CARBON FLUXES - n%gpp_acc_hold = o%gpp_acc_hold - n%gpp_acc = o%gpp_acc - n%gpp_tstep = o%gpp_tstep - - n%npp_acc_hold = o%npp_acc_hold - n%npp_tstep = o%npp_tstep - n%npp_acc = o%npp_acc - - if ( debug .and. .not.o%isnew ) write(fates_log(),*) 'EDcohortDyn Ia ',o%npp_acc - if ( debug .and. .not.o%isnew ) write(fates_log(),*) 'EDcohortDyn Ib ',o%resp_acc - - n%resp_tstep = o%resp_tstep - n%resp_acc = o%resp_acc - n%resp_acc_hold = o%resp_acc_hold - n%year_net_uptake = o%year_net_uptake - n%ts_net_uptake = o%ts_net_uptake - - ! These do not need to be copied because they - ! are written to history before dynamics occurs - ! and cohorts are reformed - n%daily_nh4_uptake = o%daily_nh4_uptake - n%daily_no3_uptake = o%daily_no3_uptake - n%sym_nfix_daily = o%sym_nfix_daily - n%daily_n_gain = o%daily_n_gain - n%daily_p_gain = o%daily_p_gain - n%daily_c_efflux = o%daily_c_efflux - n%daily_n_efflux = o%daily_n_efflux - n%daily_p_efflux = o%daily_p_efflux - n%daily_n_demand = o%daily_n_demand - n%daily_p_demand = o%daily_p_demand - - ! C13 discrimination - n%c13disc_clm = o%c13disc_clm - n%c13disc_acc = o%c13disc_acc - - !RESPIRATION - n%rdark = o%rdark - n%resp_m = o%resp_m - n%resp_m_unreduced= o%resp_m_unreduced - n%resp_excess = o%resp_excess - n%resp_g_tstep = o%resp_g_tstep - n%livestem_mr = o%livestem_mr - n%livecroot_mr = o%livecroot_mr - n%froot_mr = o%froot_mr - - ! ALLOCATION - n%dmort = o%dmort - n%seed_prod = o%seed_prod - - n%treelai = o%treelai - n%treesai = o%treesai - n%c_area = o%c_area - - ! Mortality diagnostics - n%cmort = o%cmort - n%bmort = o%bmort - n%hmort = o%hmort - n%smort = o%smort - n%asmort = o%asmort - n%frmort = o%frmort - n%dgmort = o%dgmort - - ! logging mortalities, Yi Xu - n%lmort_direct =o%lmort_direct - n%lmort_collateral =o%lmort_collateral - n%lmort_infra =o%lmort_infra - n%l_degrad =o%l_degrad - - ! Flags - n%isnew = o%isnew - - ! VARIABLES NEEDED FOR INTEGRATION - n%dndt = o%dndt - n%dhdt = o%dhdt - n%ddbhdt = o%ddbhdt - - ! FIRE - n%fraction_crown_burned = o%fraction_crown_burned - n%fire_mort = o%fire_mort - n%crownfire_mort = o%crownfire_mort - n%cambial_mort = o%cambial_mort - - ! Plant Hydraulics - - if( hlm_use_planthydro.eq.itrue ) then - call CopyCohortHydraulics(n,o) - endif - - ! indices for binning - n%size_class = o%size_class - n%size_class_lasttimestep = o%size_class_lasttimestep - n%size_by_pft_class = o%size_by_pft_class - n%coage_class = o%coage_class - n%coage_by_pft_class = o%coage_by_pft_class - - !Pointers - n%taller => NULL() ! pointer to next tallest cohort - n%shorter => NULL() ! pointer to next shorter cohort - !n%patchptr => o%patchptr ! pointer to patch that cohort is in - - - - - end subroutine copy_cohort - - !-------------------------------------------------------------------------------------! subroutine count_cohorts( currentPatch ) ! ! !DESCRIPTION: @@ -1935,7 +1769,7 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) rcohort%prt => null() call InitPRTObject(rcohort%prt) call rcohort%InitPRTBoundaryConditions() - call copy_cohort(ccohort, rcohort) + call ccohort%copy(rcohort) rcohort%n = nplant_recover diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 5674857236..3aaba6fb31 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -406,7 +406,7 @@ subroutine spawn_patches( currentSite, bc_in) ! !USES: use EDParamsMod , only : ED_val_understorey_death, logging_coll_under_frac - use EDCohortDynamicsMod , only : copy_cohort, terminate_cohorts + use EDCohortDynamicsMod , only : terminate_cohorts use FatesConstantsMod , only : rsnbl_math_prec ! @@ -691,7 +691,7 @@ subroutine spawn_patches( currentSite, bc_in) ! nc is the new cohort that goes in the disturbed patch (new_patch)... currentCohort ! is the curent cohort that stays in the donor patch (currentPatch) - call copy_cohort(currentCohort, nc) + call currentCohort%copy(nc) !this is the case as the new patch probably doesn't have a closed canopy, and ! even if it does, that will be sorted out in canopy_structure. @@ -2529,7 +2529,7 @@ subroutine fuse_2_patches(csite, dp, rp) end if ! We have no need for the dp pointer anymore, we have passed on it's legacy - call dealloc_patch(dp) + call dp%free_memory() deallocate(dp, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc006: fail on deallocate(dp):'//trim(smsg) @@ -2764,84 +2764,6 @@ subroutine DistributeSeeds(currentSite,seed_mass,el,pft) return end subroutine DistributeSeeds - - ! ===================================================================================== - - subroutine dealloc_patch(cpatch) - - ! This Subroutine is intended to de-allocate the allocatable memory that is pointed - ! to via the patch structure. This subroutine DOES NOT deallocate the patch - ! structure itself. - - type(fates_patch_type) :: cpatch - - type(fates_cohort_type), pointer :: ccohort ! current - type(fates_cohort_type), pointer :: ncohort ! next - integer :: el ! loop counter for elements - - ! First Deallocate the cohort space - ! ----------------------------------------------------------------------------------- - ccohort => cpatch%shortest - do while(associated(ccohort)) - - ncohort => ccohort%taller - - call DeallocateCohort(ccohort) - deallocate(ccohort, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc007: fail on deallocate(cchort):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - ccohort => ncohort - - end do - - ! Deallocate all litter objects - do el=1,num_elements - call cpatch%litter(el)%DeallocateLitt() - end do - deallocate(cpatch%litter, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc008: fail on deallocate(cpatch%litter):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - ! Secondly, deallocate the allocatable vector spaces in the patch - deallocate(cpatch%tr_soil_dir, & - cpatch%tr_soil_dif, & - cpatch%tr_soil_dir_dif, & - cpatch%fab, & - cpatch%fabd, & - cpatch%fabi, & - cpatch%sabs_dir, & - cpatch%sabs_dif, & - cpatch%fragmentation_scaler, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc009: fail on deallocate patch vectors:'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - ! Deallocate any running means - deallocate(cpatch%tveg24, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc010: fail on deallocate(cpatch%tveg24):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - deallocate(cpatch%tveg_lpa, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc011: fail on deallocate(cpatch%tveg_lpa):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - deallocate(cpatch%tveg_longterm, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc012: fail on deallocate(cpatch%tveg_longterm):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - return - end subroutine dealloc_patch - ! ============================================================================ subroutine patch_pft_size_profile(cp_pnt) ! diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index b1500736e8..9a49d540e5 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -31,7 +31,6 @@ module EDPhysiologyMod use FatesInterfaceTypesMod, only : bc_out_type use EDCohortDynamicsMod , only : create_cohort, sort_cohorts use EDCohortDynamicsMod , only : InitPRTObject - use EDCohortDynamicsMod , only : copy_cohort use FatesAllometryMod , only : tree_lai use FatesAllometryMod , only : tree_sai use FatesAllometryMod , only : leafc_from_treelai @@ -277,7 +276,7 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) call ndcohort%zero_values() ! nc_canopy_d is the new cohort that gets damaged - call copy_cohort(ccohort, ndcohort) + call ccohort%copy(ndcohort) ! new number densities - we just do damaged cohort here - ! undamaged at the end of the cohort loop once we know how many damaged to diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 4447c0804f..ae536a9cb5 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -24,6 +24,9 @@ module FatesPatchMod implicit none private + ! for error message writing + character(len=*), parameter :: sourcefile = __FILE__ + type, public :: fates_patch_type ! POINTERS @@ -67,82 +70,82 @@ module FatesPatchMod !:.........................................................................: ! LEAF ORGANIZATION - real(r8) :: pft_agb_profile(maxpft,n_dbh_bins) ! binned aboveground biomass, for patch fusion [kgC/m2] - real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer [m2 veg/m2 canopy area] - ! (patch without bare ground) - ! used to determine attenuation of parameters during photosynthesis - real(r8) :: total_canopy_area ! area that is covered by vegetation [m2] - real(r8) :: total_tree_area ! area that is covered by woody vegetation [m2] - real(r8) :: zstar ! height of smallest canopy tree, only meaningful in "strict PPA" mode [m] - real(r8) :: elai_profile(nclmax,maxpft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] - real(r8) :: esai_profile(nclmax,maxpft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] - real(r8) :: tlai_profile(nclmax,maxpft,nlevleaf) - real(r8) :: tsai_profile(nclmax,maxpft,nlevleaf) - real(r8) :: canopy_area_profile(nclmax,maxpft,nlevleaf) ! fraction of crown area per canopy area in each layer - ! they will sum to 1.0 in the fully closed canopy layers - ! but only in leaf-layers that contain contributions - ! from all cohorts that donate to canopy_area - integer :: canopy_mask(nclmax,maxpft) ! is there any of this pft in this canopy layer? - integer :: nrad(nclmax,maxpft) ! number of exposed leaf layers for each canopy layer and pft - integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft - real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] - real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] + real(r8), allocatable :: pft_agb_profile(:,:) ! binned aboveground biomass, for patch fusion [kgC/m2] + real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer [m2 veg/m2 canopy area] + ! (patch without bare ground) + ! used to determine attenuation of parameters during photosynthesis + real(r8) :: total_canopy_area ! area that is covered by vegetation [m2] + real(r8) :: total_tree_area ! area that is covered by woody vegetation [m2] + real(r8) :: zstar ! height of smallest canopy tree, only meaningful in "strict PPA" mode [m] + real(r8), allocatable :: elai_profile(:,:,:) ! exposed leaf area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8), allocatable :: esai_profile(:,:,:) ! exposed stem area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8), allocatable :: tlai_profile(:,:,:) + real(r8), allocatable :: tsai_profile(:,:,:) + real(r8), allocatable :: canopy_area_profile(:,:,:) ! fraction of crown area per canopy area in each layer + ! they will sum to 1.0 in the fully closed canopy layers + ! but only in leaf-layers that contain contributions + ! from all cohorts that donate to canopy_area + integer, allocatable :: canopy_mask(:,:) ! is there any of this pft in this canopy layer? + integer, allocatable :: nrad(:,:) ! number of exposed leaf layers for each canopy layer and pft + integer, allocatable :: ncan(:,:) ! number of total leaf layers for each canopy layer and pft + real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] + real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] !:.........................................................................: - real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) - real(r8) :: psn_z(nclmax,maxpft,nlevleaf) - real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) - real(r8) :: nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) - real(r8) :: nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf) - real(r8) :: nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf) + real(r8), allocatable :: layer_height_profile(:,:,:) + real(r8), allocatable :: psn_z(:,:,:) + real(r8), allocatable :: nrmlzd_parprof_pft_dir_z(:,:,:,:) + real(r8), allocatable :: nrmlzd_parprof_pft_dif_z(:,:,:,:) + real(r8), allocatable :: nrmlzd_parprof_dir_z(:,:,:) + real(r8), allocatable :: nrmlzd_parprof_dif_z(:,:,:) !:.........................................................................: ! RADIATION - real(r8) :: radiation_error ! radiation error [W/m2] - real(r8) :: fcansno ! fraction of canopy covered in snow [0-1] - logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) - real(r8) :: solar_zenith_angle ! solar zenith angle [radians] - real(r8) :: gnd_alb_dif(maxSWb) ! ground albedo for diffuse rad, both bands [0-1] - real(r8) :: gnd_alb_dir(maxSWb) ! ground albedo for direct rad, both bands [0-1] + real(r8) :: radiation_error ! radiation error [W/m2] + real(r8) :: fcansno ! fraction of canopy covered in snow [0-1] + logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) + real(r8) :: solar_zenith_angle ! solar zenith angle [radians] + real(r8), allocatable :: gnd_alb_dif(:) ! ground albedo for diffuse rad, both bands [0-1] + real(r8), allocatable :: gnd_alb_dir(:) ! ground albedo for direct rad, both bands [0-1] ! organized by canopy layer, pft, and leaf layer - real(r8) :: fabd_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of direct light absorbed [0-1] - real(r8) :: fabd_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of direct light absorbed [0-1] - real(r8) :: fabi_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of indirect light absorbed [0-1] - real(r8) :: fabi_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of indirect light absorbed [0-1] - real(r8) :: ed_parsun_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the sun [W/m2] - real(r8) :: ed_parsha_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the shade [W/m2] - real(r8) :: ed_laisun_z(nclmax,maxpft,nlevleaf) - real(r8) :: ed_laisha_z(nclmax,maxpft,nlevleaf) - real(r8) :: f_sun(nclmax,maxpft,nlevleaf) ! fraction of leaves in the sun [0-1] + real(r8), allocatable :: fabd_sun_z(:,:,:) ! sun fraction of direct light absorbed [0-1] + real(r8), allocatable :: fabd_sha_z(:,:,:) ! shade fraction of direct light absorbed [0-1] + real(r8), allocatable :: fabi_sun_z(:,:,:) ! sun fraction of indirect light absorbed [0-1] + real(r8), allocatable :: fabi_sha_z(:,:,:) ! shade fraction of indirect light absorbed [0-1] + real(r8), allocatable :: ed_parsun_z(:,:,:) ! PAR absorbed in the sun [W/m2] + real(r8), allocatable :: ed_parsha_z(:,:,:) ! PAR absorbed in the shade [W/m2] + real(r8), allocatable :: ed_laisun_z(:,:,:) + real(r8), allocatable :: ed_laisha_z(:,:,:) + real(r8), allocatable :: f_sun(:,:,:) ! fraction of leaves in the sun [0-1] ! radiation profiles for comparison against observations - real(r8) :: parprof_pft_dir_z(nclmax,maxpft,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, PFT, leaf level [W/m2] - real(r8) :: parprof_pft_dif_z(nclmax,maxpft,nlevleaf) ! diffuse PAR profile through canopy, by canopy, PFT, leaf level [W/m2] - real(r8) :: parprof_dir_z(nclmax,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, leaf level [W/m2] - real(r8) :: parprof_dif_z(nclmax,nlevleaf) ! diffuse PAR profile through canopy, by canopy, leaf level [W/m2] + real(r8), allocatable :: parprof_pft_dir_z(:,:,:) ! direct-beam PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8), allocatable :: parprof_pft_dif_z(:,:,:) ! diffuse PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8), allocatable :: parprof_dir_z(:,:) ! direct-beam PAR profile through canopy, by canopy, leaf level [W/m2] + real(r8), allocatable :: parprof_dif_z(:,:) ! diffuse PAR profile through canopy, by canopy, leaf level [W/m2] - real(r8), allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation transmitted to the soil as direct, by numSWB [0-1] - real(r8), allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse [0-1] - real(r8), allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that is transmitted to the soil as diffuse [0-1] - real(r8), allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy - real(r8), allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8), allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy - real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + real(r8), allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation transmitted to the soil as direct, by numSWB [0-1] + real(r8), allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy + real(r8), allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy !:.........................................................................: ! ROOTS - real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT - real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT + real(r8), allocatable :: btran_ft(:) ! btran calculated seperately for each PFT + real(r8), allocatable :: bstress_sal_ft(:) ! bstress from salinity calculated seperately for each PFT !:.........................................................................: ! EXTERNAL SEED RAIN - real(r8) :: nitr_repro_stoich(maxpft) ! The NC ratio of a new recruit in this patch - real(r8) :: phos_repro_stoich(maxpft) ! The PC ratio of a new recruit in this patch + real(r8), allocatable :: nitr_repro_stoich(:) ! The NC ratio of a new recruit in this patch + real(r8), allocatable :: phos_repro_stoich(:) ! The PC ratio of a new recruit in this patch !:.........................................................................: @@ -162,33 +165,33 @@ module FatesPatchMod ! FUELS AND FIRE ! fuel characteristics - real(r8) :: sum_fuel ! total ground fuel related to ROS (omits 1000 hr fuels) [kgC/m2] - real(r8) :: fuel_frac(nfsc) ! fraction of each litter class in the ros_fuel [0-1] - real(r8) :: livegrass ! total aboveground grass biomass in patch [kgC/m2] - real(r8) :: fuel_bulkd ! average fuel bulk density of the ground fuel. [kg/m3] - ! (incl. live grasses, omits 1000hr fuels) - real(r8) :: fuel_sav ! average surface area to volume ratio of the ground fuel [cm-1] - ! (incl. live grasses, omits 1000hr fuels) - real(r8) :: fuel_mef ! average moisture of extinction factor - ! of the ground fuel (incl. live grasses, omits 1000hr fuels) - real(r8) :: fuel_eff_moist ! effective avearage fuel moisture content of the ground fuel - ! (incl. live grasses. omits 1000hr fuels) - real(r8) :: litter_moisture(nfsc) ! moisture of litter [m3/m3] + real(r8) :: sum_fuel ! total ground fuel related to ROS (omits 1000 hr fuels) [kgC/m2] + real(r8) :: fuel_frac(nfsc) ! fraction of each litter class in the ros_fuel [0-1] + real(r8) :: livegrass ! total aboveground grass biomass in patch [kgC/m2] + real(r8) :: fuel_bulkd ! average fuel bulk density of the ground fuel. [kg/m3] + ! (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_sav ! average surface area to volume ratio of the ground fuel [cm-1] + ! (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_mef ! average moisture of extinction factor + ! of the ground fuel (incl. live grasses, omits 1000hr fuels) + real(r8) :: fuel_eff_moist ! effective avearage fuel moisture content of the ground fuel + ! (incl. live grasses. omits 1000hr fuels) + real(r8) :: litter_moisture(nfsc) ! moisture of litter [m3/m3] ! fire spread - real(r8) :: ros_front ! rate of forward spread of fire [m/min] - real(r8) :: ros_back ! rate of backward spread of fire [m/min] - real(r8) :: effect_wspeed ! windspeed modified by fraction of relative grass and tree cover [m/min] - real(r8) :: tau_l ! duration of lethal heating [min] - real(r8) :: fi ! average fire intensity of flaming front [kJ/m/s] or [kW/m] - integer :: fire ! is there a fire? [1=yes; 0=no] - real(r8) :: fd ! fire duration [min] + real(r8) :: ros_front ! rate of forward spread of fire [m/min] + real(r8) :: ros_back ! rate of backward spread of fire [m/min] + real(r8) :: effect_wspeed ! windspeed modified by fraction of relative grass and tree cover [m/min] + real(r8) :: tau_l ! duration of lethal heating [min] + real(r8) :: fi ! average fire intensity of flaming front [kJ/m/s] or [kW/m] + integer :: fire ! is there a fire? [1=yes; 0=no] + real(r8) :: fd ! fire duration [min] ! fire effects - real(r8) :: scorch_ht(maxpft) ! scorch height [m] - real(r8) :: frac_burnt ! fraction burnt [0-1/day] - real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] - real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] + real(r8), allocatable :: scorch_ht(:) ! scorch height [m] + real(r8) :: frac_burnt ! fraction burnt [0-1/day] + real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] + real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] !:.........................................................................: @@ -200,31 +203,66 @@ module FatesPatchMod procedure :: init procedure :: nan_values procedure :: zero_values + procedure :: init_running_means + procedure :: init_litter procedure :: create + procedure :: free_memory procedure :: dump procedure :: check_vars - procedure :: init_running_means - procedure :: init_litter end type fates_patch_type contains - subroutine init(this, numSWb, nlevsoil) + subroutine init(this, numpft, numSWb, nlevsoil) ! ! DESCRIPTION: - ! Initialize a new patch + ! Initialize a new patch - allocate arrays and set values to nan and/or + ! 0.0 ! ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object + integer, intent(in) :: numpft ! number of pfts integer, intent(in) :: numSWb ! number of shortwave broad-bands to track integer, intent(in) :: nlevsoil ! number of soil layers - ! LOCAL VARIABLES: - integer :: el ! element loop index - ! allocate arrays + allocate(this%pft_agb_profile(numpft, N_DBH_BINS)) + allocate(this%elai_profile(nclmax,numpft,nlevleaf)) + allocate(this%esai_profile(nclmax,numpft,nlevleaf)) + allocate(this%tlai_profile(nclmax,numpft,nlevleaf)) + allocate(this%tsai_profile(nclmax,numpft,nlevleaf)) + allocate(this%canopy_area_profile(nclmax,numpft,nlevleaf)) + + allocate(this%canopy_mask(nclmax,numpft)) + allocate(this%nrad(nclmax,numpft)) + allocate(this%ncan(nclmax,numpft)) + + allocate(this%layer_height_profile(nclmax,numpft,nlevleaf)) + allocate(this%psn_z(nclmax,numpft,nlevleaf)) + allocate(this%nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,numpft,nlevleaf)) + allocate(this%nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,numpft,nlevleaf)) + allocate(this%nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf)) + allocate(this%nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf)) + + allocate(this%gnd_alb_dif(numSWb)) + allocate(this%gnd_alb_dir(numSWb)) + allocate(this%fabd_sun_z(nclmax,numpft,nlevleaf)) + allocate(this%fabd_sha_z(nclmax,numpft,nlevleaf)) + allocate(this%fabi_sun_z(nclmax,numpft,nlevleaf)) + allocate(this%fabi_sha_z(nclmax,numpft,nlevleaf)) + allocate(this%ed_parsun_z(nclmax,numpft,nlevleaf)) + allocate(this%ed_parsha_z(nclmax,numpft,nlevleaf)) + allocate(this%ed_laisun_z(nclmax,numpft,nlevleaf)) + allocate(this%ed_laisha_z(nclmax,numpft,nlevleaf)) + allocate(this%f_sun(nclmax,numpft,nlevleaf)) + + allocate(this%parprof_pft_dir_z(nclmax,numpft,nlevleaf)) + allocate(this%parprof_pft_dif_z(nclmax,numpft,nlevleaf)) + allocate(this%parprof_dir_z(nclmax,nlevleaf)) + allocate(this%parprof_dif_z(nclmax,nlevleaf)) + allocate(this%tr_soil_dir(numSWb)) allocate(this%tr_soil_dif(numSWb)) allocate(this%tr_soil_dir_dif(numSWb)) @@ -233,9 +271,18 @@ subroutine init(this, numSWb, nlevsoil) allocate(this%fabi(numSWb)) allocate(this%sabs_dir(numSWb)) allocate(this%sabs_dif(numSWb)) + + allocate(this%btran_ft(numpft)) + allocate(this%bstress_sal_ft(numpft)) + + allocate(this%nitr_repro_stoich(numpft)) + allocate(this%phos_repro_stoich(numpft)) + allocate(this%fragmentation_scaler(nlevsoil)) - ! initialize values to nan + allocate(this%scorch_ht(numpft)) + + ! initialize all values to nan call this%nan_values() ! zero values that should be zeroed @@ -552,6 +599,119 @@ end subroutine create !:.........................................................................: + subroutine free_memory(this) + ! + ! DESCRIPTION: + ! deallocate the allocatable memory associated with this patch + ! this DOES NOT deallocate the patch structure itself + ! + + ! ARGUMENTS: + class(fates_patch_type), intent(inout) :: this + + ! LOCALS: + type(fates_cohort_type), pointer :: ccohort ! current cohort + type(fates_cohort_type), pointer :: ncohort ! next cohort + integer :: el ! loop counter for elements + integer :: istat ! return status code + character(len=255) :: smsg ! message string for deallocation errors + + ! first deallocate the cohorts + ccohort => this%shortest + do while(associated(ccohort)) + ncohort => ccohort%taller + call DeallocateCohort(ccohort) + deallocate(ccohort, stat=istat, errmsg=smsg) + if (istat /= 0) then + write(fates_log(),*) 'dealloc007: fail on deallocate(cchort):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + ccohort => ncohort + end do + + ! deallocate all litter objects + do el=1,num_elements + call this%litter(el)%DeallocateLitt() + end do + deallocate(this%litter, stat=istat, errmsg=smsg) + if (istat/=0) then + write(fates_log(),*) 'dealloc008: fail on deallocate(this%litter):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + + ! deallocate the allocatable arrays + deallocate(this%pft_agb_profile, & + this%elai_profile, & + this%esai_profile, & + this%tlai_profile, & + this%tsai_profile, & + this%canopy_area_profile, & + this%canopy_mask, & + this%nrad, & + this%ncan, & + this%layer_height_profile, & + this%psn_z, & + this%nrmlzd_parprof_pft_dir_z, & + this%nrmlzd_parprof_pft_dif_z, & + this%nrmlzd_parprof_dir_z, & + this%nrmlzd_parprof_dif_z, & + this%gnd_alb_dif, & + this%gnd_alb_dir, & + this%fabd_sun_z, & + this%fabd_sha_z, & + this%fabi_sun_z, & + this%fabi_sha_z, & + this%ed_parsun_z, & + this%ed_parsha_z, & + this%ed_laisun_z, & + this%ed_laisha_z, & + this%f_sun, & + this%parprof_pft_dir_z, & + this%parprof_pft_dif_z, & + this%parprof_dir_z, & + this%parprof_dif_z, & + this%tr_soil_dir, & + this%tr_soil_dif, & + this%tr_soil_dir_dif, & + this%fab, & + this%fabd, & + this%fabi, & + this%sabs_dir, & + this%sabs_dif, & + this%btran_ft, & + this%bstress_sal_ft, & + this%nitr_repro_stoich, & + this%phos_repro_stoich, & + this%fragmentation_scaler, & + this%scorch_ht, & + stat=istat, errmsg=smsg) + + if (istat/=0) then + write(fates_log(),*) 'dealloc009: fail on deallocate patch vectors:'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + + ! deallocate running means + deallocate(this%tveg24, stat=istat, errmsg=smsg) + if (istat/=0) then + write(fates_log(),*) 'dealloc010: fail on deallocate(this%tveg24):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + deallocate(this%tveg_lpa, stat=istat, errmsg=smsg) + if (istat/=0) then + write(fates_log(),*) 'dealloc011: fail on deallocate(this%tveg_lpa):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + deallocate(this%tveg_longterm, stat=istat, errmsg=smsg) + if (istat/=0) then + write(fates_log(),*) 'dealloc012: fail on deallocate(this%tveg_longterm):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + + end subroutine free_memory + + !:.........................................................................: + subroutine dump(this) ! ! DESCRIPTION: diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 index 8073d70527..c7d15da584 100644 --- a/main/FatesCohortMod.F90 +++ b/main/FatesCohortMod.F90 @@ -19,6 +19,7 @@ module FatesCohortMod use PRTParametersMod, only : prt_params use FatesParameterDerivedMod, only : param_derived use FatesHydraulicsMemMod, only : ed_cohort_hydr_type + use FatesPlantHydraulicsMod, only : CopyCohortHydraulics use FatesInterfaceTypesMod, only : hlm_parteh_mode use FatesInterfaceTypesMod, only : hlm_use_sp use FatesInterfaceTypesMod, only : nleafage @@ -268,6 +269,7 @@ module FatesCohortMod procedure :: nan_values procedure :: zero_values procedure :: create + procedure :: copy procedure :: CanUpperUnder procedure :: InitPRTBoundaryConditions procedure :: UpdateCohortBioPhysRates @@ -620,6 +622,146 @@ end subroutine create !:.........................................................................: + subroutine copy(this, copy_cohort) + ! + ! DESCRIPTION: + ! copies all the variables in one cohort into a new cohort + ! + + ! ARGUMENTS + class(fates_cohort_type), intent(in) :: this ! old cohort + class(fates_cohort_type), intent(inout) :: copy_cohort ! new cohort + + copy_cohort%indexnumber = fates_unset_int + + ! POINTERS + copy_cohort%taller => NULL() + copy_cohort%shorter => NULL() + + ! PRT + call copy_cohort%prt%CopyPRTVartypes(this%prt) + copy_cohort%l2fr = this%l2fr + + ! VEGETATION STRUCTURE + copy_cohort%pft = this%pft + copy_cohort%n = this%n + copy_cohort%dbh = this%dbh + copy_cohort%coage = this%coage + copy_cohort%hite = this%hite + copy_cohort%canopy_layer = this%canopy_layer + copy_cohort%canopy_layer_yesterday = this%canopy_layer_yesterday + copy_cohort%crowndamage = this%crowndamage + copy_cohort%g_sb_laweight = this%g_sb_laweight + copy_cohort%canopy_trim = this%canopy_trim + copy_cohort%leaf_cost = this%leaf_cost + copy_cohort%excl_weight = this%excl_weight + copy_cohort%prom_weight = this%prom_weight + copy_cohort%nv = this%nv + copy_cohort%status_coh = this%status_coh + copy_cohort%c_area = this%c_area + copy_cohort%treelai = this%treelai + copy_cohort%treesai = this%treesai + copy_cohort%isnew = this%isnew + copy_cohort%size_class = this%size_class + copy_cohort%coage_class = this%coage_class + copy_cohort%size_by_pft_class = this%size_by_pft_class + copy_cohort%coage_by_pft_class = this%coage_by_pft_class + copy_cohort%size_class_lasttimestep = this%size_class_lasttimestep + + ! CARBON AND NUTRIENT FLUXES + copy_cohort%gpp_tstep = this%gpp_tstep + copy_cohort%gpp_acc = this%gpp_acc + copy_cohort%gpp_acc_hold = this%gpp_acc_hold + copy_cohort%npp_tstep = this%npp_tstep + copy_cohort%npp_acc = this%npp_acc + copy_cohort%npp_acc_hold = this%npp_acc_hold + copy_cohort%resp_tstep = this%resp_tstep + copy_cohort%resp_acc = this%resp_acc + copy_cohort%resp_acc_hold = this%resp_acc_hold + copy_cohort%c13disc_clm = this%c13disc_clm + copy_cohort%c13disc_acc = this%c13disc_acc + copy_cohort%vcmax25top = this%vcmax25top + copy_cohort%jmax25top = this%jmax25top + copy_cohort%tpu25top = this%tpu25top + copy_cohort%kp25top = this%kp25top + copy_cohort%ts_net_uptake = this%ts_net_uptake + copy_cohort%year_net_uptake = this%year_net_uptake + copy_cohort%cnp_limiter = this%cnp_limiter + + if (debug .and. .not. this%isnew) then + write(fates_log(),*) 'EDcohortDyn Ia ', this%npp_acc + write(fates_log(),*) 'EDcohortDyn Ib ', this%resp_acc + end if + + if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then + copy_cohort%cx_int = this%cx_int + copy_cohort%ema_dcxdt = this%ema_dcxdt + copy_cohort%cx0 = this%cx0 + end if + + copy_cohort%nc_repro = this%nc_repro + copy_cohort%daily_nh4_uptake = this%daily_nh4_uptake + copy_cohort%daily_no3_uptake = this%daily_no3_uptake + copy_cohort%sym_nfix_daily = this%sym_nfix_daily + copy_cohort%sym_nfix_tstep = this%sym_nfix_tstep + copy_cohort%daily_n_gain = this%daily_n_gain + copy_cohort%daily_p_gain = this%daily_p_gain + copy_cohort%daily_c_efflux = this%daily_c_efflux + copy_cohort%daily_n_efflux = this%daily_n_efflux + copy_cohort%daily_p_efflux = this%daily_p_efflux + copy_cohort%daily_n_demand = this%daily_n_demand + copy_cohort%daily_p_demand = this%daily_p_demand + copy_cohort%seed_prod = this%seed_prod + + ! RESPIRATION COMPONENTS + copy_cohort%rdark = this%rdark + copy_cohort%resp_g_tstep = this%resp_g_tstep + copy_cohort%resp_m = this%resp_m + copy_cohort%resp_m_unreduced = this%resp_m_unreduced + copy_cohort%resp_excess = this%resp_excess + copy_cohort%livestem_mr = this%livestem_mr + copy_cohort%livecroot_mr = this%livecroot_mr + copy_cohort%froot_mr = this%froot_mr + + ! DAMAGE + copy_cohort%branch_frac = this%branch_frac + + ! MORTALITY + copy_cohort%dmort = this%dmort + copy_cohort%bmort = this%bmort + copy_cohort%cmort = this%cmort + copy_cohort%hmort = this%hmort + copy_cohort%frmort = this%frmort + copy_cohort%smort = this%smort + copy_cohort%asmort = this%asmort + copy_cohort%dgmort = this%dgmort + copy_cohort%lmort_direct = this%lmort_direct + copy_cohort%lmort_collateral = this%lmort_collateral + copy_cohort%lmort_infra = this%lmort_infra + copy_cohort%l_degrad = this%l_degrad + + ! GROWTH DERIVATIVES + copy_cohort%dndt = this%dndt + copy_cohort%dhdt = this%dhdt + copy_cohort%ddbhdt = this%ddbhdt + copy_cohort%dbdeaddt = this%dbdeaddt + + ! FIRE + copy_cohort%fraction_crown_burned = this%fraction_crown_burned + copy_cohort%cambial_mort = this%cambial_mort + copy_cohort%crownfire_mort = this%crownfire_mort + copy_cohort%fire_mort = this%fire_mort + + ! HYDRAULICS + + if (hlm_use_planthydro .eq. itrue) then + call CopyCohortHydraulics(copy_cohort, this) + endif + + end subroutine copy + + !:.........................................................................: + subroutine InitPRTBoundaryConditions(this) ! ! DESCRIPTION: @@ -627,7 +769,7 @@ subroutine InitPRTBoundaryConditions(this) ! allocation hypotheses. Each of these calls to "RegsterBC" are simply ! setting pointers. ! For instance, if the hypothesis wants to know what - ! the DBH of the plant is, then we pass in the dbh as an argument (new_cohort%dbh), + ! the DBH of the plant is, then we pass in the dbh as an argument (copy_cohort%dbh), ! and also tell it which boundary condition we are talking about (which is ! defined by an integer index (ac_bc_inout_id_dbh) ! @@ -647,48 +789,48 @@ subroutine InitPRTBoundaryConditions(this) select case(hlm_parteh_mode) case (prt_carbon_allom_hyp) - ! Register boundary conditions for the Carbon Only Allometric Hypothesis - - call this%prt%RegisterBCInOut(ac_bc_inout_id_dbh, bc_rval=this%dbh) - call this%prt%RegisterBCInOut(ac_bc_inout_id_netdc, bc_rval=this%npp_acc) - call this%prt%RegisterBCIn(ac_bc_in_id_cdamage, bc_ival=this%crowndamage) - call this%prt%RegisterBCIn(ac_bc_in_id_pft, bc_ival=this%pft) - call this%prt%RegisterBCIn(ac_bc_in_id_ctrim, bc_rval=this%canopy_trim) - call this%prt%RegisterBCIn(ac_bc_in_id_lstat, bc_ival=this%status_coh) - + ! Register boundary conditions for the Carbon Only Allometric Hypothesis + + call this%prt%RegisterBCInOut(ac_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(ac_bc_inout_id_netdc, bc_rval=this%npp_acc) + call this%prt%RegisterBCIn(ac_bc_in_id_cdamage, bc_ival=this%crowndamage) + call this%prt%RegisterBCIn(ac_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(ac_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(ac_bc_in_id_lstat, bc_ival=this%status_coh) + case (prt_cnp_flex_allom_hyp) - ! Register boundary conditions for the CNP Allometric Hypothesis - - call this%prt%RegisterBCIn(acnp_bc_in_id_pft, bc_ival=this%pft) - call this%prt%RegisterBCIn(acnp_bc_in_id_ctrim, bc_rval=this%canopy_trim) - call this%prt%RegisterBCIn(acnp_bc_in_id_lstat, bc_ival=this%status_coh) - call this%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval=this%npp_acc) - - call this%prt%RegisterBCIn(acnp_bc_in_id_nc_repro, bc_rval=this%nc_repro) - call this%prt%RegisterBCIn(acnp_bc_in_id_pc_repro, bc_rval=this%pc_repro) - call this%prt%RegisterBCIn(acnp_bc_in_id_cdamage, bc_ival=this%crowndamage) - - call this%prt%RegisterBCInOut(acnp_bc_inout_id_dbh, bc_rval=this%dbh) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess, bc_rval=this%resp_excess) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr, bc_rval=this%l2fr) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int, bc_rval=this%cx_int) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt, bc_rval=this%ema_dcxdt) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx0, bc_rval=this%cx0) - - call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval=this%daily_n_gain) - call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval=this%daily_p_gain) - - call this%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval=this%daily_c_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval=this%daily_n_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval=this%daily_p_efflux) - call this%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival=this%cnp_limiter) - + ! Register boundary conditions for the CNP Allometric Hypothesis + + call this%prt%RegisterBCIn(acnp_bc_in_id_pft, bc_ival=this%pft) + call this%prt%RegisterBCIn(acnp_bc_in_id_ctrim, bc_rval=this%canopy_trim) + call this%prt%RegisterBCIn(acnp_bc_in_id_lstat, bc_ival=this%status_coh) + call this%prt%RegisterBCIn(acnp_bc_in_id_netdc, bc_rval=this%npp_acc) + + call this%prt%RegisterBCIn(acnp_bc_in_id_nc_repro, bc_rval=this%nc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_pc_repro, bc_rval=this%pc_repro) + call this%prt%RegisterBCIn(acnp_bc_in_id_cdamage, bc_ival=this%crowndamage) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_dbh, bc_rval=this%dbh) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_resp_excess, bc_rval=this%resp_excess) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_l2fr, bc_rval=this%l2fr) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx_int, bc_rval=this%cx_int) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_emadcxdt, bc_rval=this%ema_dcxdt) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_cx0, bc_rval=this%cx0) + + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdn, bc_rval=this%daily_n_gain) + call this%prt%RegisterBCInOut(acnp_bc_inout_id_netdp, bc_rval=this%daily_p_gain) + + call this%prt%RegisterBCOut(acnp_bc_out_id_cefflux, bc_rval=this%daily_c_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_nefflux, bc_rval=this%daily_n_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_pefflux, bc_rval=this%daily_p_efflux) + call this%prt%RegisterBCOut(acnp_bc_out_id_limiter, bc_ival=this%cnp_limiter) + case DEFAULT - write(fates_log(),*) 'You specified an unknown PRT module' - write(fates_log(),*) 'Aborting' - call endrun(msg=errMsg(sourcefile, __LINE__)) + write(fates_log(),*) 'You specified an unknown PRT module' + write(fates_log(),*) 'Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) end select @@ -746,15 +888,15 @@ subroutine UpdateCohortBioPhysRates(this) this%kp25top = sum(param_derived%kp25top(ipft, 1:nleafage)* & frac_leaf_aclass(1:nleafage)) - else if (hlm_use_sp .eq. itrue) then + else if (hlm_use_sp .eq. itrue) then - this%vcmax25top = EDPftvarcon_inst%vcmax25top(ipft, 1) - this%jmax25top = param_derived%jmax25top(ipft, 1) - this%tpu25top = param_derived%tpu25top(ipft, 1) - this%kp25top = param_derived%kp25top(ipft, 1) + this%vcmax25top = EDPftvarcon_inst%vcmax25top(ipft, 1) + this%jmax25top = param_derived%jmax25top(ipft, 1) + this%tpu25top = param_derived%tpu25top(ipft, 1) + this%kp25top = param_derived%kp25top(ipft, 1) else - + this%vcmax25top = 0._r8 this%jmax25top = 0._r8 this%tpu25top = 0._r8 @@ -762,8 +904,6 @@ subroutine UpdateCohortBioPhysRates(this) end if - return - end subroutine UpdateCohortBioPhysRates !:.........................................................................: @@ -805,80 +945,78 @@ subroutine dump(this) write(fates_log(),*) '----------------------------------------' write(fates_log(),*) ' Dumping Cohort Information ' write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'co%pft = ', this%pft - write(fates_log(),*) 'co%n = ', this%n - write(fates_log(),*) 'co%dbh = ', this%dbh - write(fates_log(),*) 'co%hite = ', this%hite - write(fates_log(),*) 'co%crowndamage = ', this%crowndamage - write(fates_log(),*) 'co%coage = ', this%coage - write(fates_log(),*) 'co%l2fr = ', this%l2fr + write(fates_log(),*) 'cthis%pft = ', this%pft + write(fates_log(),*) 'cthis%n = ', this%n + write(fates_log(),*) 'cthis%dbh = ', this%dbh + write(fates_log(),*) 'cthis%hite = ', this%hite + write(fates_log(),*) 'cthis%crowndamage = ', this%crowndamage + write(fates_log(),*) 'cthis%coage = ', this%coage + write(fates_log(),*) 'cthis%l2fr = ', this%l2fr write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) - write(fates_log(),*) 'co%g_sb_laweight = ', this%g_sb_laweight - write(fates_log(),*) 'co%leaf_cost = ', this%leaf_cost - write(fates_log(),*) 'co%canopy_layer = ', this%canopy_layer - write(fates_log(),*) 'co%canopy_layer_yesterday = ', this%canopy_layer_yesterday - write(fates_log(),*) 'co%nv = ', this%nv - write(fates_log(),*) 'co%status_coh = ', this%status_coh - write(fates_log(),*) 'co%canopy_trim = ', this%canopy_trim - write(fates_log(),*) 'co%excl_weight = ', this%excl_weight - write(fates_log(),*) 'co%prom_weight = ', this%prom_weight - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class - write(fates_log(),*) 'co%coage_class = ', this%coage_class - write(fates_log(),*) 'co%coage_by_pft_class = ', this%coage_by_pft_class - write(fates_log(),*) 'co%gpp_acc_hold = ', this%gpp_acc_hold - write(fates_log(),*) 'co%gpp_acc = ', this%gpp_acc - write(fates_log(),*) 'co%gpp_tstep = ', this%gpp_tstep - write(fates_log(),*) 'co%npp_acc_hold = ', this%npp_acc_hold - write(fates_log(),*) 'co%npp_tstep = ', this%npp_tstep - write(fates_log(),*) 'co%npp_acc = ', this%npp_acc - write(fates_log(),*) 'co%resp_tstep = ', this%resp_tstep - write(fates_log(),*) 'co%resp_acc = ', this%resp_acc - write(fates_log(),*) 'co%resp_acc_hold = ', this%resp_acc_hold - write(fates_log(),*) 'co%rdark = ', this%rdark - write(fates_log(),*) 'co%resp_m = ', this%resp_m - write(fates_log(),*) 'co%resp_g_tstep = ', this%resp_g_tstep - write(fates_log(),*) 'co%livestem_mr = ', this%livestem_mr - write(fates_log(),*) 'co%livecroot_mr = ', this%livecroot_mr - write(fates_log(),*) 'co%froot_mr = ', this%froot_mr - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%treelai = ', this%treelai - write(fates_log(),*) 'co%treesai = ', this%treesai - write(fates_log(),*) 'co%c_area = ', this%c_area - write(fates_log(),*) 'co%cmort = ', this%cmort - write(fates_log(),*) 'co%bmort = ', this%bmort - write(fates_log(),*) 'co%smort = ', this%smort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%dgmort = ', this%dgmort - write(fates_log(),*) 'co%hmort = ', this%hmort - write(fates_log(),*) 'co%frmort = ', this%frmort - write(fates_log(),*) 'co%asmort = ', this%asmort - write(fates_log(),*) 'co%lmort_direct = ', this%lmort_direct - write(fates_log(),*) 'co%lmort_collateral = ', this%lmort_collateral - write(fates_log(),*) 'co%lmort_infra = ', this%lmort_infra - write(fates_log(),*) 'co%isnew = ', this%isnew - write(fates_log(),*) 'co%dndt = ', this%dndt - write(fates_log(),*) 'co%dhdt = ', this%dhdt - write(fates_log(),*) 'co%ddbhdt = ', this%ddbhdt - write(fates_log(),*) 'co%dbdeaddt = ', this%dbdeaddt - write(fates_log(),*) 'co%fraction_crown_burned = ', this%fraction_crown_burned - write(fates_log(),*) 'co%fire_mort = ', this%fire_mort - write(fates_log(),*) 'co%crownfire_mort = ', this%crownfire_mort - write(fates_log(),*) 'co%cambial_mort = ', this%cambial_mort - write(fates_log(),*) 'co%size_class = ', this%size_class - write(fates_log(),*) 'co%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'cthis%g_sb_laweight = ', this%g_sb_laweight + write(fates_log(),*) 'cthis%leaf_cost = ', this%leaf_cost + write(fates_log(),*) 'cthis%canopy_layer = ', this%canopy_layer + write(fates_log(),*) 'cthis%canopy_layer_yesterday = ', this%canopy_layer_yesterday + write(fates_log(),*) 'cthis%nv = ', this%nv + write(fates_log(),*) 'cthis%status_coh = ', this%status_coh + write(fates_log(),*) 'cthis%canopy_trim = ', this%canopy_trim + write(fates_log(),*) 'cthis%excl_weight = ', this%excl_weight + write(fates_log(),*) 'cthis%prom_weight = ', this%prom_weight + write(fates_log(),*) 'cthis%size_class = ', this%size_class + write(fates_log(),*) 'cthis%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'cthis%coage_class = ', this%coage_class + write(fates_log(),*) 'cthis%coage_by_pft_class = ', this%coage_by_pft_class + write(fates_log(),*) 'cthis%gpp_acc_hold = ', this%gpp_acc_hold + write(fates_log(),*) 'cthis%gpp_acc = ', this%gpp_acc + write(fates_log(),*) 'cthis%gpp_tstep = ', this%gpp_tstep + write(fates_log(),*) 'cthis%npp_acc_hold = ', this%npp_acc_hold + write(fates_log(),*) 'cthis%npp_tstep = ', this%npp_tstep + write(fates_log(),*) 'cthis%npp_acc = ', this%npp_acc + write(fates_log(),*) 'cthis%resp_tstep = ', this%resp_tstep + write(fates_log(),*) 'cthis%resp_acc = ', this%resp_acc + write(fates_log(),*) 'cthis%resp_acc_hold = ', this%resp_acc_hold + write(fates_log(),*) 'cthis%rdark = ', this%rdark + write(fates_log(),*) 'cthis%resp_m = ', this%resp_m + write(fates_log(),*) 'cthis%resp_g_tstep = ', this%resp_g_tstep + write(fates_log(),*) 'cthis%livestem_mr = ', this%livestem_mr + write(fates_log(),*) 'cthis%livecroot_mr = ', this%livecroot_mr + write(fates_log(),*) 'cthis%froot_mr = ', this%froot_mr + write(fates_log(),*) 'cthis%dgmort = ', this%dgmort + write(fates_log(),*) 'cthis%treelai = ', this%treelai + write(fates_log(),*) 'cthis%treesai = ', this%treesai + write(fates_log(),*) 'cthis%c_area = ', this%c_area + write(fates_log(),*) 'cthis%cmort = ', this%cmort + write(fates_log(),*) 'cthis%bmort = ', this%bmort + write(fates_log(),*) 'cthis%smort = ', this%smort + write(fates_log(),*) 'cthis%asmort = ', this%asmort + write(fates_log(),*) 'cthis%dgmort = ', this%dgmort + write(fates_log(),*) 'cthis%hmort = ', this%hmort + write(fates_log(),*) 'cthis%frmort = ', this%frmort + write(fates_log(),*) 'cthis%asmort = ', this%asmort + write(fates_log(),*) 'cthis%lmort_direct = ', this%lmort_direct + write(fates_log(),*) 'cthis%lmort_collateral = ', this%lmort_collateral + write(fates_log(),*) 'cthis%lmort_infra = ', this%lmort_infra + write(fates_log(),*) 'cthis%isnew = ', this%isnew + write(fates_log(),*) 'cthis%dndt = ', this%dndt + write(fates_log(),*) 'cthis%dhdt = ', this%dhdt + write(fates_log(),*) 'cthis%ddbhdt = ', this%ddbhdt + write(fates_log(),*) 'cthis%dbdeaddt = ', this%dbdeaddt + write(fates_log(),*) 'cthis%fraction_crown_burned = ', this%fraction_crown_burned + write(fates_log(),*) 'cthis%fire_mort = ', this%fire_mort + write(fates_log(),*) 'cthis%crownfire_mort = ', this%crownfire_mort + write(fates_log(),*) 'cthis%cambial_mort = ', this%cambial_mort + write(fates_log(),*) 'cthis%size_class = ', this%size_class + write(fates_log(),*) 'cthis%size_by_pft_class = ', this%size_by_pft_class if (associated(this%co_hydr)) call this%co_hydr%dump() write(fates_log(),*) '----------------------------------------' - return - end subroutine dump !:.........................................................................: From ce12d059959ddb5266f4a4315fa2629f1c33888d Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 4 May 2023 11:40:33 -0600 Subject: [PATCH 058/125] update for refactor --- biogeochem/EDCohortDynamicsMod.F90 | 32 ++---------------------------- biogeochem/EDPatchDynamicsMod.F90 | 3 +-- biogeochem/FatesPatchMod.F90 | 2 +- main/FatesCohortMod.F90 | 31 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index a910bee762..d1ce6efc35 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -125,7 +125,6 @@ Module EDCohortDynamicsMod public :: count_cohorts public :: InitPRTObject public :: SendCohortToLitter - public :: DeallocateCohort public :: EvaluateAndCorrectDBH public :: DamageRecovery @@ -546,7 +545,7 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) shorterCohort%taller => tallerCohort endif - call DeallocateCohort(currentCohort) + call currentCohort%free_memory() end subroutine terminate_cohort @@ -681,34 +680,7 @@ end subroutine SendCohortToLitter !-------------------------------------------------------------------------------------- - subroutine DeallocateCohort(currentCohort) - ! ---------------------------------------------------------------------------------- - ! This subroutine deallocates all dynamic memory and objects - ! inside the cohort structure. This DOES NOT deallocate - ! the cohort structure itself. - ! ---------------------------------------------------------------------------------- - - type(fates_cohort_type),intent(inout) :: currentCohort - integer :: istat ! return status code - character(len=255) :: smsg - - ! At this point, nothing should be pointing to current Cohort - if (hlm_use_planthydro.eq.itrue) call DeallocateHydrCohort(currentCohort) - - ! Deallocate the cohort's PRT structures - call currentCohort%prt%DeallocatePRTVartypes() - - ! Deallocate the PRT object - - deallocate(currentCohort%prt, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc002: fail in deallocate(currentCohort%prt):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - return - end subroutine DeallocateCohort subroutine fuse_cohorts(currentSite, currentPatch, bc_in) @@ -1186,7 +1158,7 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in) call UpdateSizeDepPlantHydProps(currentSite,currentCohort, bc_in) endif - call DeallocateCohort(nextc) + call nextc%free_memory() deallocate(nextc, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc003: fail on deallocate(nextc):'//trim(smsg) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 3aaba6fb31..c5bfabd6ec 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -11,7 +11,6 @@ module EDPatchDynamicsMod use EDPftvarcon , only : GetDecompyFrac use PRTParametersMod , only : prt_params use EDCohortDynamicsMod , only : fuse_cohorts, sort_cohorts, insert_cohort - use EDCohortDynamicsMod , only : DeallocateCohort use EDTypesMod , only : area_site => area use ChecksBalancesMod , only : PatchMassStock use FatesLitterMod , only : ncwd @@ -1110,7 +1109,7 @@ subroutine spawn_patches( currentSite, bc_in) else ! Get rid of the new temporary cohort - call DeallocateCohort(nc) + call nc%free_memory() deallocate(nc, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc005: fail on deallocate(nc):'//trim(smsg) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index ae536a9cb5..26eb43583f 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -620,7 +620,7 @@ subroutine free_memory(this) ccohort => this%shortest do while(associated(ccohort)) ncohort => ccohort%taller - call DeallocateCohort(ccohort) + call ccohort%free_memory() deallocate(ccohort, stat=istat, errmsg=smsg) if (istat /= 0) then write(fates_log(),*) 'dealloc007: fail on deallocate(cchort):'//trim(smsg) diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 index c7d15da584..9cf451a5e8 100644 --- a/main/FatesCohortMod.F90 +++ b/main/FatesCohortMod.F90 @@ -760,6 +760,37 @@ subroutine copy(this, copy_cohort) end subroutine copy + !:.........................................................................: + + subroutine free_memory(this) + ! + ! DESCRIPTION: + ! deallocates all dynamic memory and objects within the cohort structure + ! DOES NOT deallocate the cohort structure itself + ! + + ! ARGUMENTS + type(fates_cohort_type), intent(inout) :: this ! cohort object + + ! LOCALS: + integer :: istat ! return status code + character(len=255) :: smsg ! error message + + ! at this point, nothing should be pointing to current cohort + if (hlm_use_planthydro .eq. itrue) call DeallocateHydrCohort(this) + + ! deallocate the cohort's PRT structures + call this%prt%DeallocatePRTVartypes() + + ! Deallocate the PRT object + deallocate(this%prt, stat=istat, errmsg=smsg) + if (istat /= 0) then + write(fates_log(),*) 'dealloc002: fail in deallocate(currentCohort%prt):'//trim(smsg) + call endrun(msg=errMsg(sourcefile, __LINE__)) + endif + + end subroutine free_memory + !:.........................................................................: subroutine InitPRTBoundaryConditions(this) From 34b0fa04aab1a691e354682e279b6b9ec41f87fc Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 4 May 2023 13:58:31 -0600 Subject: [PATCH 059/125] fix circular dependencies with hydraulics objects --- biogeochem/FatesPatchMod.F90 | 20 ++++---- biogeophys/FatesPlantHydraulicsMod.F90 | 69 -------------------------- main/FatesCohortMod.F90 | 20 ++++---- main/FatesHydraulicsMemMod.F90 | 64 +++++++++++++++++++++++- 4 files changed, 83 insertions(+), 90 deletions(-) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 26eb43583f..22103fc6a7 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -5,6 +5,7 @@ module FatesPatchMod use FatesConstantsMod, only : fates_unset_int use FatesConstantsMod, only : primaryforest, secondaryforest use FatesGlobals, only : fates_log + use FatesGlobals, only : endrun => fates_endrun use FatesUtilsMod, only : check_hlm_list use FatesUtilsMod, only : check_var_real use FatesCohortMod, only : fates_cohort_type @@ -20,6 +21,7 @@ module FatesPatchMod use FatesRunningMeanMod, only : ema_24hr, fixed_24hr, ema_lpa, ema_longterm use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) + use shr_log_mod, only : errMsg => shr_log_errMsg implicit none private @@ -558,18 +560,18 @@ subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object - real(r8), intent(in) :: age ! notional age of this patch in years - real(r8), intent(in) :: areap ! initial area of this patch in m2. - integer, intent(in) :: label ! anthropogenic disturbance label - integer, intent(in) :: nocomp_pft ! no-competition mode pft label - integer, intent(in) :: numSWb ! number of shortwave broad-bands to track - integer, intent(in) :: numpft ! number of pfts to simulate - integer, intent(in) :: nlevsoil ! number of soil layers - integer, intent(in) :: current_tod ! time of day [seconds past 0Z] + real(r8), intent(in) :: age ! notional age of this patch in years + real(r8), intent(in) :: areap ! initial area of this patch in m2. + integer, intent(in) :: label ! anthropogenic disturbance label + integer, intent(in) :: nocomp_pft ! no-competition mode pft label + integer, intent(in) :: numSWb ! number of shortwave broad-bands to track + integer, intent(in) :: numpft ! number of pfts to simulate + integer, intent(in) :: nlevsoil ! number of soil layers + integer, intent(in) :: current_tod ! time of day [seconds past 0Z] ! initialize patch ! sets all values to nan, then some values to zero - call this%init(numSWb, nlevsoil) + call this%init(numpft, numSWb, nlevsoil) ! initialize running means for patch call this%init_running_means(current_tod) diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index 4b52cea541..7a38028db1 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -252,7 +252,6 @@ module FatesPlantHydraulicsMod public :: InitHydrCohort public :: DeallocateHydrCohort public :: UpdateH2OVeg - public :: CopyCohortHydraulics public :: FuseCohortHydraulics public :: UpdateSizeDepPlantHydProps public :: UpdateSizeDepPlantHydStates @@ -1195,74 +1194,6 @@ end function constrain_water_contents ! ===================================================================================== -subroutine CopyCohortHydraulics(newCohort, oldCohort) - - ! Arguments - type(fates_cohort_type), intent(inout), target :: newCohort - type(fates_cohort_type), intent(inout), target :: oldCohort - - ! Locals - type(ed_cohort_hydr_type), pointer :: ncohort_hydr - type(ed_cohort_hydr_type), pointer :: ocohort_hydr - - - ncohort_hydr => newCohort%co_hydr - ocohort_hydr => oldCohort%co_hydr - - ! Node heights - ncohort_hydr%z_node_ag = ocohort_hydr%z_node_ag - ncohort_hydr%z_upper_ag = ocohort_hydr%z_upper_ag - ncohort_hydr%z_lower_ag = ocohort_hydr%z_lower_ag - ncohort_hydr%z_node_troot = ocohort_hydr%z_node_troot - - ! Compartment kmax's - ncohort_hydr%kmax_petiole_to_leaf = ocohort_hydr%kmax_petiole_to_leaf - ncohort_hydr%kmax_stem_lower = ocohort_hydr%kmax_stem_lower - ncohort_hydr%kmax_stem_upper = ocohort_hydr%kmax_stem_upper - ncohort_hydr%kmax_troot_upper = ocohort_hydr%kmax_troot_upper - ncohort_hydr%kmax_troot_lower = ocohort_hydr%kmax_troot_lower - ncohort_hydr%kmax_aroot_upper = ocohort_hydr%kmax_aroot_upper - ncohort_hydr%kmax_aroot_lower = ocohort_hydr%kmax_aroot_lower - ncohort_hydr%kmax_aroot_radial_in = ocohort_hydr%kmax_aroot_radial_in - ncohort_hydr%kmax_aroot_radial_out = ocohort_hydr%kmax_aroot_radial_out - - ! Compartment volumes - ncohort_hydr%v_ag_init = ocohort_hydr%v_ag_init - ncohort_hydr%v_ag = ocohort_hydr%v_ag - ncohort_hydr%v_troot_init = ocohort_hydr%v_troot_init - ncohort_hydr%v_troot = ocohort_hydr%v_troot - ncohort_hydr%v_aroot_layer_init = ocohort_hydr%v_aroot_layer_init - ncohort_hydr%v_aroot_layer = ocohort_hydr%v_aroot_layer - ncohort_hydr%l_aroot_layer = ocohort_hydr%l_aroot_layer - - ! State Variables - ncohort_hydr%th_ag = ocohort_hydr%th_ag - ncohort_hydr%th_troot = ocohort_hydr%th_troot - ncohort_hydr%th_aroot = ocohort_hydr%th_aroot - ncohort_hydr%psi_ag = ocohort_hydr%psi_ag - ncohort_hydr%psi_troot = ocohort_hydr%psi_troot - ncohort_hydr%psi_aroot = ocohort_hydr%psi_aroot - ncohort_hydr%ftc_ag = ocohort_hydr%ftc_ag - ncohort_hydr%ftc_troot = ocohort_hydr%ftc_troot - ncohort_hydr%ftc_aroot = ocohort_hydr%ftc_aroot - - ! Other - ncohort_hydr%btran = ocohort_hydr%btran - ncohort_hydr%supsub_flag = ocohort_hydr%supsub_flag - ncohort_hydr%iterh1 = ocohort_hydr%iterh1 - ncohort_hydr%iterh2 = ocohort_hydr%iterh2 - ncohort_hydr%iterlayer = ocohort_hydr%iterlayer - ncohort_hydr%errh2o = ocohort_hydr%errh2o - - - ! BC PLANT HYDRAULICS - flux terms - ncohort_hydr%qtop = ocohort_hydr%qtop - - ncohort_hydr%is_newly_recruited = ocohort_hydr%is_newly_recruited - -end subroutine CopyCohortHydraulics - -! ===================================================================================== subroutine FuseCohortHydraulics(currentSite,currentCohort, nextCohort, bc_in, newn) diff --git a/main/FatesCohortMod.F90 b/main/FatesCohortMod.F90 index 9cf451a5e8..7cacf59c83 100644 --- a/main/FatesCohortMod.F90 +++ b/main/FatesCohortMod.F90 @@ -19,9 +19,9 @@ module FatesCohortMod use PRTParametersMod, only : prt_params use FatesParameterDerivedMod, only : param_derived use FatesHydraulicsMemMod, only : ed_cohort_hydr_type - use FatesPlantHydraulicsMod, only : CopyCohortHydraulics use FatesInterfaceTypesMod, only : hlm_parteh_mode use FatesInterfaceTypesMod, only : hlm_use_sp + use FatesInterfaceTypesMod, only : hlm_use_planthydro use FatesInterfaceTypesMod, only : nleafage use EDPftvarcon, only : EDPftvarcon_inst use FatesSizeAgeTypeIndicesMod, only : sizetype_class_index @@ -270,6 +270,7 @@ module FatesCohortMod procedure :: zero_values procedure :: create procedure :: copy + procedure :: free_memory procedure :: CanUpperUnder procedure :: InitPRTBoundaryConditions procedure :: UpdateCohortBioPhysRates @@ -630,7 +631,7 @@ subroutine copy(this, copy_cohort) ! ARGUMENTS class(fates_cohort_type), intent(in) :: this ! old cohort - class(fates_cohort_type), intent(inout) :: copy_cohort ! new cohort + class(fates_cohort_type), intent(inout) :: copy_cohort ! new cohort copy_cohort%indexnumber = fates_unset_int @@ -688,11 +689,6 @@ subroutine copy(this, copy_cohort) copy_cohort%year_net_uptake = this%year_net_uptake copy_cohort%cnp_limiter = this%cnp_limiter - if (debug .and. .not. this%isnew) then - write(fates_log(),*) 'EDcohortDyn Ia ', this%npp_acc - write(fates_log(),*) 'EDcohortDyn Ib ', this%resp_acc - end if - if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then copy_cohort%cx_int = this%cx_int copy_cohort%ema_dcxdt = this%ema_dcxdt @@ -753,9 +749,8 @@ subroutine copy(this, copy_cohort) copy_cohort%fire_mort = this%fire_mort ! HYDRAULICS - if (hlm_use_planthydro .eq. itrue) then - call CopyCohortHydraulics(copy_cohort, this) + call copy_cohort%co_hydr%CopyCohortHydraulics(this%co_hydr) endif end subroutine copy @@ -770,14 +765,17 @@ subroutine free_memory(this) ! ! ARGUMENTS - type(fates_cohort_type), intent(inout) :: this ! cohort object + class(fates_cohort_type), intent(inout) :: this ! cohort object ! LOCALS: integer :: istat ! return status code character(len=255) :: smsg ! error message ! at this point, nothing should be pointing to current cohort - if (hlm_use_planthydro .eq. itrue) call DeallocateHydrCohort(this) + if (hlm_use_planthydro .eq. itrue) then + call this%co_hydr%DeAllocateHydrCohortArrays() + deallocate(this%co_hydr) + end if ! deallocate the cohort's PRT structures call this%prt%DeallocatePRTVartypes() diff --git a/main/FatesHydraulicsMemMod.F90 b/main/FatesHydraulicsMemMod.F90 index 22ade5f9b6..856599f2e5 100644 --- a/main/FatesHydraulicsMemMod.F90 +++ b/main/FatesHydraulicsMemMod.F90 @@ -315,12 +315,74 @@ module FatesHydraulicsMemMod procedure :: AllocateHydrCohortArrays procedure :: DeallocateHydrCohortArrays + procedure :: CopyCohortHydraulics procedure :: dump end type ed_cohort_hydr_type contains - + + subroutine CopyCohortHydraulics(ncohort_hydr, ocohort_hydr) + + ! Arguments + class(ed_cohort_hydr_type), intent(inout) :: ncohort_hydr + class(ed_cohort_hydr_type), intent(inout) :: ocohort_hydr + + ! Node heights + ncohort_hydr%z_node_ag = ocohort_hydr%z_node_ag + ncohort_hydr%z_upper_ag = ocohort_hydr%z_upper_ag + ncohort_hydr%z_lower_ag = ocohort_hydr%z_lower_ag + ncohort_hydr%z_node_troot = ocohort_hydr%z_node_troot + + ! Compartment kmax's + ncohort_hydr%kmax_petiole_to_leaf = ocohort_hydr%kmax_petiole_to_leaf + ncohort_hydr%kmax_stem_lower = ocohort_hydr%kmax_stem_lower + ncohort_hydr%kmax_stem_upper = ocohort_hydr%kmax_stem_upper + ncohort_hydr%kmax_troot_upper = ocohort_hydr%kmax_troot_upper + ncohort_hydr%kmax_troot_lower = ocohort_hydr%kmax_troot_lower + ncohort_hydr%kmax_aroot_upper = ocohort_hydr%kmax_aroot_upper + ncohort_hydr%kmax_aroot_lower = ocohort_hydr%kmax_aroot_lower + ncohort_hydr%kmax_aroot_radial_in = ocohort_hydr%kmax_aroot_radial_in + ncohort_hydr%kmax_aroot_radial_out = ocohort_hydr%kmax_aroot_radial_out + + ! Compartment volumes + ncohort_hydr%v_ag_init = ocohort_hydr%v_ag_init + ncohort_hydr%v_ag = ocohort_hydr%v_ag + ncohort_hydr%v_troot_init = ocohort_hydr%v_troot_init + ncohort_hydr%v_troot = ocohort_hydr%v_troot + ncohort_hydr%v_aroot_layer_init = ocohort_hydr%v_aroot_layer_init + ncohort_hydr%v_aroot_layer = ocohort_hydr%v_aroot_layer + ncohort_hydr%l_aroot_layer = ocohort_hydr%l_aroot_layer + + ! State Variables + ncohort_hydr%th_ag = ocohort_hydr%th_ag + ncohort_hydr%th_troot = ocohort_hydr%th_troot + ncohort_hydr%th_aroot = ocohort_hydr%th_aroot + ncohort_hydr%psi_ag = ocohort_hydr%psi_ag + ncohort_hydr%psi_troot = ocohort_hydr%psi_troot + ncohort_hydr%psi_aroot = ocohort_hydr%psi_aroot + ncohort_hydr%ftc_ag = ocohort_hydr%ftc_ag + ncohort_hydr%ftc_troot = ocohort_hydr%ftc_troot + ncohort_hydr%ftc_aroot = ocohort_hydr%ftc_aroot + + ! Other + ncohort_hydr%btran = ocohort_hydr%btran + ncohort_hydr%supsub_flag = ocohort_hydr%supsub_flag + ncohort_hydr%iterh1 = ocohort_hydr%iterh1 + ncohort_hydr%iterh2 = ocohort_hydr%iterh2 + ncohort_hydr%iterlayer = ocohort_hydr%iterlayer + ncohort_hydr%errh2o = ocohort_hydr%errh2o + + + ! BC PLANT HYDRAULICS - flux terms + ncohort_hydr%qtop = ocohort_hydr%qtop + + ncohort_hydr%is_newly_recruited = ocohort_hydr%is_newly_recruited + + end subroutine CopyCohortHydraulics + + ! ========================================================================== + subroutine AllocateHydrCohortArrays(this,nlevrhiz) ! Arguments From d879aea4721ed30223d2c313e20d20df69cbd4a5 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 4 May 2023 15:26:04 -0700 Subject: [PATCH 060/125] converting variables to snake case --- tools/luh2mod.py | 127 ++++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 63 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 27174a2b13..33ab993d98 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -12,34 +12,34 @@ def main(): # Add argument parser - subfunction? Seperate common module? - # inputfiles and range should be the only arguments + # input_files and range should be the only arguments # Allow variable input files (state and/or transitions and/or management) args = CommandLineArgs() # Prep the LUH2 data - ds_luh2 = PrepDataSet(args.luh2file,args.begin,args.end) + ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) # Prep the regrid target (assuming surface dataset) - ds_regridtarget= PrepDataSet(args.regridtargetfile,args.begin,args.end) + ds_regrid_target= PrepDataSet(args.regrid_target_file,args.begin,args.end) # Build regridder - regridder = RegridConservative(ds_luh2, ds_regridtarget, save=True) + regridder = RegridConservative(ds_luh2, ds_regrid_target, save=True) # Regrid the dataset(s) regrid_luh2 = regridder(ds_states) # Rename the dimensions for the output regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) - regrid_luh2["LONGXY"] = ds_regridtarget["LONGXY"] - regrid_luh2["LATIXY"] = ds_regridtarget["LATIXY"] + regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] + regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension regrid_luh2["YEAR"] = regrid_luh2.time # Write the files - outputfile = os.path.join(os.getcwd(),'LUH2_states_transitions_management.timeseries_4x5_hist_simyr1850-2015_c230415.nc') + output_file = os.path.join(os.getcwd(),'LUH2_states_transitions_management.timeseries_4x5_hist_simyr1850-2015_c230415.nc') - regrid_luh2.to_netcdf(outputfile) + regrid_luh2.to_netcdf(output_file) # Example of file naming scheme # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') @@ -50,13 +50,13 @@ def CommandLineArgs(): # Required input luh2 datafile # TO DO: using the checking function to report back if invalid file input - parser.add_argument("-l","--luh2file", require=True) + parser.add_argument("-l","--luh2_file", require=True) # Provide mutually exlusive arguments for regridding input selection # Currently assuming that if a target is provided that a regridder file will be saved - regridtarget = parser.add_mutually_exclusive_group(required=True) - regridtarget.add_argument("-rf","--regridderfile") # use previously save regridder file - regridtarget.add_argument("-rt","--regriddertarget") # use a dataset to regrid to + regrid_target = parser.add_mutually_exclusive_group(required=True) + regrid_target.add_argument("-rf","--regridderfile") # use previously save regridder file + regrid_target.add_argument("-rt","--regriddertarget") # use a dataset to regrid to # Optional input to subset the time range of the data parser.add_argument("-b","--begin") @@ -66,52 +66,52 @@ def CommandLineArgs(): return(args) -# Prepare the inputfile to be used for regridding -def PrepDataSet(inputfile,start,stop): +# Prepare the input_file to be used for regridding +def PrepDataSet(input_file,start,stop): # Import the data - inputdataset = ImportData(inputfile) + input_dataset = ImportData(input_file) # Truncate the data to the user defined range # This might need some more error handling for when # the start/stop is out of range try: - inputdataset = inputdataset.sel(time=slice(start,stop)) + input_dataset = input_dataset.sel(time=slice(start,stop)) except TypeError as err: print("TypeError:", err) print("Input must be a string") # Correct the necessary variables for both datasets - PrepDataSet_ESMF(inputdataset) + PrepDataSet_ESMF(input_dataset) # Set dataset masks - SetMask(inputdataset) + SetMask(input_dataset) - return(inputdataset) + return(input_dataset) # Updating datasets to work with xESMF -def PrepDataSet_ESMF(inputdataset): +def PrepDataSet_ESMF(input_dataset): # Check the dataset type - dsflag, dstype = CheckDataSet(inputdataset) + dsflag, dstype = CheckDataSet(input_dataset) if (dsflag): if(dstype == "LUH2"): - BoundsVariableFixLUH2(inputdataset) + BoundsVariableFixLUH2(input_dataset) elif(dstype == "Surface"): - DimensionFixSurfData(inputdataset) + DimensionFixSurfData(input_dataset) print("data set updated for xESMF") - return(inputdataset) + return(input_dataset) # Import luh2 or surface data sets -def ImportData(inputfile): +def ImportData(input_file): # Open files # Check to see if a ValueError is raised which is likely due # to the LUH2 time units being undecodable by cftime module try: - datasetout = xr.open_dataset(inputfile) - print("Input file dataset opened: {}".format(inputfile)) + datasetout = xr.open_dataset(input_file) + print("Input file dataset opened: {}".format(input_file)) return(datasetout) except ValueError as err: print("ValueError:", err) @@ -126,19 +126,19 @@ def ImportData(inputfile): # This issue here is that the luh2 time units start prior to # year 1672, which cftime should be able to handle, but it # appears to need a specific unit name convention "common_years" -def AttribUpdateLUH2(inputfile,output_append="modified"): +def AttribUpdateLUH2(input_file,output_append="modified"): # Define the output filename - index = inputfile.find(".nc") - outputfile = inputfile[:index] + "_" + output_append + inputfile[index:] + index = input_file.find(".nc") + output_file = input_file[:index] + "_" + output_append + input_file[index:] nco = Nco() # Get the 'time:units' string from the input using ncks - timeunitstr = nco.ncks(input=inputfile,variable="time",options=["-m"]).decode() + time_unit_string = nco.ncks(input=input_file,variable="time",options=["-m"]).decode() # Grab the units string and replace "years" with "common_years" - substr = re.search('time:units.*".*"',timeunitstr) + substr = re.search('time:units.*".*"',time_unit_string) newstr = substr.group().replace("time:units = \"years","\"common_years") # Use ncatted to update the time units @@ -146,15 +146,15 @@ def AttribUpdateLUH2(inputfile,output_append="modified"): var = "time" att_type = "c" opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] - nco.ncatted(input=inputfile, output=outputfile, options=opts) + nco.ncatted(input=input_file, output=output_file, options=opts) - print("Generated modified output file: {}".format(outputfile)) + print("Generated modified output file: {}".format(output_file)) - return(outputfile) + return(output_file) # The following is fixed with PR #62 for pynco but isn't in that latest update yet # on conda - # nco.ncatted(input=inputfile,output=outputfile,options=[ + # nco.ncatted(input=input_file,output=output_file,options=[ # Atted(mode="overwrite", # att_name="units", # var_name="time", @@ -167,61 +167,61 @@ def AttribUpdateLUH2(inputfile,output_append="modified"): # Each lat/lon boundary array is a 2D array corresponding to the bounds of each # coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate # of 89.875). -def BoundsVariableFixLUH2(inputdataset): +def BoundsVariableFixLUH2(input_dataset): # Drop the old boundary names to avoid confusion - # outputdataset = inputdataset.drop(labels=['lat_bounds','lon_bounds']) + # outputdataset = input_dataset.drop(labels=['lat_bounds','lon_bounds']) # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional_bounds array. # Future todo: is it possible to have xESMF recognize and use the original 2D array? - inputdataset["lat_b"] = np.insert(inputdataset.lat_bounds[:,1].data,0,inputdataset.lat_bounds[0,0].data) - inputdataset["lon_b"] = np.insert(inputdataset.lon_bounds[:,1].data,0,inputdataset.lon_bounds[0,0].data) + input_dataset["lat_b"] = np.insert(input_dataset.lat_bounds[:,1].data,0,input_dataset.lat_bounds[0,0].data) + input_dataset["lon_b"] = np.insert(input_dataset.lon_bounds[:,1].data,0,input_dataset.lon_bounds[0,0].data) print("LUH2 dataset lat/lon boundary variables formatted and added as new variable for xESMF") - return(inputdataset) + return(input_dataset) # The user will need to use a surface data set to regrid from, but the surface datasets # need to have their dimensions renamed to something recognizable by xESMF -def DimensionFixSurfData(inputdataset): +def DimensionFixSurfData(input_dataset): # Rename the surface dataset dimensions to something recognizable by xESMF. - # inputdataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) - inputdataset = inputdataset.rename_dims(dims_dict={'lsmlat':'lat','lsmlon':'lon'}) + # input_dataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) + input_dataset = input_dataset.rename_dims(dims_dict={'lsmlat':'lat','lsmlon':'lon'}) # Populate the new surface dataset with the actual lat/lon values - # inputdataset['longitude'] = inputdataset.LONGXY.isel(latitude=0) - # inputdataset['latitude'] = inputdataset.LATIXY.isel(longitude=0) - inputdataset['lon'] = inputdataset.LONGXY.isel(lat=0) - inputdataset['lat'] = inputdataset.LATIXY.isel(lon=0) + # input_dataset['longitude'] = input_dataset.LONGXY.isel(latitude=0) + # input_dataset['latitude'] = input_dataset.LATIXY.isel(longitude=0) + input_dataset['lon'] = input_dataset.LONGXY.isel(lat=0) + input_dataset['lat'] = input_dataset.LATIXY.isel(lon=0) print("Surface dataset dimensions renamed for xESMF") - return(inputdataset) + return(input_dataset) -def SetMask(inputdataset): +def SetMask(input_dataset): # check what sort of inputdata is being provided; surface dataset or luh2 # LUH2 data will need to be masked based on the variable input to mask - dsflag,dstype = CheckDataSet(inputdataset) + dsflag,dstype = CheckDataSet(input_dataset) if (dsflag): if(dstype == "LUH2"): - SetMaskLUH2(inputdataset,'primf') # temporary + SetMaskLUH2(input_dataset,'primf') # temporary elif(dstype == "Surface"): - SetMaskSurfData(inputdataset) + SetMaskSurfData(input_dataset) print("mask added") - return(inputdataset) + return(input_dataset) # Check which dataset we're working with -def CheckDataSet(inputdataset): +def CheckDataSet(input_dataset): dsflag = False - if('primf' in list(inputdataset.variables)): + if('primf' in list(input_dataset.variables)): dstype = 'LUH2' dsflag = True print("LUH2") - elif('natpft' in list(inputdataset.variables)): + elif('natpft' in list(input_dataset.variables)): dstype = 'Surface' dsflag = True print("Surface") @@ -232,18 +232,19 @@ def CheckDataSet(inputdataset): return(dsflag,dstype) # LUH2 specific masking sub-function -def SetMaskLUH2(inputdataset,label_to_mask): +def SetMaskLUH2(input_dataset,static_data_set): # Instead of passing the label_to_mask, loop through this for all labels? - inputdataset["mask"] = xr.where(~np.isnan(inputdataset[label_to_mask].isel(time=0)), 1, 0) + # input_dataset["mask"] = xr.where(~np.isnan(input_dataset[label_to_mask].isel(time=0)), 1, 0) + input_dataset["mask"] = xr.where(state_data_set.icwtr == 1) # return(outputdataset) - return(inputdataset) + return(input_dataset) # Surface dataset specific masking sub-function -def SetMaskSurfData(inputdataset): +def SetMaskSurfData(input_dataset): # Instead of passing the label_to_mask, loop through this for all labels? - inputdataset["mask"] = inputdataset["PCT_NATVEG"]> 0 + input_dataset["mask"] = input_dataset["PCT_NATVEG"]> 0 # return(outputdataset) - return(inputdataset) + return(input_dataset) def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): # define the regridder transformation From 848bbea5f22bb58b2bcb8882dbe4ac13d52db38d Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 4 May 2023 16:16:06 -0700 Subject: [PATCH 061/125] adjust regridding methods --- tools/luh2mod.py | 92 ++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 33ab993d98..3355007324 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -16,17 +16,34 @@ def main(): # Allow variable input files (state and/or transitions and/or management) args = CommandLineArgs() - # Prep the LUH2 data + # Prep the LUH2 datasets and regrid target ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) - - # Prep the regrid target (assuming surface dataset) ds_regrid_target= PrepDataSet(args.regrid_target_file,args.begin,args.end) - # Build regridder - regridder = RegridConservative(ds_luh2, ds_regrid_target, save=True) + # Import the LUH2 static data to use for masking + ds_luh2_static = ImportData(args.luh2_static_file) + + # Create new variable where the ice water fraction is inverted + ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr + + # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data + ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) + ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) + + # Mask the regrid target + ds_regrid_target = SetMaskSurfData(ds_regrid_target) + + # Regrid the luh2 data to the target grid + regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + regrid_luh2 = regridder_luh2(ds_luh2) + + # Regrid the inverted ice/water fraction data to the target grid + regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) + regrid_land_fraction = regridder_land_fraction(ds_luh2_static) + + # Adjust the luh2 data by the land fraction + regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac - # Regrid the dataset(s) - regrid_luh2 = regridder(ds_states) # Rename the dimensions for the output regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) @@ -85,7 +102,7 @@ def PrepDataSet(input_file,start,stop): PrepDataSet_ESMF(input_dataset) # Set dataset masks - SetMask(input_dataset) + # SetMask(input_dataset) return(input_dataset) @@ -199,18 +216,33 @@ def DimensionFixSurfData(input_dataset): return(input_dataset) -def SetMask(input_dataset): +# def SetMask(input_dataset, masking_dataset): - # check what sort of inputdata is being provided; surface dataset or luh2 - # LUH2 data will need to be masked based on the variable input to mask - dsflag,dstype = CheckDataSet(input_dataset) - if (dsflag): - if(dstype == "LUH2"): - SetMaskLUH2(input_dataset,'primf') # temporary - elif(dstype == "Surface"): - SetMaskSurfData(input_dataset) - print("mask added") +# # check what sort of inputdata is being provided; surface dataset or luh2 +# # LUH2 data will need to be masked based on the variable input to mask +# dsflag,dstype = CheckDataSet(input_dataset) +# if (dsflag): +# if(dstype == "LUH2"): +# SetMaskLUH2(input_dataset) # temporary +# elif(dstype == "Surface"): +# SetMaskSurfData(input_dataset) +# print("mask added") +# +# return(input_dataset) +# LUH2 specific masking sub-function +def SetMaskLUH2(input_dataset,static_data_set): + + # Mask the luh2 data where the ice/water fraction is unity (i.e. fully ice covered gridcell) + input_dataset["mask"] = input_dataset.where(static_data_set.icwtr != 1) + # return(outputdataset) + return(input_dataset) + +# Surface dataset specific masking sub-function +def SetMaskSurfData(input_dataset): + # Instead of passing the label_to_mask, loop through this for all labels? + input_dataset["mask"] = input_dataset["PCT_NATVEG"] > 0 + # return(outputdataset) return(input_dataset) # Check which dataset we're working with @@ -231,21 +263,6 @@ def CheckDataSet(input_dataset): return(dsflag,dstype) -# LUH2 specific masking sub-function -def SetMaskLUH2(input_dataset,static_data_set): - # Instead of passing the label_to_mask, loop through this for all labels? - # input_dataset["mask"] = xr.where(~np.isnan(input_dataset[label_to_mask].isel(time=0)), 1, 0) - input_dataset["mask"] = xr.where(state_data_set.icwtr == 1) - # return(outputdataset) - return(input_dataset) - -# Surface dataset specific masking sub-function -def SetMaskSurfData(input_dataset): - # Instead of passing the label_to_mask, loop through this for all labels? - input_dataset["mask"] = input_dataset["PCT_NATVEG"]> 0 - # return(outputdataset) - return(input_dataset) - def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): # define the regridder transformation regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") @@ -258,15 +275,6 @@ def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): return(regridder) - - # Apply regridder - # regrid_states = regridder(finb_states) - # regrid_management= regridder(finb_management) - # regrid_transitions= regridder(finb_management) - - ### memory crashes on the transition data - #fin_transitions_regrid = regridder(finb) - # General functionality needed # - collect data for specific user-defined time period # - collect subset of the data variables (e.g. pasture, rangeland, etc) From 9a6a9032addc15e6063924eabc423b98df8ce604 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 5 May 2023 07:35:29 -0600 Subject: [PATCH 062/125] get rid of CMakeLists, only for unit test branch --- CMakeLists.txt | 105 --------------------- biogeochem/CMakeLists.txt | 8 -- biogeophys/CMakeLists.txt | 8 -- fire/CMakeLists.txt | 8 -- functional_unit_testing/run_FATES_tests.py | 35 ------- main/CMakeLists.txt | 19 ---- parteh/CMakeLists.txt | 9 -- 7 files changed, 192 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100644 biogeochem/CMakeLists.txt delete mode 100644 biogeophys/CMakeLists.txt delete mode 100644 fire/CMakeLists.txt delete mode 100644 functional_unit_testing/run_FATES_tests.py delete mode 100644 parteh/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 750173fc34..0000000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,105 +0,0 @@ -cmake_minimum_required(VERSION 3.4) - -list(APPEND CMAKE_MODULE_PATH ${CIME_CMAKE_MODULE_DIRECTORY}) -include(CIME_initial_setup) - -project(FATES_tests Fortran C) - -#enable_language(Fortran) - -include(CIME_utils) - -set(CLM_ROOT "../../") - -# Add source directories from other share code (csm_share, etc.) -add_subdirectory(${CLM_ROOT}/share/src csm_share) -add_subdirectory(${CLM_ROOT}/share/unit_test_stubs/util csm_share_stubs) - -#Extract just the files we need from csm_share -set (shr_sources_needed_base - shr_log_mod.F90 - shr_infnan_mod.F90 - shr_kind_mod.F90 - shr_sys_mod.F90 - shr_strconvert_mod.F90 - shr_abort_mod.abortthrows.F90 - ) -extract_sources("${shr_sources_needed_base}" "${share_sources}" shr_sources_needed) - -# Add FATES source directories -add_subdirectory(${CLM_ROOT}/src/fates/main fates_main) -add_subdirectory(${CLM_ROOT}/src/fates/biogeochem fates_biogeochem) -add_subdirectory(${CLM_ROOT}/src/fates/biogeophys fates_biogephys) -add_subdirectory(${CLM_ROOT}/src/fates/parteh fates_parteh) -add_subdirectory(${CLM_ROOT}/src/fates/fire fates_fire) - -# Add general unit test directories (stubbed out files, etc.) -add_subdirectory(${CLM_ROOT}/src/unit_test_stubs clm_stubs) -add_subdirectory(${CLM_ROOT}/src/unit_test_shr clm_tests) - -# Add general unit test directories -add_subdirectory(${CLM_ROOT}/src/fates/unit_test_shr) - -# Remove shr_mpi_mod from share_sources. -# This is needed because we want to use the mock shr_mpi_mod in place of the real one -# -# TODO: this should be moved into a general-purpose function in Sourcelist_utils. -# Then this block of code could be replaced with a single call, like: -# remove_source_file(${share_sources} "shr_mpi_mod.F90") -foreach (sourcefile ${share_sources}) - string(REGEX MATCH "shr_mpi_mod.F90" match_found ${sourcefile}) - if(match_found) - list(REMOVE_ITEM share_sources ${sourcefile}) - endif() -endforeach() - -# Remove shr_cal_mod from share_sources. -# -# shr_cal_mod depends on ESMF (or the lightweight esmf wrf timemgr, at -# least). Since CTSM doesn't currently use shr_cal_mod, we're avoiding -# the extra overhead of including esmf_wrf_timemgr sources in this -# build. -# -# TODO: like above, this should be moved into a general-purpose function -# in Sourcelist_utils. Then this block of code could be replaced with a -# single call, like: remove_source_file(${share_sources} -# "shr_cal_mod.F90") -foreach (sourcefile ${share_sources}) - string(REGEX MATCH "shr_cal_mod.F90" match_found ${sourcefile}) - if(match_found) - list(REMOVE_ITEM share_sources ${sourcefile}) - endif() -endforeach() - -# Build libraries containing stuff needed for the unit tests. -# Eventually, these add_library calls should probably be distributed into the correct location, rather than being in this top-level CMakeLists.txt file. -add_library(csm_share ${shr_sources_needed}) -declare_generated_dependencies(csm_share "${share_genf90_sources}") -add_library(fates ${fates_sources}) -add_dependencies(fates csm_share) - -# We need to look for header files here, in order to pick up shr_assert.h -include_directories(${CLM_ROOT}/share/include) - -set(NETCDF_C_DIR "/usr/local/Cellar/netcdf/4.9.2") -set(NETCDF_FORTRAN_DIR "/usr/local/Cellar/netcdf-fortran/4.6.0") - -FIND_PATH(NETCDFC_FOUND libnetcdf.a ${NETCDF_C_DIR}/lib) -FIND_PATH(NETCDFF_FOUND libnetcdff.a ${NETCDF_FORTRAN_DIR}/lib) -MESSAGE(" NETCDFC_FOUND = ${NETCDFC_FOUND}") -MESSAGE(" NETCDFF_FOUND = ${NETCDFF_FOUND}") - -include_directories(${NETCDF_C_DIR}/include - ${NETCDF_FORTRAN_DIR}/include) -link_directories(${NETCDF_C_DIR}/lib - ${NETCDF_FORTRAN_DIR}/lib) - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -link_directories(${CMAKE_CURRENT_BINARY_DIR}) - -# Add the test directories -# Note: it's possible that these could be added by each source directory that -# has tests in it. However, it appears that the order needs to be done -# carefully: for example, include_directories and link_directories needs to be -# done before adding the tests themselves. -add_subdirectory(${CLM_ROOT}/src/fates/biogeophys/test fates_biogeophys_test) diff --git a/biogeochem/CMakeLists.txt b/biogeochem/CMakeLists.txt deleted file mode 100644 index b9a6889443..0000000000 --- a/biogeochem/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -list(APPEND fates_sources - FatesLitterMod.F90 - FatesAllometryMod.F90 - DamageMainMod.F90 - FatesPatchMod.F90 - ) - -sourcelist_to_parent(fates_sources) \ No newline at end of file diff --git a/biogeophys/CMakeLists.txt b/biogeophys/CMakeLists.txt deleted file mode 100644 index 037dd49fa7..0000000000 --- a/biogeophys/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Note that this is just used for unit testing; hence, we only need to add -# source files that are currently used in unit tests - -list(APPEND fates_sources - FatesHydroWTFMod.F90 - ) - -sourcelist_to_parent(fates_sources) diff --git a/fire/CMakeLists.txt b/fire/CMakeLists.txt deleted file mode 100644 index 0cec31a6a6..0000000000 --- a/fire/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Note that this is just used for unit testing; hence, we only need to add -# source files that are currently used in unit tests - -list(APPEND fates_sources - SFParamsMod.F90 - ) - -sourcelist_to_parent(fates_sources) diff --git a/functional_unit_testing/run_FATES_tests.py b/functional_unit_testing/run_FATES_tests.py deleted file mode 100644 index 29b2df5667..0000000000 --- a/functional_unit_testing/run_FATES_tests.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys - -# -_CTSM_PYTHON = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "..", "python") -) -sys.path.insert(1, _CTSM_PYTHON) - -from ctsm import add_cime_to_path -from CIME.utils import run_cmd_no_fail - -from shutil import rmtree, copy - -def main(build_dir): - os.chdir("..") - if os.path.isdir(build_dir): - rmtree(build_dir) - - ## super hacky right now!! - run_command = ["../../cime/scripts/fortran_unit_testing/run_tests.py", - "--build-dir", "build.temp"] - run_cmd_no_fail(" ".join(run_command), combine_output=True) - - copy(os.path.join(build_dir, "__command_line_test__/__command_line_test__/fates_biogeophys_test/solar_rad_test/FATES_rad_exe"), - "biogeophys/test/solar_rad_test/") - - os.chdir("biogeophys/test/solar_rad_test") - run_command = ["./FATES_rad_exe"] - output = run_cmd_no_fail(" ".join(run_command), combine_output=True) - print(output) - - -if __name__ == "__main__": - main("build.temp") \ No newline at end of file diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 6cbca40357..dfd5eaba2a 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -11,23 +11,4 @@ list(APPEND clm_sources FatesUtilsMod.F90 ) -list(APPEND fates_sources - FatesConstantsMod.F90 - EDTypesMod.F90 - EDPftvarcon.F90 - EDParamsMod.F90 - FatesGlobals.F90 - FatesInterfaceTypesMod.F90 - FatesParametersInterface.F90 - FatesParameterDerivedMod.F90 - FatesHydraulicsMemMod.F90 - FatesRunningMeanMod.F90 - FatesCohortMod.F90 - FatesSizeAgeTypeIndicesMod.F90 - FatesIntegratorsMod.F90 - FatesUtilsMod.F90 - FatesSynchronizedParamsMod.F90 - ) - sourcelist_to_parent(clm_sources) -sourcelist_to_parent(fates_sources) diff --git a/parteh/CMakeLists.txt b/parteh/CMakeLists.txt deleted file mode 100644 index f04d622092..0000000000 --- a/parteh/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -list(APPEND fates_sources - PRTGenericMod.F90 - PRTParametersMod.F90 - PRTParamsFATESMod.F90 - PRTAllometricCarbonMod.F90 - PRTAllometricCNPMod.F90 - ) - - sourcelist_to_parent(fates_sources) \ No newline at end of file From c2e4e24cf502cf51c81150dbb31c32a5dac00978 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 5 May 2023 13:12:45 -0700 Subject: [PATCH 063/125] various fixes and improvements --- tools/luh2mod.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 3355007324..c6932e0a8b 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -76,6 +76,7 @@ def CommandLineArgs(): regrid_target.add_argument("-rt","--regriddertarget") # use a dataset to regrid to # Optional input to subset the time range of the data + # TO DO: howto parser.add_argument("-b","--begin") parser.add_argument("-e","--end") @@ -84,11 +85,18 @@ def CommandLineArgs(): return(args) # Prepare the input_file to be used for regridding -def PrepDataSet(input_file,start,stop): +def PrepDataSet(input_file,start=None,stop=None): # Import the data input_dataset = ImportData(input_file) + # Use the maximum span if start and stop are not present + if (start == None): + start = input_dataset.time[0] + + if (stop == None): + stop = input_dataset.time[-1] + # Truncate the data to the user defined range # This might need some more error handling for when # the start/stop is out of range @@ -99,7 +107,7 @@ def PrepDataSet(input_file,start,stop): print("Input must be a string") # Correct the necessary variables for both datasets - PrepDataSet_ESMF(input_dataset) + input_dataset = PrepDataSet_ESMF(input_dataset) # Set dataset masks # SetMask(input_dataset) @@ -113,9 +121,11 @@ def PrepDataSet_ESMF(input_dataset): dsflag, dstype = CheckDataSet(input_dataset) if (dsflag): if(dstype == "LUH2"): - BoundsVariableFixLUH2(input_dataset) + print("PrepDataSet: LUH2") + input_dataset = BoundsVariableFixLUH2(input_dataset) elif(dstype == "Surface"): - DimensionFixSurfData(input_dataset) + print("PrepDataSet: SurfData") + input_dataset = DimensionFixSurfData(input_dataset) print("data set updated for xESMF") return(input_dataset) @@ -210,7 +220,7 @@ def DimensionFixSurfData(input_dataset): # input_dataset['longitude'] = input_dataset.LONGXY.isel(latitude=0) # input_dataset['latitude'] = input_dataset.LATIXY.isel(longitude=0) input_dataset['lon'] = input_dataset.LONGXY.isel(lat=0) - input_dataset['lat'] = input_dataset.LATIXY.isel(lon=0) + input_dataset['lat'] = input_dataset.LATIXY.isel(lon=0) print("Surface dataset dimensions renamed for xESMF") @@ -234,7 +244,7 @@ def DimensionFixSurfData(input_dataset): def SetMaskLUH2(input_dataset,static_data_set): # Mask the luh2 data where the ice/water fraction is unity (i.e. fully ice covered gridcell) - input_dataset["mask"] = input_dataset.where(static_data_set.icwtr != 1) + input_dataset["mask"] = (static_data_set.icwtr != 1) # return(outputdataset) return(input_dataset) From 243137f415594b16d282784ac6a98eec170f2a42 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 5 May 2023 14:52:40 -0600 Subject: [PATCH 064/125] put cohort mod in biogeochem folder --- {main => biogeochem}/FatesCohortMod.F90 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {main => biogeochem}/FatesCohortMod.F90 (100%) diff --git a/main/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 similarity index 100% rename from main/FatesCohortMod.F90 rename to biogeochem/FatesCohortMod.F90 From 99eac94d8e2bc9c901ab4efa7656e74ae5733e12 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 5 May 2023 15:37:19 -0700 Subject: [PATCH 065/125] Separated luh2 module and luh2 call script --- tools/luh2.py | 132 +++++++++++++++++++++++++++++++++-------------- tools/luh2mod.py | 109 ++++++++++---------------------------- 2 files changed, 120 insertions(+), 121 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 44cd0d1e9a..0457d092a5 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,40 +1,96 @@ #!/usr/bin/env python3 -import luh2mod as luh2 - -# Location of luh2 data - move this to input -# file_states = "/home/glemieux/Data/luh2/orig/states.nc" -# file_management = "/home/glemieux/Data/luh2/orig/management.nc" -# file_transitions = "/home/glemieux/Data/luh2/orig/transitions.nc" - -# # Modify the files -# mod_file_states = luh2.attribupdate(file_states) -# mod_file_management = luh2.attribupdate(file_management) -# mod_file_transitions = luh2.attribupdate(file_transitions) -mod_file_states = "/home/glemieux/Data/luh2/states_modified.nc" -mod_file_management = "/home/glemieux/Data/luh2/management_modified.nc" -mod_file_transitions = "/home/glemieux/Data/luh2/transitions_modified.nc" - -# Open modified files -ds_states = luh2.ImportData(mod_file_states) -# ds_management = luh2.importdata(mod_file_management) -# ds_transitions = luh2.importdata(mod_file_transitions) - -# Fix the bounds of the LUH2 variable for xESMF -ds_states = luh2.BoundsVariableFixLUH2(ds_states) -# ds_management= luh2.BoundsFixLUH2(ds_management) -# ds_transitions = luh2.BoundsFixLUH2(ds_transitions) - -# Grab surface data set to use as regrid "target" -# Import the surface dataset -file_surfdata = "/home/glemieux/Data/luh2/surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc" -ds_surfdata = luh2.ImportData(file_surfdata) -# modify the surface data set to enable xesmf regridder to find necessary data - = luh2.DimensionFixSurfData(file_surfdata) - -print("done") - - -# def main(): -# if __name__ == "__main__": -# main() +import argparse, os +from luh2mod import PrepDataSet, ImportData, SetMaskLUH2, SetMaskSurfData +from luh2mod import RegridConservative + +# Add version checking here in case environment.yml not used +def main(): + + # Add argument parser - subfunction? Seperate common module? + # input_files and range should be the only arguments + # Allow variable input files (state and/or transitions and/or management) + args = CommandLineArgs() + + # Prep the LUH2 datasets and regrid target + # To Do: need logic to handle taking in a saved regrid file + ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) + ds_regrid_target= PrepDataSet(args.regridder_target_file,args.begin,args.end) + + # Import the LUH2 static data to use for masking + ds_luh2_static = ImportData(args.luh2_static_file) + + # Create new variable where the ice water fraction is inverted + ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr + + # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data + ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) + ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) + + # Mask the regrid target + ds_regrid_target = SetMaskSurfData(ds_regrid_target) + + # Regrid the luh2 data to the target grid + regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + regrid_luh2 = regridder_luh2(ds_luh2) + + # # Regrid the inverted ice/water fraction data to the target grid + # # regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) + # # regrid_land_fraction = regridder_land_fraction(ds_luh2_static) + # regrid_land_fraction = regridder_luh2(ds_luh2_static) + + # # Adjust the luh2 data by the land fraction + # # To Do: check if we need to do this for transition and management data as well + # regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac + + # # Rename the dimensions for the output + # regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) + # regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] + # regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] + + # # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension + # regrid_luh2["YEAR"] = regrid_luh2.time + + # # Write the files + # # TO DO: add check to handle if the user enters the full path + # output_filename = args.output + # if (args.output == None): + # output_filename = 'LUH2_timeseries.nc' + + # output_file = os.path.join(os.getcwd(),output_filename) + # regrid_luh2.to_netcdf(output_file) + + # Example of file naming scheme + # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') + +def CommandLineArgs(): + + parser = argparse.ArgumentParser(description="placeholder desc") + + # Required input luh2 datafile + # TO DO: using the checking function to report back if invalid file input + parser.add_argument("-l","--luh2_file", required=True) + + # Required static luh2 data to get the ice/water fraction + parser.add_argument("-s", "--luh2_static_file", required=True) + + # Provide mutually exlusive arguments for regridding input selection + # Currently assuming that if a target is provided that a regridder file will be saved + regrid_target = parser.add_mutually_exclusive_group(required=True) + regrid_target.add_argument("-rf","--regridder_file") # use previously save regridder file + regrid_target.add_argument("-rt","--regridder_target_file") # use a dataset to regrid to + + # Optional input to subset the time range of the data + parser.add_argument("-b","--begin") + parser.add_argument("-e","--end") + + # Optional output argument + parser.add_argument("-o","--output") + + args = parser.parse_args() + + return(args) + + +if __name__ == "__main__": + main() diff --git a/tools/luh2mod.py b/tools/luh2mod.py index c6932e0a8b..f106d784c0 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -1,89 +1,12 @@ #!/usr/bin/env python3 -import argparse, os, re +import re import numpy as np import xarray as xr import xesmf as xe from nco import Nco from nco.custom import Atted -# Add version checking here in case environment.yml not used - -def main(): - - # Add argument parser - subfunction? Seperate common module? - # input_files and range should be the only arguments - # Allow variable input files (state and/or transitions and/or management) - args = CommandLineArgs() - - # Prep the LUH2 datasets and regrid target - ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) - ds_regrid_target= PrepDataSet(args.regrid_target_file,args.begin,args.end) - - # Import the LUH2 static data to use for masking - ds_luh2_static = ImportData(args.luh2_static_file) - - # Create new variable where the ice water fraction is inverted - ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr - - # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data - ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) - ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) - - # Mask the regrid target - ds_regrid_target = SetMaskSurfData(ds_regrid_target) - - # Regrid the luh2 data to the target grid - regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) - regrid_luh2 = regridder_luh2(ds_luh2) - - # Regrid the inverted ice/water fraction data to the target grid - regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) - regrid_land_fraction = regridder_land_fraction(ds_luh2_static) - - # Adjust the luh2 data by the land fraction - regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac - - - # Rename the dimensions for the output - regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) - regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] - regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] - - # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension - regrid_luh2["YEAR"] = regrid_luh2.time - - # Write the files - output_file = os.path.join(os.getcwd(),'LUH2_states_transitions_management.timeseries_4x5_hist_simyr1850-2015_c230415.nc') - - regrid_luh2.to_netcdf(output_file) - - # Example of file naming scheme - # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') - -def CommandLineArgs(): - - parser = argparse.ArgumentParser(description="placeholder desc") - - # Required input luh2 datafile - # TO DO: using the checking function to report back if invalid file input - parser.add_argument("-l","--luh2_file", require=True) - - # Provide mutually exlusive arguments for regridding input selection - # Currently assuming that if a target is provided that a regridder file will be saved - regrid_target = parser.add_mutually_exclusive_group(required=True) - regrid_target.add_argument("-rf","--regridderfile") # use previously save regridder file - regrid_target.add_argument("-rt","--regriddertarget") # use a dataset to regrid to - - # Optional input to subset the time range of the data - # TO DO: howto - parser.add_argument("-b","--begin") - parser.add_argument("-e","--end") - - args = parser.parse_args() - - return(args) - # Prepare the input_file to be used for regridding def PrepDataSet(input_file,start=None,stop=None): @@ -104,7 +27,7 @@ def PrepDataSet(input_file,start=None,stop=None): input_dataset = input_dataset.sel(time=slice(start,stop)) except TypeError as err: print("TypeError:", err) - print("Input must be a string") + print("Input must be a string\n") # Correct the necessary variables for both datasets input_dataset = PrepDataSet_ESMF(input_dataset) @@ -126,7 +49,7 @@ def PrepDataSet_ESMF(input_dataset): elif(dstype == "Surface"): print("PrepDataSet: SurfData") input_dataset = DimensionFixSurfData(input_dataset) - print("data set updated for xESMF") + print("data set updated for xESMF\n") return(input_dataset) @@ -144,7 +67,7 @@ def ImportData(input_file): print("ValueError:", err) errmsg = "User direction: If error is due to units being 'years since ...' " \ "update the input data file to change to 'common_years since...'. " \ - "This can be done using the luh2.attribupdate function." + "This can be done using the luh2.attribupdate function\n." print() print(errmsg) @@ -175,7 +98,7 @@ def AttribUpdateLUH2(input_file,output_append="modified"): opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] nco.ncatted(input=input_file, output=output_file, options=opts) - print("Generated modified output file: {}".format(output_file)) + print("Generated modified output file: {}\n".format(output_file)) return(output_file) @@ -274,6 +197,10 @@ def CheckDataSet(input_dataset): return(dsflag,dstype) def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): + + + print("\nDefining regridder") + # define the regridder transformation regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") @@ -283,7 +210,23 @@ def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): filename = regridder.to_netcdf("regridder.nc") print("regridder saved to file: ", filename) - return(regridder) + ds_regrid = ds_to_regrid.copy() + print("regridding") + + # Loop through the variables one at a time to conserve memory + # To Do: implement dask + # To Do: can we skip time, lat, and lon variables? + ds_varnames = list(ds_to_regrid.variables.keys()) + varlen = len(ds_to_regrid.variables) + for i in range(varlen-1): + if (not(ds_varnames[i] == 'time' or ds_varnames[i] == 'lon' or + ds_varnames[i] == 'lat')): + print("regridding variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) + else: + print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + + return(ds_regrid) # General functionality needed # - collect data for specific user-defined time period From 1e0e02fa414080c438a6b684b7d9557d0c65987b Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 10:42:20 -0600 Subject: [PATCH 066/125] put endrun back --- main/FatesGlobals.F90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main/FatesGlobals.F90 b/main/FatesGlobals.F90 index 56d381377c..71e4120df0 100644 --- a/main/FatesGlobals.F90 +++ b/main/FatesGlobals.F90 @@ -91,8 +91,7 @@ subroutine fates_endrun(msg) !----------------------------------------------------------------------- write(fates_log(),*)'ENDRUN:', msg - !call shr_sys_abort() - stop + call shr_sys_abort() end subroutine fates_endrun From e5e3f49c5d12bde61a3ea5dae9ff092a79ef5ab8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 10:59:34 -0600 Subject: [PATCH 067/125] remove allocatable arrays --- biogeochem/FatesPatchMod.F90 | 199 +++++++++++------------------------ 1 file changed, 59 insertions(+), 140 deletions(-) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 22103fc6a7..8356a1f64c 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -72,82 +72,82 @@ module FatesPatchMod !:.........................................................................: ! LEAF ORGANIZATION - real(r8), allocatable :: pft_agb_profile(:,:) ! binned aboveground biomass, for patch fusion [kgC/m2] - real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer [m2 veg/m2 canopy area] - ! (patch without bare ground) - ! used to determine attenuation of parameters during photosynthesis - real(r8) :: total_canopy_area ! area that is covered by vegetation [m2] - real(r8) :: total_tree_area ! area that is covered by woody vegetation [m2] - real(r8) :: zstar ! height of smallest canopy tree, only meaningful in "strict PPA" mode [m] - real(r8), allocatable :: elai_profile(:,:,:) ! exposed leaf area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] - real(r8), allocatable :: esai_profile(:,:,:) ! exposed stem area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] - real(r8), allocatable :: tlai_profile(:,:,:) - real(r8), allocatable :: tsai_profile(:,:,:) - real(r8), allocatable :: canopy_area_profile(:,:,:) ! fraction of crown area per canopy area in each layer - ! they will sum to 1.0 in the fully closed canopy layers - ! but only in leaf-layers that contain contributions - ! from all cohorts that donate to canopy_area - integer, allocatable :: canopy_mask(:,:) ! is there any of this pft in this canopy layer? - integer, allocatable :: nrad(:,:) ! number of exposed leaf layers for each canopy layer and pft - integer, allocatable :: ncan(:,:) ! number of total leaf layers for each canopy layer and pft - real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] - real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] + real(r8) :: pft_agb_profile(maxpft,n_dbh_bins) ! binned aboveground biomass, for patch fusion [kgC/m2] + real(r8) :: canopy_layer_tlai(nclmax) ! total leaf area index of each canopy layer [m2 veg/m2 canopy area] + ! (patch without bare ground) + ! used to determine attenuation of parameters during photosynthesis + real(r8) :: total_canopy_area ! area that is covered by vegetation [m2] + real(r8) :: total_tree_area ! area that is covered by woody vegetation [m2] + real(r8) :: zstar ! height of smallest canopy tree, only meaningful in "strict PPA" mode [m] + real(r8) :: elai_profile(nclmax,maxpft,nlevleaf) ! exposed leaf area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8) :: esai_profile(nclmax,maxpft,nlevleaf) ! exposed stem area in each canopy layer, pft, and leaf layer [m2 leaf/m2 contributing crown area] + real(r8) :: tlai_profile(nclmax,maxpft,nlevleaf) + real(r8) :: tsai_profile(nclmax,maxpft,nlevleaf) + real(r8) :: canopy_area_profile(nclmax,maxpft,nlevleaf) ! fraction of crown area per canopy area in each layer + ! they will sum to 1.0 in the fully closed canopy layers + ! but only in leaf-layers that contain contributions + ! from all cohorts that donate to canopy_area + integer :: canopy_mask(nclmax,maxpft) ! is there any of this pft in this canopy layer? + integer :: nrad(nclmax,maxpft) ! number of exposed leaf layers for each canopy layer and pft + integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft + real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] + real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] !:.........................................................................: - real(r8), allocatable :: layer_height_profile(:,:,:) - real(r8), allocatable :: psn_z(:,:,:) - real(r8), allocatable :: nrmlzd_parprof_pft_dir_z(:,:,:,:) - real(r8), allocatable :: nrmlzd_parprof_pft_dif_z(:,:,:,:) - real(r8), allocatable :: nrmlzd_parprof_dir_z(:,:,:) - real(r8), allocatable :: nrmlzd_parprof_dif_z(:,:,:) + real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) + real(r8) :: psn_z(nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) + real(r8) :: nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf) + real(r8) :: nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf) !:.........................................................................: ! RADIATION - real(r8) :: radiation_error ! radiation error [W/m2] - real(r8) :: fcansno ! fraction of canopy covered in snow [0-1] - logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) - real(r8) :: solar_zenith_angle ! solar zenith angle [radians] - real(r8), allocatable :: gnd_alb_dif(:) ! ground albedo for diffuse rad, both bands [0-1] - real(r8), allocatable :: gnd_alb_dir(:) ! ground albedo for direct rad, both bands [0-1] + real(r8) :: radiation_error ! radiation error [W/m2] + real(r8) :: fcansno ! fraction of canopy covered in snow [0-1] + logical :: solar_zenith_flag ! integer flag specifying daylight (based on zenith angle) + real(r8) :: solar_zenith_angle ! solar zenith angle [radians] + real(r8) :: gnd_alb_dif(maxSWb) ! ground albedo for diffuse rad, both bands [0-1] + real(r8) :: gnd_alb_dir(maxSWb) ! ground albedo for direct rad, both bands [0-1] ! organized by canopy layer, pft, and leaf layer - real(r8), allocatable :: fabd_sun_z(:,:,:) ! sun fraction of direct light absorbed [0-1] - real(r8), allocatable :: fabd_sha_z(:,:,:) ! shade fraction of direct light absorbed [0-1] - real(r8), allocatable :: fabi_sun_z(:,:,:) ! sun fraction of indirect light absorbed [0-1] - real(r8), allocatable :: fabi_sha_z(:,:,:) ! shade fraction of indirect light absorbed [0-1] - real(r8), allocatable :: ed_parsun_z(:,:,:) ! PAR absorbed in the sun [W/m2] - real(r8), allocatable :: ed_parsha_z(:,:,:) ! PAR absorbed in the shade [W/m2] - real(r8), allocatable :: ed_laisun_z(:,:,:) - real(r8), allocatable :: ed_laisha_z(:,:,:) - real(r8), allocatable :: f_sun(:,:,:) ! fraction of leaves in the sun [0-1] + real(r8) :: fabd_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of direct light absorbed [0-1] + real(r8) :: fabd_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of direct light absorbed [0-1] + real(r8) :: fabi_sun_z(nclmax,maxpft,nlevleaf) ! sun fraction of indirect light absorbed [0-1] + real(r8) :: fabi_sha_z(nclmax,maxpft,nlevleaf) ! shade fraction of indirect light absorbed [0-1] + real(r8) :: ed_parsun_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the sun [W/m2] + real(r8) :: ed_parsha_z(nclmax,maxpft,nlevleaf) ! PAR absorbed in the shade [W/m2] + real(r8) :: ed_laisun_z(nclmax,maxpft,nlevleaf) + real(r8) :: ed_laisha_z(nclmax,maxpft,nlevleaf) + real(r8) :: f_sun(nclmax,maxpft,nlevleaf) ! fraction of leaves in the sun [0-1] ! radiation profiles for comparison against observations - real(r8), allocatable :: parprof_pft_dir_z(:,:,:) ! direct-beam PAR profile through canopy, by canopy, PFT, leaf level [W/m2] - real(r8), allocatable :: parprof_pft_dif_z(:,:,:) ! diffuse PAR profile through canopy, by canopy, PFT, leaf level [W/m2] - real(r8), allocatable :: parprof_dir_z(:,:) ! direct-beam PAR profile through canopy, by canopy, leaf level [W/m2] - real(r8), allocatable :: parprof_dif_z(:,:) ! diffuse PAR profile through canopy, by canopy, leaf level [W/m2] + real(r8) :: parprof_pft_dir_z(nclmax,maxpft,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8) :: parprof_pft_dif_z(nclmax,maxpft,nlevleaf) ! diffuse PAR profile through canopy, by canopy, PFT, leaf level [W/m2] + real(r8) :: parprof_dir_z(nclmax,nlevleaf) ! direct-beam PAR profile through canopy, by canopy, leaf level [W/m2] + real(r8) :: parprof_dif_z(nclmax,nlevleaf) ! diffuse PAR profile through canopy, by canopy, leaf level [W/m2] - real(r8), allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation transmitted to the soil as direct, by numSWB [0-1] - real(r8), allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse [0-1] - real(r8), allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that is transmitted to the soil as diffuse [0-1] - real(r8), allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy - real(r8), allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8), allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy - real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy - real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + real(r8), allocatable :: tr_soil_dir(:) ! fraction of incoming direct radiation transmitted to the soil as direct, by numSWB [0-1] + real(r8), allocatable :: tr_soil_dif(:) ! fraction of incoming diffuse radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: tr_soil_dir_dif(:) ! fraction of incoming direct radiation that is transmitted to the soil as diffuse [0-1] + real(r8), allocatable :: fab(:) ! fraction of incoming total radiation that is absorbed by the canopy + real(r8), allocatable :: fabd(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: fabi(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy + real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy !:.........................................................................: ! ROOTS - real(r8), allocatable :: btran_ft(:) ! btran calculated seperately for each PFT - real(r8), allocatable :: bstress_sal_ft(:) ! bstress from salinity calculated seperately for each PFT + real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT + real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT !:.........................................................................: ! EXTERNAL SEED RAIN - real(r8), allocatable :: nitr_repro_stoich(:) ! The NC ratio of a new recruit in this patch - real(r8), allocatable :: phos_repro_stoich(:) ! The PC ratio of a new recruit in this patch + real(r8) :: nitr_repro_stoich(maxpft) ! The NC ratio of a new recruit in this patch + real(r8) :: phos_repro_stoich(maxpft) ! The PC ratio of a new recruit in this patch !:.........................................................................: @@ -190,7 +190,7 @@ module FatesPatchMod real(r8) :: fd ! fire duration [min] ! fire effects - real(r8), allocatable :: scorch_ht(:) ! scorch height [m] + real(r8) :: scorch_ht(maxpft) ! scorch height [m] real(r8) :: frac_burnt ! fraction burnt [0-1/day] real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] @@ -230,41 +230,6 @@ subroutine init(this, numpft, numSWb, nlevsoil) integer, intent(in) :: nlevsoil ! number of soil layers ! allocate arrays - allocate(this%pft_agb_profile(numpft, N_DBH_BINS)) - allocate(this%elai_profile(nclmax,numpft,nlevleaf)) - allocate(this%esai_profile(nclmax,numpft,nlevleaf)) - allocate(this%tlai_profile(nclmax,numpft,nlevleaf)) - allocate(this%tsai_profile(nclmax,numpft,nlevleaf)) - allocate(this%canopy_area_profile(nclmax,numpft,nlevleaf)) - - allocate(this%canopy_mask(nclmax,numpft)) - allocate(this%nrad(nclmax,numpft)) - allocate(this%ncan(nclmax,numpft)) - - allocate(this%layer_height_profile(nclmax,numpft,nlevleaf)) - allocate(this%psn_z(nclmax,numpft,nlevleaf)) - allocate(this%nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,numpft,nlevleaf)) - allocate(this%nrmlzd_parprof_pft_dif_z(n_rad_stream_types,nclmax,numpft,nlevleaf)) - allocate(this%nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf)) - allocate(this%nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf)) - - allocate(this%gnd_alb_dif(numSWb)) - allocate(this%gnd_alb_dir(numSWb)) - allocate(this%fabd_sun_z(nclmax,numpft,nlevleaf)) - allocate(this%fabd_sha_z(nclmax,numpft,nlevleaf)) - allocate(this%fabi_sun_z(nclmax,numpft,nlevleaf)) - allocate(this%fabi_sha_z(nclmax,numpft,nlevleaf)) - allocate(this%ed_parsun_z(nclmax,numpft,nlevleaf)) - allocate(this%ed_parsha_z(nclmax,numpft,nlevleaf)) - allocate(this%ed_laisun_z(nclmax,numpft,nlevleaf)) - allocate(this%ed_laisha_z(nclmax,numpft,nlevleaf)) - allocate(this%f_sun(nclmax,numpft,nlevleaf)) - - allocate(this%parprof_pft_dir_z(nclmax,numpft,nlevleaf)) - allocate(this%parprof_pft_dif_z(nclmax,numpft,nlevleaf)) - allocate(this%parprof_dir_z(nclmax,nlevleaf)) - allocate(this%parprof_dif_z(nclmax,nlevleaf)) - allocate(this%tr_soil_dir(numSWb)) allocate(this%tr_soil_dif(numSWb)) allocate(this%tr_soil_dir_dif(numSWb)) @@ -274,16 +239,6 @@ subroutine init(this, numpft, numSWb, nlevsoil) allocate(this%sabs_dir(numSWb)) allocate(this%sabs_dif(numSWb)) - allocate(this%btran_ft(numpft)) - allocate(this%bstress_sal_ft(numpft)) - - allocate(this%nitr_repro_stoich(numpft)) - allocate(this%phos_repro_stoich(numpft)) - - allocate(this%fragmentation_scaler(nlevsoil)) - - allocate(this%scorch_ht(numpft)) - ! initialize all values to nan call this%nan_values() @@ -642,37 +597,7 @@ subroutine free_memory(this) endif ! deallocate the allocatable arrays - deallocate(this%pft_agb_profile, & - this%elai_profile, & - this%esai_profile, & - this%tlai_profile, & - this%tsai_profile, & - this%canopy_area_profile, & - this%canopy_mask, & - this%nrad, & - this%ncan, & - this%layer_height_profile, & - this%psn_z, & - this%nrmlzd_parprof_pft_dir_z, & - this%nrmlzd_parprof_pft_dif_z, & - this%nrmlzd_parprof_dir_z, & - this%nrmlzd_parprof_dif_z, & - this%gnd_alb_dif, & - this%gnd_alb_dir, & - this%fabd_sun_z, & - this%fabd_sha_z, & - this%fabi_sun_z, & - this%fabi_sha_z, & - this%ed_parsun_z, & - this%ed_parsha_z, & - this%ed_laisun_z, & - this%ed_laisha_z, & - this%f_sun, & - this%parprof_pft_dir_z, & - this%parprof_pft_dif_z, & - this%parprof_dir_z, & - this%parprof_dif_z, & - this%tr_soil_dir, & + deallocate(this%tr_soil_dir, & this%tr_soil_dif, & this%tr_soil_dir_dif, & this%fab, & @@ -680,12 +605,6 @@ subroutine free_memory(this) this%fabi, & this%sabs_dir, & this%sabs_dif, & - this%btran_ft, & - this%bstress_sal_ft, & - this%nitr_repro_stoich, & - this%phos_repro_stoich, & - this%fragmentation_scaler, & - this%scorch_ht, & stat=istat, errmsg=smsg) if (istat/=0) then From b04fd2e2f5ef58d17bcdae150e5251ae7c824b4e Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 8 May 2023 11:47:24 -0700 Subject: [PATCH 068/125] More updates --- tools/luh2.py | 28 ++++++++++++++-------------- tools/luh2mod.py | 18 ++++++++++-------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 0457d092a5..5634534d66 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -31,34 +31,34 @@ def main(): ds_regrid_target = SetMaskSurfData(ds_regrid_target) # Regrid the luh2 data to the target grid - regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) - regrid_luh2 = regridder_luh2(ds_luh2) + regridder_luh2,regrid_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) # # Regrid the inverted ice/water fraction data to the target grid - # # regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) - # # regrid_land_fraction = regridder_land_fraction(ds_luh2_static) - # regrid_land_fraction = regridder_luh2(ds_luh2_static) + #regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) + #regrid_land_fraction = regridder_land_fraction(ds_luh2_static) + regrid_land_fraction = regridder_luh2(ds_luh2_static) # # Adjust the luh2 data by the land fraction # # To Do: check if we need to do this for transition and management data as well - # regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac + regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac # # Rename the dimensions for the output + # TO DO: double check if this is necessary # regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) - # regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] - # regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] + regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] + regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension - # regrid_luh2["YEAR"] = regrid_luh2.time + regrid_luh2["YEAR"] = regrid_luh2.time # # Write the files # # TO DO: add check to handle if the user enters the full path - # output_filename = args.output - # if (args.output == None): - # output_filename = 'LUH2_timeseries.nc' + output_filename = args.output + if (args.output == None): + output_filename = 'LUH2_timeseries.nc' - # output_file = os.path.join(os.getcwd(),output_filename) - # regrid_luh2.to_netcdf(output_file) + output_file = os.path.join(os.getcwd(),output_filename) + regrid_luh2.to_netcdf(output_file) # Example of file naming scheme # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') diff --git a/tools/luh2mod.py b/tools/luh2mod.py index f106d784c0..d8749b08dc 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -219,14 +219,16 @@ def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): ds_varnames = list(ds_to_regrid.variables.keys()) varlen = len(ds_to_regrid.variables) for i in range(varlen-1): - if (not(ds_varnames[i] == 'time' or ds_varnames[i] == 'lon' or - ds_varnames[i] == 'lat')): - print("regridding variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) - ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) - else: - print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) - - return(ds_regrid) + # Skip time variable + if (ds_varnames[i] != "time"): + # Only regrid variables that match the lat/lon shape + if (ds_regrid[ds_varnames[i]][0].shape == (ds_regrid.lat.shape[0], ds_regrid.lon.shape[0])): + print("regridding variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) + else: + print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + + return(regridder,ds_regrid) # General functionality needed # - collect data for specific user-defined time period From 3d5709b161294014073383fdb4ef9a2a0c940936 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 13:29:32 -0600 Subject: [PATCH 069/125] add abort back --- main/FatesGlobals.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/FatesGlobals.F90 b/main/FatesGlobals.F90 index 71e4120df0..ebc0f326ff 100644 --- a/main/FatesGlobals.F90 +++ b/main/FatesGlobals.F90 @@ -83,7 +83,7 @@ subroutine fates_endrun(msg) ! This subroutine was derived from CLM's ! endrun_vanilla() in abortutils.F90 ! - !use shr_sys_mod , only: shr_sys_abort + use shr_sys_mod , only: shr_sys_abort ! ! !ARGUMENTS: implicit none From 447b2f4257b4e6edcd702e3875dfe61e759a5f5e Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 14:00:11 -0600 Subject: [PATCH 070/125] add fragmentation scalar --- biogeochem/FatesPatchMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 8356a1f64c..96ce038b70 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -605,6 +605,7 @@ subroutine free_memory(this) this%fabi, & this%sabs_dir, & this%sabs_dif, & + this%fragmentation_scaler, & stat=istat, errmsg=smsg) if (istat/=0) then From 20f9cb122ec9bc161df0039a66ccce865274847e Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 14:18:58 -0600 Subject: [PATCH 071/125] add shr_sys_abort use --- main/FatesGlobals.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/FatesGlobals.F90 b/main/FatesGlobals.F90 index 71e4120df0..ebc0f326ff 100644 --- a/main/FatesGlobals.F90 +++ b/main/FatesGlobals.F90 @@ -83,7 +83,7 @@ subroutine fates_endrun(msg) ! This subroutine was derived from CLM's ! endrun_vanilla() in abortutils.F90 ! - !use shr_sys_mod , only: shr_sys_abort + use shr_sys_mod , only: shr_sys_abort ! ! !ARGUMENTS: implicit none From ecae3ab879d5b55a7bf42d49098d4a94759e040e Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 8 May 2023 14:21:25 -0600 Subject: [PATCH 072/125] fragmentation scalar --- biogeochem/FatesPatchMod.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 96ce038b70..dad402ac49 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -238,6 +238,7 @@ subroutine init(this, numpft, numSWb, nlevsoil) allocate(this%fabi(numSWb)) allocate(this%sabs_dir(numSWb)) allocate(this%sabs_dif(numSWb)) + allocate(this%fragmentation_scaler(nlevsoil)) ! initialize all values to nan call this%nan_values() From 472eaa616c300dabab38b2103b0ed646c3c33a8c Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 8 May 2023 14:54:54 -0700 Subject: [PATCH 073/125] start working on allowing read in of regridder file --- tools/luh2.py | 36 ++++++++++++++++++++++-------------- tools/luh2mod.py | 2 ++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 5634534d66..559a72610e 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -13,25 +13,31 @@ def main(): args = CommandLineArgs() # Prep the LUH2 datasets and regrid target - # To Do: need logic to handle taking in a saved regrid file ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) - ds_regrid_target= PrepDataSet(args.regridder_target_file,args.begin,args.end) - # Import the LUH2 static data to use for masking - ds_luh2_static = ImportData(args.luh2_static_file) + if (args.regridder_file == None): + ds_regrid_target = PrepDataSet(args.regridder_target_file,args.begin,args.end) - # Create new variable where the ice water fraction is inverted - ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr + # Import the LUH2 static data to use for masking + ds_luh2_static = ImportData(args.luh2_static_file) - # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data - ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) - ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) + # Create new variable where the ice water fraction is inverted + ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr - # Mask the regrid target - ds_regrid_target = SetMaskSurfData(ds_regrid_target) + # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data + ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) + ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) - # Regrid the luh2 data to the target grid - regridder_luh2,regrid_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + # Mask the regrid target + ds_regrid_target = SetMaskSurfData(ds_regrid_target) + + # Regrid the luh2 data to the target grid + regridder_luh2,regrid_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + + elif (args.regridder_target_file == None): + regridder_luhs = ImportData(args.regridder_file) + # TO DO: check that the time bounds match the argument bounds + # TO DO: create bypass option to regridder function # # Regrid the inverted ice/water fraction data to the target grid #regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) @@ -53,11 +59,13 @@ def main(): # # Write the files # # TO DO: add check to handle if the user enters the full path - output_filename = args.output if (args.output == None): output_filename = 'LUH2_timeseries.nc' + else: + output_filename = args.output output_file = os.path.join(os.getcwd(),output_filename) + print("generating output: {}".format(output_file)) regrid_luh2.to_netcdf(output_file) # Example of file naming scheme diff --git a/tools/luh2mod.py b/tools/luh2mod.py index d8749b08dc..5e3e051e6a 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -227,6 +227,8 @@ def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) else: print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + else: + print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) return(regridder,ds_regrid) From 2e1c73623f2c98eca7b13ad7afe0f5b6dbf34f2a Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 8 May 2023 17:03:47 -0700 Subject: [PATCH 074/125] Fix regridding loop --- tools/luh2.py | 16 +++++++++++--- tools/luh2mod.py | 55 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 559a72610e..0a5ea6229e 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse, os +import xarray as xr from luh2mod import PrepDataSet, ImportData, SetMaskLUH2, SetMaskSurfData from luh2mod import RegridConservative @@ -32,10 +33,10 @@ def main(): ds_regrid_target = SetMaskSurfData(ds_regrid_target) # Regrid the luh2 data to the target grid - regridder_luh2,regrid_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) elif (args.regridder_target_file == None): - regridder_luhs = ImportData(args.regridder_file) + regridder_luh2 = ImportData(args.regridder_file) # TO DO: check that the time bounds match the argument bounds # TO DO: create bypass option to regridder function @@ -50,13 +51,19 @@ def main(): # # Rename the dimensions for the output # TO DO: double check if this is necessary - # regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'latitude':'lsmlat','longitude':'lsmlon'}) + regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'lat':'lsmlat','lon':'lsmlon'}) regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension regrid_luh2["YEAR"] = regrid_luh2.time + # Merge existing regrided luh2 file with merge input target + # TO DO: check that the grid resolution and time bounds match + if (args.luh2_merge_file != None): + ds_luh2_merge = ImportData(args.luh2_merge_file) + regrid_luh2 = regrid_luhs.merge(ds_luh2_merge) + # # Write the files # # TO DO: add check to handle if the user enters the full path if (args.output == None): @@ -95,6 +102,9 @@ def CommandLineArgs(): # Optional output argument parser.add_argument("-o","--output") + # Optional merge argument to enable merging of other files + parser.add_argument("-m", "--luh2_merge_file") + args = parser.parse_args() return(args) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 5e3e051e6a..63b52f1331 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -198,39 +198,62 @@ def CheckDataSet(input_dataset): def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): + # define the regridder transformation + regridder = GenerateRegridder(ds_to_regrid, ds_regrid_target, save) - print("\nDefining regridder") + # Loop through the variables to regrid + ds_regrid = RegridLoop(ds_to_regrid, regridder) - # define the regridder transformation - regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") + return (ds_regrid, regridder) - # If save flag is set, write regridder to a file - # TO DO: define a more useful name based on inputs - if(save): - filename = regridder.to_netcdf("regridder.nc") - print("regridder saved to file: ", filename) +def RegridLoop(ds_to_regrid, regridder): - ds_regrid = ds_to_regrid.copy() - print("regridding") + # To Do: implement this with dask + print("\nRegridding") # Loop through the variables one at a time to conserve memory - # To Do: implement dask - # To Do: can we skip time, lat, and lon variables? ds_varnames = list(ds_to_regrid.variables.keys()) varlen = len(ds_to_regrid.variables) + first_var = False for i in range(varlen-1): + # Skip time variable if (ds_varnames[i] != "time"): - # Only regrid variables that match the lat/lon shape - if (ds_regrid[ds_varnames[i]][0].shape == (ds_regrid.lat.shape[0], ds_regrid.lon.shape[0])): + + # Only regrid variables that match the lat/lon shape. + if (ds_to_regrid[ds_varnames[i]][0].shape == (ds_to_regrid.lat.shape[0], ds_to_regrid.lon.shape[0])): print("regridding variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) - ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) + + # For the first non-coordinate variable, copy and regrid the dataset as a whole. + # This makes sure to correctly include the lat/lon in the regridding. + if (not(first_var)): + ds_regrid = ds_to_regrid[ds_varnames[i]].to_dataset() # convert data array to dataset + ds_regrid = regridder(ds_regrid) + first_var = True + + # Once the first variable has been included, then we can regrid by variable + else: + ds_regrid[ds_varnames[i]] = regridder(ds_to_regrid[ds_varnames[i]]) else: print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) else: print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) - return(regridder,ds_regrid) + return(ds_regrid) + +def GenerateRegridder(ds_to_regrid, ds_regrid_target,save=False): + + print("\nDefining regridder") + regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") + + # If save flag is set, write regridder to a file + # TO DO: define a more useful name based on inputs + if(save): + filename = regridder.to_netcdf("regridder.nc") + print("regridder saved to file: ", filename) + + return(regridder) + # General functionality needed # - collect data for specific user-defined time period From 21c7c9600423a3c6767c0ccae7317f71096ee0db Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 9 May 2023 07:23:31 -0600 Subject: [PATCH 075/125] begin to update for style --- biogeochem/FatesPatchMod.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index dad402ac49..a5f0f7bed5 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -216,7 +216,7 @@ module FatesPatchMod contains - subroutine init(this, numpft, numSWb, nlevsoil) + subroutine init(this, numSWb, nlevsoil) ! ! DESCRIPTION: ! Initialize a new patch - allocate arrays and set values to nan and/or @@ -225,7 +225,6 @@ subroutine init(this, numpft, numSWb, nlevsoil) ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object - integer, intent(in) :: numpft ! number of pfts integer, intent(in) :: numSWb ! number of shortwave broad-bands to track integer, intent(in) :: nlevsoil ! number of soil layers @@ -250,7 +249,7 @@ end subroutine init !:.........................................................................: - subroutine nan_values(this) + subroutine nanValues(this) ! ! DESCRIPTION: ! Sets all values in patch to nan From e8c2ea8fcaed26a01626cae03b6d3c6552a8223e Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 9 May 2023 11:06:11 -0600 Subject: [PATCH 076/125] update style on patchmod --- biogeochem/EDPatchDynamicsMod.F90 | 4 +- biogeochem/FatesPatchMod.F90 | 155 +++++++++++++++--------------- main/EDInitMod.F90 | 2 +- main/FatesInventoryInitMod.F90 | 2 +- main/FatesRestartInterfaceMod.F90 | 2 +- 5 files changed, 83 insertions(+), 82 deletions(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index c5bfabd6ec..8780294ee9 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -537,7 +537,7 @@ subroutine spawn_patches( currentSite, bc_in) ! first create patch to receive primary forest area if ( site_areadis_primary .gt. nearzero ) then allocate(new_patch_primary) - call new_patch_primary%create(age, site_areadis_primary, & + call new_patch_primary%Create(age, site_areadis_primary, & primaryforest, i_nocomp_pft, hlm_numSWb, numpft, & currentSite%nlevsoil, hlm_current_tod) @@ -560,7 +560,7 @@ subroutine spawn_patches( currentSite, bc_in) ! next create patch to receive secondary forest area if (site_areadis_secondary .gt. nearzero) then allocate(new_patch_secondary) - call new_patch_secondary%create(age, site_areadis_secondary, & + call new_patch_secondary%Create(age, site_areadis_secondary, & secondaryforest, i_nocomp_pft, hlm_numSWb, numpft, & currentSite%nlevsoil, hlm_current_tod) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index a5f0f7bed5..ddeee61f65 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -37,7 +37,7 @@ module FatesPatchMod type (fates_patch_type), pointer :: older => null() ! pointer to next older patch type (fates_patch_type), pointer :: younger => null() ! pointer to next younger patch - !:.........................................................................: + !--------------------------------------------------------------------------- ! INDICES integer :: patchno ! unique number given to each new patch created for tracking @@ -48,7 +48,7 @@ module FatesPatchMod ! is set to unset. This is set in patch%create as an argument ! to that procedure. - !:.........................................................................: + !--------------------------------------------------------------------------- ! PATCH INFO real(r8) :: age ! average patch age [years] @@ -59,7 +59,7 @@ module FatesPatchMod integer :: anthro_disturbance_label ! patch label for anthropogenic disturbance classification real(r8) :: age_since_anthro_disturbance ! average age for secondary forest since last anthropogenic disturbance [years] - !:.........................................................................: + !--------------------------------------------------------------------------- ! RUNNING MEANS !class(rmean_type), pointer :: t2m ! place-holder for 2m air temperature (variable window-size) @@ -69,7 +69,7 @@ module FatesPatchMod class(rmean_type), pointer :: tveg_longterm ! long-term running mean of vegetation temperature at the ! leaf photosynthesis acclimation timescale [K] (i.e T_home) - !:.........................................................................: + !--------------------------------------------------------------------------- ! LEAF ORGANIZATION real(r8) :: pft_agb_profile(maxpft,n_dbh_bins) ! binned aboveground biomass, for patch fusion [kgC/m2] @@ -92,8 +92,8 @@ module FatesPatchMod integer :: ncan(nclmax,maxpft) ! number of total leaf layers for each canopy layer and pft real(r8) :: c_stomata ! mean stomatal conductance of all leaves in the patch [umol/m2/s] real(r8) :: c_lblayer ! mean boundary layer conductance of all leaves in the patch [umol/m2/s] - !:.........................................................................: - + + !TODO - can we delete these? real(r8) :: layer_height_profile(nclmax,maxpft,nlevleaf) real(r8) :: psn_z(nclmax,maxpft,nlevleaf) real(r8) :: nrmlzd_parprof_pft_dir_z(n_rad_stream_types,nclmax,maxpft,nlevleaf) @@ -101,7 +101,7 @@ module FatesPatchMod real(r8) :: nrmlzd_parprof_dir_z(n_rad_stream_types,nclmax,nlevleaf) real(r8) :: nrmlzd_parprof_dif_z(n_rad_stream_types,nclmax,nlevleaf) - !:.........................................................................: + !--------------------------------------------------------------------------- ! RADIATION real(r8) :: radiation_error ! radiation error [W/m2] @@ -137,19 +137,19 @@ module FatesPatchMod real(r8), allocatable :: sabs_dir(:) ! fraction of incoming direct radiation that is absorbed by the canopy real(r8), allocatable :: sabs_dif(:) ! fraction of incoming diffuse radiation that is absorbed by the canopy - !:.........................................................................: + !--------------------------------------------------------------------------- ! ROOTS real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT - !:.........................................................................: + !--------------------------------------------------------------------------- ! EXTERNAL SEED RAIN real(r8) :: nitr_repro_stoich(maxpft) ! The NC ratio of a new recruit in this patch real(r8) :: phos_repro_stoich(maxpft) ! The PC ratio of a new recruit in this patch - !:.........................................................................: + !--------------------------------------------------------------------------- ! DISTURBANCE real(r8) :: disturbance_rates(n_dist_types) ! disturbance rate [0-1/day] from 1) mortality @@ -157,13 +157,13 @@ module FatesPatchMod ! 3) logging mortatliy real(r8) :: fract_ldist_not_harvested ! fraction of logged area that is canopy trees that weren't harvested [0-1] - !:.........................................................................: + !--------------------------------------------------------------------------- ! LITTER AND COARSE WOODY DEBRIS type(litter_type), pointer :: litter(:) ! litter (leaf,fnrt,CWD and seeds) for different elements real(r8), allocatable :: fragmentation_scaler(:) ! scale rate of litter fragmentation based on soil layer [0-1] - !:.........................................................................: + !--------------------------------------------------------------------------- ! FUELS AND FIRE ! fuel characteristics @@ -195,61 +195,62 @@ module FatesPatchMod real(r8) :: tfc_ros ! total intensity-relevant fuel consumed - no trunks [kgC/m2 of burned ground/day] real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned, conditional on it being burned [0-1] - !:.........................................................................: + !--------------------------------------------------------------------------- ! PLANT HYDRAULICS (not currently used in hydraulics RGK 03-2018) ! type(ed_patch_hydr_type), pointer :: pa_hydr ! All patch hydraulics data, see FatesHydraulicsMemMod.F90 contains - procedure :: init - procedure :: nan_values - procedure :: zero_values - procedure :: init_running_means - procedure :: init_litter - procedure :: create - procedure :: free_memory - procedure :: dump - procedure :: check_vars + procedure :: Init + procedure :: NanValues + procedure :: ZeroValues + procedure :: InitRunningMeans + procedure :: InitLitter + procedure :: Create + procedure :: FreeMemory + procedure :: Dump + procedure :: CheckVars end type fates_patch_type contains - subroutine init(this, numSWb, nlevsoil) + !=========================================================================== + + subroutine Init(this, num_swb, num_levsoil) ! ! DESCRIPTION: - ! Initialize a new patch - allocate arrays and set values to nan and/or - ! 0.0 + ! Initialize a new patch - allocate arrays and set values to nan and/or 0.0 ! ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object - integer, intent(in) :: numSWb ! number of shortwave broad-bands to track - integer, intent(in) :: nlevsoil ! number of soil layers + integer, intent(in) :: num_swb ! number of shortwave broad-bands to track + integer, intent(in) :: num_levsoil ! number of soil layers ! allocate arrays - allocate(this%tr_soil_dir(numSWb)) - allocate(this%tr_soil_dif(numSWb)) - allocate(this%tr_soil_dir_dif(numSWb)) - allocate(this%fab(numSWb)) - allocate(this%fabd(numSWb)) - allocate(this%fabi(numSWb)) - allocate(this%sabs_dir(numSWb)) - allocate(this%sabs_dif(numSWb)) - allocate(this%fragmentation_scaler(nlevsoil)) + allocate(this%tr_soil_dir(num_swb)) + allocate(this%tr_soil_dif(num_swb)) + allocate(this%tr_soil_dir_dif(num_swb)) + allocate(this%fab(num_swb)) + allocate(this%fabd(num_swb)) + allocate(this%fabi(num_swb)) + allocate(this%sabs_dir(num_swb)) + allocate(this%sabs_dif(num_swb)) + allocate(this%fragmentation_scaler(num_levsoil)) ! initialize all values to nan - call this%nan_values() + call this%NanValues() ! zero values that should be zeroed - call this%zero_values() + call this%ZeroValues() - end subroutine init + end subroutine Init - !:.........................................................................: + !=========================================================================== - subroutine nanValues(this) + subroutine NanValues(this) ! ! DESCRIPTION: ! Sets all values in patch to nan @@ -370,11 +371,11 @@ subroutine nanValues(this) this%tfc_ros = nan this%burnt_frac_litter(:) = nan - end subroutine nan_values + end subroutine NanValues - !:.........................................................................: + !=========================================================================== - subroutine zero_values(this) + subroutine ZeroValues(this) ! ! DESCRIPTION: ! sets specific variables in patch to zero @@ -445,11 +446,11 @@ subroutine zero_values(this) this%tfc_ros = 0.0_r8 this%burnt_frac_litter(:) = 0.0_r8 - end subroutine zero_values + end subroutine ZeroValues - !:.........................................................................: + !=========================================================================== - subroutine init_running_means(this, current_tod) + subroutine InitRunningMeans(this, current_tod) ! ! DESCRIPTION: ! set initial values for patch running means @@ -473,20 +474,20 @@ subroutine init_running_means(this, current_tod) call this%tveg_lpa%InitRmean(ema_lpa, init_value=temp_init_veg) call this%tveg_longterm%InitRmean(ema_longterm, init_value=temp_init_veg) - end subroutine init_running_means + end subroutine InitRunningMeans - !:.........................................................................: + !=========================================================================== - subroutine init_litter(this, numpft, nlevsoil) + subroutine InitLitter(this, num_pft, num_levsoil) ! ! DESCRIPTION: ! set initial values for litter ! ! ARGUMENTS: - class(fates_patch_type), intent(inout) :: this ! patch object - integer, intent(in) :: numpft ! number of pfts to simulate - integer, intent(in) :: nlevsoil ! number of soil layers + class(fates_patch_type), intent(inout) :: this ! patch object + integer, intent(in) :: num_pft ! number of pfts to simulate + integer, intent(in) :: num_levsoil ! number of soil layers ! LOCALS: integer :: el ! looping index @@ -494,7 +495,7 @@ subroutine init_litter(this, numpft, nlevsoil) allocate(this%litter(num_elements)) do el = 1, num_elements - call this%litter(el)%InitAllocate(numpft, nlevsoil, element_list(el)) + call this%litter(el)%InitAllocate(num_pft, num_levsoil, element_list(el)) call this%litter(el)%ZeroFlux() call this%litter(el)%InitConditions(init_leaf_fines=fates_unset_r8, & init_root_fines=fates_unset_r8, init_ag_cwd=fates_unset_r8, & @@ -502,12 +503,12 @@ subroutine init_litter(this, numpft, nlevsoil) init_seed_germ=fates_unset_r8) end do - end subroutine init_litter + end subroutine InitLitter - !:.........................................................................: + !=========================================================================== - subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & - nlevsoil, current_tod) + subroutine Create(this, age, area, label, nocomp_pft, num_swb, num_pft, & + num_levsoil, current_tod) ! ! DESCRIPTION: ! create a new patch with input and default values @@ -516,28 +517,28 @@ subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this ! patch object real(r8), intent(in) :: age ! notional age of this patch in years - real(r8), intent(in) :: areap ! initial area of this patch in m2. + real(r8), intent(in) :: area ! initial area of this patch in m2. integer, intent(in) :: label ! anthropogenic disturbance label integer, intent(in) :: nocomp_pft ! no-competition mode pft label - integer, intent(in) :: numSWb ! number of shortwave broad-bands to track - integer, intent(in) :: numpft ! number of pfts to simulate - integer, intent(in) :: nlevsoil ! number of soil layers + integer, intent(in) :: num_swb ! number of shortwave broad-bands to track + integer, intent(in) :: num_pft ! number of pfts to simulate + integer, intent(in) :: num_levsoil ! number of soil layers integer, intent(in) :: current_tod ! time of day [seconds past 0Z] ! initialize patch ! sets all values to nan, then some values to zero - call this%init(numpft, numSWb, nlevsoil) + call this%Init(num_swb, num_levsoil) ! initialize running means for patch - call this%init_running_means(current_tod) + call this%InitRunningMeans(current_tod) ! initialize litter - call this%init_litter(numpft, nlevsoil) + call this%InitLitter(num_pft, num_levsoil) ! assign known patch attributes this%age = age this%age_class = 1 - this%area = areap + this%area = area ! assign anthropgenic disturbance category and label this%anthro_disturbance_label = label @@ -552,11 +553,11 @@ subroutine create(this, age, areap, label, nocomp_pft, numSWb, numpft, & this%tr_soil_dif(:) = 1.0_r8 this%NCL_p = 1 - end subroutine create + end subroutine Create - !:.........................................................................: + !=========================================================================== - subroutine free_memory(this) + subroutine FreeMemory(this) ! ! DESCRIPTION: ! deallocate the allocatable memory associated with this patch @@ -630,11 +631,11 @@ subroutine free_memory(this) call endrun(msg=errMsg(sourcefile, __LINE__)) endif - end subroutine free_memory + end subroutine FreeMemory - !:.........................................................................: + !=========================================================================== - subroutine dump(this) + subroutine Dump(this) ! ! DESCRIPTION: ! print attributes of a patch @@ -679,11 +680,11 @@ subroutine dump(this) write(fates_log(),*) 'bg_cwd(c,sl): ',sum(this%litter(el)%bg_cwd) end do - end subroutine dump + end subroutine Dump - !:.........................................................................: + !=========================================================================== - subroutine check_vars(this, var_aliases, return_code) + subroutine CheckVars(this, var_aliases, return_code) ! ! DESCRIPTION: ! perform numerical checks on patch variables of interest @@ -736,8 +737,8 @@ subroutine check_vars(this, var_aliases, return_code) end if end if -end subroutine check_vars + end subroutine CheckVars -!:.........................................................................: + !=========================================================================== end module FatesPatchMod \ No newline at end of file diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 8dd15a9a8d..3419596026 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -611,7 +611,7 @@ subroutine init_patches( nsites, sites, bc_in) if(newparea.gt.0._r8)then ! Stop patches being initilialized when PFT not present in nocomop mode allocate(newp) - call newp%create(age, newparea, primaryforest, nocomp_pft, & + call newp%Create(age, newparea, primaryforest, nocomp_pft, & hlm_numSWb, numpft, sites(s)%nlevsoil, hlm_current_tod) if(is_first_patch.eq.itrue)then !is this the first patch? diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 1c9b0f9449..254dc100ff 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -276,7 +276,7 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) age_init = 0.0_r8 area_init = 0.0_r8 allocate(newpatch) - call newpatch%create(age_init, area_init, primaryforest, & + call newpatch%Create(age_init, area_init, primaryforest, & fates_unset_int, hlm_numSWb, numpft, sites(s)%nlevsoil, & hlm_current_tod) diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index dcd99da82e..f76fdd2680 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -2590,7 +2590,7 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) nocomp_pft = fates_unset_int ! the nocomp_pft label is set after patch creation has occured in 'get_restart_vectors' ! make new patch - call newp%create(fates_unset_r8, fates_unset_r8, primaryforest, & + call newp%Create(fates_unset_r8, fates_unset_r8, primaryforest, & nocomp_pft, hlm_numSWb, numpft, sites(s)%nlevsoil, & hlm_current_tod) From 4b9e9d5b6aa7277edd1f97e1fee1aca4010a98dd Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 9 May 2023 11:24:21 -0600 Subject: [PATCH 077/125] update style to match style guide --- biogeochem/EDCanopyStructureMod.F90 | 4 +- biogeochem/EDCohortDynamicsMod.F90 | 8 +-- biogeochem/EDPatchDynamicsMod.F90 | 10 +-- biogeochem/EDPhysiologyMod.F90 | 6 +- biogeochem/FatesCohortMod.F90 | 96 ++++++++++++++--------------- biogeochem/FatesPatchMod.F90 | 14 ++--- main/FatesHydraulicsMemMod.F90 | 10 +-- main/FatesRestartInterfaceMod.F90 | 4 +- 8 files changed, 76 insertions(+), 76 deletions(-) diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index 5c867b698a..174855ea5d 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -682,7 +682,7 @@ subroutine DemoteFromLayer(currentSite,currentPatch,i_lyr,bc_in) call InitHydrCohort(currentSite,copyc) endif - call currentCohort%copy(copyc) + call currentCohort%Copy(copyc) call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_loss @@ -1157,7 +1157,7 @@ subroutine PromoteIntoLayer(currentSite,currentPatch,i_lyr) !call copyc%tveg_lpa%InitRMean(ema_lpa,& ! init_value=currentPatch%tveg_lpa%GetMean()) - call currentCohort%copy(copyc) !makes an identical copy... + call currentCohort%Copy(copyc) !makes an identical copy... call copyc%InitPRTBoundaryConditions() newarea = currentCohort%c_area - cc_gain !new area of existing cohort diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index d1ce6efc35..cad2a5ee26 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -202,7 +202,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! create new cohort allocate(new_cohort) -call new_cohort%create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & +call new_cohort%Create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & clayer, crowndamage, spread, patchptr%canopy_layer_tlai) ! Put cohort at the right place in the linked list @@ -545,7 +545,7 @@ subroutine terminate_cohort(currentSite, currentPatch, currentCohort, bc_in) shorterCohort%taller => tallerCohort endif - call currentCohort%free_memory() + call currentCohort%FreeMemory() end subroutine terminate_cohort @@ -1158,7 +1158,7 @@ subroutine fuse_cohorts(currentSite, currentPatch, bc_in) call UpdateSizeDepPlantHydProps(currentSite,currentCohort, bc_in) endif - call nextc%free_memory() + call nextc%FreeMemory() deallocate(nextc, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc003: fail on deallocate(nextc):'//trim(smsg) @@ -1741,7 +1741,7 @@ subroutine DamageRecovery(csite,cpatch,ccohort,newly_recovered) rcohort%prt => null() call InitPRTObject(rcohort%prt) call rcohort%InitPRTBoundaryConditions() - call ccohort%copy(rcohort) + call ccohort%Copy(rcohort) rcohort%n = nplant_recover diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 8780294ee9..753aa4ff4f 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -485,7 +485,7 @@ subroutine spawn_patches( currentSite, bc_in) if(disturbance_rate > (1.0_r8 + rsnbl_math_prec)) then write(fates_log(),*) 'patch disturbance rate > 1 ?',disturbance_rate - call currentPatch%dump() + call currentPatch%Dump() call endrun(msg=errMsg(sourcefile, __LINE__)) end if @@ -686,11 +686,11 @@ subroutine spawn_patches( currentSite, bc_in) !allocate(nc%tveg_lpa) !call nc%tveg_lpa%InitRMean(ema_lpa,init_value=new_patch%tveg_lpa%GetMean()) - call nc%zero_values() + call nc%ZeroValues() ! nc is the new cohort that goes in the disturbed patch (new_patch)... currentCohort ! is the curent cohort that stays in the donor patch (currentPatch) - call currentCohort%copy(nc) + call currentCohort%Copy(nc) !this is the case as the new patch probably doesn't have a closed canopy, and ! even if it does, that will be sorted out in canopy_structure. @@ -1109,7 +1109,7 @@ subroutine spawn_patches( currentSite, bc_in) else ! Get rid of the new temporary cohort - call nc%free_memory() + call nc%FreeMemory() deallocate(nc, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc005: fail on deallocate(nc):'//trim(smsg) @@ -2528,7 +2528,7 @@ subroutine fuse_2_patches(csite, dp, rp) end if ! We have no need for the dp pointer anymore, we have passed on it's legacy - call dp%free_memory() + call dp%FreeMemory() deallocate(dp, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc006: fail on deallocate(dp):'//trim(smsg) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 9a49d540e5..b0961d2e81 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -273,10 +273,10 @@ subroutine GenerateDamageAndLitterFluxes( csite, cpatch, bc_in ) call InitPRTObject(ndcohort%prt) call ndcohort%InitPRTBoundaryConditions() - call ndcohort%zero_values() + call ndcohort%ZeroValues() ! nc_canopy_d is the new cohort that gets damaged - call ccohort%copy(ndcohort) + call ccohort%Copy(ndcohort) ! new number densities - we just do damaged cohort here - ! undamaged at the end of the cohort loop once we know how many damaged to @@ -2027,7 +2027,7 @@ subroutine recruitment( currentSite, currentPatch, bc_in ) !---------------------------------------------------------------------- allocate(temp_cohort) ! create temporary cohort - call temp_cohort%zero_values() + call temp_cohort%ZeroValues() do ft = 1,numpft diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index 7cacf59c83..a589c160ba 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -57,7 +57,7 @@ module FatesCohortMod type (fates_cohort_type), pointer :: taller => null() ! pointer to next tallest cohort type (fates_cohort_type), pointer :: shorter => null() ! pointer to next shorter cohort - !:.........................................................................: + !--------------------------------------------------------------------------- ! Multi-species, multi-organ Plant Reactive Transport (PRT) ! Contains carbon and nutrient state variables for various plant organs @@ -70,7 +70,7 @@ module FatesCohortMod ! parameters, with a tendency driven by ! nutrient storage) [kg root / kg leaf] - !:.........................................................................: + !--------------------------------------------------------------------------- ! VEGETATION STRUCTURE @@ -110,7 +110,7 @@ module FatesCohortMod integer :: coage_by_pft_class ! index that indicates the cohorts position of the join cohort age class x PFT integer :: size_class_lasttimestep ! size class of the cohort at the last time step - !:.........................................................................: + !--------------------------------------------------------------------------- ! CARBON AND NUTRIENT FLUXES @@ -188,7 +188,7 @@ module FatesCohortMod real(r8) :: seed_prod ! diagnostic seed production rate [kgC/plant/day] - !:.........................................................................: + !--------------------------------------------------------------------------- ! RESPIRATION COMPONENTS real(r8) :: rdark ! dark respiration [kgC/indiv/s] @@ -200,12 +200,12 @@ module FatesCohortMod real(r8) :: livecroot_mr ! belowground live stem maintenance respiration [kgC/indiv/s] real(r8) :: froot_mr ! live fine root maintenance respiration [kgC/indiv/s] - !:.........................................................................: + !--------------------------------------------------------------------------- ! DAMAGE real(r8) :: branch_frac ! fraction of aboveground woody biomass in branches [0-1] - !:.........................................................................: + !--------------------------------------------------------------------------- ! MORTALITY real(r8) :: dmort ! proportional mortality rate [/year] @@ -228,7 +228,7 @@ module FatesCohortMod ! (i.e. they are moved to newly-anthro-disturbed secondary ! forest patch) [fraction/logging activity] - !:.........................................................................: + !--------------------------------------------------------------------------- ! NITROGEN POOLS ! -------------------------------------------------------------------------- @@ -237,7 +237,7 @@ module FatesCohortMod ! Local values are used in that routine. ! -------------------------------------------------------------------------- - !:.........................................................................: + !--------------------------------------------------------------------------- ! GROWTH DERIVIATIVES real(r8) :: dndt ! time derivative of cohort size [n/year] @@ -245,7 +245,7 @@ module FatesCohortMod real(r8) :: ddbhdt ! time derivative of dbh [cm/year] real(r8) :: dbdeaddt ! time derivative of dead biomass [kgC/year] - !:.........................................................................: + !--------------------------------------------------------------------------- ! FIRE real(r8) :: fraction_crown_burned ! proportion of crown affected by fire [0-1] @@ -255,31 +255,31 @@ module FatesCohortMod ! (conditional on the tree being subjected to the fire) real(r8) :: fire_mort ! post-fire mortality from cambial and crown damage assuming two are independent [0-1] - !:.........................................................................: + !--------------------------------------------------------------------------- ! HYDRAULICS type(ed_cohort_hydr_type), pointer :: co_hydr ! all cohort hydraulics data, see FatesHydraulicsMemMod.F90 - !:.........................................................................: - contains - procedure :: init - procedure :: dump - procedure :: nan_values - procedure :: zero_values - procedure :: create - procedure :: copy - procedure :: free_memory + procedure :: Init + procedure :: NanValues + procedure :: ZeroValues + procedure :: Create + procedure :: Copy + procedure :: FreeMemory procedure :: CanUpperUnder procedure :: InitPRTBoundaryConditions procedure :: UpdateCohortBioPhysRates + procedure :: Dump end type fates_cohort_type contains - subroutine init(this, prt) + !=========================================================================== + + subroutine Init(this, prt) ! ! DESCRIPTION: ! Create new cohort and set default values for all variables @@ -289,8 +289,8 @@ subroutine init(this, prt) class(fates_cohort_type), intent(inout), target :: this class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object - call this%nan_values() ! make everything in the cohort not-a-number - call this%zero_values() ! zero things that need to be zeroed + call this%NanValues() ! make everything in the cohort not-a-number + call this%ZeroValues() ! zero things that need to be zeroed ! point to the PARTEH object this%prt => prt @@ -307,11 +307,11 @@ subroutine init(this, prt) ! growth, disturbance and mortality. this%isnew = .true. - end subroutine init + end subroutine Init - !:.........................................................................: + !=========================================================================== - subroutine nan_values(this) + subroutine NanValues(this) ! ! DESCRIPTION: ! make all the cohort variables NaN or unset so they aren't used before defined @@ -433,11 +433,11 @@ subroutine nan_values(this) this%crownfire_mort = nan this%fire_mort = nan - end subroutine nan_values + end subroutine NanValues - !:.........................................................................: + !=========================================================================== - subroutine zero_values(this) + subroutine ZeroValues(this) ! ! DESCRIPTION: ! Zero variables that need to be accounted for if this cohort is altered @@ -513,11 +513,11 @@ subroutine zero_values(this) this%crownfire_mort = 0._r8 this%fire_mort = 0._r8 - end subroutine zero_values + end subroutine ZeroValues - !:.........................................................................: + !=========================================================================== - subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & + subroutine Create(this, prt, pft, nn, hite, coage, dbh, status, & ctrim, carea, clayer, crowndamage, spread, can_tlai) ! ! DESCRIPTION: @@ -544,7 +544,7 @@ subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & real(r8) :: leaf_c ! total leaf carbon [kgC] ! initialize cohort - call this%init(prt) + call this%Init(prt) ! set values this%pft = pft @@ -563,7 +563,7 @@ subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & ! In these cases, testing if things like biomass are reasonable is premature ! However, in this part of the code, we will pass in nominal values for size, number and type if (this%dbh <= 0._r8 .or. this%n == 0._r8 .or. this%pft == 0) then - write(fates_log(),*) 'FATES: something is zero in cohort%create', & + write(fates_log(),*) 'FATES: something is zero in cohort%Create', & this%dbh, this%n, this%pft call endrun(msg=errMsg(sourcefile, __LINE__)) endif @@ -619,11 +619,11 @@ subroutine create(this, prt, pft, nn, hite, coage, dbh, status, & this%treelai,this%vcmax25top, 2) end if - end subroutine create + end subroutine Create - !:.........................................................................: + !=========================================================================== - subroutine copy(this, copy_cohort) + subroutine Copy(this, copy_cohort) ! ! DESCRIPTION: ! copies all the variables in one cohort into a new cohort @@ -753,11 +753,11 @@ subroutine copy(this, copy_cohort) call copy_cohort%co_hydr%CopyCohortHydraulics(this%co_hydr) endif - end subroutine copy + end subroutine Copy - !:.........................................................................: + !=========================================================================== - subroutine free_memory(this) + subroutine FreeMemory(this) ! ! DESCRIPTION: ! deallocates all dynamic memory and objects within the cohort structure @@ -787,9 +787,9 @@ subroutine free_memory(this) call endrun(msg=errMsg(sourcefile, __LINE__)) endif - end subroutine free_memory + end subroutine FreeMemory - !:.........................................................................: + !=========================================================================== subroutine InitPRTBoundaryConditions(this) ! @@ -865,7 +865,7 @@ subroutine InitPRTBoundaryConditions(this) end subroutine InitPRTBoundaryConditions - !:.........................................................................: + !=========================================================================== subroutine UpdateCohortBioPhysRates(this) ! @@ -935,7 +935,7 @@ subroutine UpdateCohortBioPhysRates(this) end subroutine UpdateCohortBioPhysRates - !:.........................................................................: + !=========================================================================== function CanUpperUnder(this) result(can_position) ! @@ -960,9 +960,9 @@ function CanUpperUnder(this) result(can_position) end function CanUpperUnder - !:.........................................................................: + !=========================================================================== - subroutine dump(this) + subroutine Dump(this) ! ! DESCRIPTION: ! Print out attributes of a cohort @@ -1042,12 +1042,12 @@ subroutine dump(this) write(fates_log(),*) 'cthis%size_class = ', this%size_class write(fates_log(),*) 'cthis%size_by_pft_class = ', this%size_by_pft_class - if (associated(this%co_hydr)) call this%co_hydr%dump() + if (associated(this%co_hydr)) call this%co_hydr%Dump() write(fates_log(),*) '----------------------------------------' - end subroutine dump + end subroutine Dump - !:.........................................................................: + !=========================================================================== end module FatesCohortMod \ No newline at end of file diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index ddeee61f65..9ec2e38969 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -45,7 +45,7 @@ module FatesPatchMod ! each patch ID corresponds to a pft number since each ! patch has only one pft. Bareground patches are given ! a zero integer as a label. If nocomp is not active this - ! is set to unset. This is set in patch%create as an argument + ! is set to unset. This is set in patch%Create as an argument ! to that procedure. !--------------------------------------------------------------------------- @@ -578,7 +578,7 @@ subroutine FreeMemory(this) ccohort => this%shortest do while(associated(ccohort)) ncohort => ccohort%taller - call ccohort%free_memory() + call ccohort%FreeMemory() deallocate(ccohort, stat=istat, errmsg=smsg) if (istat /= 0) then write(fates_log(),*) 'dealloc007: fail on deallocate(cchort):'//trim(smsg) @@ -708,8 +708,8 @@ subroutine CheckVars(this, var_aliases, return_code) do while(associated(currentCohort)) call check_var_real(currentCohort%n, 'cohort%n', return_code) if (.not.(return_code .eq. 0)) then - call this%dump() - call currentCohort%dump() + call this%Dump() + call currentCohort%Dump() return end if currentCohort => currentCohort%taller @@ -721,8 +721,8 @@ subroutine CheckVars(this, var_aliases, return_code) do while(associated(currentCohort)) call check_var_real(currentCohort%dbh, 'cohort%dbh', return_code) if (.not. (return_code .eq. 0)) then - call this%dump() - call currentCohort%dump() + call this%Dump() + call currentCohort%Dump() return end if currentCohort => currentCohort%taller @@ -732,7 +732,7 @@ subroutine CheckVars(this, var_aliases, return_code) if (check_hlm_list(trim(var_aliases), 'pa_area')) then call check_var_real(this%area, 'patch%area', return_code) if (.not. (return_code .eq. 0)) then - call this%dump() + call this%Dump() return end if end if diff --git a/main/FatesHydraulicsMemMod.F90 b/main/FatesHydraulicsMemMod.F90 index 856599f2e5..61e97173c7 100644 --- a/main/FatesHydraulicsMemMod.F90 +++ b/main/FatesHydraulicsMemMod.F90 @@ -316,7 +316,7 @@ module FatesHydraulicsMemMod procedure :: AllocateHydrCohortArrays procedure :: DeallocateHydrCohortArrays procedure :: CopyCohortHydraulics - procedure :: dump + procedure :: Dump end type ed_cohort_hydr_type @@ -425,9 +425,9 @@ subroutine DeallocateHydrCohortArrays(this) return end subroutine DeallocateHydrCohortArrays - ! =================================================================================== + ! ========================================================================== - subroutine dump(this) + subroutine Dump(this) class(ed_cohort_hydr_type), intent(in) :: this @@ -440,9 +440,9 @@ subroutine dump(this) return - end subroutine dump + end subroutine Dump - !:..........................................................................: + ! ========================================================================== subroutine InitHydrSite(this,numpft,numlevsclass,hydr_solver_type,nlevsoil) diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index f76fdd2680..4f72dd69d0 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -2622,8 +2622,8 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) do fto = 1, rio_ncohort_pa( io_idx_co_1st ) allocate(new_cohort) - call new_cohort%nan_values() - call new_cohort%zero_values() + call new_cohort%NanValues() + call new_cohort%ZeroValues() ! If this is the first in the list, it is tallest if (.not.associated(newp%tallest)) then From 92a57d0a890ada1175dabb02a2f8202ce5cf3213 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 9 May 2023 13:45:06 -0700 Subject: [PATCH 078/125] Remove unnecessary xarray import call --- tools/luh2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/luh2.py b/tools/luh2.py index 0a5ea6229e..22e8d8bab7 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import argparse, os -import xarray as xr from luh2mod import PrepDataSet, ImportData, SetMaskLUH2, SetMaskSurfData from luh2mod import RegridConservative From a265ef3c9663e51999d3e63da9979d7b6fd6b1d7 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 10 May 2023 12:00:47 -0600 Subject: [PATCH 079/125] update for style --- biogeochem/FatesCohortMod.F90 | 328 +++++++++++++++++----------------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index a589c160ba..01d652464a 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -623,134 +623,134 @@ end subroutine Create !=========================================================================== - subroutine Copy(this, copy_cohort) + subroutine Copy(this, copyCohort) ! ! DESCRIPTION: ! copies all the variables in one cohort into a new cohort ! ! ARGUMENTS - class(fates_cohort_type), intent(in) :: this ! old cohort - class(fates_cohort_type), intent(inout) :: copy_cohort ! new cohort + class(fates_cohort_type), intent(in) :: this ! old cohort + class(fates_cohort_type), intent(inout) :: copyCohort ! new cohort - copy_cohort%indexnumber = fates_unset_int + copyCohort%indexnumber = fates_unset_int ! POINTERS - copy_cohort%taller => NULL() - copy_cohort%shorter => NULL() + copyCohort%taller => NULL() + copyCohort%shorter => NULL() ! PRT - call copy_cohort%prt%CopyPRTVartypes(this%prt) - copy_cohort%l2fr = this%l2fr + call copyCohort%prt%CopyPRTVartypes(this%prt) + copyCohort%l2fr = this%l2fr ! VEGETATION STRUCTURE - copy_cohort%pft = this%pft - copy_cohort%n = this%n - copy_cohort%dbh = this%dbh - copy_cohort%coage = this%coage - copy_cohort%hite = this%hite - copy_cohort%canopy_layer = this%canopy_layer - copy_cohort%canopy_layer_yesterday = this%canopy_layer_yesterday - copy_cohort%crowndamage = this%crowndamage - copy_cohort%g_sb_laweight = this%g_sb_laweight - copy_cohort%canopy_trim = this%canopy_trim - copy_cohort%leaf_cost = this%leaf_cost - copy_cohort%excl_weight = this%excl_weight - copy_cohort%prom_weight = this%prom_weight - copy_cohort%nv = this%nv - copy_cohort%status_coh = this%status_coh - copy_cohort%c_area = this%c_area - copy_cohort%treelai = this%treelai - copy_cohort%treesai = this%treesai - copy_cohort%isnew = this%isnew - copy_cohort%size_class = this%size_class - copy_cohort%coage_class = this%coage_class - copy_cohort%size_by_pft_class = this%size_by_pft_class - copy_cohort%coage_by_pft_class = this%coage_by_pft_class - copy_cohort%size_class_lasttimestep = this%size_class_lasttimestep + copyCohort%pft = this%pft + copyCohort%n = this%n + copyCohort%dbh = this%dbh + copyCohort%coage = this%coage + copyCohort%hite = this%hite + copyCohort%canopy_layer = this%canopy_layer + copyCohort%canopy_layer_yesterday = this%canopy_layer_yesterday + copyCohort%crowndamage = this%crowndamage + copyCohort%g_sb_laweight = this%g_sb_laweight + copyCohort%canopy_trim = this%canopy_trim + copyCohort%leaf_cost = this%leaf_cost + copyCohort%excl_weight = this%excl_weight + copyCohort%prom_weight = this%prom_weight + copyCohort%nv = this%nv + copyCohort%status_coh = this%status_coh + copyCohort%c_area = this%c_area + copyCohort%treelai = this%treelai + copyCohort%treesai = this%treesai + copyCohort%isnew = this%isnew + copyCohort%size_class = this%size_class + copyCohort%coage_class = this%coage_class + copyCohort%size_by_pft_class = this%size_by_pft_class + copyCohort%coage_by_pft_class = this%coage_by_pft_class + copyCohort%size_class_lasttimestep = this%size_class_lasttimestep ! CARBON AND NUTRIENT FLUXES - copy_cohort%gpp_tstep = this%gpp_tstep - copy_cohort%gpp_acc = this%gpp_acc - copy_cohort%gpp_acc_hold = this%gpp_acc_hold - copy_cohort%npp_tstep = this%npp_tstep - copy_cohort%npp_acc = this%npp_acc - copy_cohort%npp_acc_hold = this%npp_acc_hold - copy_cohort%resp_tstep = this%resp_tstep - copy_cohort%resp_acc = this%resp_acc - copy_cohort%resp_acc_hold = this%resp_acc_hold - copy_cohort%c13disc_clm = this%c13disc_clm - copy_cohort%c13disc_acc = this%c13disc_acc - copy_cohort%vcmax25top = this%vcmax25top - copy_cohort%jmax25top = this%jmax25top - copy_cohort%tpu25top = this%tpu25top - copy_cohort%kp25top = this%kp25top - copy_cohort%ts_net_uptake = this%ts_net_uptake - copy_cohort%year_net_uptake = this%year_net_uptake - copy_cohort%cnp_limiter = this%cnp_limiter + copyCohort%gpp_tstep = this%gpp_tstep + copyCohort%gpp_acc = this%gpp_acc + copyCohort%gpp_acc_hold = this%gpp_acc_hold + copyCohort%npp_tstep = this%npp_tstep + copyCohort%npp_acc = this%npp_acc + copyCohort%npp_acc_hold = this%npp_acc_hold + copyCohort%resp_tstep = this%resp_tstep + copyCohort%resp_acc = this%resp_acc + copyCohort%resp_acc_hold = this%resp_acc_hold + copyCohort%c13disc_clm = this%c13disc_clm + copyCohort%c13disc_acc = this%c13disc_acc + copyCohort%vcmax25top = this%vcmax25top + copyCohort%jmax25top = this%jmax25top + copyCohort%tpu25top = this%tpu25top + copyCohort%kp25top = this%kp25top + copyCohort%ts_net_uptake = this%ts_net_uptake + copyCohort%year_net_uptake = this%year_net_uptake + copyCohort%cnp_limiter = this%cnp_limiter if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then - copy_cohort%cx_int = this%cx_int - copy_cohort%ema_dcxdt = this%ema_dcxdt - copy_cohort%cx0 = this%cx0 + copyCohort%cx_int = this%cx_int + copyCohort%ema_dcxdt = this%ema_dcxdt + copyCohort%cx0 = this%cx0 end if - copy_cohort%nc_repro = this%nc_repro - copy_cohort%daily_nh4_uptake = this%daily_nh4_uptake - copy_cohort%daily_no3_uptake = this%daily_no3_uptake - copy_cohort%sym_nfix_daily = this%sym_nfix_daily - copy_cohort%sym_nfix_tstep = this%sym_nfix_tstep - copy_cohort%daily_n_gain = this%daily_n_gain - copy_cohort%daily_p_gain = this%daily_p_gain - copy_cohort%daily_c_efflux = this%daily_c_efflux - copy_cohort%daily_n_efflux = this%daily_n_efflux - copy_cohort%daily_p_efflux = this%daily_p_efflux - copy_cohort%daily_n_demand = this%daily_n_demand - copy_cohort%daily_p_demand = this%daily_p_demand - copy_cohort%seed_prod = this%seed_prod + copyCohort%nc_repro = this%nc_repro + copyCohort%daily_nh4_uptake = this%daily_nh4_uptake + copyCohort%daily_no3_uptake = this%daily_no3_uptake + copyCohort%sym_nfix_daily = this%sym_nfix_daily + copyCohort%sym_nfix_tstep = this%sym_nfix_tstep + copyCohort%daily_n_gain = this%daily_n_gain + copyCohort%daily_p_gain = this%daily_p_gain + copyCohort%daily_c_efflux = this%daily_c_efflux + copyCohort%daily_n_efflux = this%daily_n_efflux + copyCohort%daily_p_efflux = this%daily_p_efflux + copyCohort%daily_n_demand = this%daily_n_demand + copyCohort%daily_p_demand = this%daily_p_demand + copyCohort%seed_prod = this%seed_prod ! RESPIRATION COMPONENTS - copy_cohort%rdark = this%rdark - copy_cohort%resp_g_tstep = this%resp_g_tstep - copy_cohort%resp_m = this%resp_m - copy_cohort%resp_m_unreduced = this%resp_m_unreduced - copy_cohort%resp_excess = this%resp_excess - copy_cohort%livestem_mr = this%livestem_mr - copy_cohort%livecroot_mr = this%livecroot_mr - copy_cohort%froot_mr = this%froot_mr + copyCohort%rdark = this%rdark + copyCohort%resp_g_tstep = this%resp_g_tstep + copyCohort%resp_m = this%resp_m + copyCohort%resp_m_unreduced = this%resp_m_unreduced + copyCohort%resp_excess = this%resp_excess + copyCohort%livestem_mr = this%livestem_mr + copyCohort%livecroot_mr = this%livecroot_mr + copyCohort%froot_mr = this%froot_mr ! DAMAGE - copy_cohort%branch_frac = this%branch_frac + copyCohort%branch_frac = this%branch_frac ! MORTALITY - copy_cohort%dmort = this%dmort - copy_cohort%bmort = this%bmort - copy_cohort%cmort = this%cmort - copy_cohort%hmort = this%hmort - copy_cohort%frmort = this%frmort - copy_cohort%smort = this%smort - copy_cohort%asmort = this%asmort - copy_cohort%dgmort = this%dgmort - copy_cohort%lmort_direct = this%lmort_direct - copy_cohort%lmort_collateral = this%lmort_collateral - copy_cohort%lmort_infra = this%lmort_infra - copy_cohort%l_degrad = this%l_degrad + copyCohort%dmort = this%dmort + copyCohort%bmort = this%bmort + copyCohort%cmort = this%cmort + copyCohort%hmort = this%hmort + copyCohort%frmort = this%frmort + copyCohort%smort = this%smort + copyCohort%asmort = this%asmort + copyCohort%dgmort = this%dgmort + copyCohort%lmort_direct = this%lmort_direct + copyCohort%lmort_collateral = this%lmort_collateral + copyCohort%lmort_infra = this%lmort_infra + copyCohort%l_degrad = this%l_degrad ! GROWTH DERIVATIVES - copy_cohort%dndt = this%dndt - copy_cohort%dhdt = this%dhdt - copy_cohort%ddbhdt = this%ddbhdt - copy_cohort%dbdeaddt = this%dbdeaddt + copyCohort%dndt = this%dndt + copyCohort%dhdt = this%dhdt + copyCohort%ddbhdt = this%ddbhdt + copyCohort%dbdeaddt = this%dbdeaddt ! FIRE - copy_cohort%fraction_crown_burned = this%fraction_crown_burned - copy_cohort%cambial_mort = this%cambial_mort - copy_cohort%crownfire_mort = this%crownfire_mort - copy_cohort%fire_mort = this%fire_mort + copyCohort%fraction_crown_burned = this%fraction_crown_burned + copyCohort%cambial_mort = this%cambial_mort + copyCohort%crownfire_mort = this%crownfire_mort + copyCohort%fire_mort = this%fire_mort ! HYDRAULICS if (hlm_use_planthydro .eq. itrue) then - call copy_cohort%co_hydr%CopyCohortHydraulics(this%co_hydr) + call copyCohort%co_hydr%CopyCohortHydraulics(this%co_hydr) endif end subroutine Copy @@ -798,7 +798,7 @@ subroutine InitPRTBoundaryConditions(this) ! allocation hypotheses. Each of these calls to "RegsterBC" are simply ! setting pointers. ! For instance, if the hypothesis wants to know what - ! the DBH of the plant is, then we pass in the dbh as an argument (copy_cohort%dbh), + ! the DBH of the plant is, then we pass in the dbh as an argument (copyCohort%dbh), ! and also tell it which boundary condition we are talking about (which is ! defined by an integer index (ac_bc_inout_id_dbh) ! @@ -974,73 +974,73 @@ subroutine Dump(this) write(fates_log(),*) '----------------------------------------' write(fates_log(),*) ' Dumping Cohort Information ' write(fates_log(),*) '----------------------------------------' - write(fates_log(),*) 'cthis%pft = ', this%pft - write(fates_log(),*) 'cthis%n = ', this%n - write(fates_log(),*) 'cthis%dbh = ', this%dbh - write(fates_log(),*) 'cthis%hite = ', this%hite - write(fates_log(),*) 'cthis%crowndamage = ', this%crowndamage - write(fates_log(),*) 'cthis%coage = ', this%coage - write(fates_log(),*) 'cthis%l2fr = ', this%l2fr - write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) - write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) - write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) - write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) - write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) - write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) - write(fates_log(),*) 'cthis%g_sb_laweight = ', this%g_sb_laweight - write(fates_log(),*) 'cthis%leaf_cost = ', this%leaf_cost - write(fates_log(),*) 'cthis%canopy_layer = ', this%canopy_layer - write(fates_log(),*) 'cthis%canopy_layer_yesterday = ', this%canopy_layer_yesterday - write(fates_log(),*) 'cthis%nv = ', this%nv - write(fates_log(),*) 'cthis%status_coh = ', this%status_coh - write(fates_log(),*) 'cthis%canopy_trim = ', this%canopy_trim - write(fates_log(),*) 'cthis%excl_weight = ', this%excl_weight - write(fates_log(),*) 'cthis%prom_weight = ', this%prom_weight - write(fates_log(),*) 'cthis%size_class = ', this%size_class - write(fates_log(),*) 'cthis%size_by_pft_class = ', this%size_by_pft_class - write(fates_log(),*) 'cthis%coage_class = ', this%coage_class - write(fates_log(),*) 'cthis%coage_by_pft_class = ', this%coage_by_pft_class - write(fates_log(),*) 'cthis%gpp_acc_hold = ', this%gpp_acc_hold - write(fates_log(),*) 'cthis%gpp_acc = ', this%gpp_acc - write(fates_log(),*) 'cthis%gpp_tstep = ', this%gpp_tstep - write(fates_log(),*) 'cthis%npp_acc_hold = ', this%npp_acc_hold - write(fates_log(),*) 'cthis%npp_tstep = ', this%npp_tstep - write(fates_log(),*) 'cthis%npp_acc = ', this%npp_acc - write(fates_log(),*) 'cthis%resp_tstep = ', this%resp_tstep - write(fates_log(),*) 'cthis%resp_acc = ', this%resp_acc - write(fates_log(),*) 'cthis%resp_acc_hold = ', this%resp_acc_hold - write(fates_log(),*) 'cthis%rdark = ', this%rdark - write(fates_log(),*) 'cthis%resp_m = ', this%resp_m - write(fates_log(),*) 'cthis%resp_g_tstep = ', this%resp_g_tstep - write(fates_log(),*) 'cthis%livestem_mr = ', this%livestem_mr - write(fates_log(),*) 'cthis%livecroot_mr = ', this%livecroot_mr - write(fates_log(),*) 'cthis%froot_mr = ', this%froot_mr - write(fates_log(),*) 'cthis%dgmort = ', this%dgmort - write(fates_log(),*) 'cthis%treelai = ', this%treelai - write(fates_log(),*) 'cthis%treesai = ', this%treesai - write(fates_log(),*) 'cthis%c_area = ', this%c_area - write(fates_log(),*) 'cthis%cmort = ', this%cmort - write(fates_log(),*) 'cthis%bmort = ', this%bmort - write(fates_log(),*) 'cthis%smort = ', this%smort - write(fates_log(),*) 'cthis%asmort = ', this%asmort - write(fates_log(),*) 'cthis%dgmort = ', this%dgmort - write(fates_log(),*) 'cthis%hmort = ', this%hmort - write(fates_log(),*) 'cthis%frmort = ', this%frmort - write(fates_log(),*) 'cthis%asmort = ', this%asmort - write(fates_log(),*) 'cthis%lmort_direct = ', this%lmort_direct - write(fates_log(),*) 'cthis%lmort_collateral = ', this%lmort_collateral - write(fates_log(),*) 'cthis%lmort_infra = ', this%lmort_infra - write(fates_log(),*) 'cthis%isnew = ', this%isnew - write(fates_log(),*) 'cthis%dndt = ', this%dndt - write(fates_log(),*) 'cthis%dhdt = ', this%dhdt - write(fates_log(),*) 'cthis%ddbhdt = ', this%ddbhdt - write(fates_log(),*) 'cthis%dbdeaddt = ', this%dbdeaddt - write(fates_log(),*) 'cthis%fraction_crown_burned = ', this%fraction_crown_burned - write(fates_log(),*) 'cthis%fire_mort = ', this%fire_mort - write(fates_log(),*) 'cthis%crownfire_mort = ', this%crownfire_mort - write(fates_log(),*) 'cthis%cambial_mort = ', this%cambial_mort - write(fates_log(),*) 'cthis%size_class = ', this%size_class - write(fates_log(),*) 'cthis%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'cohort%pft = ', this%pft + write(fates_log(),*) 'cohort%n = ', this%n + write(fates_log(),*) 'cohort%dbh = ', this%dbh + write(fates_log(),*) 'cohort%hite = ', this%hite + write(fates_log(),*) 'cohort%crowndamage = ', this%crowndamage + write(fates_log(),*) 'cohort%coage = ', this%coage + write(fates_log(),*) 'cohort%l2fr = ', this%l2fr + write(fates_log(),*) 'leaf carbon = ', this%prt%GetState(leaf_organ,carbon12_element) + write(fates_log(),*) 'fineroot carbon = ', this%prt%GetState(fnrt_organ,carbon12_element) + write(fates_log(),*) 'sapwood carbon = ', this%prt%GetState(sapw_organ,carbon12_element) + write(fates_log(),*) 'structural (dead) carbon = ', this%prt%GetState(struct_organ,carbon12_element) + write(fates_log(),*) 'storage carbon = ', this%prt%GetState(store_organ,carbon12_element) + write(fates_log(),*) 'reproductive carbon = ', this%prt%GetState(repro_organ,carbon12_element) + write(fates_log(),*) 'cohort%g_sb_laweight = ', this%g_sb_laweight + write(fates_log(),*) 'cohort%leaf_cost = ', this%leaf_cost + write(fates_log(),*) 'cohort%canopy_layer = ', this%canopy_layer + write(fates_log(),*) 'cohort%canopy_layer_yesterday = ', this%canopy_layer_yesterday + write(fates_log(),*) 'cohort%nv = ', this%nv + write(fates_log(),*) 'cohort%status_coh = ', this%status_coh + write(fates_log(),*) 'cohort%canopy_trim = ', this%canopy_trim + write(fates_log(),*) 'cohort%excl_weight = ', this%excl_weight + write(fates_log(),*) 'cohort%prom_weight = ', this%prom_weight + write(fates_log(),*) 'cohort%size_class = ', this%size_class + write(fates_log(),*) 'cohort%size_by_pft_class = ', this%size_by_pft_class + write(fates_log(),*) 'cohort%coage_class = ', this%coage_class + write(fates_log(),*) 'cohort%coage_by_pft_class = ', this%coage_by_pft_class + write(fates_log(),*) 'cohort%gpp_acc_hold = ', this%gpp_acc_hold + write(fates_log(),*) 'cohort%gpp_acc = ', this%gpp_acc + write(fates_log(),*) 'cohort%gpp_tstep = ', this%gpp_tstep + write(fates_log(),*) 'cohort%npp_acc_hold = ', this%npp_acc_hold + write(fates_log(),*) 'cohort%npp_tstep = ', this%npp_tstep + write(fates_log(),*) 'cohort%npp_acc = ', this%npp_acc + write(fates_log(),*) 'cohort%resp_tstep = ', this%resp_tstep + write(fates_log(),*) 'cohort%resp_acc = ', this%resp_acc + write(fates_log(),*) 'cohort%resp_acc_hold = ', this%resp_acc_hold + write(fates_log(),*) 'cohort%rdark = ', this%rdark + write(fates_log(),*) 'cohort%resp_m = ', this%resp_m + write(fates_log(),*) 'cohort%resp_g_tstep = ', this%resp_g_tstep + write(fates_log(),*) 'cohort%livestem_mr = ', this%livestem_mr + write(fates_log(),*) 'cohort%livecroot_mr = ', this%livecroot_mr + write(fates_log(),*) 'cohort%froot_mr = ', this%froot_mr + write(fates_log(),*) 'cohort%dgmort = ', this%dgmort + write(fates_log(),*) 'cohort%treelai = ', this%treelai + write(fates_log(),*) 'cohort%treesai = ', this%treesai + write(fates_log(),*) 'cohort%c_area = ', this%c_area + write(fates_log(),*) 'cohort%cmort = ', this%cmort + write(fates_log(),*) 'cohort%bmort = ', this%bmort + write(fates_log(),*) 'cohort%smort = ', this%smort + write(fates_log(),*) 'cohort%asmort = ', this%asmort + write(fates_log(),*) 'cohort%dgmort = ', this%dgmort + write(fates_log(),*) 'cohort%hmort = ', this%hmort + write(fates_log(),*) 'cohort%frmort = ', this%frmort + write(fates_log(),*) 'cohort%asmort = ', this%asmort + write(fates_log(),*) 'cohort%lmort_direct = ', this%lmort_direct + write(fates_log(),*) 'cohort%lmort_collateral = ', this%lmort_collateral + write(fates_log(),*) 'cohort%lmort_infra = ', this%lmort_infra + write(fates_log(),*) 'cohort%isnew = ', this%isnew + write(fates_log(),*) 'cohort%dndt = ', this%dndt + write(fates_log(),*) 'cohort%dhdt = ', this%dhdt + write(fates_log(),*) 'cohort%ddbhdt = ', this%ddbhdt + write(fates_log(),*) 'cohort%dbdeaddt = ', this%dbdeaddt + write(fates_log(),*) 'cohort%fraction_crown_burned = ', this%fraction_crown_burned + write(fates_log(),*) 'cohort%fire_mort = ', this%fire_mort + write(fates_log(),*) 'cohort%crownfire_mort = ', this%crownfire_mort + write(fates_log(),*) 'cohort%cambial_mort = ', this%cambial_mort + write(fates_log(),*) 'cohort%size_class = ', this%size_class + write(fates_log(),*) 'cohort%size_by_pft_class = ', this%size_by_pft_class if (associated(this%co_hydr)) call this%co_hydr%Dump() From 548467d66040db0a36fd053419d62d8dc2fb79d8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 10 May 2023 14:34:27 -0600 Subject: [PATCH 080/125] add target --- biogeochem/FatesCohortMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index 01d652464a..46775fb6a9 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -813,7 +813,7 @@ subroutine InitPRTBoundaryConditions(this) ! value boundary condition. ! ARGUMENTS: - class(fates_cohort_type), intent(inout) :: this + class(fates_cohort_type), intent(inout), target :: this select case(hlm_parteh_mode) case (prt_carbon_allom_hyp) From 5c72c2fad15cc247bda5cd034da6404f7beb10e5 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 16:06:54 -0700 Subject: [PATCH 081/125] Adding state correction function --- tools/luh2.py | 38 +++++++++++++++++++++++++------------- tools/luh2mod.py | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 22e8d8bab7..67a728dcd5 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -1,8 +1,11 @@ #!/usr/bin/env python3 +# LUH2 python script +# Usage: python luh2.py -l -s + import argparse, os from luh2mod import PrepDataSet, ImportData, SetMaskLUH2, SetMaskSurfData -from luh2mod import RegridConservative +from luh2mod import RegridConservative, CorrectStateSum # Add version checking here in case environment.yml not used def main(): @@ -15,13 +18,14 @@ def main(): # Prep the LUH2 datasets and regrid target ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) + if (args.regridder_file == None): ds_regrid_target = PrepDataSet(args.regridder_target_file,args.begin,args.end) # Import the LUH2 static data to use for masking ds_luh2_static = ImportData(args.luh2_static_file) - # Create new variable where the ice water fraction is inverted + # Create new variable where the ice water fraction is inverted w ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data @@ -32,6 +36,7 @@ def main(): ds_regrid_target = SetMaskSurfData(ds_regrid_target) # Regrid the luh2 data to the target grid + # TO DO: provide a check for the save argument based on the input arguments regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) elif (args.regridder_target_file == None): @@ -44,18 +49,21 @@ def main(): #regrid_land_fraction = regridder_land_fraction(ds_luh2_static) regrid_land_fraction = regridder_luh2(ds_luh2_static) - # # Adjust the luh2 data by the land fraction - # # To Do: check if we need to do this for transition and management data as well + # Adjust the luh2 data by the land fraction regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac - # # Rename the dimensions for the output - # TO DO: double check if this is necessary - regrid_luh2 = regrid_luh2.rename_dims(dims_dict={'lat':'lsmlat','lon':'lsmlon'}) - regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] - regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] + regrid_luh2 = CorrectStateSum(regrid_luh2) - # # Add 'YEAR' as a variable. This is an old requirement of the HLM and should simply be a copy of the `time` dimension + # Add additional required variables for the host land model + # Add 'YEAR' as a variable. + # This is an old requirement of the HLM and should simply be a copy of the `time` dimension regrid_luh2["YEAR"] = regrid_luh2.time + regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary + regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary + + + # Rename the dimensions for the output + regrid_luh2 = regrid_luh2.rename_dims({'lat':'lsmlat','lon':'lsmlon'}) # Merge existing regrided luh2 file with merge input target # TO DO: check that the grid resolution and time bounds match @@ -85,15 +93,19 @@ def CommandLineArgs(): # TO DO: using the checking function to report back if invalid file input parser.add_argument("-l","--luh2_file", required=True) - # Required static luh2 data to get the ice/water fraction - parser.add_argument("-s", "--luh2_static_file", required=True) - # Provide mutually exlusive arguments for regridding input selection # Currently assuming that if a target is provided that a regridder file will be saved regrid_target = parser.add_mutually_exclusive_group(required=True) regrid_target.add_argument("-rf","--regridder_file") # use previously save regridder file regrid_target.add_argument("-rt","--regridder_target_file") # use a dataset to regrid to + # TO DO: static file is required if regridder file argument is not used + # Required static luh2 data to get the ice/water fraction + parser.add_argument("-s", "--luh2_static_file") + + # Optional argument for defining the regridder file name + parser.add_argument("-rs", "--regridder_save_name") + # Optional input to subset the time range of the data parser.add_argument("-b","--begin") parser.add_argument("-e","--end") diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 63b52f1331..61304bba8e 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -32,9 +32,6 @@ def PrepDataSet(input_file,start=None,stop=None): # Correct the necessary variables for both datasets input_dataset = PrepDataSet_ESMF(input_dataset) - # Set dataset masks - # SetMask(input_dataset) - return(input_dataset) # Updating datasets to work with xESMF @@ -61,8 +58,6 @@ def ImportData(input_file): # to the LUH2 time units being undecodable by cftime module try: datasetout = xr.open_dataset(input_file) - print("Input file dataset opened: {}".format(input_file)) - return(datasetout) except ValueError as err: print("ValueError:", err) errmsg = "User direction: If error is due to units being 'years since ...' " \ @@ -70,7 +65,9 @@ def ImportData(input_file): "This can be done using the luh2.attribupdate function\n." print() print(errmsg) - + else: + print("Input file dataset opened: {}".format(input_file)) + return(datasetout) # Modify the luh2 metadata to enable xarray to read in data # This issue here is that the luh2 time units start prior to @@ -119,14 +116,14 @@ def AttribUpdateLUH2(input_file,output_append="modified"): # of 89.875). def BoundsVariableFixLUH2(input_dataset): - # Drop the old boundary names to avoid confusion - # outputdataset = input_dataset.drop(labels=['lat_bounds','lon_bounds']) - # Create lat and lon bounds as a single dimension array out of the LUH2 two dimensional_bounds array. # Future todo: is it possible to have xESMF recognize and use the original 2D array? input_dataset["lat_b"] = np.insert(input_dataset.lat_bounds[:,1].data,0,input_dataset.lat_bounds[0,0].data) input_dataset["lon_b"] = np.insert(input_dataset.lon_bounds[:,1].data,0,input_dataset.lon_bounds[0,0].data) + # Drop the old boundary names to avoid confusion + input_dataset = input_dataset.drop(labels=['lat_bounds','lon_bounds']) + print("LUH2 dataset lat/lon boundary variables formatted and added as new variable for xESMF") return(input_dataset) @@ -254,6 +251,28 @@ def GenerateRegridder(ds_to_regrid, ds_regrid_target,save=False): return(regridder) +# Temporary: Add minor correction factor to assure states sum to one +def CorrectStateSum(input_dataset): + + # Do this only for the state data set + if (not(any('irrig' in var for var in input_dataset) or + any('_to_' in var for var in input_dataset))): + + # Drop the secma and secmb variables temporarily + temp_dataset = input_dataset.drop({'secma','secmb'}) + + # Sum the remaining state variables and normalize + state_sum = temp_dataset.to_array().sum(dim='variable') + state_sum = state_sum.where(state_sum != 0) + temp_dataset = temp_dataset / state_sum + + # Update dataset with new scaled values + input_dataset.update(temp_dataset) + + # Save the correction value + input_dataset["stscf"] = 1.0 / state_sum + + return(input_dataset) # General functionality needed # - collect data for specific user-defined time period From 0b86cd217bb508f5bdb17df6d4e18e12e3a903eb Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 21:24:37 -0700 Subject: [PATCH 082/125] Add handling of regridder argument option --- tools/luh2.py | 17 ++++++++++++++--- tools/luh2mod.py | 15 ++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 67a728dcd5..c2ba10fc03 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -15,6 +15,7 @@ def main(): # Allow variable input files (state and/or transitions and/or management) args = CommandLineArgs() + # Prep the LUH2 datasets and regrid target ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) @@ -35,9 +36,18 @@ def main(): # Mask the regrid target ds_regrid_target = SetMaskSurfData(ds_regrid_target) + # Handle regridder file save name + # TO DO: add check to handle if the user enters the full path + # TO DO: check if its possible to enter nothing with the argument + if (args.regridder_save_name == None): + regridder_save_file = None + print("Warning: Regridder will not be saved to file") + else: + output_filename = regridder_save_name + # Regrid the luh2 data to the target grid # TO DO: provide a check for the save argument based on the input arguments - regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, save=True) + regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, regridder_save_file) elif (args.regridder_target_file == None): regridder_luh2 = ImportData(args.regridder_file) @@ -52,6 +62,7 @@ def main(): # Adjust the luh2 data by the land fraction regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac + # Correct the state sum (will be returned as if in not state values) regrid_luh2 = CorrectStateSum(regrid_luh2) # Add additional required variables for the host land model @@ -71,8 +82,8 @@ def main(): ds_luh2_merge = ImportData(args.luh2_merge_file) regrid_luh2 = regrid_luhs.merge(ds_luh2_merge) - # # Write the files - # # TO DO: add check to handle if the user enters the full path + # Write the files + # TO DO: add check to handle if the user enters the full path if (args.output == None): output_filename = 'LUH2_timeseries.nc' else: diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 61304bba8e..bbd47b0f39 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -193,10 +193,10 @@ def CheckDataSet(input_dataset): return(dsflag,dstype) -def RegridConservative(ds_to_regrid,ds_regrid_target,save=False): +def RegridConservative(ds_to_regrid,ds_regrid_target,regridder_save_file): # define the regridder transformation - regridder = GenerateRegridder(ds_to_regrid, ds_regrid_target, save) + regridder = GenerateRegridder(ds_to_regrid, ds_regrid_target, regridder_save_file) # Loop through the variables to regrid ds_regrid = RegridLoop(ds_to_regrid, regridder) @@ -238,15 +238,16 @@ def RegridLoop(ds_to_regrid, regridder): return(ds_regrid) -def GenerateRegridder(ds_to_regrid, ds_regrid_target,save=False): +def GenerateRegridder(ds_to_regrid, ds_regrid_target,regridder_save_file): - print("\nDefining regridder") - regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, "conservative") + regrid_method = "conservative" + print("\nDefining regridder, method: ", regrid_method) + regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, regrid_method) # If save flag is set, write regridder to a file # TO DO: define a more useful name based on inputs - if(save): - filename = regridder.to_netcdf("regridder.nc") + if(not(isinstance(regridder_save_file,type(None)))): + filename = regridder.to_netcdf(regridder_save_file) print("regridder saved to file: ", filename) return(regridder) From 430bd037b50d315881b07fb203aa003cb2f89b08 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 21:35:25 -0700 Subject: [PATCH 083/125] switch the importdata and prepdataset functions --- tools/luh2.py | 5 ++--- tools/luh2mod.py | 58 +++++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index c2ba10fc03..b3a183514e 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -17,11 +17,11 @@ def main(): # Prep the LUH2 datasets and regrid target - ds_luh2 = PrepDataSet(args.luh2_file,args.begin,args.end) + ds_luh2 = ImportData(args.luh2_file,args.begin,args.end) if (args.regridder_file == None): - ds_regrid_target = PrepDataSet(args.regridder_target_file,args.begin,args.end) + ds_regrid_target = ImportData(args.regridder_target_file,args.begin,args.end) # Import the LUH2 static data to use for masking ds_luh2_static = ImportData(args.luh2_static_file) @@ -52,7 +52,6 @@ def main(): elif (args.regridder_target_file == None): regridder_luh2 = ImportData(args.regridder_file) # TO DO: check that the time bounds match the argument bounds - # TO DO: create bypass option to regridder function # # Regrid the inverted ice/water fraction data to the target grid #regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index bbd47b0f39..8d9b210ae8 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -7,17 +7,37 @@ from nco import Nco from nco.custom import Atted -# Prepare the input_file to be used for regridding -def PrepDataSet(input_file,start=None,stop=None): +# Import luh2 or surface data sets +def ImportData(input_file,start=None,stop=None): + + # Open files + # Check to see if a ValueError is raised which is likely due + # to the LUH2 time units being undecodable by cftime module + try: + datasetout = xr.open_dataset(input_file) + except ValueError as err: + print("ValueError:", err) + errmsg = "User direction: If error is due to units being 'years since ...' " \ + "update the input data file to change to 'common_years since...'. " \ + "This can be done using the luh2.attribupdate function\n." + print() + print(errmsg) + else: + print("Input file dataset opened: {}".format(input_file)) + + datasetout = PrepDataset(datasetout,start,stop) + + return(datasetout) - # Import the data - input_dataset = ImportData(input_file) + +# Prepare the input_file to be used for regridding +def PrepDataset(input_dataset,start=None,stop=None): # Use the maximum span if start and stop are not present - if (start == None): + if (isinstance(start,type(None))): start = input_dataset.time[0] - if (stop == None): + if (isinstance(stop,type(None))): stop = input_dataset.time[-1] # Truncate the data to the user defined range @@ -30,44 +50,26 @@ def PrepDataSet(input_file,start=None,stop=None): print("Input must be a string\n") # Correct the necessary variables for both datasets - input_dataset = PrepDataSet_ESMF(input_dataset) + input_dataset = PrepDataset_ESMF(input_dataset) return(input_dataset) # Updating datasets to work with xESMF -def PrepDataSet_ESMF(input_dataset): +def PrepDataset_ESMF(input_dataset): # Check the dataset type dsflag, dstype = CheckDataSet(input_dataset) if (dsflag): if(dstype == "LUH2"): - print("PrepDataSet: LUH2") + print("PrepDataset: LUH2") input_dataset = BoundsVariableFixLUH2(input_dataset) elif(dstype == "Surface"): - print("PrepDataSet: SurfData") + print("PrepDataset: SurfData") input_dataset = DimensionFixSurfData(input_dataset) print("data set updated for xESMF\n") return(input_dataset) -# Import luh2 or surface data sets -def ImportData(input_file): - - # Open files - # Check to see if a ValueError is raised which is likely due - # to the LUH2 time units being undecodable by cftime module - try: - datasetout = xr.open_dataset(input_file) - except ValueError as err: - print("ValueError:", err) - errmsg = "User direction: If error is due to units being 'years since ...' " \ - "update the input data file to change to 'common_years since...'. " \ - "This can be done using the luh2.attribupdate function\n." - print() - print(errmsg) - else: - print("Input file dataset opened: {}".format(input_file)) - return(datasetout) # Modify the luh2 metadata to enable xarray to read in data # This issue here is that the luh2 time units start prior to From 3a31c2a1aef8d2c0c73a45789b5705295bf551a6 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 21:57:55 -0700 Subject: [PATCH 084/125] Correct some issues --- tools/luh2.py | 7 +++---- tools/luh2mod.py | 7 +++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index b3a183514e..9037caabed 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -4,7 +4,7 @@ # Usage: python luh2.py -l -s import argparse, os -from luh2mod import PrepDataSet, ImportData, SetMaskLUH2, SetMaskSurfData +from luh2mod import ImportData, SetMaskLUH2, SetMaskSurfData from luh2mod import RegridConservative, CorrectStateSum # Add version checking here in case environment.yml not used @@ -71,15 +71,14 @@ def main(): regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary - # Rename the dimensions for the output regrid_luh2 = regrid_luh2.rename_dims({'lat':'lsmlat','lon':'lsmlon'}) # Merge existing regrided luh2 file with merge input target # TO DO: check that the grid resolution and time bounds match - if (args.luh2_merge_file != None): + if (not(isinstance(args.luh2_merge_file,type(None)))): ds_luh2_merge = ImportData(args.luh2_merge_file) - regrid_luh2 = regrid_luhs.merge(ds_luh2_merge) + regrid_luh2 = regrid_luh2.merge(ds_luh2_merge) # Write the files # TO DO: add check to handle if the user enters the full path diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 8d9b210ae8..98b44d17fe 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -257,7 +257,7 @@ def GenerateRegridder(ds_to_regrid, ds_regrid_target,regridder_save_file): # Temporary: Add minor correction factor to assure states sum to one def CorrectStateSum(input_dataset): - # Do this only for the state data set + # Only calculate the state sum to unity correction for the appropiate dataset if (not(any('irrig' in var for var in input_dataset) or any('_to_' in var for var in input_dataset))): @@ -275,7 +275,10 @@ def CorrectStateSum(input_dataset): # Save the correction value input_dataset["stscf"] = 1.0 / state_sum - return(input_dataset) + # If this is the transitions data apply the state correction to the transitions + # elif (any('_to_' in var for var in input_dataset)): + + return(input_dataset) # General functionality needed # - collect data for specific user-defined time period From 9af66f0d965adf53c1bb069d7c0646bad83493cc Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 22:09:16 -0700 Subject: [PATCH 085/125] adding type checks --- tools/luh2mod.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 98b44d17fe..a19734fb77 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -45,9 +45,11 @@ def PrepDataset(input_dataset,start=None,stop=None): # the start/stop is out of range try: input_dataset = input_dataset.sel(time=slice(start,stop)) - except TypeError as err: - print("TypeError:", err) + except TypeError as type_err: print("Input must be a string\n") + raise TypeError(type_err) + except AttributeError: + pass # likely due to input_dataset not having time for surface dataset # Correct the necessary variables for both datasets input_dataset = PrepDataset_ESMF(input_dataset) From 23dabb778bc830caee35cded8f559477a3fcf6ff Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 22:22:16 -0700 Subject: [PATCH 086/125] adding check against the time variable for the input dataset --- tools/luh2mod.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index a19734fb77..f5abe77ef8 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -34,11 +34,13 @@ def ImportData(input_file,start=None,stop=None): def PrepDataset(input_dataset,start=None,stop=None): # Use the maximum span if start and stop are not present - if (isinstance(start,type(None))): - start = input_dataset.time[0] + dsflag, dstype = CheckDataset(input_dataset) + if(dstype != "static"): + if (isinstance(start,type(None))): + start = input_dataset.time[0] - if (isinstance(stop,type(None))): - stop = input_dataset.time[-1] + if (isinstance(stop,type(None))): + stop = input_dataset.time[-1] # Truncate the data to the user defined range # This might need some more error handling for when @@ -48,8 +50,6 @@ def PrepDataset(input_dataset,start=None,stop=None): except TypeError as type_err: print("Input must be a string\n") raise TypeError(type_err) - except AttributeError: - pass # likely due to input_dataset not having time for surface dataset # Correct the necessary variables for both datasets input_dataset = PrepDataset_ESMF(input_dataset) @@ -60,7 +60,7 @@ def PrepDataset(input_dataset,start=None,stop=None): def PrepDataset_ESMF(input_dataset): # Check the dataset type - dsflag, dstype = CheckDataSet(input_dataset) + dsflag, dstype = CheckDataset(input_dataset) if (dsflag): if(dstype == "LUH2"): print("PrepDataset: LUH2") @@ -154,7 +154,7 @@ def DimensionFixSurfData(input_dataset): # # check what sort of inputdata is being provided; surface dataset or luh2 # # LUH2 data will need to be masked based on the variable input to mask -# dsflag,dstype = CheckDataSet(input_dataset) +# dsflag,dstype = CheckDataset(input_dataset) # if (dsflag): # if(dstype == "LUH2"): # SetMaskLUH2(input_dataset) # temporary @@ -180,17 +180,21 @@ def SetMaskSurfData(input_dataset): return(input_dataset) # Check which dataset we're working with -def CheckDataSet(input_dataset): +def CheckDataset(input_dataset): dsflag = False - if('primf' in list(input_dataset.variables)): + dsvars = list(input_dataset.variables) + if('primf' in dsvars): dstype = 'LUH2' dsflag = True print("LUH2") - elif('natpft' in list(input_dataset.variables)): + elif('natpft' in dsvars): dstype = 'Surface' dsflag = True print("Surface") + elif('icwtr' in dsvars): + dstype = 'static' + dsflag = True else: dstype = 'Unknown' print("Unrecognize data set") From 61306a09396ccdd6c2f73af56e5dd4310da42d27 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 22:25:44 -0700 Subject: [PATCH 087/125] fix import function --- tools/luh2mod.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/tools/luh2mod.py b/tools/luh2mod.py index f5abe77ef8..780a28a496 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -42,25 +42,23 @@ def PrepDataset(input_dataset,start=None,stop=None): if (isinstance(stop,type(None))): stop = input_dataset.time[-1] - # Truncate the data to the user defined range - # This might need some more error handling for when - # the start/stop is out of range - try: - input_dataset = input_dataset.sel(time=slice(start,stop)) - except TypeError as type_err: - print("Input must be a string\n") - raise TypeError(type_err) - - # Correct the necessary variables for both datasets - input_dataset = PrepDataset_ESMF(input_dataset) + # Truncate the data to the user defined range + # This might need some more error handling for when + # the start/stop is out of range + try: + input_dataset = input_dataset.sel(time=slice(start,stop)) + except TypeError as type_err: + print("Input must be a string\n") + raise TypeError(type_err) + + # Correct the necessary variables for both datasets + input_dataset = PrepDataset_ESMF(input_dataset,dsflag,dstype) return(input_dataset) # Updating datasets to work with xESMF -def PrepDataset_ESMF(input_dataset): +def PrepDataset_ESMF(input_dataset,dsflag,dstype): - # Check the dataset type - dsflag, dstype = CheckDataset(input_dataset) if (dsflag): if(dstype == "LUH2"): print("PrepDataset: LUH2") From 4e830a85d0f8fca20e990a90f1b9c25509f00a6f Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 22:29:36 -0700 Subject: [PATCH 088/125] fix argument call --- tools/luh2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/luh2.py b/tools/luh2.py index 9037caabed..4565870ea1 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -43,7 +43,7 @@ def main(): regridder_save_file = None print("Warning: Regridder will not be saved to file") else: - output_filename = regridder_save_name + output_filename = args.regridder_save_name # Regrid the luh2 data to the target grid # TO DO: provide a check for the save argument based on the input arguments From e4b43ac1922a53f4a777894969af67e4b7b36db0 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 12 May 2023 22:58:44 -0700 Subject: [PATCH 089/125] update check function outputs --- tools/luh2.py | 5 +++-- tools/luh2mod.py | 9 +++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 4565870ea1..53c65bf875 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -5,7 +5,7 @@ import argparse, os from luh2mod import ImportData, SetMaskLUH2, SetMaskSurfData -from luh2mod import RegridConservative, CorrectStateSum +from luh2mod import RegridConservative, RegridLoop, CorrectStateSum # Add version checking here in case environment.yml not used def main(): @@ -43,7 +43,7 @@ def main(): regridder_save_file = None print("Warning: Regridder will not be saved to file") else: - output_filename = args.regridder_save_name + regridder_save_file = args.regridder_save_name # Regrid the luh2 data to the target grid # TO DO: provide a check for the save argument based on the input arguments @@ -51,6 +51,7 @@ def main(): elif (args.regridder_target_file == None): regridder_luh2 = ImportData(args.regridder_file) + regrid_luh2 = RegridLoop(ds_luh2,regridder_luh2) # TO DO: check that the time bounds match the argument bounds # # Regrid the inverted ice/water fraction data to the target grid diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 780a28a496..aab8aba228 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -35,7 +35,8 @@ def PrepDataset(input_dataset,start=None,stop=None): # Use the maximum span if start and stop are not present dsflag, dstype = CheckDataset(input_dataset) - if(dstype != "static"): + + if(not(dstype in ('static','regrid'))): if (isinstance(start,type(None))): start = input_dataset.time[0] @@ -182,7 +183,7 @@ def CheckDataset(input_dataset): dsflag = False dsvars = list(input_dataset.variables) - if('primf' in dsvars): + if('primf' in dsvars or 'primf_to_secdn' in dsvars or 'irrig' in dsvars): dstype = 'LUH2' dsflag = True print("LUH2") @@ -193,6 +194,9 @@ def CheckDataset(input_dataset): elif('icwtr' in dsvars): dstype = 'static' dsflag = True + elif('col' in dsvars): + dstype = 'regrid' + dsflag = True else: dstype = 'Unknown' print("Unrecognize data set") @@ -262,6 +266,7 @@ def GenerateRegridder(ds_to_regrid, ds_regrid_target,regridder_save_file): def CorrectStateSum(input_dataset): # Only calculate the state sum to unity correction for the appropiate dataset + # TO DO: Update this to use the check function if (not(any('irrig' in var for var in input_dataset) or any('_to_' in var for var in input_dataset))): From 5916d15bbc25e610a0ba7a1253cb5a1cc2179e14 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 15 May 2023 10:30:04 -0600 Subject: [PATCH 090/125] get rid of temporary cohort allocation --- biogeochem/EDCohortDynamicsMod.F90 | 36 +- biogeochem/EDPhysiologyMod.F90 | 560 +++++++++++++---------------- biogeochem/FatesCohortMod.F90 | 5 +- main/EDInitMod.F90 | 426 ++++++++++------------ 4 files changed, 474 insertions(+), 553 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index cad2a5ee26..069b0147c9 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -191,7 +191,7 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! !LOCAL VARIABLES: -type(fates_cohort_type), pointer :: new_cohort ! Pointer to New Cohort structure. +type(fates_cohort_type), pointer :: newCohort ! Pointer to New Cohort structure. type(fates_cohort_type), pointer :: storesmallcohort type(fates_cohort_type), pointer :: storebigcohort real(r8) :: rmean_temp ! running mean temperature @@ -201,8 +201,8 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & !---------------------------------------------------------------------- ! create new cohort -allocate(new_cohort) -call new_cohort%Create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & +allocate(newCohort) +call newCohort%Create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & clayer, crowndamage, spread, patchptr%canopy_layer_tlai) ! Put cohort at the right place in the linked list @@ -213,53 +213,53 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & tnull = 0 else tnull = 1 - patchptr%tallest => new_cohort + patchptr%tallest => newCohort endif if (associated(patchptr%shortest)) then snull = 0 else snull = 1 - patchptr%shortest => new_cohort + patchptr%shortest => newCohort endif ! Allocate running mean functions ! (Keeping as an example) -!! allocate(new_cohort%tveg_lpa) -!! call new_cohort%tveg_lpa%InitRMean(ema_lpa,init_value=patchptr%tveg_lpa%GetMean()) +!! allocate(newCohort%tveg_lpa) +!! call newCohort%tveg_lpa%InitRMean(ema_lpa,init_value=patchptr%tveg_lpa%GetMean()) if( hlm_use_planthydro.eq.itrue ) then nlevrhiz = currentSite%si_hydr%nlevrhiz ! This allocates array spaces - call InitHydrCohort(currentSite,new_cohort) + call InitHydrCohort(currentSite, newCohort) ! zero out the water balance error - new_cohort%co_hydr%errh2o = 0._r8 + newCohort%co_hydr%errh2o = 0._r8 ! This calculates node heights - call UpdatePlantHydrNodes(new_cohort,new_cohort%pft, & - new_cohort%hite,currentSite%si_hydr) + call UpdatePlantHydrNodes(newCohort, newCohort%pft, & + newCohort%hite,currentSite%si_hydr) ! This calculates volumes and lengths - call UpdatePlantHydrLenVol(new_cohort,currentSite%si_hydr) + call UpdatePlantHydrLenVol(newCohort,currentSite%si_hydr) ! This updates the Kmax's of the plant's compartments - call UpdatePlantKmax(new_cohort%co_hydr,new_cohort,currentSite%si_hydr) + call UpdatePlantKmax(newCohort%co_hydr,newCohort,currentSite%si_hydr) ! Since this is a newly initialized plant, we set the previous compartment-size ! equal to the ones we just calculated. - call SavePreviousCompartmentVolumes(new_cohort%co_hydr) + call SavePreviousCompartmentVolumes(newCohort%co_hydr) ! This comes up with starter suctions and then water contents ! based on the soil values - call InitPlantHydStates(currentSite,new_cohort) + call InitPlantHydStates(currentSite,newCohort) if(recruitstatus==1)then - new_cohort%co_hydr%is_newly_recruited = .true. + newCohort%co_hydr%is_newly_recruited = .true. ! If plant hydraulics is active, we must constrain the ! number density of the new recruits based on the moisture @@ -267,14 +267,14 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! So we go through the process of pre-initializing the hydraulic ! states in the temporary cohort, to calculate this new number density rmean_temp = patchptr%tveg24%GetMean() - call ConstrainRecruitNumber(currentSite, new_cohort, patchptr, & + call ConstrainRecruitNumber(currentSite, newCohort, patchptr, & bc_in, rmean_temp) endif endif -call insert_cohort(patchptr, new_cohort, patchptr%tallest, patchptr%shortest, tnull, snull, & +call insert_cohort(patchptr, newCohort, patchptr%tallest, patchptr%shortest, tnull, snull, & storebigcohort, storesmallcohort) patchptr%tallest => storebigcohort diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index b0961d2e81..25d6a35ae9 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -21,6 +21,7 @@ module EDPhysiologyMod use FatesInterfaceTypesMod, only : hlm_nitrogen_spec use FatesInterfaceTypesMod, only : hlm_phosphorus_spec use FatesInterfaceTypesMod, only : hlm_use_tree_damage + use FatesInterfaceTypesMod, only : hlm_use_ed_prescribed_phys use FatesConstantsMod, only : r8 => fates_r8 use FatesConstantsMod, only : nearzero use FatesConstantsMod, only : nocomp_bareground @@ -1970,334 +1971,283 @@ end subroutine SeedGermination ! ===================================================================================== - - - - ! ===================================================================================== - subroutine recruitment( currentSite, currentPatch, bc_in ) ! ! !DESCRIPTION: ! spawn new cohorts of juveniles of each PFT ! - ! !USES: - use FatesInterfaceTypesMod, only : hlm_use_ed_prescribed_phys - use FatesLitterMod , only : ncwd - ! ! !ARGUMENTS - type(ed_site_type), intent(inout) :: currentSite - type(fates_patch_type), intent(inout),pointer :: currentPatch - type(bc_in_type), intent(in) :: bc_in - ! + type(ed_site_type), intent(inout) :: currentSite + type(fates_patch_type), intent(inout), pointer :: currentPatch + type(bc_in_type), intent(in) :: bc_in + ! !LOCAL VARIABLES: - class(prt_vartypes), pointer :: prt - integer :: ft - integer :: c - type (fates_cohort_type) , pointer :: temp_cohort - type (litter_type), pointer :: litt ! The litter object (carbon right now) - type(site_massbal_type), pointer :: site_mass ! For accounting total in-out mass fluxes - integer :: cohortstatus - integer :: el ! loop counter for element - integer :: element_id ! element index consistent with definitions in PRTGenericMod - integer :: iage ! age loop counter for leaf age bins - integer :: crowndamage - integer,parameter :: recruitstatus = 1 !weather it the new created cohorts is recruited or initialized - real(r8) :: c_leaf ! target leaf biomass [kgC] - real(r8) :: c_fnrt ! target fine root biomass [kgC] - real(r8) :: c_sapw ! target sapwood biomass [kgC] - real(r8) :: a_sapw ! target sapwood cross section are [m2] (dummy) - real(r8) :: c_agw ! target Above ground biomass [kgC] - real(r8) :: c_bgw ! target Below ground biomass [kgC] - real(r8) :: c_struct ! target Structural biomass [kgc] - real(r8) :: c_store ! target Storage biomass [kgC] - real(r8) :: m_leaf ! leaf mass (element agnostic) [kg] - real(r8) :: m_fnrt ! fine-root mass (element agnostic) [kg] - real(r8) :: m_sapw ! sapwood mass (element agnostic) [kg] - real(r8) :: m_agw ! AG wood mass (element agnostic) [kg] - real(r8) :: m_bgw ! BG wood mass (element agnostic) [kg] - real(r8) :: m_struct ! structural mass (element agnostic) [kg] - real(r8) :: m_store ! storage mass (element agnostic) [kg] - real(r8) :: m_repro ! reproductive mass (element agnostic) [kg] - real(r8) :: mass_avail ! The mass of each nutrient/carbon available in the seed_germination pool [kg] - real(r8) :: mass_demand ! Total mass demanded by the plant to achieve the stoichiometric targets - ! of all the organs in the recruits. Used for both [kg per plant] and [kg per cohort] - real(r8) :: stem_drop_fraction - - !---------------------------------------------------------------------- - - allocate(temp_cohort) ! create temporary cohort - call temp_cohort%ZeroValues() - - - do ft = 1,numpft - - ! The following if block is for the prescribed biogeography and/or nocomp modes. - ! Since currentSite%use_this_pft is a site-level quantity and thus only limits whether a given PFT - ! is permitted on a given gridcell or not, it applies to the prescribed biogeography case only. - ! If nocomp is enabled, then we must determine whether a given PFT is allowed on a given patch or not. - - if(currentSite%use_this_pft(ft).eq.itrue & - .and. ((hlm_use_nocomp .eq. ifalse) .or. (ft .eq. currentPatch%nocomp_pft_label)))then - - temp_cohort%canopy_trim = init_recruit_trim - temp_cohort%pft = ft - temp_cohort%hite = EDPftvarcon_inst%hgt_min(ft) - temp_cohort%coage = 0.0_r8 - stem_drop_fraction = EDPftvarcon_inst%phen_stem_drop_fraction(ft) - temp_cohort%l2fr = currentSite%rec_l2fr(ft,currentPatch%NCL_p) - temp_cohort%crowndamage = 1 ! new recruits are undamaged - - call h2d_allom(temp_cohort%hite,ft,temp_cohort%dbh) - - - ! Initialize live pools - call bleaf(temp_cohort%dbh,ft,temp_cohort%crowndamage,& - temp_cohort%canopy_trim,c_leaf) - call bfineroot(temp_cohort%dbh,ft,temp_cohort%canopy_trim,temp_cohort%l2fr,c_fnrt) - call bsap_allom(temp_cohort%dbh,ft,temp_cohort%crowndamage, & - temp_cohort%canopy_trim,a_sapw, c_sapw) - call bagw_allom(temp_cohort%dbh,ft,temp_cohort%crowndamage, c_agw) - call bbgw_allom(temp_cohort%dbh,ft,c_bgw) - call bdead_allom(c_agw,c_bgw,c_sapw,ft,c_struct) - call bstore_allom(temp_cohort%dbh,ft, temp_cohort%crowndamage, & - temp_cohort%canopy_trim,c_store) - - ! Default assumption is that leaves are on - cohortstatus = leaves_on - - ! But if the plant is seasonally (cold) deciduous, and the site status is flagged - ! as "cold", then set the cohort's status to leaves_off, and remember the leaf biomass - if ((prt_params%season_decid(ft) == itrue) .and. & - (any(currentSite%cstatus == [phen_cstat_nevercold,phen_cstat_iscold]))) then - c_leaf = 0.0_r8 - - ! If plant is not woody then set sapwood and structural biomass as well - if (prt_params%woody(ft).ne.itrue) then - c_sapw = (1.0_r8 - stem_drop_fraction) * c_sapw - c_struct = (1.0_r8 - stem_drop_fraction) * c_struct - endif - cohortstatus = leaves_off + class(prt_vartypes), pointer :: prt ! PARTEH object + type(litter_type), pointer :: litt ! litter object (carbon right now) + type(site_massbal_type), pointer :: site_mass ! for accounting total in-out mass fluxes + integer :: ft ! loop counter for PFTs + integer :: leaf_status ! cohort phenology status [leaves on/off] + integer :: el ! loop counter for element + integer :: element_id ! element index consistent with definitions in PRTGenericMod + integer :: iage ! age loop counter for leaf age bins + integer :: crowndamage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] + real(r8) :: hite ! new cohort height [m] + real(r8) :: dbh ! new cohort DBH [cm] + real(r8) :: cohort_n ! new cohort density + real(r8) :: l2fr ! leaf to fineroot biomass ratio [0-1] + real(r8) :: c_leaf ! target leaf biomass [kgC] + real(r8) :: c_fnrt ! target fine root biomass [kgC] + real(r8) :: c_sapw ! target sapwood biomass [kgC] + real(r8) :: a_sapw ! target sapwood cross section are [m2] (dummy) + real(r8) :: c_agw ! target Above ground biomass [kgC] + real(r8) :: c_bgw ! target Below ground biomass [kgC] + real(r8) :: c_struct ! target Structural biomass [kgc] + real(r8) :: c_store ! target Storage biomass [kgC] + real(r8) :: m_leaf ! leaf mass (element agnostic) [kg] + real(r8) :: m_fnrt ! fine-root mass (element agnostic) [kg] + real(r8) :: m_sapw ! sapwood mass (element agnostic) [kg] + real(r8) :: m_agw ! AG wood mass (element agnostic) [kg] + real(r8) :: m_bgw ! BG wood mass (element agnostic) [kg] + real(r8) :: m_struct ! structural mass (element agnostic) [kg] + real(r8) :: m_store ! storage mass (element agnostic) [kg] + real(r8) :: m_repro ! reproductive mass (element agnostic) [kg] + real(r8) :: mass_avail ! mass of each nutrient/carbon available in the seed_germination pool [kg] + real(r8) :: mass_demand ! total mass demanded by the plant to achieve the stoichiometric targets + real(r8) :: stem_drop_fraction ! of all the organs in the recruits. Used for both [kg per plant] and [kg per cohort] + integer, parameter :: recruitstatus = 1 ! whether the newly created cohorts are recruited or initialized + + !--------------------------------------------------------------------------- + + do ft = 1, numpft + + ! The following if block is for the prescribed biogeography and/or nocomp modes. + ! Since currentSite%use_this_pft is a site-level quantity and thus only limits whether a given PFT + ! is permitted on a given gridcell or not, it applies to the prescribed biogeography case only. + ! If nocomp is enabled, then we must determine whether a given PFT is allowed on a given patch or not. + + if (currentSite%use_this_pft(ft) .eq. itrue .and. & + ((hlm_use_nocomp .eq. ifalse) .or. (ft .eq. currentPatch%nocomp_pft_label))) then + + hite = EDPftvarcon_inst%hgt_min(ft) + stem_drop_fraction = EDPftvarcon_inst%phen_stem_drop_fraction(ft) + l2fr = currentSite%rec_l2fr(ft, currentPatch%NCL_p) + crowndamage = 1 ! new recruits are undamaged + + ! calculate DBH from initial height + call h2d_allom(hite, ft, dbh) + + ! calculate live pools + call bleaf(dbh, ft, crowndamage, init_recruit_trim, c_leaf) + call bfineroot(dbh, ft, init_recruit_trim, l2fr, c_fnrt) + call bsap_allom(dbh, ft, crowndamage, init_recruit_trim, a_sapw, c_sapw) + call bagw_allom(dbh, ft, crowndamage, c_agw) + call bbgw_allom(dbh, ft, c_bgw) + call bdead_allom(c_agw, c_bgw, c_sapw, ft, c_struct) + call bstore_allom(dbh, ft, crowndamage, init_recruit_trim, c_store) + + ! default assumption is that leaves are on + leaf_status = leaves_on + + ! if the plant is seasonally (cold) deciduous, and the site status is flagged + ! as "cold", then set the cohort's status to leaves_off, and remember the leaf biomass + if ((prt_params%season_decid(ft) == itrue) .and. & + (any(currentSite%cstatus == [phen_cstat_nevercold, phen_cstat_iscold]))) then + leaf_status = leaves_off + c_leaf = 0.0_r8 + + ! if plant is not woody then set sapwood and structural biomass to 0.0 as well + if (prt_params%woody(ft) .ne. itrue) then + c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw + c_struct = (1.0_r8 - stem_drop_fraction)*c_struct endif - - ! Or.. if the plant is drought deciduous, and the site status is flagged as - ! "in a drought", then likewise, set the cohort's status to leaves_off, and remember leaf - ! biomass - if ((prt_params%stress_decid(ft) == itrue) .and. & - (any(currentSite%dstatus == [phen_dstat_timeoff,phen_dstat_moistoff]))) then - c_leaf = 0.0_r8 - - ! If plant is not woody then set sapwood and structural biomass as well - if(prt_params%woody(ft).ne.itrue)then - c_sapw = (1.0_r8 - stem_drop_fraction) * c_sapw - c_struct = (1.0_r8 - stem_drop_fraction) * c_struct - endif - cohortstatus = leaves_off - endif - - - ! Cycle through available carbon and nutrients, find the limiting element - ! to dictate the total number of plants that can be generated - - if ( (hlm_use_ed_prescribed_phys .eq. ifalse) .or. & - (EDPftvarcon_inst%prescribed_recruitment(ft) .lt. 0._r8) ) then - - temp_cohort%n = 1.e20_r8 - - do el = 1,num_elements - - element_id = element_list(el) - select case(element_id) - case(carbon12_element) - - mass_demand = c_struct+c_leaf+c_fnrt+c_sapw+c_store - - case(nitrogen_element) - - mass_demand = & - c_struct*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(struct_organ)) + & - c_leaf*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)) + & - c_fnrt*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)) + & - c_sapw*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)) + & - StorageNutrientTarget(ft, element_id, & - c_leaf*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)), & - c_fnrt*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)), & - c_sapw*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)), & - c_struct*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(struct_organ))) - - case(phosphorus_element) - - mass_demand = & - c_struct*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(struct_organ)) + & - c_leaf*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)) + & - c_fnrt*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)) + & - c_sapw*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)) + & - StorageNutrientTarget(ft, element_id, & - c_leaf*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)), & - c_fnrt*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)), & - c_sapw*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)), & - c_struct*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(struct_organ))) - - case default - write(fates_log(),*) 'Undefined element type in recruitment' - call endrun(msg=errMsg(sourcefile, __LINE__)) - end select - - mass_avail = currentPatch%area * currentPatch%litter(el)%seed_germ(ft) - - ! ------------------------------------------------------------------------ - ! Update number density if this is the limiting mass - ! ------------------------------------------------------------------------ - - temp_cohort%n = min(temp_cohort%n, mass_avail/mass_demand) - - end do - - - else - ! prescribed recruitment rates. number per sq. meter per year - temp_cohort%n = currentPatch%area * & - EDPftvarcon_inst%prescribed_recruitment(ft) * & - hlm_freq_day + endif + + ! if the plant is drought deciduous, and the site status is flagged as + ! "in a drought", then likewise, set the cohort's status to leaves_off, and remember leaf + ! biomass + if ((prt_params%stress_decid(ft) == itrue) .and. & + (any(currentSite%dstatus == [phen_dstat_timeoff, phen_dstat_moistoff]))) then + leaf_status = leaves_off + c_leaf = 0.0_r8 + + ! ff plant is not woody then set sapwood and structural biomass as well + if(prt_params%woody(ft) .ne. itrue)then + c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw + c_struct = (1.0_r8 - stem_drop_fraction)*c_struct endif + endif + + ! cycle through available carbon and nutrients, find the limiting element + ! to dictate the total number of plants that can be generated + if ((hlm_use_ed_prescribed_phys .eq. ifalse) .or. & + (EDPftvarcon_inst%prescribed_recruitment(ft) .lt. 0._r8) ) then + + cohort_n = 1.e20_r8 + + do el = 1, num_elements + element_id = element_list(el) + select case(element_id) + case(carbon12_element) + + mass_demand = c_struct + c_leaf + c_fnrt + c_sapw + c_store + + case(nitrogen_element) + + mass_demand = & + c_struct*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(struct_organ)) + & + c_leaf*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)) + & + c_fnrt*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)) + & + c_sapw*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)) + & + StorageNutrientTarget(ft, element_id, & + c_leaf*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)), & + c_fnrt*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)), & + c_sapw*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)), & + c_struct*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(struct_organ))) + + case(phosphorus_element) + + mass_demand = & + c_struct*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(struct_organ)) + & + c_leaf*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)) + & + c_fnrt*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)) + & + c_sapw*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)) + & + StorageNutrientTarget(ft, element_id, & + c_leaf*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)), & + c_fnrt*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)), & + c_sapw*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)), & + c_struct*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(struct_organ))) + + case default + write(fates_log(),*) 'Undefined element type in recruitment' + call endrun(msg=errMsg(sourcefile, __LINE__)) + end select + + mass_avail = currentPatch%area*currentPatch%litter(el)%seed_germ(ft) + + ! update number density if this is the limiting mass + cohort_n = min(cohort_n, mass_avail/mass_demand) - ! Only bother allocating a new cohort if there is a reasonable amount of it - any_recruits: if (temp_cohort%n > min_n_safemath )then - - ! ----------------------------------------------------------------------------- - ! PART II. - ! Initialize the PARTEH object, and determine the initial masses of all - ! organs and elements. - ! ----------------------------------------------------------------------------- - prt => null() - call InitPRTObject(prt) - - do el = 1,num_elements - - element_id = element_list(el) - - ! If this is carbon12, then the initialization is straight forward - ! otherwise, we use stoichiometric ratios - select case(element_id) - case(carbon12_element) - - m_struct = c_struct - m_leaf = c_leaf - m_fnrt = c_fnrt - m_sapw = c_sapw - m_store = c_store - m_repro = 0._r8 - - case(nitrogen_element) - - m_struct = c_struct*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(struct_organ)) - m_leaf = c_leaf*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)) - m_fnrt = c_fnrt*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)) - m_sapw = c_sapw*prt_params%nitr_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)) - m_store = StorageNutrientTarget(ft, element_id, m_leaf, m_fnrt, m_sapw, m_struct ) - m_repro = 0._r8 - - case(phosphorus_element) - - m_struct = c_struct*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(struct_organ)) - m_leaf = c_leaf*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(leaf_organ)) - m_fnrt = c_fnrt*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(fnrt_organ)) - m_sapw = c_sapw*prt_params%phos_stoich_p1(ft,prt_params%organ_param_id(sapw_organ)) - m_store = StorageNutrientTarget(ft, element_id, m_leaf, m_fnrt, m_sapw, m_struct ) - m_repro = 0._r8 - - end select - - select case(hlm_parteh_mode) - case (prt_carbon_allom_hyp,prt_cnp_flex_allom_hyp ) - - ! Put all of the leaf mass into the first bin - call SetState(prt,leaf_organ, element_id,m_leaf,1) - do iage = 2,nleafage - call SetState(prt,leaf_organ, element_id,0._r8,iage) - end do - - call SetState(prt,fnrt_organ, element_id, m_fnrt) - call SetState(prt,sapw_organ, element_id, m_sapw) - call SetState(prt,store_organ, element_id, m_store) - call SetState(prt,struct_organ, element_id, m_struct) - call SetState(prt,repro_organ, element_id, m_repro) - - case default - write(fates_log(),*) 'Unspecified PARTEH module during create_cohort' - call endrun(msg=errMsg(sourcefile, __LINE__)) - end select - - site_mass => currentSite%mass_balance(el) - - ! Remove mass from the germination pool. However, if we are use prescribed physiology, - ! AND the forced recruitment model, then we are not realling using the prognostic - ! seed_germination model, so we have to short circuit things. We send all of the - ! seed germination mass to an outflux pool, and use an arbitrary generic input flux - ! to balance out the new recruits. - - if ( (hlm_use_ed_prescribed_phys .eq. itrue ) .and. & - (EDPftvarcon_inst%prescribed_recruitment(ft) .ge. 0._r8 )) then - - site_mass%flux_generic_in = site_mass%flux_generic_in + & - temp_cohort%n*(m_struct + m_leaf + m_fnrt + m_sapw + m_store + m_repro) - - site_mass%flux_generic_out = site_mass%flux_generic_out + & - currentPatch%area * currentPatch%litter(el)%seed_germ(ft) - - currentPatch%litter(el)%seed_germ(ft) = 0._r8 - - - else - - currentPatch%litter(el)%seed_germ(ft) = currentPatch%litter(el)%seed_germ(ft) - & - temp_cohort%n / currentPatch%area * & - (m_struct + m_leaf + m_fnrt + m_sapw + m_store + m_repro) - - end if - - - - end do + end do - ! This call cycles through the initial conditions, and makes sure that they - ! are all initialized. - ! ----------------------------------------------------------------------------------- + else + ! prescribed recruitment rates. number per sq. meter per year + cohort_n = currentPatch%area * EDPftvarcon_inst%prescribed_recruitment(ft) * & + hlm_freq_day + endif - call prt%CheckInitialConditions() + ! Only bother allocating a new cohort if there is a reasonable amount of it + any_recruits: if (cohort_n > min_n_safemath) then - ! This initializes the cohort + ! -------------------------------------------------------------------------------- + ! PART II. + ! Initialize the PARTEH object, and determine the initial masses of all + ! organs and elements. + ! -------------------------------------------------------------------------------- + + prt => null() + call InitPRTObject(prt) + + do el = 1,num_elements + + element_id = element_list(el) + + ! If this is carbon12, then the initialization is straight forward + ! otherwise, we use stoichiometric ratios + select case(element_id) + case(carbon12_element) + + m_struct = c_struct + m_leaf = c_leaf + m_fnrt = c_fnrt + m_sapw = c_sapw + m_store = c_store + m_repro = 0._r8 + + case(nitrogen_element) + + m_struct = c_struct*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(struct_organ)) + m_leaf = c_leaf*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)) + m_fnrt = c_fnrt*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)) + m_sapw = c_sapw*prt_params%nitr_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)) + m_store = StorageNutrientTarget(ft, element_id, m_leaf, m_fnrt, m_sapw, m_struct) + m_repro = 0._r8 + + case(phosphorus_element) + + m_struct = c_struct*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(struct_organ)) + m_leaf = c_leaf*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(leaf_organ)) + m_fnrt = c_fnrt*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(fnrt_organ)) + m_sapw = c_sapw*prt_params%phos_stoich_p1(ft, prt_params%organ_param_id(sapw_organ)) + m_store = StorageNutrientTarget(ft, element_id, m_leaf, m_fnrt, m_sapw, m_struct) + m_repro = 0._r8 + + end select + + select case(hlm_parteh_mode) + case (prt_carbon_allom_hyp, prt_cnp_flex_allom_hyp) + + ! put all of the leaf mass into the first bin + call SetState(prt, leaf_organ, element_id, m_leaf, 1) + do iage = 2, nleafage + call SetState(prt,leaf_organ, element_id, 0._r8, iage) + end do + + call SetState(prt, fnrt_organ, element_id, m_fnrt) + call SetState(prt, sapw_organ, element_id, m_sapw) + call SetState(prt, store_organ, element_id, m_store) + call SetState(prt, struct_organ, element_id, m_struct) + call SetState(prt, repro_organ, element_id, m_repro) + + case default + write(fates_log(),*) 'Unspecified PARTEH module during create_cohort' + call endrun(msg=errMsg(sourcefile, __LINE__)) + end select + + site_mass => currentSite%mass_balance(el) + + ! Remove mass from the germination pool. However, if we are use prescribed physiology, + ! AND the forced recruitment model, then we are not realling using the prognostic + ! seed_germination model, so we have to short circuit things. We send all of the + ! seed germination mass to an outflux pool, and use an arbitrary generic input flux + ! to balance out the new recruits. + if ((hlm_use_ed_prescribed_phys .eq. itrue) .and. & + (EDPftvarcon_inst%prescribed_recruitment(ft) .ge. 0._r8)) then + + site_mass%flux_generic_in = site_mass%flux_generic_in + & + cohort_n*(m_struct + m_leaf + m_fnrt + m_sapw + m_store + m_repro) + + site_mass%flux_generic_out = site_mass%flux_generic_out + & + currentPatch%area * currentPatch%litter(el)%seed_germ(ft) + + currentPatch%litter(el)%seed_germ(ft) = 0._r8 + else + currentPatch%litter(el)%seed_germ(ft) = & + currentPatch%litter(el)%seed_germ(ft) - cohort_n / currentPatch%area * & + (m_struct + m_leaf + m_fnrt + m_sapw + m_store + m_repro) + end if + end do - call create_cohort(currentSite,currentPatch, temp_cohort%pft, temp_cohort%n, & - temp_cohort%hite, temp_cohort%coage, temp_cohort%dbh, prt, & - cohortstatus, recruitstatus, & - temp_cohort%canopy_trim,temp_cohort%c_area, & - currentPatch%NCL_p, & - temp_cohort%crowndamage, & - currentSite%spread, bc_in) + ! cycle through the initial conditions, and makes sure that they are all initialized + call prt%CheckInitialConditions() - ! Note that if hydraulics is on, the number of cohorts may had - ! changed due to hydraulic constraints. - ! This constaint is applied during "create_cohort" subroutine. + call create_cohort(currentSite, currentPatch, ft, cohort_n, hite, 0.0_r8, dbh, & + prt, leaf_status, recruitstatus, init_recruit_trim, 0.0_r8, & + currentPatch%NCL_p, crowndamage, currentSite%spread, bc_in) - ! keep track of how many individuals were recruited for passing to history - currentSite%recruitment_rate(ft) = currentSite%recruitment_rate(ft) + temp_cohort%n + ! Note that if hydraulics is on, the number of cohorts may have + ! changed due to hydraulic constraints. + ! This constaint is applied during "create_cohort" subroutine. + ! keep track of how many individuals were recruited for passing to history + currentSite%recruitment_rate(ft) = currentSite%recruitment_rate(ft) + cohort_n endif any_recruits - endif !use_this_pft + endif !use_this_pft enddo !pft loop - - deallocate(temp_cohort, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc013: fail on deallocate(temp_cohort):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - end subroutine recruitment - ! ============================================================================ + ! ====================================================================================== subroutine CWDInput( currentSite, currentPatch, litt, bc_in) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index 46775fb6a9..6ca89921ba 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -286,7 +286,7 @@ subroutine Init(this, prt) ! ! ARGUMENTS: - class(fates_cohort_type), intent(inout), target :: this + class(fates_cohort_type), intent(inout) :: this class(prt_vartypes), intent(inout), pointer :: prt ! allocated PARTEH object call this%NanValues() ! make everything in the cohort not-a-number @@ -298,7 +298,6 @@ subroutine Init(this, prt) ! The PARTEH cohort object should be allocated and already ! initialized in this routine. call this%prt%CheckInitialConditions() - call this%InitPRTBoundaryConditions() ! new cohorts do not have mortality rates, nor have they moved any ! carbon when they are created. They will bias our statistics @@ -619,6 +618,8 @@ subroutine Create(this, prt, pft, nn, hite, coage, dbh, status, & this%treelai,this%vcmax25top, 2) end if + call this%InitPRTBoundaryConditions() + end subroutine Create !=========================================================================== diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 3419596026..13d17c88fe 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -735,281 +735,252 @@ subroutine init_patches( nsites, sites, bc_in) end subroutine init_patches ! ============================================================================ - subroutine init_cohorts( site_in, patch_in, bc_in) + + subroutine init_cohorts(site_in, patch_in, bc_in) ! - ! !DESCRIPTION: + ! DESCRIPTION: ! initialize new cohorts on bare ground ! - ! !USES: - - ! - ! !ARGUMENTS - type(ed_site_type), intent(inout), pointer :: site_in - type(fates_patch_type), intent(inout), pointer :: patch_in - type(bc_in_type), intent(in) :: bc_in - ! - ! !LOCAL VARIABLES: - type(fates_cohort_type),pointer :: temp_cohort - class(prt_vartypes),pointer :: prt_obj - integer :: cstatus - integer :: pft - integer :: crowndamage ! which crown damage class - integer :: iage ! index for leaf age loop - integer :: el ! index for element loop - integer :: element_id ! element index consistent with defs in PRTGeneric - integer :: use_pft_local(numpft) ! determine whether this PFT is used for this patch and site. - real(r8) :: c_agw ! biomass above ground (non-leaf) [kgC] - real(r8) :: c_bgw ! biomass below ground (non-fineroot) [kgC] - real(r8) :: c_leaf ! biomass in leaves [kgC] - real(r8) :: c_fnrt ! biomass in fine roots [kgC] - real(r8) :: c_sapw ! biomass in sapwood [kgC] - real(r8) :: c_struct ! biomass in structure (dead) [kgC] - real(r8) :: c_store ! biomass in storage [kgC] - real(r8) :: a_sapw ! area in sapwood (dummy) [m2] - real(r8) :: m_struct ! Generic (any element) mass for structure [kg] - real(r8) :: m_leaf ! Generic mass for leaf [kg] - real(r8) :: m_fnrt ! Generic mass for fine-root [kg] - real(r8) :: m_sapw ! Generic mass for sapwood [kg] - real(r8) :: m_store ! Generic mass for storage [kg] - real(r8) :: m_repro ! Generic mass for reproductive tissues [kg] - real(r8) :: stem_drop_fraction - - integer, parameter :: rstatus = 0 - integer init - - real(r8) :: dummy_n ! set cohort n to a dummy value of 1 + + ! ARGUMENTS + type(ed_site_type), intent(inout), pointer :: site_in + type(fates_patch_type), intent(inout), pointer :: patch_in + type(bc_in_type), intent(in) :: bc_in + + ! LOCAL VARIABLES: + class(prt_vartypes), pointer :: prt ! PARTEH object + integer :: leaf_status ! cohort phenology status [leaves on/off] + integer :: pft ! index for PFT + integer :: crowndamage ! crown damage class + integer :: iage ! index for leaf age loop + integer :: el ! index for element loop + integer :: element_id ! element index consistent with defs in PRTGeneric + integer :: use_pft_local(numpft) ! determine whether this PFT is used for this patch and site + integer :: crown_damage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] + real(r8) :: l2fr ! leaf to fineroot biomass ratio [0-1] + real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] + real(r8) :: cohort_n ! cohort density + real(r8) :: dbh ! cohort dbh [cm] + real(r8) :: c_area ! cohort crown area [m2] + real(r8) :: c_agw ! above ground (non-leaf) biomass [kgC] + real(r8) :: c_bgw ! below ground (non-fineroot) biomss [kgC] + real(r8) :: c_leaf ! leaf biomass [kgC] + real(r8) :: c_fnrt ! fine root biomss [kgC] + real(r8) :: c_sapw ! sapwood biomass [kgC] + real(r8) :: c_struct ! structural (dead) biomass [kgC] + real(r8) :: c_store ! storage biomass [kgC] + real(r8) :: a_sapw ! sapwood area [m2] + real(r8) :: m_struct ! generic (any element) mass for structure [kg] + real(r8) :: m_leaf ! generic mass for leaf [kg] + real(r8) :: m_fnrt ! generic mass for fine-root [kg] + real(r8) :: m_sapw ! generic mass for sapwood [kg] + real(r8) :: m_store ! generic mass for storage [kg] + real(r8) :: m_repro ! generic mass for reproductive tissues [kg] + real(r8) :: stem_drop_fraction ! of all the organs in the recruits. Used for both [kg per plant] and [kg per cohort] + integer, parameter :: recruitstatus = 0 ! whether the newly created cohorts are recruited or initialized - !---------------------------------------------------------------------- + !------------------------------------------------------------------------------------- patch_in%tallest => null() patch_in%shortest => null() - ! Manage interactions of fixed biogeog (site level filter) and - ! nocomp (patch level filter) + ! Manage interactions of fixed biogeog (site level filter) and nocomp (patch level filter) ! Need to cover all potential biogeog x nocomp combinations ! 1. biogeog = false. nocomp = false: all PFTs on (DEFAULT) ! 2. biogeog = true. nocomp = false: site level filter ! 3. biogeog = false. nocomp = true : patch level filter ! 4. biogeog = true. nocomp = true : patch and site level filter ! in principle this could be a patch level variable. - do pft = 1,numpft - ! Turn every PFT ON, unless we are in a special case. - use_pft_local(pft) = itrue ! Case 1 - if(hlm_use_fixed_biogeog.eq.itrue)then !filter geographically - use_pft_local(pft) = site_in%use_this_pft(pft) ! Case 2 - if(hlm_use_nocomp.eq.itrue.and.pft.ne.patch_in%nocomp_pft_label)then - ! Having set the biogeog filter as on or off, turn off all PFTs - ! whose identiy does not correspond to this patch label. - use_pft_local(pft) = ifalse ! Case 3 - endif - else - if(hlm_use_nocomp.eq.itrue.and.pft.ne.patch_in%nocomp_pft_label)then - ! This case has all PFTs on their own patch everywhere. - use_pft_local(pft) = ifalse ! Case 4 - endif - endif + do pft = 1, numpft + ! first turn every PFT ON, unless we are in a special case + use_pft_local(pft) = itrue ! Case 1 + if (hlm_use_fixed_biogeog .eq. itrue) then !filter geographically + use_pft_local(pft) = site_in%use_this_pft(pft) ! Case 2 + if (hlm_use_nocomp .eq. itrue .and. pft .ne. patch_in%nocomp_pft_label) then + ! having set the biogeog filter as on or off, turn off all PFTs + ! whose identity does not correspond to this patch label + use_pft_local(pft) = ifalse ! Case 3 + endif + else + if (hlm_use_nocomp .eq. itrue .and pft .ne. patch_in%nocomp_pft_label) then + ! This case has all PFTs on their own patch everywhere + use_pft_local(pft) = ifalse ! Case 4 + endif + endif end do - - do pft = 1,numpft - - if(use_pft_local(pft).eq.itrue)then + do pft = 1, numpft + if (use_pft_local(pft) .eq. itrue) then - allocate(temp_cohort) ! temporary cohort - temp_cohort%pft = pft - temp_cohort%l2fr = prt_params%allom_l2fr(pft) - temp_cohort%canopy_trim = 1.0_r8 - temp_cohort%crowndamage = 1 ! Assume no damage to begin with + l2fr = prt_params%allom_l2fr(pft) + canopy_trim = 1.0_r8 + crown_damage = 1 ! Assume no damage to begin with - ! If positive EDPftvarcon_inst%initd is interpreted as initial recruit density. - ! If negative EDPftvarcon_inst%initd is interpreted as initial dbh. - ! Dbh-initialization can only be used in nocomp mode. - ! In the dbh-initialization case, we calculate crown area for a single tree and then calculate - ! the density of plants needed for a full canopy. - - if(EDPftvarcon_inst%initd(pft)>nearzero) then ! interpret as initial density and calculate diameter - - temp_cohort%n = EDPftvarcon_inst%initd(pft) * patch_in%area - if(hlm_use_nocomp.eq.itrue)then !in nocomp mode we only have one PFT per patch - ! as opposed to numpft's. So we should up the initial density - ! to compensate (otherwise runs are very hard to compare) - ! this multiplies it by the number of PFTs there would have been in - ! the single shared patch in competition mode. - ! n.b. that this is the same as currentcohort%n = %initd(pft) &AREA - temp_cohort%n = temp_cohort%n * sum(site_in%use_this_pft) - endif + ! If positive EDPftvarcon_inst%initd is interpreted as initial recruit density. + ! If negative EDPftvarcon_inst%initd is interpreted as initial dbh. + ! Dbh-initialization can only be used in nocomp mode. + ! In the dbh-initialization case, we calculate crown area for a single tree and then calculate + ! the density of plants needed for a full canopy. + if (EDPftvarcon_inst%initd(pft) > nearzero) then ! interpret as initial density and calculate diameter + + cohort_n = EDPftvarcon_inst%initd(pft)*patch_in%area + if (hlm_use_nocomp .eq. itrue) then !in nocomp mode we only have one PFT per patch + ! as opposed to numpft's. So we should up the initial density + ! to compensate (otherwise runs are very hard to compare) + ! this multiplies it by the number of PFTs there would have been in + ! the single shared patch in competition mode. + ! n.b. that this is the same as currentcohort%n = %initd(pft) &AREA + cohort_n = cohort_n*sum(site_in%use_this_pft) + endif - ! h,dbh,leafc,n from SP values or from small initial size. - if(hlm_use_sp.eq.itrue)then - init = itrue - ! At this point, we do not know the bc_in values of tlai tsai and htop, - ! so this is initializing to an arbitrary value for the very first timestep. - ! Not sure if there's a way around this or not. - call assign_cohort_SP_properties(temp_cohort, 0.5_r8,0.2_r8, 0.1_r8,patch_in%area,init,c_leaf) - - else - temp_cohort%hite = EDPftvarcon_inst%hgt_min(pft) - ! Calculate the plant diameter from height - call h2d_allom(temp_cohort%hite,pft,temp_cohort%dbh) - - ! Calculate the leaf biomass from allometry - ! (calculates a maximum first, then applies canopy trim) - call bleaf(temp_cohort%dbh,pft,temp_cohort%crowndamage, & - temp_cohort%canopy_trim,c_leaf) - - endif ! sp mode - - else ! interpret as initial diameter and calculate density - if(hlm_use_nocomp .eq. itrue)then - temp_cohort%dbh = abs(EDPftvarcon_inst%initd(pft)) - - ! calculate crown area of a single plant - dummy_n = 1.0_r8 ! make n=1 to get area of one tree - - call carea_allom(temp_cohort%dbh, dummy_n, init_spread_inventory, temp_cohort%pft, & - temp_cohort%crowndamage, temp_cohort%c_area) - - ! calculate initial density required to close canopy - temp_cohort%n = patch_in%area / temp_cohort%c_area - - ! Calculate the leaf biomass from allometry - ! (calculates a maximum first, then applies canopy trim) - call bleaf(temp_cohort%dbh,pft,temp_cohort%crowndamage, & - temp_cohort%canopy_trim,c_leaf) - - else - write(fates_log(),*) 'Negative fates_recruit_init_density can only be used in no comp mode' - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif + ! h, dbh, leafc, n from SP values or from small initial size + if (hlm_use_sp .eq. itrue) then + ! At this point, we do not know the bc_in values of tlai tsai and htop, + ! so this is initializing to an arbitrary value for the very first timestep. + ! Not sure if there's a way around this or not. + call assign_cohort_SP_properties(temp_cohort, 0.5_r8, 0.2_r8, 0.1_r8, & + patch_in%area, itrue, c_leaf) + else + ! calculate the plant diameter from height + call h2d_allom(EDPftvarcon_inst%hgt_min(pft), pft, dbh) + + ! Calculate the leaf biomass from allometry + ! (calculates a maximum first, then applies canopy trim) + call bleaf(dbh, pft, crowndamage, canopy_trim, c_leaf) + endif ! sp mode + + else ! interpret as initial diameter and calculate density + if (hlm_use_nocomp .eq. itrue) then + dbh = abs(EDPftvarcon_inst%initd(pft)) + ! calculate crown area of a single plant + call carea_allom(dbh, 1.0_r8, init_spread_inventory, pft, crowndamage, & + c_area) + + ! calculate initial density required to close canopy + cohort_n = patch_in%area/c_area + + ! Calculate the leaf biomass from allometry + ! (calculates a maximum first, then applies canopy trim) + call bleaf(dbh, pft, crowndamage, canopy_trim, c_leaf) + + else + write(fates_log(),*) 'Negative fates_recruit_init_density can only be used in no comp mode' + call endrun(msg=errMsg(sourcefile, __LINE__)) endif + endif + ! calculate total above-ground biomass from allometry + call bagw_allom(dbh, pft, crowndamage, c_agw) - ! Calculate total above-ground biomass from allometry - call bagw_allom(temp_cohort%dbh,pft,temp_cohort%crowndamage,c_agw) - - ! Calculate coarse root biomass from allometry - call bbgw_allom(temp_cohort%dbh,pft,c_bgw) - - ! Calculate fine root biomass from allometry - ! (calculates a maximum and then trimming value) - call bfineroot(temp_cohort%dbh,pft,temp_cohort%canopy_trim,temp_cohort%l2fr,c_fnrt) + ! calculate coarse root biomass from allometry + call bbgw_allom(dbh pft, c_bgw) - ! Calculate sapwood biomass - call bsap_allom(temp_cohort%dbh,pft,temp_cohort%crowndamage, & - temp_cohort%canopy_trim,a_sapw,c_sapw) + ! Calculate fine root biomass from allometry + ! (calculates a maximum and then trimming value) + call bfineroot(dbh, pft, canopy_trim, l2fr, c_fnrt) - call bdead_allom( c_agw, c_bgw, c_sapw, pft, c_struct ) + ! Calculate sapwood biomass + call bsap_allom(dbh, pft, crowndamage, canopy_trim, a_sapw, c_sapw) - call bstore_allom(temp_cohort%dbh, pft, temp_cohort%crowndamage, & - temp_cohort%canopy_trim, c_store) + call bdead_allom(c_agw, c_bgw, c_sapw, pft, c_struct) + call bstore_allom(dbh, pft, crowndamage, canopy_trim, c_store) - cstatus = leaves_on + leaf_status = leaves_on - stem_drop_fraction = EDPftvarcon_inst%phen_stem_drop_fraction(temp_cohort%pft) + stem_drop_fraction = EDPftvarcon_inst%phen_stem_drop_fraction(pft) - if(hlm_use_sp.eq.ifalse)then ! do not override SP vales with phenology + if (hlm_use_sp .eq. ifalse) then ! do not override SP vales with phenology - if( prt_params%season_decid(pft) == itrue .and. & - any(site_in%cstatus == [phen_cstat_nevercold,phen_cstat_iscold])) then - c_leaf = 0._r8 - c_sapw = (1.0_r8-stem_drop_fraction) * c_sapw - c_struct = (1.0_r8-stem_drop_fraction) * c_struct - cstatus = leaves_off - endif - - if ( prt_params%stress_decid(pft) == itrue .and. & - any(site_in%dstatus == [phen_dstat_timeoff,phen_dstat_moistoff])) then - c_leaf = 0._r8 - c_sapw = (1.0_r8-stem_drop_fraction) * c_sapw - c_struct = (1.0_r8-stem_drop_fraction) * c_struct - cstatus = leaves_off - endif - - end if ! SP mode + if (prt_params%season_decid(pft) == itrue .and. & + any(site_in%cstatus == [phen_cstat_nevercold, phen_cstat_iscold])) then + c_leaf = 0._r8 + c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw + c_struct = (1.0_r8 - stem_drop_fraction)*c_struct + cstatus = leaves_off + endif - if ( debug ) write(fates_log(),*) 'EDInitMod.F90 call create_cohort ' + if (prt_params%stress_decid(pft) == itrue .and. & + any(site_in%dstatus == [phen_dstat_timeoff, phen_dstat_moistoff])) then + c_leaf = 0._r8 + c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw + c_struct = (1.0_r8-stem_drop_fraction)*c_struct + cstatus = leaves_off + endif + end if ! SP mode - temp_cohort%coage = 0.0_r8 + if (debug) write(fates_log(),*) 'EDInitMod.F90 call create_cohort ' + ! -------------------------------------------------------------------------------- + ! Initialize the mass of every element in every organ of the organ + ! -------------------------------------------------------------------------------- - ! -------------------------------------------------------------------------------- - ! Initialize the mass of every element in every organ of the organ - ! -------------------------------------------------------------------------------- + prt => null() + call InitPRTObject(prt) - prt_obj => null() - call InitPRTObject(prt_obj) + do el = 1, num_elements - do el = 1,num_elements + element_id = element_list(el) + ! If this is carbon12, then the initialization is straight forward + ! otherwise, we use stoichiometric ratios + select case(element_id) + case(carbon12_element) - element_id = element_list(el) + m_struct = c_struct + m_leaf = c_leaf + m_fnrt = c_fnrt + m_sapw = c_sapw + m_store = c_store + m_repro = 0._r8 - ! If this is carbon12, then the initialization is straight forward - ! otherwise, we use stoichiometric ratios - select case(element_id) - case(carbon12_element) + case(nitrogen_element) - m_struct = c_struct - m_leaf = c_leaf - m_fnrt = c_fnrt - m_sapw = c_sapw - m_store = c_store - m_repro = 0._r8 + m_struct = c_struct*prt_params%nitr_stoich_p1(pft, prt_params%organ_param_id(struct_organ)) + m_leaf = c_leaf*prt_params%nitr_stoich_p1(pft, prt_params%organ_param_id(leaf_organ)) + m_fnrt = c_fnrt*prt_params%nitr_stoich_p1(pft, prt_params%organ_param_id(fnrt_organ)) + m_sapw = c_sapw*prt_params%nitr_stoich_p1(pft, prt_params%organ_param_id(sapw_organ)) + m_repro = 0._r8 + m_store = StorageNutrientTarget(pft, element_id, m_leaf, m_fnrt, m_sapw, m_struct) - case(nitrogen_element) + case(phosphorus_element) - m_struct = c_struct*prt_params%nitr_stoich_p1(pft,prt_params%organ_param_id(struct_organ)) - m_leaf = c_leaf*prt_params%nitr_stoich_p1(pft,prt_params%organ_param_id(leaf_organ)) - m_fnrt = c_fnrt*prt_params%nitr_stoich_p1(pft,prt_params%organ_param_id(fnrt_organ)) - m_sapw = c_sapw*prt_params%nitr_stoich_p1(pft,prt_params%organ_param_id(sapw_organ)) - m_repro = 0._r8 - m_store = StorageNutrientTarget(pft,element_id,m_leaf,m_fnrt,m_sapw,m_struct) + m_struct = c_struct*prt_params%phos_stoich_p1(pft, prt_params%organ_param_id(struct_organ)) + m_leaf = c_leaf*prt_params%phos_stoich_p1(pft, prt_params%organ_param_id(leaf_organ)) + m_fnrt = c_fnrt*prt_params%phos_stoich_p1(pft, prt_params%organ_param_id(fnrt_organ)) + m_sapw = c_sapw*prt_params%phos_stoich_p1(pft, prt_params%organ_param_id(sapw_organ)) + m_repro = 0._r8 + m_store = StorageNutrientTarget(pft, element_id, m_leaf, m_fnrt, m_sapw, m_struct) - case(phosphorus_element) + end select - m_struct = c_struct*prt_params%phos_stoich_p1(pft,prt_params%organ_param_id(struct_organ)) - m_leaf = c_leaf*prt_params%phos_stoich_p1(pft,prt_params%organ_param_id(leaf_organ)) - m_fnrt = c_fnrt*prt_params%phos_stoich_p1(pft,prt_params%organ_param_id(fnrt_organ)) - m_sapw = c_sapw*prt_params%phos_stoich_p1(pft,prt_params%organ_param_id(sapw_organ)) - m_repro = 0._r8 - m_store = StorageNutrientTarget(pft,element_id,m_leaf,m_fnrt,m_sapw,m_struct) + select case(hlm_parteh_mode) + case (prt_carbon_allom_hyp, prt_cnp_flex_allom_hyp ) - end select + ! Put all of the leaf mass into the first bin + call SetState(prt_obj, leaf_organ, element_id, m_leaf, 1) + do iage = 2,nleafage + call SetState(prt_obj, leaf_organ, element_id, 0._r8, iage) + end do - select case(hlm_parteh_mode) - case (prt_carbon_allom_hyp,prt_cnp_flex_allom_hyp ) + call SetState(prt_obj, fnrt_organ, element_id, m_fnrt) + call SetState(prt_obj, sapw_organ, element_id, m_sapw) + call SetState(prt_obj, store_organ, element_id, m_store) + call SetState(prt_obj, struct_organ, element_id, m_struct) + call SetState(prt_obj, repro_organ, element_id, m_repro) - ! Put all of the leaf mass into the first bin - call SetState(prt_obj,leaf_organ, element_id,m_leaf,1) - do iage = 2,nleafage - call SetState(prt_obj,leaf_organ, element_id,0._r8,iage) - end do + case default + write(fates_log(),*) 'Unspecified PARTEH module during create_cohort' + call endrun(msg=errMsg(sourcefile, __LINE__)) + end select - call SetState(prt_obj,fnrt_organ, element_id, m_fnrt) - call SetState(prt_obj,sapw_organ, element_id, m_sapw) - call SetState(prt_obj,store_organ, element_id, m_store) - call SetState(prt_obj,struct_organ, element_id, m_struct) - call SetState(prt_obj,repro_organ, element_id, m_repro) + end do - case default - write(fates_log(),*) 'Unspecified PARTEH module during create_cohort' - call endrun(msg=errMsg(sourcefile, __LINE__)) - end select + call prt_obj%CheckInitialConditions() - end do + call create_cohort(site_in, patch_in, pft, cohort_n, & + EDPftvarcon_inst%hgt_min(pft), 0.0_r8, dbh, prt, leaf_status, recruitstatus, & + canopy_trim, c_area, 1, crowndamage, site_in%spread, bc_in) - call prt_obj%CheckInitialConditions() - - call create_cohort(site_in, patch_in, pft, temp_cohort%n, temp_cohort%hite, & - temp_cohort%coage, temp_cohort%dbh, prt_obj, cstatus, rstatus, & - temp_cohort%canopy_trim, temp_cohort%c_area,1,temp_cohort%crowndamage, site_in%spread, bc_in) - - deallocate(temp_cohort, stat=istat, errmsg=smsg) - if (istat/=0) then - write(fates_log(),*) 'dealloc014: fail on deallocate(temp_cohort):'//trim(smsg) - call endrun(msg=errMsg(sourcefile, __LINE__)) - endif - - endif !use_this_pft + endif !use_this_pft enddo !numpft ! (Keeping as an example) @@ -1023,10 +994,9 @@ subroutine init_cohorts( site_in, patch_in, bc_in) call fuse_cohorts(site_in, patch_in,bc_in) call sort_cohorts(patch_in) - end subroutine init_cohorts - ! =============================================================================================== + ! ====================================================================================== end module EDInitMod From 6a8f12bbbb0b39c870fedff83bc146f923e0d643 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Mon, 15 May 2023 10:31:46 -0600 Subject: [PATCH 091/125] do_inventory_out off --- main/FatesInventoryInitMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 254dc100ff..8a1d83542c 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -97,7 +97,7 @@ module FatesInventoryInitMod ! defined in model memory and a physical ! site listed in the file - logical, parameter :: do_inventory_out = .true. + logical, parameter :: do_inventory_out = .false. public :: initialize_sites_by_inventory From 8bd42ea98dcdd28c8e4ba314322240a77c44baa9 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 16 May 2023 09:01:30 -0600 Subject: [PATCH 092/125] remove temp cohort --- biogeochem/EDPhysiologyMod.F90 | 212 ++++++++++++++++++--------------- main/EDInitMod.F90 | 34 +++--- 2 files changed, 135 insertions(+), 111 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 25d6a35ae9..7aae864201 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -130,6 +130,7 @@ module EDPhysiologyMod public :: phenology public :: satellite_phenology public :: assign_cohort_SP_properties + public :: calculate_SP_properties public :: recruitment public :: ZeroLitterFluxes @@ -1621,121 +1622,144 @@ subroutine satellite_phenology(currentSite, bc_in) end subroutine satellite_phenology - ! ===================================================================================== - - subroutine assign_cohort_SP_properties(currentCohort,htop,tlai,tsai,parea,init,leaf_c) - - ! -----------------------------------------------------------------------------------! - ! Takes the daily inputs of leaf area index, stem area index and canopy height and - ! translates them into a FATES structure with one patch and one cohort per PFT - ! The leaf area of the cohort is modified each day to match that asserted by the HLM - ! -----------------------------------------------------------------------------------! - - - type(fates_cohort_type), intent(inout), target :: currentCohort - - real(r8), intent(in) :: tlai ! target leaf area index from SP inputs - real(r8), intent(in) :: tsai ! target stem area index from SP inputs - real(r8), intent(in) :: htop ! target tree height from SP inputs - real(r8), intent(in) :: parea ! patch area for this PFT - integer, intent(in) :: init ! are we in the initialization routine? if so do not set leaf_c - real(r8), intent(out) :: leaf_c ! leaf carbon estimated to generate target tlai - - real(r8) :: dummy_n ! set cohort n to a dummy value of 1.0 - integer :: fates_pft ! fates pft numer for weighting loop - real(r8) :: spread ! dummy value of canopy spread to estimate c_area - real(r8) :: check_treelai - real(r8) :: canopylai(1:nclmax) - real(r8) :: fracerr - real(r8) :: oldcarea - - ! Do some checks - if(associated(currentCohort%shorter))then - write(fates_log(),*) 'SP mode has >1 cohort' - write(fates_log(),*) "SP mode >1 cohort: PFT",currentCohort%pft, currentCohort%shorter%pft - write(fates_log(),*) "SP mode >1 cohort: CL",currentCohort%canopy_layer, currentCohort%shorter%canopy_layer - call endrun(msg=errMsg(sourcefile, __LINE__)) - end if - - !------------------------------------------ - ! Calculate dbh from input height, and c_area from dbh - !------------------------------------------ - currentCohort%hite = htop - - fates_pft = currentCohort%pft - call h2d_allom(currentCohort%hite,fates_pft,currentCohort%dbh) - - dummy_n = 1.0_r8 ! make n=1 to get area of one tree. - spread = 1.0_r8 ! fix this to 0 to remove dynamics of canopy closure, assuming a closed canopy. - ! n.b. the value of this will only affect 'n', which isn't/shouldn't be a diagnostic in - ! SP mode. - call carea_allom(currentCohort%dbh,dummy_n,spread,currentCohort%pft,& - currentCohort%crowndamage,currentCohort%c_area) - - !------------------------------------------ - ! Calculate canopy N assuming patch area is full - !------------------------------------------ - currentCohort%n = parea / currentCohort%c_area + ! ====================================================================================== - ! correct c_area for the new nplant - call carea_allom(currentCohort%dbh,currentCohort%n,spread,currentCohort%pft,& - currentCohort%crowndamage,currentCohort%c_area) + subroutine calculate_SP_properties(htop, tlai, tsai, parea, pft, crown_damage, & + canopy_layer, vcmax25top, leaf_c, dbh, cohort_n, c_area) + ! + ! DESCRIPTION: + ! Takes the daily inputs of leaf area index, stem area index and canopy height and + ! translates them into a FATES structure with one patch and one cohort per PFT. + ! The leaf area of the cohort is modified each day to match that asserted by the HLM + ! - ! ------------------------------------------ - ! Calculate leaf carbon from target treelai - ! ------------------------------------------ - currentCohort%treelai = tlai + ! ARGUMENTS: + real(r8), intent(in) :: tlai ! target leaf area index from SP inputs [m2 m-2] + real(r8), intent(in) :: tsai ! target stem area index from SP inputs [m2 m-2] + real(r8), intent(in) :: htop ! target tree height from SP inputs [m] + real(r8), intent(in) :: parea ! patch area for this PFT [m2] + real(r8), intent(in) :: vcmax25top ! maximum carboxylation at canopy top and 25degC [umol CO2/m2/s] + integer, intent(in) :: pft ! cohort PFT index + integer, intent(in) :: crown_damage ! cohort crown damage status + integer, intent(in) :: canopy_layer ! canopy status of cohort [1 = canopy, 2 = understorey, etc.] + real(r8), intent(out) :: leaf_c ! leaf carbon estimated to generate target tlai [kgC] + real(r8), intent(out) :: dbh ! cohort diameter at breast height [cm] + real(r8), intent(out) :: cohort_n ! cohort density [/m2] + real(r8), intent(out) :: c_area + + ! LOCAL VARIABLES: + real(r8) :: check_treelai ! check tree LAI against input tlai [m2/m2] + real(r8) :: canopylai(1:nclmax) ! canopy LAI [m2/m2] + real(r8) :: oldcarea ! save value of crown area [m2] + + ! calculate DBH from input height + call h2d_allom(htop, pft, dbh) + + ! calculate canopy area, assuming n = 1.0 and spread = 1.0_r8 + call carea_allom(dbh, 1.0_r8, 1.0_r8, pft, crown_damage, c_area) + + ! calculate canopy N assuming patch area is full + cohort_n = parea/c_area + + ! correct c_area for the new nplant, assuming spread = 1.0 + call carea_allom(dbh, cohort_n, 1.0_r8, pft, crown_damage, c_area) + + ! calculate leaf carbon from target treelai canopylai(:) = 0._r8 - if(init.eq.itrue)then - ! If we are initializing, the canopy layer has not been set yet, so just set to 1 - currentCohort%canopy_layer = 1 - ! We need to get the vcmax25top - currentCohort%vcmax25top = EDPftvarcon_inst%vcmax25top(currentCohort%pft,1) - endif - leaf_c = leafc_from_treelai( currentCohort%treelai, currentCohort%pft, currentCohort%c_area,& - currentCohort%n, currentCohort%canopy_layer, currentCohort%vcmax25top) + leaf_c = leafc_from_treelai(tlai, pft, c_area, cohort_n, canopy_layer, vcmax25top) - !check that the inverse calculation of leafc from treelai is the same as the + ! check that the inverse calculation of leafc from treelai is the same as the ! standard calculation of treelai from leafc. Maybe can delete eventually? + check_treelai = tree_lai(leaf_c, pft, c_area, cohort_n, canopy_layer, & + canopylai, vcmax25top) - check_treelai = tree_lai(leaf_c, currentCohort%pft, currentCohort%c_area, & - currentCohort%n, currentCohort%canopy_layer, & - canopylai,currentCohort%vcmax25top ) - - if( abs(currentCohort%treelai-check_treelai).gt.1.0e-12)then !this is not as precise as nearzero - write(fates_log(),*) 'error in validate treelai',currentCohort%treelai,check_treelai,currentCohort%treelai-check_treelai - write(fates_log(),*) 'tree_lai inputs: ', currentCohort%pft, currentCohort%c_area, currentCohort%n, & - currentCohort%canopy_layer, currentCohort%vcmax25top + if (abs(tlai - check_treelai) .gt. 1.0e-12) then !this is not as precise as nearzero + write(fates_log(),*) 'error in validate treelai', tlai, check_treelai, tlai - check_treelai + write(fates_log(),*) 'tree_lai inputs: ', pft, c_area, cohort_n, & + canopy_layer, vcmax25top call endrun(msg=errMsg(sourcefile, __LINE__)) end if ! the carea_allom routine sometimes generates precision-tolerance level errors in the canopy area ! these mean that the canopy area does not exactly add up to the patch area, which causes chaos in ! the radiation routines. Correct both the area and the 'n' to remove error, and don't use - !! carea_allom in SP mode after this point. - - if(abs(currentCohort%c_area-parea).gt.nearzero)then ! there is an error - if(abs(currentCohort%c_area-parea).lt.10.e-9)then !correct this if it's a very small error - oldcarea = currentCohort%c_area - !generate new cohort area - currentCohort%c_area = currentCohort%c_area - (currentCohort%c_area- parea) - currentCohort%n = currentCohort%n * (currentCohort%c_area/oldcarea) - if(abs(currentCohort%c_area-parea).gt.nearzero)then - write(fates_log(),*) 'SPassign, c_area still broken',currentCohort%c_area-parea,currentCohort%c_area-oldcarea - call endrun(msg=errMsg(sourcefile, __LINE__)) + ! carea_allom in SP mode after this point. + + if (abs(c_area - parea) .gt. nearzero) then ! there is an error + if (abs(c_area - parea) .lt. 10.e-9) then ! correct this if it's a very small error + oldcarea = c_area + ! generate new cohort area + c_area = c_area - (c_area - parea) + cohort_n = cohort_n*(c_area/oldcarea) + if (abs(c_area-parea) .gt. nearzero) then + write(fates_log(),*) 'SPassign, c_area still broken', c_area - parea, c_area - oldcarea + call endrun(msg=errMsg(sourcefile, __LINE__)) end if else - write(fates_log(),*) 'SPassign, big error in c_area',currentCohort%c_area-parea,currentCohort%pft + write(fates_log(),*) 'SPassign, big error in c_area', c_area - parea, pft end if ! still broken end if !small error - if(init.eq.ifalse)then - call SetState(currentCohort%prt, leaf_organ, carbon12_element, leaf_c, 1) + end subroutine calculate_SP_properties + + ! ====================================================================================== + + subroutine assign_cohort_SP_properties(currentCohort, htop, tlai, tsai, parea, init, & + leaf_c) + ! + ! DESCRIPTION: + ! Takes the daily inputs of leaf area index, stem area index and canopy height and + ! translates them into a FATES structure with one patch and one cohort per PFT. + ! The leaf area of the cohort is modified each day to match that asserted by the HLM + + + ! ARGUMENTS + type(fates_cohort_type), intent(inout), target :: currentCohort ! cohort object + real(r8), intent(in) :: tlai ! target leaf area index from SP inputs [m2/m2] + real(r8), intent(in) :: tsai ! target stem area index from SP inputs [m2/m2] + real(r8), intent(in) :: htop ! target tree height from SP inputs [m] + real(r8), intent(in) :: parea ! patch area for this PFT [m2] + integer, intent(in) :: init ! are we in the initialization routine? if so do not set leaf_c + real(r8), intent(out) :: leaf_c ! leaf carbon estimated to generate target tlai [kgC] + + ! LOCAL VARIABLES + real(r8) :: dbh ! cohort dbh [cm] + real(r8) :: cohort_n ! cohort density [/m2] + real(r8) :: c_area ! cohort canopy area [m2] + + if (associated(currentCohort%shorter)) then + write(fates_log(),*) 'SP mode has >1 cohort' + write(fates_log(),*) "SP mode >1 cohort: PFT", currentCohort%pft, currentCohort%shorter%pft + write(fates_log(),*) "SP mode >1 cohort: CL", currentCohort%canopy_layer, currentCohort%shorter%canopy_layer + call endrun(msg=errMsg(sourcefile, __LINE__)) + end if + + if (init .eq. itrue) then + ! If we are initializing, the canopy layer has not been set yet, so just set to 1 + currentCohort%canopy_layer = 1 + ! We need to get the vcmax25top + currentCohort%vcmax25top = EDPftvarcon_inst%vcmax25top(currentCohort%pft, 1) endif - ! assert sai + call calculate_SP_properties(htop, tlai, tsai, parea, currentCohort%pft, & + currentCohort%crowndamage, currentCohort%canopy_layer, currentCohort%vcmax25top, & + leaf_c, dbh, cohort_n, c_area) + + ! set allometric characteristics + currentCohort%hite = htop + currentCohort%dbh = dbh + currentCohort%n = cohort_n + currentCohort%c_area = c_area + currentCohort%treelai = tlai currentCohort%treesai = tsai + leaf_c = leafc_from_treelai(tlai, currentCohort%pft, currentCohort%c_area, & + currentCohort%n, currentCohort%canopy_layer, currentCohort%vcmax25top) + + if (init .eq. ifalse) then + call SetState(currentCohort%prt, leaf_organ, carbon12_element, leaf_c, 1) + endif + end subroutine assign_cohort_SP_properties ! ===================================================================================== diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 13d17c88fe..8a72e542ae 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -21,7 +21,7 @@ module EDInitMod use EDCohortDynamicsMod , only : create_cohort, fuse_cohorts, sort_cohorts use EDCohortDynamicsMod , only : InitPRTObject use EDPatchDynamicsMod , only : set_patchno - use EDPhysiologyMod , only : assign_cohort_sp_properties + use EDPhysiologyMod , only : calculate_sp_properties use ChecksBalancesMod , only : SiteMassStock use FatesInterfaceTypesMod , only : hlm_day_of_year use EDTypesMod , only : ed_site_type @@ -802,7 +802,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) use_pft_local(pft) = ifalse ! Case 3 endif else - if (hlm_use_nocomp .eq. itrue .and pft .ne. patch_in%nocomp_pft_label) then + if (hlm_use_nocomp .eq. itrue .and. pft .ne. patch_in%nocomp_pft_label) then ! This case has all PFTs on their own patch everywhere use_pft_local(pft) = ifalse ! Case 4 endif @@ -838,8 +838,9 @@ subroutine init_cohorts(site_in, patch_in, bc_in) ! At this point, we do not know the bc_in values of tlai tsai and htop, ! so this is initializing to an arbitrary value for the very first timestep. ! Not sure if there's a way around this or not. - call assign_cohort_SP_properties(temp_cohort, 0.5_r8, 0.2_r8, 0.1_r8, & - patch_in%area, itrue, c_leaf) + call calculate_SP_properties(0.5_r8, 0.2_r8, 0.1_r8, patch_in%area, pft, & + crown_damage, 1, EDPftvarcon_inst%vcmax25top(pft, 1), c_leaf, dbh, & + cohort_n, c_area) else ! calculate the plant diameter from height call h2d_allom(EDPftvarcon_inst%hgt_min(pft), pft, dbh) @@ -873,7 +874,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) call bagw_allom(dbh, pft, crowndamage, c_agw) ! calculate coarse root biomass from allometry - call bbgw_allom(dbh pft, c_bgw) + call bbgw_allom(dbh, pft, c_bgw) ! Calculate fine root biomass from allometry ! (calculates a maximum and then trimming value) @@ -896,7 +897,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) c_leaf = 0._r8 c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw c_struct = (1.0_r8 - stem_drop_fraction)*c_struct - cstatus = leaves_off + leaf_status = leaves_off endif if (prt_params%stress_decid(pft) == itrue .and. & @@ -904,7 +905,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) c_leaf = 0._r8 c_sapw = (1.0_r8 - stem_drop_fraction)*c_sapw c_struct = (1.0_r8-stem_drop_fraction)*c_struct - cstatus = leaves_off + leaf_status = leaves_off endif end if ! SP mode @@ -955,17 +956,17 @@ subroutine init_cohorts(site_in, patch_in, bc_in) select case(hlm_parteh_mode) case (prt_carbon_allom_hyp, prt_cnp_flex_allom_hyp ) - ! Put all of the leaf mass into the first bin - call SetState(prt_obj, leaf_organ, element_id, m_leaf, 1) + ! Put all of the leaf mass into the first bin + call SetState(prt, leaf_organ, element_id, m_leaf, 1) do iage = 2,nleafage - call SetState(prt_obj, leaf_organ, element_id, 0._r8, iage) + call SetState(prt, leaf_organ, element_id, 0._r8, iage) end do - call SetState(prt_obj, fnrt_organ, element_id, m_fnrt) - call SetState(prt_obj, sapw_organ, element_id, m_sapw) - call SetState(prt_obj, store_organ, element_id, m_store) - call SetState(prt_obj, struct_organ, element_id, m_struct) - call SetState(prt_obj, repro_organ, element_id, m_repro) + call SetState(prt, fnrt_organ, element_id, m_fnrt) + call SetState(prt, sapw_organ, element_id, m_sapw) + call SetState(prt, store_organ, element_id, m_store) + call SetState(prt, struct_organ, element_id, m_struct) + call SetState(prt, repro_organ, element_id, m_repro) case default write(fates_log(),*) 'Unspecified PARTEH module during create_cohort' @@ -974,7 +975,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) end do - call prt_obj%CheckInitialConditions() + call prt%CheckInitialConditions() call create_cohort(site_in, patch_in, pft, cohort_n, & EDPftvarcon_inst%hgt_min(pft), 0.0_r8, dbh, prt, leaf_status, recruitstatus, & @@ -998,5 +999,4 @@ end subroutine init_cohorts ! ====================================================================================== - end module EDInitMod From 3879006cd57682848318fc0ab255d2c3667df0ab Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 16 May 2023 09:47:06 -0600 Subject: [PATCH 093/125] update l2fr definition --- biogeochem/FatesCohortMod.F90 | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index 6ca89921ba..e72a76fa26 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -62,13 +62,12 @@ module FatesCohortMod ! Multi-species, multi-organ Plant Reactive Transport (PRT) ! Contains carbon and nutrient state variables for various plant organs class(prt_vartypes), pointer :: prt - real(r8) :: l2fr ! leaf to fineroot biomass ratio (this is constant - ! in carbon only simulationss, and is set by the - ! allom_l2fr_min parameter. In nutrient - ! enabled simulations, this is dynamic, will - ! vary between allom_l2fr_min and allom_l2fr_max - ! parameters, with a tendency driven by - ! nutrient storage) [kg root / kg leaf] + real(r8) :: l2fr ! leaf to fineroot biomass ratio [kg root / kg leaf] + ! (this is constant in carbon only simulationss, and + ! is set by the allom_l2fr parameter). + ! For nutrient enabled simulations, this is dynamic. + ! In cold-start simulations, the allom_l2fr + ! parameter sets the starter value. !--------------------------------------------------------------------------- From 614e4a4badc8a945831e92e3978141200e96549b Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 16 May 2023 10:20:02 -0600 Subject: [PATCH 094/125] dangling pointer --- biogeochem/FatesCohortMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index e72a76fa26..df04360d18 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -522,7 +522,7 @@ subroutine Create(this, prt, pft, nn, hite, coage, dbh, status, & ! set up values for a newly created cohort ! ARGUMENTS - class(fates_cohort_type), intent(inout) :: this ! cohort object + class(fates_cohort_type), intent(inout), :: this ! cohort object class(prt_vartypes), intent(inout), pointer :: prt ! The allocated PARTEH object integer, intent(in) :: pft ! cohort Plant Functional Type integer, intent(in) :: crowndamage ! cohort damage class From 474551652857d9bbc1a09c4dad4995888e2585f2 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 16 May 2023 11:03:35 -0600 Subject: [PATCH 095/125] update to target --- biogeochem/FatesCohortMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biogeochem/FatesCohortMod.F90 b/biogeochem/FatesCohortMod.F90 index df04360d18..5b3155dcab 100644 --- a/biogeochem/FatesCohortMod.F90 +++ b/biogeochem/FatesCohortMod.F90 @@ -522,7 +522,7 @@ subroutine Create(this, prt, pft, nn, hite, coage, dbh, status, & ! set up values for a newly created cohort ! ARGUMENTS - class(fates_cohort_type), intent(inout), :: this ! cohort object + class(fates_cohort_type), intent(inout), target :: this ! cohort object class(prt_vartypes), intent(inout), pointer :: prt ! The allocated PARTEH object integer, intent(in) :: pft ! cohort Plant Functional Type integer, intent(in) :: crowndamage ! cohort damage class From f22540da7a3a84ee0fe98074b7685673d0b2ad6f Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 16 May 2023 11:42:13 -0700 Subject: [PATCH 096/125] Add bash script --- tools/luh2.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tools/luh2.sh diff --git a/tools/luh2.sh b/tools/luh2.sh new file mode 100644 index 0000000000..08a673741b --- /dev/null +++ b/tools/luh2.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Note that this script must be run with the luh2 conda environment + +# Regrid the luh2 data against a target surface data set +python luh2.py -l ~/Data/luh2/states.nc -s ~/Data/luh2/staticData_quarterdeg.nc \ + -rt ~/Data/luh2/surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc \ + -rs regridder.nc \ + -o LUH2_historical_0850_2015_4x5.nc + +# Regrid the luh2 transitions data using the saved regridder file and merge into previous regrid output +python luh2.py -l ~/Data/luh2/transitions.nc \ + -rf regridder.nc \ + -m LUH2_historical_0850_2015_4x5.nc \ + -o LUH2_historical_0850_2015_4x5.nc + +# Regrid the luh2 management data using the saved regridder file and merge into previous regrid output +python luh2.py -l ~/Data/luh2/management.nc \ + -rf regridder.nc \ + -m LUH2_historical_0850_2015_4x5.nc \ + -o LUH2_historical_0850_2015_4x5.nc From f93741bd32927b41eb1ee6cf6268aa6eb68a70c8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Tue, 16 May 2023 12:52:58 -0600 Subject: [PATCH 097/125] fix crown_damage --- main/EDInitMod.F90 | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 8a72e542ae..15fe7113d6 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -751,13 +751,12 @@ subroutine init_cohorts(site_in, patch_in, bc_in) class(prt_vartypes), pointer :: prt ! PARTEH object integer :: leaf_status ! cohort phenology status [leaves on/off] integer :: pft ! index for PFT - integer :: crowndamage ! crown damage class integer :: iage ! index for leaf age loop integer :: el ! index for element loop integer :: element_id ! element index consistent with defs in PRTGeneric integer :: use_pft_local(numpft) ! determine whether this PFT is used for this patch and site integer :: crown_damage ! crown damage class of the cohort [1 = undamaged, >1 = damaged] - real(r8) :: l2fr ! leaf to fineroot biomass ratio [0-1] + real(r8) :: l2fr ! leaf to fineroot biomass ratio [kg kg-1] real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] real(r8) :: cohort_n ! cohort density real(r8) :: dbh ! cohort dbh [cm] @@ -847,14 +846,14 @@ subroutine init_cohorts(site_in, patch_in, bc_in) ! Calculate the leaf biomass from allometry ! (calculates a maximum first, then applies canopy trim) - call bleaf(dbh, pft, crowndamage, canopy_trim, c_leaf) + call bleaf(dbh, pft, crown_damage, canopy_trim, c_leaf) endif ! sp mode else ! interpret as initial diameter and calculate density if (hlm_use_nocomp .eq. itrue) then dbh = abs(EDPftvarcon_inst%initd(pft)) ! calculate crown area of a single plant - call carea_allom(dbh, 1.0_r8, init_spread_inventory, pft, crowndamage, & + call carea_allom(dbh, 1.0_r8, init_spread_inventory, pft, crown_damage, & c_area) ! calculate initial density required to close canopy @@ -862,7 +861,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) ! Calculate the leaf biomass from allometry ! (calculates a maximum first, then applies canopy trim) - call bleaf(dbh, pft, crowndamage, canopy_trim, c_leaf) + call bleaf(dbh, pft, crown_damage, canopy_trim, c_leaf) else write(fates_log(),*) 'Negative fates_recruit_init_density can only be used in no comp mode' @@ -871,7 +870,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) endif ! calculate total above-ground biomass from allometry - call bagw_allom(dbh, pft, crowndamage, c_agw) + call bagw_allom(dbh, pft, crown_damage, c_agw) ! calculate coarse root biomass from allometry call bbgw_allom(dbh, pft, c_bgw) @@ -881,10 +880,10 @@ subroutine init_cohorts(site_in, patch_in, bc_in) call bfineroot(dbh, pft, canopy_trim, l2fr, c_fnrt) ! Calculate sapwood biomass - call bsap_allom(dbh, pft, crowndamage, canopy_trim, a_sapw, c_sapw) + call bsap_allom(dbh, pft, crown_damage, canopy_trim, a_sapw, c_sapw) call bdead_allom(c_agw, c_bgw, c_sapw, pft, c_struct) - call bstore_allom(dbh, pft, crowndamage, canopy_trim, c_store) + call bstore_allom(dbh, pft, crown_damage, canopy_trim, c_store) leaf_status = leaves_on @@ -979,7 +978,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) call create_cohort(site_in, patch_in, pft, cohort_n, & EDPftvarcon_inst%hgt_min(pft), 0.0_r8, dbh, prt, leaf_status, recruitstatus, & - canopy_trim, c_area, 1, crowndamage, site_in%spread, bc_in) + canopy_trim, c_area, 1, crown_damage, site_in%spread, bc_in) endif !use_this_pft enddo !numpft From eb79dd83d6d38de17e6f9b2eed5073c9dbd5f95b Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 17 May 2023 16:41:58 -0700 Subject: [PATCH 098/125] refactoring luh2 module This refactor is to account for a misunderstanding in the way that the reuse of a saved regridder weights file is to be applied. --- tools/luh2.py | 103 +++++++++++++++++++++-------------------------- tools/luh2.sh | 34 +++++++++------- tools/luh2mod.py | 35 ++++++++-------- 3 files changed, 86 insertions(+), 86 deletions(-) mode change 100644 => 100755 tools/luh2.sh diff --git a/tools/luh2.py b/tools/luh2.py index 53c65bf875..720780ad43 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -15,72 +15,67 @@ def main(): # Allow variable input files (state and/or transitions and/or management) args = CommandLineArgs() - - # Prep the LUH2 datasets and regrid target + # Import and prep the LUH2 datasets and regrid target ds_luh2 = ImportData(args.luh2_file,args.begin,args.end) + ds_regrid_target = ImportData(args.regridder_target_file,args.begin,args.end) - if (args.regridder_file == None): - ds_regrid_target = ImportData(args.regridder_target_file,args.begin,args.end) - - # Import the LUH2 static data to use for masking - ds_luh2_static = ImportData(args.luh2_static_file) - - # Create new variable where the ice water fraction is inverted w - ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr - - # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data - ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) - ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) + # Import the LUH2 static data to use for masking + ds_luh2_static = ImportData(args.luh2_static_file) - # Mask the regrid target - ds_regrid_target = SetMaskSurfData(ds_regrid_target) + # Create new variable where the ice water fraction is inverted w + ds_luh2_static["landfrac"] = 1 - ds_luh2_static.icwtr - # Handle regridder file save name - # TO DO: add check to handle if the user enters the full path - # TO DO: check if its possible to enter nothing with the argument - if (args.regridder_save_name == None): - regridder_save_file = None - print("Warning: Regridder will not be saved to file") - else: - regridder_save_file = args.regridder_save_name + # Mask all LUH2 input data using the ice/water fraction for the LUH2 static data + ds_luh2 = SetMaskLUH2(ds_luh2, ds_luh2_static) + ds_luh2_static = SetMaskLUH2(ds_luh2_static, ds_luh2_static) - # Regrid the luh2 data to the target grid - # TO DO: provide a check for the save argument based on the input arguments - regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, regridder_save_file) + # Mask the regrid target + ds_regrid_target = SetMaskSurfData(ds_regrid_target) - elif (args.regridder_target_file == None): - regridder_luh2 = ImportData(args.regridder_file) - regrid_luh2 = RegridLoop(ds_luh2,regridder_luh2) - # TO DO: check that the time bounds match the argument bounds - - # # Regrid the inverted ice/water fraction data to the target grid - #regridder_land_fraction = RegridConservative(ds_luh2_static, ds_regrid_target) - #regrid_land_fraction = regridder_land_fraction(ds_luh2_static) + # Determine if we are saving a new regridder or using an old one + # TO DO: add check to handle if the user enters the full path + # TO DO: check if its possible to enter nothing with the argument + regrid_reuse = False + # If we are merging files together, we assume that the weights file + # being supplied exists on file + if (not isinstance(args.luh2_merge_file,type(None))): + regrid_reuse = True + + # Regrid the luh2 data to the target grid + # TO DO: provide a check for the save argument based on the input arguments + regrid_luh2,regridder_luh2 = RegridConservative(ds_luh2, ds_regrid_target, + args.regridder_weights, regrid_reuse) + + # Regrid the inverted ice/water fraction data to the target grid regrid_land_fraction = regridder_luh2(ds_luh2_static) # Adjust the luh2 data by the land fraction + # TO DO: determine if this is necessary for the transitions and management data regrid_luh2 = regrid_luh2 / regrid_land_fraction.landfrac - # Correct the state sum (will be returned as if in not state values) + # Correct the state sum (checks if argument passed is state file in the function) regrid_luh2 = CorrectStateSum(regrid_luh2) - # Add additional required variables for the host land model - # Add 'YEAR' as a variable. - # This is an old requirement of the HLM and should simply be a copy of the `time` dimension - regrid_luh2["YEAR"] = regrid_luh2.time - regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary - regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary - - # Rename the dimensions for the output - regrid_luh2 = regrid_luh2.rename_dims({'lat':'lsmlat','lon':'lsmlon'}) - # Merge existing regrided luh2 file with merge input target # TO DO: check that the grid resolution and time bounds match if (not(isinstance(args.luh2_merge_file,type(None)))): ds_luh2_merge = ImportData(args.luh2_merge_file) regrid_luh2 = regrid_luh2.merge(ds_luh2_merge) + # Add additional required variables for the host land model + # Add 'YEAR' as a variable. + # This is an old requirement of the HLM and should simply be a copy of the `time` dimension + # If we are merging, we might not need to do this, so check to see if its there already + if (not "YEAR" in list(regrid_luh2.variables)): + regrid_luh2["YEAR"] = regrid_luh2.time + regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary + regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary + + # Rename the dimensions for the output. This needs to happen after the "LONGXY/LATIXY" assignment + if ('lat' in list(regrid_luh2.dims)): + regrid_luh2 = regrid_luh2.rename_dims({'lat':'lsmlat','lon':'lsmlon'}) + # Write the files # TO DO: add check to handle if the user enters the full path if (args.output == None): @@ -103,18 +98,14 @@ def CommandLineArgs(): # TO DO: using the checking function to report back if invalid file input parser.add_argument("-l","--luh2_file", required=True) - # Provide mutually exlusive arguments for regridding input selection - # Currently assuming that if a target is provided that a regridder file will be saved - regrid_target = parser.add_mutually_exclusive_group(required=True) - regrid_target.add_argument("-rf","--regridder_file") # use previously save regridder file - regrid_target.add_argument("-rt","--regridder_target_file") # use a dataset to regrid to + # Required static luh2 data to get the ice/water fraction for masking + parser.add_argument("-s", "--luh2_static_file", required=True) - # TO DO: static file is required if regridder file argument is not used - # Required static luh2 data to get the ice/water fraction - parser.add_argument("-s", "--luh2_static_file") + # File to use as regridder target (e.g. a surface dataset) + parser.add_argument("-r","--regridder_target_file", required=True) - # Optional argument for defining the regridder file name - parser.add_argument("-rs", "--regridder_save_name") + # Filename to use or save for the regridder weights + parser.add_argument("-w", "--regridder_weights", required=True) # Optional input to subset the time range of the data parser.add_argument("-b","--begin") diff --git a/tools/luh2.sh b/tools/luh2.sh old mode 100644 new mode 100755 index 08a673741b..3b179f206c --- a/tools/luh2.sh +++ b/tools/luh2.sh @@ -1,21 +1,27 @@ #!/bin/bash - # Note that this script must be run with the luh2 conda environment +# LUH2 data names +export DATA_LOC=~/Data/luh2 +export STATES_FILE=states_modified.nc +export STATIC_FILE=staticData_quarterdeg.nc +export REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc + +# Save files +export REGRID_SAVE=regridder.nc +export OUTPUT=LUH2_historical_0850_2015_4x5.nc + +# Combine strings +export STATES=${DATA_LOC}/${STATES_FILE} +export STATIC=${DATA_LOC}/${STATIC_FILE} +export REGRID_TARGET=${DATA_LOC}/${REGRID_TARGET_FILE} + + # Regrid the luh2 data against a target surface data set -python luh2.py -l ~/Data/luh2/states.nc -s ~/Data/luh2/staticData_quarterdeg.nc \ - -rt ~/Data/luh2/surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc \ - -rs regridder.nc \ - -o LUH2_historical_0850_2015_4x5.nc +python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -o ${OUTPUT} -# Regrid the luh2 transitions data using the saved regridder file and merge into previous regrid output -python luh2.py -l ~/Data/luh2/transitions.nc \ - -rf regridder.nc \ - -m LUH2_historical_0850_2015_4x5.nc \ - -o LUH2_historical_0850_2015_4x5.nc +# Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output +# python luh2.py -l ${STATES} -s ${STATIC} -rt ${REGRID_TARGET} -rf ${REGRID_SAVE} -m ${OUTPUT} -o ${OUTPUT} # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -python luh2.py -l ~/Data/luh2/management.nc \ - -rf regridder.nc \ - -m LUH2_historical_0850_2015_4x5.nc \ - -o LUH2_historical_0850_2015_4x5.nc +# python luh2.py -l ${STATES} -s ${STATIC} -rt ${REGRID_TARGET} -rf ${REGRID_SAVE} -m ${OUTPUT} -o ${OUTPUT} diff --git a/tools/luh2mod.py b/tools/luh2mod.py index aab8aba228..c92e57eab3 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -203,16 +203,33 @@ def CheckDataset(input_dataset): return(dsflag,dstype) -def RegridConservative(ds_to_regrid,ds_regrid_target,regridder_save_file): +def RegridConservative(ds_to_regrid, ds_regrid_target, regridder_weights, regrid_reuse): # define the regridder transformation - regridder = GenerateRegridder(ds_to_regrid, ds_regrid_target, regridder_save_file) + regridder = GenerateRegridder(ds_to_regrid, ds_regrid_target, regridder_weights, regrid_reuse) # Loop through the variables to regrid ds_regrid = RegridLoop(ds_to_regrid, regridder) return (ds_regrid, regridder) +def GenerateRegridder(ds_to_regrid, ds_regrid_target, regridder_weights_file, regrid_reuse): + + regrid_method = "conservative" + print("\nDefining regridder, method: ", regrid_method) + + if (regrid_reuse): + regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, + regrid_method, weights=regridder_weights_file) + else: + regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, regrid_method) + + # If we are not reusing the regridder weights file, then save the regridder + filename = regridder.to_netcdf(regridder_weights_file) + print("regridder saved to file: ", filename) + + return(regridder) + def RegridLoop(ds_to_regrid, regridder): # To Do: implement this with dask @@ -248,20 +265,6 @@ def RegridLoop(ds_to_regrid, regridder): return(ds_regrid) -def GenerateRegridder(ds_to_regrid, ds_regrid_target,regridder_save_file): - - regrid_method = "conservative" - print("\nDefining regridder, method: ", regrid_method) - regridder = xe.Regridder(ds_to_regrid, ds_regrid_target, regrid_method) - - # If save flag is set, write regridder to a file - # TO DO: define a more useful name based on inputs - if(not(isinstance(regridder_save_file,type(None)))): - filename = regridder.to_netcdf(regridder_save_file) - print("regridder saved to file: ", filename) - - return(regridder) - # Temporary: Add minor correction factor to assure states sum to one def CorrectStateSum(input_dataset): From 1941e66cccb5778f51f879481340023dca6d9aee Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 17 May 2023 17:11:24 -0700 Subject: [PATCH 099/125] Add merge flag to import data This avoids prepping the data if its already been prepped --- tools/luh2.py | 3 +-- tools/luh2mod.py | 14 +++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 720780ad43..7b18b0655c 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -19,7 +19,6 @@ def main(): ds_luh2 = ImportData(args.luh2_file,args.begin,args.end) ds_regrid_target = ImportData(args.regridder_target_file,args.begin,args.end) - # Import the LUH2 static data to use for masking ds_luh2_static = ImportData(args.luh2_static_file) @@ -60,7 +59,7 @@ def main(): # Merge existing regrided luh2 file with merge input target # TO DO: check that the grid resolution and time bounds match if (not(isinstance(args.luh2_merge_file,type(None)))): - ds_luh2_merge = ImportData(args.luh2_merge_file) + ds_luh2_merge = ImportData(args.luh2_merge_file,True) regrid_luh2 = regrid_luh2.merge(ds_luh2_merge) # Add additional required variables for the host land model diff --git a/tools/luh2mod.py b/tools/luh2mod.py index c92e57eab3..a815773203 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -8,7 +8,7 @@ from nco.custom import Atted # Import luh2 or surface data sets -def ImportData(input_file,start=None,stop=None): +def ImportData(input_file,start=None,stop=None,merge_flag=False): # Open files # Check to see if a ValueError is raised which is likely due @@ -25,13 +25,13 @@ def ImportData(input_file,start=None,stop=None): else: print("Input file dataset opened: {}".format(input_file)) - datasetout = PrepDataset(datasetout,start,stop) + datasetout = PrepDataset(datasetout,start,stop,merge_flag) return(datasetout) # Prepare the input_file to be used for regridding -def PrepDataset(input_dataset,start=None,stop=None): +def PrepDataset(input_dataset,start=None,stop=None,merge_flag=False): # Use the maximum span if start and stop are not present dsflag, dstype = CheckDataset(input_dataset) @@ -53,7 +53,9 @@ def PrepDataset(input_dataset,start=None,stop=None): raise TypeError(type_err) # Correct the necessary variables for both datasets - input_dataset = PrepDataset_ESMF(input_dataset,dsflag,dstype) + # We don't need to Prep the incoming dataset if it's being opened to merge + if(not merge_flag): + input_dataset = PrepDataset_ESMF(input_dataset,dsflag,dstype) return(input_dataset) @@ -183,7 +185,9 @@ def CheckDataset(input_dataset): dsflag = False dsvars = list(input_dataset.variables) - if('primf' in dsvars or 'primf_to_secdn' in dsvars or 'irrig' in dsvars): + if('primf' in dsvars or + 'primf_to_secdn' in dsvars or + any('irrig' in subname for subname in dsvars)): dstype = 'LUH2' dsflag = True print("LUH2") From 1cee03040442cab51ce04d44c0d1484a8734f62f Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 17 May 2023 23:56:21 -0700 Subject: [PATCH 100/125] fix order of operations --- tools/luh2.py | 21 +++++++++++---------- tools/luh2.sh | 10 +++++++--- tools/luh2mod.py | 1 + 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/tools/luh2.py b/tools/luh2.py index 7b18b0655c..71e8b777c4 100644 --- a/tools/luh2.py +++ b/tools/luh2.py @@ -56,12 +56,6 @@ def main(): # Correct the state sum (checks if argument passed is state file in the function) regrid_luh2 = CorrectStateSum(regrid_luh2) - # Merge existing regrided luh2 file with merge input target - # TO DO: check that the grid resolution and time bounds match - if (not(isinstance(args.luh2_merge_file,type(None)))): - ds_luh2_merge = ImportData(args.luh2_merge_file,True) - regrid_luh2 = regrid_luh2.merge(ds_luh2_merge) - # Add additional required variables for the host land model # Add 'YEAR' as a variable. # This is an old requirement of the HLM and should simply be a copy of the `time` dimension @@ -72,23 +66,30 @@ def main(): regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary # Rename the dimensions for the output. This needs to happen after the "LONGXY/LATIXY" assignment - if ('lat' in list(regrid_luh2.dims)): + if (not 'lsmlat' in list(regrid_luh2.dims)): regrid_luh2 = regrid_luh2.rename_dims({'lat':'lsmlat','lon':'lsmlon'}) + # Merge existing regrided luh2 file with merge input target + # TO DO: check that the grid resolution + # We could do this with an append during the write phase instead of the merge + if (not(isinstance(args.luh2_merge_file,type(None)))): + ds_luh2_merge = ImportData(args.luh2_merge_file,args.begin,args.end,merge_flag=True) + #ds_luh2_merge = ds_luh2_merge.merge(regrid_luh2) + regrid_luh2 = regrid_luh2.merge(ds_luh2_merge) + # Write the files # TO DO: add check to handle if the user enters the full path + # TO DO: add check if user sets the output the same as the input if (args.output == None): output_filename = 'LUH2_timeseries.nc' else: output_filename = args.output + output_file = os.path.join(os.getcwd(),output_filename) print("generating output: {}".format(output_file)) regrid_luh2.to_netcdf(output_file) - # Example of file naming scheme - # finb_luh2_all_regrid.to_netcdf('LUH2_historical_1850_2015_4x5_cdk_220302.nc') - def CommandLineArgs(): parser = argparse.ArgumentParser(description="placeholder desc") diff --git a/tools/luh2.sh b/tools/luh2.sh index 3b179f206c..710c771811 100755 --- a/tools/luh2.sh +++ b/tools/luh2.sh @@ -4,6 +4,8 @@ # LUH2 data names export DATA_LOC=~/Data/luh2 export STATES_FILE=states_modified.nc +export TRANSITIONS_FILE=transitions_modified.nc +export MANAGE_FILE=management_modified.nc export STATIC_FILE=staticData_quarterdeg.nc export REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc @@ -13,15 +15,17 @@ export OUTPUT=LUH2_historical_0850_2015_4x5.nc # Combine strings export STATES=${DATA_LOC}/${STATES_FILE} +export TRANSITIONS=${DATA_LOC}/${TRANSITIONS_FILE} +export MANAGE=${DATA_LOC}/${MANAGE_FILE} export STATIC=${DATA_LOC}/${STATIC_FILE} export REGRID_TARGET=${DATA_LOC}/${REGRID_TARGET_FILE} # Regrid the luh2 data against a target surface data set -python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -o ${OUTPUT} +python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -o states_regrid.nc # Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output -# python luh2.py -l ${STATES} -s ${STATIC} -rt ${REGRID_TARGET} -rf ${REGRID_SAVE} -m ${OUTPUT} -o ${OUTPUT} +python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -m states_regrid.nc -o states_trans_regrid.nc # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -# python luh2.py -l ${STATES} -s ${STATIC} -rt ${REGRID_TARGET} -rf ${REGRID_SAVE} -m ${OUTPUT} -o ${OUTPUT} +python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -m states_trans_regrid.nc -o ${OUTPUT} diff --git a/tools/luh2mod.py b/tools/luh2mod.py index a815773203..815cf8f22c 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -267,6 +267,7 @@ def RegridLoop(ds_to_regrid, regridder): else: print("skipping variable {}/{}: {}".format(i+1, varlen, ds_varnames[i])) + print("\n") return(ds_regrid) # Temporary: Add minor correction factor to assure states sum to one From 4eadfb7081f6b843b3854a324c0c894f447691f8 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 18 May 2023 12:58:50 -0700 Subject: [PATCH 101/125] add commands to remove intermediate file copies This helps mitigate loss of storage space --- tools/luh2.sh | 51 ++++++++++++++++++++++++++++++++++++++++-------- tools/luh2mod.py | 18 ++++++++--------- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/tools/luh2.sh b/tools/luh2.sh index 710c771811..c68057a245 100755 --- a/tools/luh2.sh +++ b/tools/luh2.sh @@ -1,11 +1,16 @@ #!/bin/bash +# WARNING: This script generates intermediate copies of the LUH2 +# data which at its peak takes up approximately 42G of space. +# # Note that this script must be run with the luh2 conda environment +# It requires a single argument that points to the full path location +# of the luh2 data and the dataset to regrid against # LUH2 data names -export DATA_LOC=~/Data/luh2 -export STATES_FILE=states_modified.nc -export TRANSITIONS_FILE=transitions_modified.nc -export MANAGE_FILE=management_modified.nc +export DATA_LOC=$1 +export STATES_FILE=states.nc +export TRANSITIONS_FILE=transitions.nc +export MANAGE_FILE=management.nc export STATIC_FILE=staticData_quarterdeg.nc export REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc @@ -19,13 +24,43 @@ export TRANSITIONS=${DATA_LOC}/${TRANSITIONS_FILE} export MANAGE=${DATA_LOC}/${MANAGE_FILE} export STATIC=${DATA_LOC}/${STATIC_FILE} export REGRID_TARGET=${DATA_LOC}/${REGRID_TARGET_FILE} +export REGRIDDER=${DATA_LOC}/${REGRID_SAVE} +# Create copies of the luh2 data that have the time data modified +# Comment this out if the user already has the modified datasets available -# Regrid the luh2 data against a target surface data set -python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -o states_regrid.nc +# Update that filename to point to + +# Regrid the luh2 data against a target surface data set and then remove the states_modified file +echo "starting storage" +du -h ${DATA_LOC} +echo "Correcting LUH2 time data for ${STATES}" +python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${STATES}')" +export STATES=${DATA_LOC}/states_modified.nc +python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${DATA_LOC}/states_regrid.nc +echo -e"storage status:\n" +du -h ${DATA_LOC} +rm ${STATES} # Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output -python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -m states_regrid.nc -o states_trans_regrid.nc +echo "Correcting LUH2 time data for ${TRANSITIONS}" +python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${TRANSITIONS}')" +export TRANSITIONS=${DATA_LOC}/transitions_modified.nc +python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ + -m ${DATA_LOC}/states_regrid.nc -o ${DATA_LOC}/states_trans_regrid.nc +echo -e"storage status:\n" +du -h ${DATA_LOC} +rm ${TRANSITIONS} +rm ${DATA_LOC}/states_regrid.nc # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRID_SAVE} -m states_trans_regrid.nc -o ${OUTPUT} +echo "Correcting LUH2 time data for ${MANAGE}" +python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${MANAGE}')" +export MANAGE=${DATA_LOC}/management_modified.nc +python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ + -m ${DATA_LOC}/states_trans_regrid.nc -o ${OUTPUT} +echo -e"storage status:\n" +du -h ${DATA_LOC} +rm ${MANAGE} +rm ${DATA_LOC}/states_trans_regrid.nc +rm ${REGRIDDER} diff --git a/tools/luh2mod.py b/tools/luh2mod.py index 815cf8f22c..62c4312187 100644 --- a/tools/luh2mod.py +++ b/tools/luh2mod.py @@ -73,13 +73,13 @@ def PrepDataset_ESMF(input_dataset,dsflag,dstype): return(input_dataset) - # Modify the luh2 metadata to enable xarray to read in data # This issue here is that the luh2 time units start prior to # year 1672, which cftime should be able to handle, but it # appears to need a specific unit name convention "common_years" -def AttribUpdateLUH2(input_file,output_append="modified"): +def AttributeUpdateLUH2(input_file,output_append="modified"): + # TO DO: Make this so that it can handle more than just absolute file location # Define the output filename index = input_file.find(".nc") output_file = input_file[:index] + "_" + output_append + input_file[index:] @@ -100,21 +100,22 @@ def AttribUpdateLUH2(input_file,output_append="modified"): opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] nco.ncatted(input=input_file, output=output_file, options=opts) - print("Generated modified output file: {}\n".format(output_file)) - - return(output_file) - # The following is fixed with PR #62 for pynco but isn't in that latest update yet # on conda # nco.ncatted(input=input_file,output=output_file,options=[ # Atted(mode="overwrite", # att_name="units", # var_name="time", - # value=newstr + # value=newstr, # stype="c" # ), # ]) + print("Generated modified output file: {}\n".format(output_file)) + + return(output_file) + + # Create the necessary variable "lat_b" and "lon_b" for xESMF conservative regridding # Each lat/lon boundary array is a 2D array corresponding to the bounds of each # coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate @@ -292,9 +293,6 @@ def CorrectStateSum(input_dataset): # Save the correction value input_dataset["stscf"] = 1.0 / state_sum - # If this is the transitions data apply the state correction to the transitions - # elif (any('_to_' in var for var in input_dataset)): - return(input_dataset) # General functionality needed From e6278f637ba4f87d45ac58dea9953340d80abe6a Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Thu, 18 May 2023 13:07:14 -0700 Subject: [PATCH 102/125] move all luh2 code into named folder --- tools/{ => luh2}/conda-luh2.yml | 0 tools/{ => luh2}/luh2.py | 0 tools/{ => luh2}/luh2.sh | 0 tools/{ => luh2}/luh2mod.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename tools/{ => luh2}/conda-luh2.yml (100%) rename tools/{ => luh2}/luh2.py (100%) rename tools/{ => luh2}/luh2.sh (100%) rename tools/{ => luh2}/luh2mod.py (100%) diff --git a/tools/conda-luh2.yml b/tools/luh2/conda-luh2.yml similarity index 100% rename from tools/conda-luh2.yml rename to tools/luh2/conda-luh2.yml diff --git a/tools/luh2.py b/tools/luh2/luh2.py similarity index 100% rename from tools/luh2.py rename to tools/luh2/luh2.py diff --git a/tools/luh2.sh b/tools/luh2/luh2.sh similarity index 100% rename from tools/luh2.sh rename to tools/luh2/luh2.sh diff --git a/tools/luh2mod.py b/tools/luh2/luh2mod.py similarity index 100% rename from tools/luh2mod.py rename to tools/luh2/luh2mod.py From 28bcafc8219bb2373d9c4492856cb46a64654b5a Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 23 May 2023 15:41:28 -0700 Subject: [PATCH 103/125] convert YEAR from cftime object to number --- tools/luh2/luh2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 71e8b777c4..1e5c5ef857 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -4,6 +4,7 @@ # Usage: python luh2.py -l -s import argparse, os +from cftime import date2num from luh2mod import ImportData, SetMaskLUH2, SetMaskSurfData from luh2mod import RegridConservative, RegridLoop, CorrectStateSum @@ -61,7 +62,7 @@ def main(): # This is an old requirement of the HLM and should simply be a copy of the `time` dimension # If we are merging, we might not need to do this, so check to see if its there already if (not "YEAR" in list(regrid_luh2.variables)): - regrid_luh2["YEAR"] = regrid_luh2.time + regrid_luh2["YEAR"] = date2num(regrid_luh2.time,'common_years since 0-00-00 00:00:00') regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary From a178f9da840d75a75e54c7594fcff2037cdeeff1 Mon Sep 17 00:00:00 2001 From: Charlie Koven Date: Tue, 30 May 2023 19:03:01 -0700 Subject: [PATCH 104/125] bugfixes to reduce memory usage and interpret cftime reference point --- tools/luh2/luh2.py | 2 +- tools/luh2/luh2mod.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 1e5c5ef857..78385b6284 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -62,7 +62,7 @@ def main(): # This is an old requirement of the HLM and should simply be a copy of the `time` dimension # If we are merging, we might not need to do this, so check to see if its there already if (not "YEAR" in list(regrid_luh2.variables)): - regrid_luh2["YEAR"] = date2num(regrid_luh2.time,'common_years since 0-00-00 00:00:00') + regrid_luh2["YEAR"] = date2num(regrid_luh2.time,'common_years since 0-01-01 00:00:00') regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary diff --git a/tools/luh2/luh2mod.py b/tools/luh2/luh2mod.py index 62c4312187..a26ae68727 100644 --- a/tools/luh2/luh2mod.py +++ b/tools/luh2/luh2mod.py @@ -14,7 +14,7 @@ def ImportData(input_file,start=None,stop=None,merge_flag=False): # Check to see if a ValueError is raised which is likely due # to the LUH2 time units being undecodable by cftime module try: - datasetout = xr.open_dataset(input_file) + datasetout = xr.open_dataset(input_file, cache=False) except ValueError as err: print("ValueError:", err) errmsg = "User direction: If error is due to units being 'years since ...' " \ From 64c50364569a762d4a9ec893344887d4556b0519 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 13 Jul 2023 09:12:22 -0600 Subject: [PATCH 105/125] merge conflicts fix --- biogeochem/EDCohortDynamicsMod.F90 | 12 +++++++----- biogeochem/EDPhysiologyMod.F90 | 12 ++++++------ main/EDInitMod.F90 | 6 +++--- main/EDTypesMod.F90 | 20 +------------------- main/FatesConstantsMod.F90 | 19 +++++++++++++++++++ main/FatesInventoryInitMod.F90 | 4 ++-- parteh/PRTAllometricCNPMod.F90 | 10 +++++----- parteh/PRTAllometricCarbonMod.F90 | 6 +++--- parteh/PRTParamsFATESMod.F90 | 2 +- 9 files changed, 47 insertions(+), 44 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 2285c9b731..cb4cdb0a1b 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -48,9 +48,9 @@ Module EDCohortDynamicsMod use PRTGenericMod , only : num_elements use FatesConstantsMod , only : leaves_on use FatesConstantsMod , only : leaves_off - use EDTypesMod , only : leaves_shedding - use EDTypesMod , only : ihard_stress_decid - use EDTypesMod , only : isemi_stress_decid + use FatesConstantsMod , only : leaves_shedding + use FatesConstantsMod , only : ihard_stress_decid + use FatesConstantsMod , only : isemi_stress_decid use EDParamsMod , only : ED_val_cohort_age_fusion_tol use FatesInterfaceTypesMod , only : hlm_use_planthydro use FatesInterfaceTypesMod , only : hlm_parteh_mode @@ -206,8 +206,10 @@ subroutine create_cohort(currentSite, patchptr, pft, nn, hite, coage, dbh, & ! create new cohort allocate(newCohort) -call newCohort%Create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & - clayer, crowndamage, spread, patchptr%canopy_layer_tlai) +call newCohort%Create(prt, pft, nn, hite, coage, dbh, status, ctrim, carea, & + clayer, crowndamage, spread, patchptr%canopy_layer_tlai, elongf_leaf, elongf_fnrt, & + elongf_stem) + ! Put cohort at the right place in the linked list storebigcohort => patchptr%tallest diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 942e9fdd5c..f031c3739e 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -56,9 +56,9 @@ module EDPhysiologyMod use FatesLitterMod , only : adjust_SF_CWD_frac use EDParamsMod , only : nclmax use EDTypesMod , only : AREA,AREA_INV - use EDTypesMod , only : leaves_shedding - use EDTypesMod , only : ihard_stress_decid - use EDTypesMod , only : isemi_stress_decid + use FatesConstantsMod , only : leaves_shedding + use FatesConstantsMod , only : ihard_stress_decid + use FatesConstantsMod , only : isemi_stress_decid use EDParamsMod , only : nlevleaf use EDTypesMod , only : num_vegtemp_mem use FatesConstantsMod , only : maxpft @@ -2318,8 +2318,8 @@ subroutine recruitment(currentSite, currentPatch, bc_in) (ft .eq. currentPatch%nocomp_pft_label))) then hite = EDPftvarcon_inst%hgt_min(ft) - stem_drop_fraction = EDPftvarcon_inst%phen_stem_drop_fraction(ft) - fnrt_drop_fraction = EDPftvarcon_inst%phen_fnrt_drop_fraction(ft) + stem_drop_fraction = prt_params%phen_stem_drop_fraction(ft) + fnrt_drop_fraction = prt_params%phen_fnrt_drop_fraction(ft) l2fr = currentSite%rec_l2fr(ft, currentPatch%NCL_p) crowndamage = 1 ! new recruits are undamaged @@ -2373,7 +2373,7 @@ subroutine recruitment(currentSite, currentPatch, bc_in) call bsap_allom(dbh, ft, crowndamage, init_recruit_trim, & efstem_coh, a_sapw, c_sapw) call bagw_allom(dbh, ft, crowndamage, efstem_coh, c_agw) - call bbgw_allom(dbh, ft, c_bgw) + call bbgw_allom(dbh, ft, efstem_coh, c_bgw) call bdead_allom(c_agw, c_bgw, c_sapw, ft, c_struct) call bstore_allom(dbh, ft, crowndamage, init_recruit_trim, c_store) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index f3d7b4673e..1b57ccfaeb 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -34,8 +34,8 @@ module EDInitMod use EDTypesMod , only : init_spread_inventory use FatesConstantsMod , only : leaves_on use FatesConstantsMod , only : leaves_off - use EDTypesMod , only : ihard_stress_decid - use EDTypesMod , only : isemi_stress_decid + use FatesConstantsMod , only : ihard_stress_decid + use FatesConstantsMod , only : isemi_stress_decid use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list use EDTypesMod , only : phen_cstat_nevercold @@ -925,7 +925,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) ! Calculate the leaf biomass from allometry ! (calculates a maximum first, then applies canopy trim) - call bleaf(dbh, pft, crown_damage, canopy_trim, c_leaf) + call bleaf(dbh, pft, crown_damage, canopy_trim, efleaf_coh, c_leaf) endif ! sp mode else ! interpret as initial diameter and calculate density diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index c3063341c1..7e4991e04b 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -82,25 +82,7 @@ module EDTypesMod integer, parameter, public :: numlevsoil_max = 30 ! This is scratch space used for static arrays ! The actual number of soil layers should not exceed this - integer, parameter, public :: leaves_shedding = 3 ! Flag specifying that a deciduous plant has leaves - ! but is shedding them (partial shedding). This plant - ! should not allocate carbon towards growth or - ! reproduction. - integer, parameter, public :: ihard_stress_decid = 1 ! If the PFT is stress (drought) deciduous, - ! this flag is used to tell that the PFT - ! is a "hard" deciduous (i.e., the plant - ! has only two statuses, the plant either - ! sheds all leaves when it's time, or seeks - ! to flush the leaves back to allometry - ! when conditions improve. -integer, parameter, public :: isemi_stress_decid = 2 ! If the PFT is stress (drought) deciduous, - ! this flag is used to tell that the PFT - ! is a semi-deciduous (i.e., the plant - ! can downregulate the amount of leaves - ! relative to the allometry based on - ! soil moisture conditions. It can still - ! shed all leaves if conditions are very - ! dry. + ! BIOLOGY/BIOGEOCHEMISTRY diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index 9608df48f8..deff05a1bb 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -53,6 +53,25 @@ module FatesConstantsMod integer, parameter, public :: leaves_off = 1 ! Flag specifying that a deciduous plant has dropped ! its leaves and should not be trying to allocate ! towards any growth. + integer, parameter, public :: leaves_shedding = 3 ! Flag specifying that a deciduous plant has leaves + ! but is shedding them (partial shedding). This plant + ! should not allocate carbon towards growth or + ! reproduction. +integer, parameter, public :: ihard_stress_decid = 1 ! If the PFT is stress (drought) deciduous, + ! this flag is used to tell that the PFT + ! is a "hard" deciduous (i.e., the plant + ! has only two statuses, the plant either + ! sheds all leaves when it's time, or seeks + ! to flush the leaves back to allometry + ! when conditions improve. +integer, parameter, public :: isemi_stress_decid = 2 ! If the PFT is stress (drought) deciduous, + ! this flag is used to tell that the PFT + ! is a semi-deciduous (i.e., the plant + ! can downregulate the amount of leaves + ! relative to the allometry based on + ! soil moisture conditions. It can still + ! shed all leaves if conditions are very + ! dry. integer, parameter, public :: ican_upper = 1 ! nominal index for the upper canopy integer, parameter, public :: ican_ustory = 2 ! nominal index for diagnostics that refer to understory layers diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 8c51aafdd0..21346873f0 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -41,8 +41,8 @@ module FatesInventoryInitMod use EDTypesMod , only : area use FatesConstantsMod, only : leaves_on use FatesConstantsMod, only : leaves_off - use EDTypesMod , only : ihard_stress_decid - use EDTypesMod , only : isemi_stress_decid + use FatesConstantsMod, only : ihard_stress_decid + use FatesConstantsMod, only : isemi_stress_decid use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list use EDTypesMod , only : phen_cstat_nevercold diff --git a/parteh/PRTAllometricCNPMod.F90 b/parteh/PRTAllometricCNPMod.F90 index 1e3b25b3bf..108de586e8 100644 --- a/parteh/PRTAllometricCNPMod.F90 +++ b/parteh/PRTAllometricCNPMod.F90 @@ -57,11 +57,11 @@ module PRTAllometricCNPMod use FatesConstantsMod , only : sec_per_day use PRTParametersMod , only : prt_params use FatesConstantsMod , only : leaves_on,leaves_off - use EDTypesMod , only : leaves_shedding - use EDTypesMod , only : p_uptake_mode - use EDTypesMod , only : n_uptake_mode - use FatesConstantsMod , only : prescribed_p_uptake - use FatesConstantsMod , only : prescribed_n_uptake + use FatesConstantsMod , only : leaves_shedding + use EDParamsMod , only : p_uptake_mode + use EDParamsMod , only : n_uptake_mode + use FatesConstantsMod , only : prescribed_p_uptake + use FatesConstantsMod , only : prescribed_n_uptake use EDPftvarcon, only : EDPftvarcon_inst implicit none diff --git a/parteh/PRTAllometricCarbonMod.F90 b/parteh/PRTAllometricCarbonMod.F90 index 0ca8546bcc..d211520a0f 100644 --- a/parteh/PRTAllometricCarbonMod.F90 +++ b/parteh/PRTAllometricCarbonMod.F90 @@ -51,9 +51,9 @@ module PRTAllometricCarbonMod use FatesConstantsMod , only : leaves_on use FatesConstantsMod , only : leaves_off - use EDTypesMod , only : leaves_shedding - use EDTypesMod , only : ihard_stress_decid - use EDTypesMod , only : isemi_stress_decid + use FatesConstantsMod , only : leaves_shedding + use FatesConstantsMod , only : ihard_stress_decid + use FatesConstantsMod , only : isemi_stress_decid implicit none private diff --git a/parteh/PRTParamsFATESMod.F90 b/parteh/PRTParamsFATESMod.F90 index 4a9423c151..d30ac1681c 100644 --- a/parteh/PRTParamsFATESMod.F90 +++ b/parteh/PRTParamsFATESMod.F90 @@ -32,7 +32,7 @@ module PRTInitParamsFatesMod use FatesAllometryMod, only : set_root_fraction use PRTGenericMod, only : StorageNutrientTarget use EDTypesMod, only : init_recruit_trim - use EDTypesMod, only : ihard_stress_decid, isemi_stress_decid + use FatesConstantsMod, only : ihard_stress_decid, isemi_stress_decid ! ! !PUBLIC TYPES: From d652c21c5e904385bc4ee9c6927ef949206c602a Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 24 Jul 2023 11:58:05 -0600 Subject: [PATCH 106/125] implement decode_times=False --- tools/luh2/luh2.py | 13 ++++---- tools/luh2/luh2mod.py | 74 +++++++------------------------------------ 2 files changed, 19 insertions(+), 68 deletions(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 78385b6284..5c4bf68858 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -3,8 +3,7 @@ # LUH2 python script # Usage: python luh2.py -l -s -import argparse, os -from cftime import date2num +import argparse, os, sys from luh2mod import ImportData, SetMaskLUH2, SetMaskSurfData from luh2mod import RegridConservative, RegridLoop, CorrectStateSum @@ -62,7 +61,7 @@ def main(): # This is an old requirement of the HLM and should simply be a copy of the `time` dimension # If we are merging, we might not need to do this, so check to see if its there already if (not "YEAR" in list(regrid_luh2.variables)): - regrid_luh2["YEAR"] = date2num(regrid_luh2.time,'common_years since 0-01-01 00:00:00') + regrid_luh2["YEAR"] = regrid_luh2.time regrid_luh2["LONGXY"] = ds_regrid_target["LONGXY"] # TO DO: double check if this is strictly necessary regrid_luh2["LATIXY"] = ds_regrid_target["LATIXY"] # TO DO: double check if this is strictly necessary @@ -109,8 +108,11 @@ def CommandLineArgs(): parser.add_argument("-w", "--regridder_weights", required=True) # Optional input to subset the time range of the data - parser.add_argument("-b","--begin") - parser.add_argument("-e","--end") + # TODO: add support for parsing the input and checking against the allowable date range + parser.add_argument("-b","--begin", type=int, choices=range(850,2015), + help="beginning of date range to slice (allowable range is 0850-2015)") + parser.add_argument("-e","--end", type=int, choices=range(850,2015), + help="ending of date range to slice (allowable range is 0850-2015)") # Optional output argument parser.add_argument("-o","--output") @@ -122,6 +124,5 @@ def CommandLineArgs(): return(args) - if __name__ == "__main__": main() diff --git a/tools/luh2/luh2mod.py b/tools/luh2/luh2mod.py index a26ae68727..83ff10e40f 100644 --- a/tools/luh2/luh2mod.py +++ b/tools/luh2/luh2mod.py @@ -4,31 +4,20 @@ import numpy as np import xarray as xr import xesmf as xe -from nco import Nco -from nco.custom import Atted # Import luh2 or surface data sets def ImportData(input_file,start=None,stop=None,merge_flag=False): # Open files - # Check to see if a ValueError is raised which is likely due - # to the LUH2 time units being undecodable by cftime module - try: - datasetout = xr.open_dataset(input_file, cache=False) - except ValueError as err: - print("ValueError:", err) - errmsg = "User direction: If error is due to units being 'years since ...' " \ - "update the input data file to change to 'common_years since...'. " \ - "This can be done using the luh2.attribupdate function\n." - print() - print(errmsg) - else: - print("Input file dataset opened: {}".format(input_file)) - - datasetout = PrepDataset(datasetout,start,stop,merge_flag) + # Set decode_times to false as the luh2 raw data is outside the range + # of the standard NetCDF datetime format. + datasetout = xr.open_dataset(input_file, cache=False, decode_times=False) + print("Input file dataset opened: {}".format(input_file)) - return(datasetout) + # Prep the input data for use + datasetout = PrepDataset(datasetout,start,stop,merge_flag) + return(datasetout) # Prepare the input_file to be used for regridding def PrepDataset(input_dataset,start=None,stop=None,merge_flag=False): @@ -43,11 +32,15 @@ def PrepDataset(input_dataset,start=None,stop=None,merge_flag=False): if (isinstance(stop,type(None))): stop = input_dataset.time[-1] + # Convert the date to years since 0850 + years_since_start = start - 850 + years_since_stop = stop - 850 + # Truncate the data to the user defined range # This might need some more error handling for when # the start/stop is out of range try: - input_dataset = input_dataset.sel(time=slice(start,stop)) + input_dataset = input_dataset.sel(time=slice(years_since_start,years_since_stop)) except TypeError as type_err: print("Input must be a string\n") raise TypeError(type_err) @@ -73,49 +66,6 @@ def PrepDataset_ESMF(input_dataset,dsflag,dstype): return(input_dataset) -# Modify the luh2 metadata to enable xarray to read in data -# This issue here is that the luh2 time units start prior to -# year 1672, which cftime should be able to handle, but it -# appears to need a specific unit name convention "common_years" -def AttributeUpdateLUH2(input_file,output_append="modified"): - - # TO DO: Make this so that it can handle more than just absolute file location - # Define the output filename - index = input_file.find(".nc") - output_file = input_file[:index] + "_" + output_append + input_file[index:] - - nco = Nco() - - # Get the 'time:units' string from the input using ncks - time_unit_string = nco.ncks(input=input_file,variable="time",options=["-m"]).decode() - - # Grab the units string and replace "years" with "common_years" - substr = re.search('time:units.*".*"',time_unit_string) - newstr = substr.group().replace("time:units = \"years","\"common_years") - - # Use ncatted to update the time units - att = "units" - var = "time" - att_type = "c" - opts = [" -a {0},{1},o,{2},{3}".format(att, var, att_type, newstr)] - nco.ncatted(input=input_file, output=output_file, options=opts) - - # The following is fixed with PR #62 for pynco but isn't in that latest update yet - # on conda - # nco.ncatted(input=input_file,output=output_file,options=[ - # Atted(mode="overwrite", - # att_name="units", - # var_name="time", - # value=newstr, - # stype="c" - # ), - # ]) - - print("Generated modified output file: {}\n".format(output_file)) - - return(output_file) - - # Create the necessary variable "lat_b" and "lon_b" for xESMF conservative regridding # Each lat/lon boundary array is a 2D array corresponding to the bounds of each # coordinate position (e.g. lat_boundary would be 90.0 and 89.75 for lat coordinate From 14153c5c55625b2ba3f1680f3f924be2bbe59d60 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 24 Jul 2023 15:00:22 -0600 Subject: [PATCH 107/125] remove call to attribute update in shell script --- tools/luh2/luh2.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/luh2/luh2.sh b/tools/luh2/luh2.sh index c68057a245..06ae70ecfd 100755 --- a/tools/luh2/luh2.sh +++ b/tools/luh2/luh2.sh @@ -34,8 +34,6 @@ export REGRIDDER=${DATA_LOC}/${REGRID_SAVE} # Regrid the luh2 data against a target surface data set and then remove the states_modified file echo "starting storage" du -h ${DATA_LOC} -echo "Correcting LUH2 time data for ${STATES}" -python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${STATES}')" export STATES=${DATA_LOC}/states_modified.nc python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${DATA_LOC}/states_regrid.nc echo -e"storage status:\n" @@ -43,8 +41,6 @@ du -h ${DATA_LOC} rm ${STATES} # Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output -echo "Correcting LUH2 time data for ${TRANSITIONS}" -python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${TRANSITIONS}')" export TRANSITIONS=${DATA_LOC}/transitions_modified.nc python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ -m ${DATA_LOC}/states_regrid.nc -o ${DATA_LOC}/states_trans_regrid.nc @@ -54,8 +50,6 @@ rm ${TRANSITIONS} rm ${DATA_LOC}/states_regrid.nc # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -echo "Correcting LUH2 time data for ${MANAGE}" -python -c "from luh2mod import AttributeUpdateLUH2; AttributeUpdateLUH2('${MANAGE}')" export MANAGE=${DATA_LOC}/management_modified.nc python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ -m ${DATA_LOC}/states_trans_regrid.nc -o ${OUTPUT} From 35dee92f297767b5ecc6753cac609942320dd2d1 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 24 Jul 2023 15:22:32 -0600 Subject: [PATCH 108/125] reworking luh2 shell script call --- tools/luh2/luh2.sh | 55 ++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/tools/luh2/luh2.sh b/tools/luh2/luh2.sh index 06ae70ecfd..1e43dec9ef 100755 --- a/tools/luh2/luh2.sh +++ b/tools/luh2/luh2.sh @@ -7,54 +7,47 @@ # of the luh2 data and the dataset to regrid against # LUH2 data names -export DATA_LOC=$1 -export STATES_FILE=states.nc -export TRANSITIONS_FILE=transitions.nc -export MANAGE_FILE=management.nc -export STATIC_FILE=staticData_quarterdeg.nc -export REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc +DATA_LOC=$1 +TARGET_LOC=$2 +OUTPUT_LOC=$3 +STATES_FILE=states.nc +TRANSITIONS_FILE=transitions.nc +MANAGE_FILE=management.nc +STATIC_FILE=staticData_quarterdeg.nc +REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc # Save files -export REGRID_SAVE=regridder.nc -export OUTPUT=LUH2_historical_0850_2015_4x5.nc +REGRID_SAVE=regridder.nc +OUTPUT_FILE=LUH2_historical_0850_2015_4x5.nc # Combine strings -export STATES=${DATA_LOC}/${STATES_FILE} -export TRANSITIONS=${DATA_LOC}/${TRANSITIONS_FILE} -export MANAGE=${DATA_LOC}/${MANAGE_FILE} -export STATIC=${DATA_LOC}/${STATIC_FILE} -export REGRID_TARGET=${DATA_LOC}/${REGRID_TARGET_FILE} -export REGRIDDER=${DATA_LOC}/${REGRID_SAVE} +STATES=${DATA_LOC}/${STATES_FILE} +TRANSITIONS=${DATA_LOC}/${TRANSITIONS_FILE} +MANAGE=${DATA_LOC}/${MANAGE_FILE} +STATIC=${DATA_LOC}/${STATIC_FILE} +REGRID_TARGET=${TARGET_LOC}/${REGRID_TARGET_FILE} +REGRIDDER=${OUTPUT_LOC}/${REGRID_SAVE} -# Create copies of the luh2 data that have the time data modified # Comment this out if the user already has the modified datasets available -# Update that filename to point to - # Regrid the luh2 data against a target surface data set and then remove the states_modified file echo "starting storage" -du -h ${DATA_LOC} -export STATES=${DATA_LOC}/states_modified.nc -python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${DATA_LOC}/states_regrid.nc +du -h ${OUTPUT_LOC} +python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${OUTPUT_LOC}/states_regrid.nc echo -e"storage status:\n" -du -h ${DATA_LOC} -rm ${STATES} +du -h ${OUTPUT_LOC} # Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output -export TRANSITIONS=${DATA_LOC}/transitions_modified.nc python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ - -m ${DATA_LOC}/states_regrid.nc -o ${DATA_LOC}/states_trans_regrid.nc + -m ${OUTPUT_LOC}/states_regrid.nc -o ${OUTPUT_LOC}/states_trans_regrid.nc echo -e"storage status:\n" -du -h ${DATA_LOC} -rm ${TRANSITIONS} +du -h ${OUTPUT_LOC} rm ${DATA_LOC}/states_regrid.nc # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -export MANAGE=${DATA_LOC}/management_modified.nc python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ - -m ${DATA_LOC}/states_trans_regrid.nc -o ${OUTPUT} + -m ${OUTPUT_LOC}/states_trans_regrid.nc -o ${OUTPUT_LOC}/${OUTPUT_FILE} echo -e"storage status:\n" -du -h ${DATA_LOC} -rm ${MANAGE} -rm ${DATA_LOC}/states_trans_regrid.nc +du -h ${OUTPUT_LOC} +rm ${OUTPUT_LOC}/states_trans_regrid.nc rm ${REGRIDDER} From 436a95650751107b91cbc44af36bc38ecce36549 Mon Sep 17 00:00:00 2001 From: Marcos Longo <5891904+mpaiao@users.noreply.github.com> Date: Fri, 7 Jul 2023 08:57:27 -0700 Subject: [PATCH 109/125] Fix EDInitMod.F90 initialisation of drought deciduous variables Two local variables were not initialised before the first time being used (thanks @adrifoster for spotting it!). This PR fixes it. --- main/EDInitMod.F90 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index 1b57ccfaeb..e32de0c895 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -847,9 +847,17 @@ subroutine init_cohorts(site_in, patch_in, bc_in) canopy_trim = 1.0_r8 crown_damage = 1 ! Assume no damage to begin with +<<<<<<< HEAD ! retrieve drop fraction of non-leaf tissues for phenology initialization fnrt_drop_fraction = prt_params%phen_fnrt_drop_fraction(pft) stem_drop_fraction = prt_params%phen_stem_drop_fraction(pft) +||||||| parent of 7c8a53cf (Fix EDInitMod.F90 initialisation of drought deciduous variables) +======= + ! Retrieve drop fraction of non-leaf tissues for phenology initialisation + fnrt_drop_fraction = prt_params%phen_fnrt_drop_fraction(pft) + stem_drop_fraction = prt_params%phen_stem_drop_fraction(pft) + +>>>>>>> 7c8a53cf (Fix EDInitMod.F90 initialisation of drought deciduous variables) ! initialize phenology variables if_spmode: if (hlm_use_sp == itrue) then From b6816f6c085c6170cb200a43a65e6c7d2e2f9ad1 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Wed, 26 Jul 2023 09:09:18 -0600 Subject: [PATCH 110/125] fix init error --- main/EDInitMod.F90 | 8 -------- 1 file changed, 8 deletions(-) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index e32de0c895..1b57ccfaeb 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -847,17 +847,9 @@ subroutine init_cohorts(site_in, patch_in, bc_in) canopy_trim = 1.0_r8 crown_damage = 1 ! Assume no damage to begin with -<<<<<<< HEAD ! retrieve drop fraction of non-leaf tissues for phenology initialization fnrt_drop_fraction = prt_params%phen_fnrt_drop_fraction(pft) stem_drop_fraction = prt_params%phen_stem_drop_fraction(pft) -||||||| parent of 7c8a53cf (Fix EDInitMod.F90 initialisation of drought deciduous variables) -======= - ! Retrieve drop fraction of non-leaf tissues for phenology initialisation - fnrt_drop_fraction = prt_params%phen_fnrt_drop_fraction(pft) - stem_drop_fraction = prt_params%phen_stem_drop_fraction(pft) - ->>>>>>> 7c8a53cf (Fix EDInitMod.F90 initialisation of drought deciduous variables) ! initialize phenology variables if_spmode: if (hlm_use_sp == itrue) then From f458ea73ed57f366667cdce72f1dacf23246ab8d Mon Sep 17 00:00:00 2001 From: Marcos Longo <5891904+mpaiao@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:16:33 -0700 Subject: [PATCH 111/125] Remove duplicated init of the drought deciduous local variables I forgot to delete the assignment of the local variables when I moved it to the beginning of the `do` loop (thanks @glemieux). From 44668e2bf032d935da0f5fd9d9603385ce2b06ff Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 27 Jul 2023 12:04:34 -0600 Subject: [PATCH 112/125] remove default --- biogeochem/EDPhysiologyMod.F90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index f202291352..91cd49bce7 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -2537,9 +2537,6 @@ subroutine recruitment(currentSite, currentPatch, bc_in) else leaf_status = leaves_off end if - case default - write(fates_log(),*) 'Undefined stress deciduous type' - call endrun(msg=errMsg(sourcefile, __LINE__)) end select ! calculate live pools From 1054ce5ee94ed3264b03727e225d4e5a4348e1f9 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Thu, 27 Jul 2023 15:11:36 -0600 Subject: [PATCH 113/125] fix deallocate --- biogeochem/EDPatchDynamicsMod.F90 | 4 +++- biogeochem/FatesPatchMod.F90 | 23 +++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 1a84d7cddb..52a956f986 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -29,6 +29,8 @@ module EDPatchDynamicsMod use EDTypesMod , only : min_patch_area use EDTypesMod , only : min_patch_area_forced use EDParamsMod , only : nclmax + use EDParamsMod , only : regeneration_model + use FatesInterfaceTypesMod, only : numpft use EDTypesMod , only : dtype_ifall use EDTypesMod , only : dtype_ilog use EDTypesMod , only : dtype_ifire @@ -2569,7 +2571,7 @@ subroutine fuse_2_patches(csite, dp, rp) end if ! We have no need for the dp pointer anymore, we have passed on it's legacy - call dp%FreeMemory() + call dp%FreeMemory(regeneration_model, numpft) deallocate(dp, stat=istat, errmsg=smsg) if (istat/=0) then write(fates_log(),*) 'dealloc006: fail on deallocate(dp):'//trim(smsg) diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index c75708e3c0..76d167c0f2 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -605,7 +605,7 @@ end subroutine Create !=========================================================================== - subroutine FreeMemory(this) + subroutine FreeMemory(this, regeneration_model, numpft) ! ! DESCRIPTION: ! deallocate the allocatable memory associated with this patch @@ -614,12 +614,13 @@ subroutine FreeMemory(this) ! ARGUMENTS: class(fates_patch_type), intent(inout) :: this + integer, intent(in) :: regeneration_model + integer, intent(in) :: numpft ! LOCALS: type(fates_cohort_type), pointer :: ccohort ! current cohort type(fates_cohort_type), pointer :: ncohort ! next cohort integer :: el ! loop counter for elements - integer :: numpft ! size of pft-indexed arrays integer :: pft ! loop counter for pfts integer :: istat ! return status code character(len=255) :: smsg ! message string for deallocation errors @@ -681,22 +682,16 @@ subroutine FreeMemory(this) call endrun(msg=errMsg(sourcefile, __LINE__)) endif - if (associated(this%seedling_layer_par24)) deallocate(this%seedling_layer_par24) - if (associated(this%sdlng_mort_par)) deallocate(this%sdlng_mort_par) - if (associated(this%sdlng2sap_par)) deallocate(this%sdlng2sap_par) - - if (associated(this%sdlng_mdd)) then - numpft = size(this%sdlng_mdd) + if (regeneration_model == TRS_regeneration) then + deallocate(this%seedling_layer_par24) + deallocate(this%sdlng_mort_par) + deallocate(this%sdlng2sap_par) do pft = 1, numpft - if (associated(this%sdlng_mdd(pft)%p)) deallocate(this%sdlng_mdd(pft)%p) + deallocate(this%sdlng_mdd(pft)%p) end do deallocate(this%sdlng_mdd) - end if - - if (associated(this%sdlng_emerg_smp)) then - numpft = size(this%sdlng_emerg_smp) do pft = 1, numpft - if (associated(this%sdlng_emerg_smp(pft)%p)) deallocate(this%sdlng_emerg_smp(pft)%p) + deallocate(this%sdlng_emerg_smp(pft)%p) end do deallocate(this%sdlng_emerg_smp) end if From 8bfb215ebbb47f5177b4eec16130a3d6e5a5aae8 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 28 Jul 2023 10:30:46 -0600 Subject: [PATCH 114/125] remove duplicate uses --- biogeochem/EDPhysiologyMod.F90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 91cd49bce7..5fee6f3567 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -34,8 +34,6 @@ module EDPhysiologyMod use FatesConstantsMod, only : g_per_kg use FatesConstantsMod, only : ndays_per_year use FatesConstantsMod, only : nocomp_bareground - use FatesConstantsMod, only : g_per_kg - use FatesConstantsMod, only : ndays_per_year use EDPftvarcon , only : EDPftvarcon_inst use PRTParametersMod , only : prt_params use EDPftvarcon , only : GetDecompyFrac From ec19393b2169aee5ba786a033cd95ff090dbb847 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Fri, 28 Jul 2023 13:50:31 -0600 Subject: [PATCH 115/125] fix choice range and add shell script input options --- tools/luh2/luh2.py | 4 ++-- tools/luh2/luh2.sh | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 5c4bf68858..13d516cefa 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -109,9 +109,9 @@ def CommandLineArgs(): # Optional input to subset the time range of the data # TODO: add support for parsing the input and checking against the allowable date range - parser.add_argument("-b","--begin", type=int, choices=range(850,2015), + parser.add_argument("-b","--begin", type=int, choices=range(850,2016), help="beginning of date range to slice (allowable range is 0850-2015)") - parser.add_argument("-e","--end", type=int, choices=range(850,2015), + parser.add_argument("-e","--end", type=int, choices=range(850,2016), help="ending of date range to slice (allowable range is 0850-2015)") # Optional output argument diff --git a/tools/luh2/luh2.sh b/tools/luh2/luh2.sh index 1e43dec9ef..3aa246907d 100755 --- a/tools/luh2/luh2.sh +++ b/tools/luh2/luh2.sh @@ -8,14 +8,18 @@ # LUH2 data names DATA_LOC=$1 -TARGET_LOC=$2 -OUTPUT_LOC=$3 +STATIC_LOC=$2 +TARGET_LOC=$3 +OUTPUT_LOC=$4 STATES_FILE=states.nc TRANSITIONS_FILE=transitions.nc MANAGE_FILE=management.nc STATIC_FILE=staticData_quarterdeg.nc REGRID_TARGET_FILE=surfdata_4x5_16pfts_Irrig_CMIP6_simyr2000_c170824.nc +START=1850 +END=2015 + # Save files REGRID_SAVE=regridder.nc OUTPUT_FILE=LUH2_historical_0850_2015_4x5.nc @@ -24,7 +28,7 @@ OUTPUT_FILE=LUH2_historical_0850_2015_4x5.nc STATES=${DATA_LOC}/${STATES_FILE} TRANSITIONS=${DATA_LOC}/${TRANSITIONS_FILE} MANAGE=${DATA_LOC}/${MANAGE_FILE} -STATIC=${DATA_LOC}/${STATIC_FILE} +STATIC=${STATIC_LOC}/${STATIC_FILE} REGRID_TARGET=${TARGET_LOC}/${REGRID_TARGET_FILE} REGRIDDER=${OUTPUT_LOC}/${REGRID_SAVE} @@ -33,19 +37,19 @@ REGRIDDER=${OUTPUT_LOC}/${REGRID_SAVE} # Regrid the luh2 data against a target surface data set and then remove the states_modified file echo "starting storage" du -h ${OUTPUT_LOC} -python luh2.py -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${OUTPUT_LOC}/states_regrid.nc +python luh2.py -b ${START} -e ${END} -l ${STATES} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} -o ${OUTPUT_LOC}/states_regrid.nc echo -e"storage status:\n" du -h ${OUTPUT_LOC} # Regrid the luh2 transitions data using the saved regridder weights file and merge into previous regrid output -python luh2.py -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ +python luh2.py -b ${START} -e ${END} -l ${TRANSITIONS} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ -m ${OUTPUT_LOC}/states_regrid.nc -o ${OUTPUT_LOC}/states_trans_regrid.nc echo -e"storage status:\n" du -h ${OUTPUT_LOC} rm ${DATA_LOC}/states_regrid.nc # Regrid the luh2 management data using the saved regridder file and merge into previous regrid output -python luh2.py -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ +python luh2.py -b ${START} -e ${END} -l ${MANAGE} -s ${STATIC} -r ${REGRID_TARGET} -w ${REGRIDDER} \ -m ${OUTPUT_LOC}/states_trans_regrid.nc -o ${OUTPUT_LOC}/${OUTPUT_FILE} echo -e"storage status:\n" du -h ${OUTPUT_LOC} From 8f7f9b2e75cd5cb3d9fa7b721cd61f21ada98f71 Mon Sep 17 00:00:00 2001 From: adrifoster Date: Fri, 28 Jul 2023 15:08:26 -0600 Subject: [PATCH 116/125] address comments --- biogeochem/EDCohortDynamicsMod.F90 | 1 - biogeochem/EDLoggingMortalityMod.F90 | 6 +++--- biogeochem/EDMortalityFunctionsMod.F90 | 2 +- biogeochem/EDPatchDynamicsMod.F90 | 9 +++++---- biogeochem/EDPhysiologyMod.F90 | 2 +- biogeochem/FatesPatchMod.F90 | 4 ++-- biogeophys/EDBtranMod.F90 | 2 +- biogeophys/EDSurfaceAlbedoMod.F90 | 15 +++------------ biogeophys/FatesBstressMod.F90 | 2 +- biogeophys/FatesPlantRespPhotosynthMod.F90 | 4 +--- main/EDParamsMod.F90 | 4 ++++ main/EDTypesMod.F90 | 9 ++------- main/FatesConstantsMod.F90 | 10 +++++++--- main/FatesHistoryInterfaceMod.F90 | 10 +++++----- main/FatesInterfaceMod.F90 | 2 +- main/FatesInventoryInitMod.F90 | 1 - main/FatesRestartInterfaceMod.F90 | 3 --- 17 files changed, 37 insertions(+), 49 deletions(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index cb4cdb0a1b..8e340ef33c 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -1393,7 +1393,6 @@ subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebi storebigcohort => icohort end if currentPatch%tallest => icohort - !icohort%patchptr%tallest => icohort !new cohort is not tallest else !next shorter cohort to new cohort is the next shorter cohort diff --git a/biogeochem/EDLoggingMortalityMod.F90 b/biogeochem/EDLoggingMortalityMod.F90 index 2a70c50d46..a4703ae840 100644 --- a/biogeochem/EDLoggingMortalityMod.F90 +++ b/biogeochem/EDLoggingMortalityMod.F90 @@ -25,9 +25,9 @@ module EDLoggingMortalityMod use FatesLitterMod , only : adjust_SF_CWD_frac use EDTypesMod , only : ed_site_type use EDTypesMod , only : ed_resources_management_type - use EDTypesMod , only : dtype_ilog - use EDTypesMod , only : dtype_ifall - use EDTypesMod , only : dtype_ifire + use FatesConstantsMod , only : dtype_ilog + use FatesConstantsMod , only : dtype_ifall + use FatesConstantsMod , only : dtype_ifire use EDPftvarcon , only : EDPftvarcon_inst use EDPftvarcon , only : GetDecompyFrac use PRTParametersMod , only : prt_params diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index ea7cc006c2..bf47a5cce3 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -11,7 +11,7 @@ module EDMortalityFunctionsMod use EDPftvarcon , only : EDPftvarcon_inst use FatesCohortMod , only : fates_cohort_type use EDTypesMod , only : ed_site_type - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxpft use FatesConstantsMod , only : itrue,ifalse use FatesAllometryMod , only : bleaf use FatesAllometryMod , only : storage_fraction_of_target diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 52a956f986..6f022ccfbd 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -19,7 +19,8 @@ module EDPatchDynamicsMod use FatesConstantsMod , only : n_dbh_bins use FatesLitterMod , only : adjust_SF_CWD_frac use EDTypesMod , only : homogenize_seed_pfts - use EDTypesMod , only : area, patchfusion_dbhbin_loweredges + use EDTypesMod , only : area + use FatesConstantsMod , only : patchfusion_dbhbin_loweredges use EDtypesMod , only : force_patchfuse_min_biomass use EDTypesMod , only : ed_site_type use FatesPatchMod, only : fates_patch_type @@ -31,9 +32,9 @@ module EDPatchDynamicsMod use EDParamsMod , only : nclmax use EDParamsMod , only : regeneration_model use FatesInterfaceTypesMod, only : numpft - use EDTypesMod , only : dtype_ifall - use EDTypesMod , only : dtype_ilog - use EDTypesMod , only : dtype_ifire + use FatesConstantsMod , only : dtype_ifall + use FatesConstantsMod , only : dtype_ilog + use FatesConstantsMod , only : dtype_ifire use FatesConstantsMod , only : ican_upper use PRTGenericMod , only : num_elements use PRTGenericMod , only : element_list diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 5fee6f3567..9aaf9d3d80 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -66,7 +66,7 @@ module EDPhysiologyMod use FatesConstantsMod , only : isemi_stress_decid use EDParamsMod , only : nlevleaf use EDTypesMod , only : num_vegtemp_mem - use FatesConstantsMod , only : maxpft + use EDParamsMod , only : maxpft use EDTypesMod , only : ed_site_type use FatesPatchMod, only : fates_patch_type use FatesCohortMod, only : fates_cohort_type diff --git a/biogeochem/FatesPatchMod.F90 b/biogeochem/FatesPatchMod.F90 index 76d167c0f2..8a38366217 100644 --- a/biogeochem/FatesPatchMod.F90 +++ b/biogeochem/FatesPatchMod.F90 @@ -15,8 +15,8 @@ module FatesPatchMod use FatesLitterMod, only : litter_type use PRTGenericMod, only : num_elements use PRTGenericMod, only : element_list - use EDParamsMod, only : maxSWb, nlevleaf, nclmax - use FatesConstantsMod, only : n_dbh_bins, maxpft, n_dist_types + use EDParamsMod, only : maxSWb, nlevleaf, nclmax, maxpft + use FatesConstantsMod, only : n_dbh_bins, n_dist_types use FatesConstantsMod, only : n_rad_stream_types use FatesConstantsMod, only : t_water_freeze_k_1atm use FatesRunningMeanMod, only : ema_24hr, fixed_24hr, ema_lpa, ema_longterm diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index ecdc1bb0c1..a785493d54 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -11,7 +11,7 @@ module EDBtranMod use FatesConstantsMod , only : nocomp_bareground use EDTypesMod , only : ed_site_type use FatesPatchMod, only : fates_patch_type - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxpft use FatesCohortMod, only : fates_cohort_type use shr_kind_mod , only : r8 => shr_kind_r8 use FatesInterfaceTypesMod , only : bc_in_type, & diff --git a/biogeophys/EDSurfaceAlbedoMod.F90 b/biogeophys/EDSurfaceAlbedoMod.F90 index 8fe41194ba..18c7e7866e 100644 --- a/biogeophys/EDSurfaceAlbedoMod.F90 +++ b/biogeophys/EDSurfaceAlbedoMod.F90 @@ -12,7 +12,7 @@ module EDSurfaceRadiationMod use EDTypesMod , only : ed_site_type use FatesPatchMod, only : fates_patch_type - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxpft use FatesConstantsMod , only : r8 => fates_r8 use FatesConstantsMod , only : itrue use FatesConstantsMod , only : pi_const @@ -33,6 +33,7 @@ module EDSurfaceRadiationMod use EDCanopyStructureMod, only: calc_areaindex use FatesGlobals , only : fates_log use FatesGlobals, only : endrun => fates_endrun + use EDPftvarcon, only : EDPftvarcon_inst ! CIME globals use shr_log_mod , only : errMsg => shr_log_errMsg @@ -66,13 +67,8 @@ module EDSurfaceRadiationMod subroutine ED_Norman_Radiation (nsites, sites, bc_in, bc_out ) ! - ! - ! !USES: - use FatesPatchMod , only : fates_patch_type - use EDTypesMod , only : ed_site_type - - + ! !ARGUMENTS: integer, intent(in) :: nsites @@ -194,11 +190,6 @@ subroutine PatchNormanRadiation (currentPatch, & ! ! ----------------------------------------------------------------------------------- - ! - ! !USES: - use EDPftvarcon , only : EDPftvarcon_inst - use FatesPatchMod , only : fates_patch_type - ! ----------------------------------------------------------------------------------- ! !ARGUMENTS: ! ----------------------------------------------------------------------------------- diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 index 825a886011..f37ab8ccb1 100644 --- a/biogeophys/FatesBstressMod.F90 +++ b/biogeophys/FatesBstressMod.F90 @@ -7,7 +7,7 @@ module FatesBstressMod ! use FatesConstantsMod , only : tfrz => t_water_freeze_k_1atm use FatesConstantsMod , only : itrue,ifalse - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxpft use EDTypesMod , only : ed_site_type use FatesPatchMod, only : fates_patch_type use FatesCohortMod , only : fates_cohort_type diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 2c5c88c660..603e691067 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -38,7 +38,7 @@ module FATESPlantRespPhotosynthMod use FatesInterfaceTypesMod, only : hlm_parteh_mode use FatesInterfaceTypesMod, only : numpft use FatesInterfaceTypesMod, only : nleafage - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxpft use EDParamsMod, only : nlevleaf use EDParamsMod, only : nclmax use PRTGenericMod, only : max_nleafage @@ -124,10 +124,8 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! a multi-layer canopy ! ----------------------------------------------------------------------------------- - ! !USES: use EDTypesMod , only : ed_site_type - use FatesConstantsMod , only : maxpft use EDParamsMod , only : dinc_vai use EDParamsMod , only : dlower_vai use FatesInterfaceTypesMod , only : bc_in_type diff --git a/main/EDParamsMod.F90 b/main/EDParamsMod.F90 index 9620c9d433..438d387213 100644 --- a/main/EDParamsMod.F90 +++ b/main/EDParamsMod.F90 @@ -126,6 +126,10 @@ module EDParamsMod integer, parameter, public :: ipar = ivis ! The photosynthetically active band ! can be approximated to be equal to the visible band + + + +integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed real(r8),protected,public :: q10_mr ! Q10 for respiration rate (for soil fragmenation and plant respiration) (unitless) real(r8),protected,public :: q10_froz ! Q10 for frozen-soil respiration rates (for soil fragmentation) (unitless) diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index f9a7f13717..c9b9a90161 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -28,8 +28,7 @@ module EDTypesMod use FatesInterfaceTypesMod,only : hlm_parteh_mode use FatesCohortMod, only : fates_cohort_type use FatesPatchMod, only : fates_patch_type - use EDParamsMod, only : maxSWb, nclmax, nlevleaf - use FatesConstantsMod, only : maxpft + use EDParamsMod, only : maxSWb, nclmax, nlevleaf, maxpft use FatesConstantsMod, only : n_dbh_bins, n_dist_types use shr_log_mod, only : errMsg => shr_log_errMsg @@ -87,9 +86,7 @@ module EDTypesMod ! BIOLOGY/BIOGEOCHEMISTRY integer , parameter, public :: num_vegtemp_mem = 10 ! Window of time over which we track temp for cold sensecence (days) - integer , parameter, public :: dtype_ifall = 1 ! index for naturally occuring tree-fall generated event - integer , parameter, public :: dtype_ifire = 2 ! index for fire generated disturbance event - integer , parameter, public :: dtype_ilog = 3 ! index for logging generated disturbance event + ! Phenology status flag definitions (cold type is cstat, dry type is dstat) @@ -106,8 +103,6 @@ module EDTypesMod ! PATCH FUSION real(r8), parameter, public :: force_patchfuse_min_biomass = 0.005_r8 ! min biomass (kg / m2 patch area) below which to force-fuse patches - real(r8), parameter, public :: patchfusion_dbhbin_loweredges(N_DBH_BINS) = & - (/0._r8, 5._r8, 20._r8, 50._r8, 100._r8, 150._r8/) ! array of bin lower edges for comparing patches real(r8), parameter, public :: patch_fusion_tolerance_relaxation_increment = 1.1_r8 ! amount by which to increment patch fusion threshold real(r8), parameter, public :: max_age_of_second_oldest_patch = 200._r8 ! age in years above which to combine all patches diff --git a/main/FatesConstantsMod.F90 b/main/FatesConstantsMod.F90 index 3a670e3e7c..08a8aaa3df 100644 --- a/main/FatesConstantsMod.F90 +++ b/main/FatesConstantsMod.F90 @@ -30,17 +30,21 @@ module FatesConstantsMod ! Integer equivalent of false (in case come compilers dont auto convert) integer, parameter, public :: ifalse = 0 - integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches - - integer, parameter, public :: maxpft = 16 ! maximum number of PFTs allowed ! the parameter file may determine that fewer ! are used, but this helps allocate scratch ! space and output arrays. integer, parameter, public :: n_rad_stream_types = 2 ! The number of radiation streams used (direct/diffuse) + integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches + real(fates_r8), parameter, public :: patchfusion_dbhbin_loweredges(N_DBH_BINS) = & + (/0._fates_r8, 5._fates_r8, 20._fates_r8, 50._fates_r8, 100._fates_r8, 150._fates_r8/) ! array of bin lower edges for comparing patches + integer , parameter, public :: N_DIST_TYPES = 3 ! Disturbance Modes 1) tree-fall, 2) fire, 3) logging + integer , parameter, public :: dtype_ifall = 1 ! index for naturally occuring tree-fall generated event + integer , parameter, public :: dtype_ifire = 2 ! index for fire generated disturbance event + integer , parameter, public :: dtype_ilog = 3 ! index for logging generated disturbance event ! Labels for patch disturbance history integer, parameter, public :: n_anthro_disturbance_categories = 2 diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 851d876c7a..779a1dbdda 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -12,7 +12,7 @@ module FatesHistoryInterfaceMod use FatesConstantsMod , only : t_water_freeze_k_1atm use FatesGlobals , only : fates_log use FatesGlobals , only : endrun => fates_endrun - use EDParamsMod , only : nclmax + use EDParamsMod , only : nclmax, maxpft use FatesConstantsMod , only : ican_upper use PRTGenericMod , only : element_pos use PRTGenericMod , only : num_elements @@ -27,10 +27,10 @@ module FatesHistoryInterfaceMod use EDTypesMod , only : num_vegtemp_mem use EDTypesMod , only : site_massbal_type use PRTGenericMod , only : element_list - use FatesConstantsMod , only : N_DIST_TYPES, maxpft - use EDTypesMod , only : dtype_ifall - use EDTypesMod , only : dtype_ifire - use EDTypesMod , only : dtype_ilog + use FatesConstantsMod , only : N_DIST_TYPES + use FatesConstantsMod , only : dtype_ifall + use FatesConstantsMod , only : dtype_ifire + use FatesConstantsMod , only : dtype_ilog use FatesIODimensionsMod , only : fates_io_dimension_type use FatesIOVariableKindMod , only : fates_io_variable_kind_type use FatesIOVariableKindMod , only : site_int diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index d5b489d528..be6c1bbd38 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -25,7 +25,7 @@ module FatesInterfaceMod use EDParamsMod , only : inir use EDParamsMod , only : nclmax use EDParamsMod , only : nlevleaf - use FatesConstantsMod , only : maxpft + use EDParamsMod , only : maxpft use EDTypesMod , only : do_fates_salinity use EDTypesMod , only : numWaterMem use EDTypesMod , only : numlevsoil_max diff --git a/main/FatesInventoryInitMod.F90 b/main/FatesInventoryInitMod.F90 index 76090fb844..0141c68fe5 100644 --- a/main/FatesInventoryInitMod.F90 +++ b/main/FatesInventoryInitMod.F90 @@ -555,7 +555,6 @@ subroutine initialize_sites_by_inventory(nsites,sites,bc_in) end if end do - !call canopy_summarization(nsites, sites, bc_in) deallocate(inv_format_list, inv_pss_list, inv_css_list, inv_lat_list, inv_lon_list) diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index 045f64408d..55016e9acb 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -1906,7 +1906,6 @@ subroutine set_restart_vectors(this,nc,nsites,sites) use EDParamsMod, only : nclmax use EDTypesMod, only : numWaterMem use EDTypesMod, only : num_vegtemp_mem - use FatesConstantsMod, only : maxpft use FatesInterfaceTypesMod, only : nlevdamage ! Arguments @@ -2646,7 +2645,6 @@ subroutine create_patchcohort_structure(this, nc, nsites, sites, bc_in, bc_out) use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use FatesInterfaceTypesMod, only : hlm_current_tod, hlm_numSWb, numpft - use FatesConstantsMod, only : maxpft use EDTypesMod, only : area use EDInitMod, only : zero_site use EDInitMod, only : init_site_vars @@ -2846,7 +2844,6 @@ subroutine get_restart_vectors(this, nc, nsites, sites) use FatesInterfaceTypesMod, only : numpft use FatesInterfaceTypesMod, only : fates_maxElementsPerPatch use EDTypesMod, only : numWaterMem - use FatesConstantsMod, only : maxpft use EDTypesMod, only : num_vegtemp_mem use FatesSizeAgeTypeIndicesMod, only : get_age_class_index From e0311ca5bceef300eb83746f92bf39ed6c5e387a Mon Sep 17 00:00:00 2001 From: Adrianna Foster Date: Fri, 28 Jul 2023 16:00:56 -0600 Subject: [PATCH 117/125] Update biogeochem/EDCohortDynamicsMod.F90 Co-authored-by: Gregory Lemieux <7565064+glemieux@users.noreply.github.com> --- biogeochem/EDCohortDynamicsMod.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index 8e340ef33c..c4bfabdcf7 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -1413,7 +1413,6 @@ subroutine insert_cohort(currentPatch, pcc, ptall, pshort, tnull, snull, storebi storesmallcohort => icohort end if currentPatch%shortest => icohort - !icohort%patchptr%shortest => icohort else !new cohort is not shortest and becomes next taller cohort !to the cohort just below it as defined in the previous block From cf41e0afe3396e849ca3e41d6fae99c125c436b4 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 31 Jul 2023 17:32:19 -0700 Subject: [PATCH 118/125] fix spmode cohort height initialization --- main/EDInitMod.F90 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main/EDInitMod.F90 b/main/EDInitMod.F90 index daf502e1e7..8b76b604f4 100644 --- a/main/EDInitMod.F90 +++ b/main/EDInitMod.F90 @@ -801,6 +801,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) real(r8) :: canopy_trim ! fraction of the maximum leaf biomass that we are targeting [0-1] real(r8) :: cohort_n ! cohort density real(r8) :: dbh ! cohort dbh [cm] + real(r8) :: hite ! cohort height [m] real(r8) :: c_area ! cohort crown area [m2] real(r8) :: c_agw ! above ground (non-leaf) biomass [kgC] real(r8) :: c_bgw ! below ground (non-fineroot) biomss [kgC] @@ -922,19 +923,21 @@ subroutine init_cohorts(site_in, patch_in, bc_in) ! n.b. that this is the same as currentcohort%n = %initd(pft) &AREA cohort_n = cohort_n*sum(site_in%use_this_pft) endif + hite = EDPftvarcon_inst%hgt_min(pft) ! h, dbh, leafc, n from SP values or from small initial size if (hlm_use_sp .eq. itrue) then ! At this point, we do not know the bc_in values of tlai tsai and htop, ! so this is initializing to an arbitrary value for the very first timestep. ! Not sure if there's a way around this or not. - call calculate_SP_properties(0.5_r8, 0.2_r8, 0.1_r8, & + hite = 0.5_r8 + call calculate_SP_properties(hite, 0.2_r8, 0.1_r8, & patch_in%area, pft, crown_damage, 1, & EDPftvarcon_inst%vcmax25top(pft, 1), c_leaf, dbh, & cohort_n, c_area) else ! calculate the plant diameter from height - call h2d_allom(EDPftvarcon_inst%hgt_min(pft), pft, dbh) + call h2d_allom(hite, pft, dbh) ! Calculate the leaf biomass from allometry ! (calculates a maximum first, then applies canopy trim) @@ -1043,7 +1046,7 @@ subroutine init_cohorts(site_in, patch_in, bc_in) call prt%CheckInitialConditions() call create_cohort(site_in, patch_in, pft, cohort_n, & - EDPftvarcon_inst%hgt_min(pft), 0.0_r8, dbh, prt, efleaf_coh, & + hite, 0.0_r8, dbh, prt, efleaf_coh, & effnrt_coh, efstem_coh, leaf_status, recruitstatus, & canopy_trim, c_area, 1, crown_damage, site_in%spread, bc_in) From 67b8d0191d28da19e13d9f84cec82c61ff3fe82e Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 1 Aug 2023 12:50:48 -0700 Subject: [PATCH 119/125] Add comments and remove unnecessary dependence to yaml file --- tools/luh2/conda-luh2.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/luh2/conda-luh2.yml b/tools/luh2/conda-luh2.yml index 4caf2e341b..12d4a35c65 100644 --- a/tools/luh2/conda-luh2.yml +++ b/tools/luh2/conda-luh2.yml @@ -1,3 +1,6 @@ +# This yaml file is intended for users who wish to utilize the luh2.py tool on their own machines. +# The file is not yet tested regularly to determine if the latest versions of the dependencies will +# always work. This regular testing is expected to be implemented in the future. name: luh2 channels: - conda-forge @@ -6,5 +9,3 @@ dependencies: - xesmf # xarray which is autodownloaded as xesmf dependency, uses scipy, which needs netcdf4 to open datasets - netcdf4 - - pynco -prefix: /home/glemieux/local/conda/miniconda3/envs/luh2 From 63124fd1ef0422595e09b46a2b3bf759166d509e Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 1 Aug 2023 15:20:33 -0700 Subject: [PATCH 120/125] add luh2 readme --- tools/luh2/README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tools/luh2/README.md diff --git a/tools/luh2/README.md b/tools/luh2/README.md new file mode 100644 index 0000000000..60305c7ad1 --- /dev/null +++ b/tools/luh2/README.md @@ -0,0 +1,55 @@ +# FATES LUH2 data tool README + +## Purpose + +This tool takes the raw Land Use Harmonization (https://luh.umd.edu/), or LUH2, data files as +input and prepares them for use with FATES. The tool concatenates the various raw data sets into +a single file and provides the ability to regrid the source data resolution to a target +resolution that the user designates. The output data is then usable by FATES, mediated through +a host land model (currently either CTSM or E3SM). + +For more information on how FATES utilizes this information see https://github.com/NGEET/fates/pull/1040. + +## Installation + +This tool requires the usage of conda with python3. See https://docs.conda.io/en/latest/miniconda.html#installing +for information on installing conda on your system. To install the conda environment necessary to run the tool +execute the following commands: + +conda env create -f conda-luh2.yml + +This will create a conda environment named "luh2". To activate this environment run: + +conda activate luh2 + +For more information on creating conda environments see +https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-from-an-environment-yml-file + +Note that it is planned that a subset of host land model (hlm) and hlm supported machines will incoporate this tool into the surface dataset workflow. +As such, if you are working on one of these machines, the output from this tool may be precomputed and available for the grid resolution of interest. + +## Usage + +After activating the "luh2" environment the tool can be run from the command line with the following minimum required inputs: + +python luh2.py -l -s -r -w -o + +The description of the minimum required input arguments is as follows: +- raw-luh2-datafile: this is one of three raw luh2 datafiles, either states, transitions, or management. This is the data to be regridded and used by FATES. +- luh2-static-datafile: supplementary 0.25 deg resolution static data used in the construction of the raw luh2 datafiles. This is utilized to help set the gridcell mask for the output file. +- regrid-targetfile: host land model surface data file intended to be used in conjunction with the fates run at a specific grid resolution. This is used as the regridder target resolution. +- regridder-output: the path and filename to write out the regridding weights file or to use an existing regridding weights file. +- outputfile: the path and filename to which the output is written + +The tool is intended to be run three times, sequentially, to concatenate the raw states, transitions, and management data into a single file. After the first run of +the tool, a merge option should also be included in the argument list pointing to the most recent output file. This will ensure that the previous regridding run +will be merged into the current run as well as reusing the previously output regridding weights file (to help reduce duplicate computation). +The luh2.sh file in this directory provides an example shell script in using the python tool in this sequential manner. The python tool itself provides additional +help by passing the `--help` option argument to the command line call. + +## Description of directory contents + +- luh2.py: main luh2 python script +- luh2mod.py: python module source file for the functions called in luh2.py +- luh2.sh: example bash shell script file demonstrating how to call luh2.py +- conda-luh2.yml: conda enviroment yaml file which defines the minimum set of package dependencies for luh2.py From e44bc90ffb895100051b7ed6305a4fa3625c5db9 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 1 Aug 2023 15:33:17 -0700 Subject: [PATCH 121/125] remove old comments --- tools/luh2/luh2mod.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/tools/luh2/luh2mod.py b/tools/luh2/luh2mod.py index 83ff10e40f..4a283382b8 100644 --- a/tools/luh2/luh2mod.py +++ b/tools/luh2/luh2mod.py @@ -93,8 +93,6 @@ def DimensionFixSurfData(input_dataset): input_dataset = input_dataset.rename_dims(dims_dict={'lsmlat':'lat','lsmlon':'lon'}) # Populate the new surface dataset with the actual lat/lon values - # input_dataset['longitude'] = input_dataset.LONGXY.isel(latitude=0) - # input_dataset['latitude'] = input_dataset.LATIXY.isel(longitude=0) input_dataset['lon'] = input_dataset.LONGXY.isel(lat=0) input_dataset['lat'] = input_dataset.LATIXY.isel(lon=0) @@ -102,20 +100,6 @@ def DimensionFixSurfData(input_dataset): return(input_dataset) -# def SetMask(input_dataset, masking_dataset): - -# # check what sort of inputdata is being provided; surface dataset or luh2 -# # LUH2 data will need to be masked based on the variable input to mask -# dsflag,dstype = CheckDataset(input_dataset) -# if (dsflag): -# if(dstype == "LUH2"): -# SetMaskLUH2(input_dataset) # temporary -# elif(dstype == "Surface"): -# SetMaskSurfData(input_dataset) -# print("mask added") -# -# return(input_dataset) - # LUH2 specific masking sub-function def SetMaskLUH2(input_dataset,static_data_set): @@ -244,15 +228,3 @@ def CorrectStateSum(input_dataset): input_dataset["stscf"] = 1.0 / state_sum return(input_dataset) - -# General functionality needed -# - collect data for specific user-defined time period -# - collect subset of the data variables (e.g. pasture, rangeland, etc) -# - write the subset to the necessary format to pass to regridding tools -# - This may need to be specific to the particular hlm tooling -# - call regridding tooling in hlm model -# - this will need to point at existing mapping data files, which are external to hlm -# - this may need a new mksurf_xxxx module if it can't conform to existing modules due -# to needing to use new fields -# future functionality: -# - importdata function for aforestation and other data to add to luh2 data From 4615b8a6a16462c6712d81939a2e9e3c89eff50c Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 1 Aug 2023 15:44:41 -0700 Subject: [PATCH 122/125] Add system exit if unrecognized file type provided as argument --- tools/luh2/luh2mod.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/luh2/luh2mod.py b/tools/luh2/luh2mod.py index 4a283382b8..29691bfbe2 100644 --- a/tools/luh2/luh2mod.py +++ b/tools/luh2/luh2mod.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -import re +import re, sys import numpy as np import xarray as xr import xesmf as xe @@ -138,7 +138,7 @@ def CheckDataset(input_dataset): dsflag = True else: dstype = 'Unknown' - print("Unrecognize data set") + sys.exit("CheckDataSetError: Unrecognize data set") return(dsflag,dstype) From 8cbb7ab204c2f2eb397d2cfec1da8f3471506da6 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 1 Aug 2023 17:22:16 -0700 Subject: [PATCH 123/125] update luh2 tool argparse options and time handling Adding 'default' and 'required' option as necessary to the argparse. This helps remove some of the luh2mod code that was previously handling default options. This also adds code to handle non-historical luh2 data file input arguments. Prior to this, it was assumed that only historical data files starting at 0850-01-01 were to be used. Now this can handle luh2 scenario files. It also adds time bounds error handling. --- tools/luh2/luh2.py | 45 +++++++++++++++++++------------- tools/luh2/luh2mod.py | 60 ++++++++++++++++++++++++++++--------------- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 13d516cefa..3f31038565 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -79,14 +79,7 @@ def main(): # Write the files # TO DO: add check to handle if the user enters the full path - # TO DO: add check if user sets the output the same as the input - if (args.output == None): - output_filename = 'LUH2_timeseries.nc' - else: - output_filename = args.output - - - output_file = os.path.join(os.getcwd(),output_filename) + output_file = os.path.join(os.getcwd(),args.output) print("generating output: {}".format(output_file)) regrid_luh2.to_netcdf(output_file) @@ -96,29 +89,45 @@ def CommandLineArgs(): # Required input luh2 datafile # TO DO: using the checking function to report back if invalid file input - parser.add_argument("-l","--luh2_file", required=True) + parser.add_argument("-l","--luh2_file", + required=True, + help = "luh2 raw states, transitions, or management data file") # Required static luh2 data to get the ice/water fraction for masking - parser.add_argument("-s", "--luh2_static_file", required=True) + parser.add_argument("-s", "--luh2_static_file", + required=True, + help = "luh2 static data file") # File to use as regridder target (e.g. a surface dataset) - parser.add_argument("-r","--regridder_target_file", required=True) + parser.add_argument("-r","--regridder_target_file", + required=True, + help = "target file with desired resolution to regrid luh2 data to") # Filename to use or save for the regridder weights - parser.add_argument("-w", "--regridder_weights", required=True) + parser.add_argument("-w", "--regridder_weights", + default = 'regridder.nc', + help = "filename of regridder weights to write to or reuse (if -m option used)") # Optional input to subset the time range of the data # TODO: add support for parsing the input and checking against the allowable date range - parser.add_argument("-b","--begin", type=int, choices=range(850,2016), - help="beginning of date range to slice (allowable range is 0850-2015)") - parser.add_argument("-e","--end", type=int, choices=range(850,2016), - help="ending of date range to slice (allowable range is 0850-2015)") + parser.add_argument("-b","--begin", + type = int, + default = None, + help = "beginning of date range of interest") + parser.add_argument("-e","--end", + type = int, + default = None, + help = "ending of date range to slice") # Optional output argument - parser.add_argument("-o","--output") + parser.add_argument("-o","--output", + default = 'LUH2_timeseries.nc', + help = "output filename") # Optional merge argument to enable merging of other files - parser.add_argument("-m", "--luh2_merge_file") + parser.add_argument("-m", "--luh2_merge_file", + default = None, + help = "previous luh2 output filename to merge into current run output") args = parser.parse_args() diff --git a/tools/luh2/luh2mod.py b/tools/luh2/luh2mod.py index 29691bfbe2..c8534d42a9 100644 --- a/tools/luh2/luh2mod.py +++ b/tools/luh2/luh2mod.py @@ -22,28 +22,49 @@ def ImportData(input_file,start=None,stop=None,merge_flag=False): # Prepare the input_file to be used for regridding def PrepDataset(input_dataset,start=None,stop=None,merge_flag=False): - # Use the maximum span if start and stop are not present + # Check that the input dataset is a valid type dsflag, dstype = CheckDataset(input_dataset) - + + # Use the maximum span if start and stop are not present + # This assumes that the luh2 raw data will always use a + # 'years since' style format. if(not(dstype in ('static','regrid'))): - if (isinstance(start,type(None))): - start = input_dataset.time[0] - if (isinstance(stop,type(None))): - stop = input_dataset.time[-1] + if (dstype == 'LUH2'): + # Get the units to determine the file time + # It is expected that the units of time is 'years since ...' + time_since_array = input_dataset.time.units.split() + if (time_since_array[0] != 'years'): + sys.exit("FileTimeUnitsError: input file units of time is not 'years since ...'") + + # Note that datetime package is not used as the date range might + # be beyond the bounds of the packages applicable bounds + time_since = int(time_since_array[2].split('-')[0]) + + # Get the time bounds of the input file + start_bound = input_dataset.time.values[0] + stop_bound = input_dataset.time.values[-1] + + # If no input provided, simply get the bounds of the time + if (isinstance(start,type(None))): + start = start_bound + time_since + + if (isinstance(stop,type(None))): + stop = stop_bound + time_since + + # Convert the input dates to years since 0850 + years_since_start = start - time_since + years_since_stop = stop - time_since - # Convert the date to years since 0850 - years_since_start = start - 850 - years_since_stop = stop - 850 + # Abort if the times provided are outside the applicable range + if (years_since_start < start_bound or years_since_stop < start_bound or + years_since_start > stop_bound or years_since_stop > stop_bound): + sys.exit("StartStopBoundError: the input start or stop date is outside the applicable range of {} to {}".format(time_since+start_bound,time_since+stop_bound)) - # Truncate the data to the user defined range - # This might need some more error handling for when - # the start/stop is out of range - try: + # Truncate the data to the user defined range + # This might need some more error handling for when + # the start/stop is out of range input_dataset = input_dataset.sel(time=slice(years_since_start,years_since_stop)) - except TypeError as type_err: - print("Input must be a string\n") - raise TypeError(type_err) # Correct the necessary variables for both datasets # We don't need to Prep the incoming dataset if it's being opened to merge @@ -59,7 +80,7 @@ def PrepDataset_ESMF(input_dataset,dsflag,dstype): if(dstype == "LUH2"): print("PrepDataset: LUH2") input_dataset = BoundsVariableFixLUH2(input_dataset) - elif(dstype == "Surface"): + elif(dstype == "surface"): print("PrepDataset: SurfData") input_dataset = DimensionFixSurfData(input_dataset) print("data set updated for xESMF\n") @@ -89,7 +110,6 @@ def BoundsVariableFixLUH2(input_dataset): def DimensionFixSurfData(input_dataset): # Rename the surface dataset dimensions to something recognizable by xESMF. - # input_dataset = surfdataset.rename_dims(dims_dict={'lsmlat':'latitude','lsmlon':'longitude'}) input_dataset = input_dataset.rename_dims(dims_dict={'lsmlat':'lat','lsmlon':'lon'}) # Populate the new surface dataset with the actual lat/lon values @@ -105,14 +125,12 @@ def SetMaskLUH2(input_dataset,static_data_set): # Mask the luh2 data where the ice/water fraction is unity (i.e. fully ice covered gridcell) input_dataset["mask"] = (static_data_set.icwtr != 1) - # return(outputdataset) return(input_dataset) # Surface dataset specific masking sub-function def SetMaskSurfData(input_dataset): # Instead of passing the label_to_mask, loop through this for all labels? input_dataset["mask"] = input_dataset["PCT_NATVEG"] > 0 - # return(outputdataset) return(input_dataset) # Check which dataset we're working with @@ -127,7 +145,7 @@ def CheckDataset(input_dataset): dsflag = True print("LUH2") elif('natpft' in dsvars): - dstype = 'Surface' + dstype = 'surface' dsflag = True print("Surface") elif('icwtr' in dsvars): From 9cbfe4f0a10196e7805aec032205746b455eb92b Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 2 Aug 2023 14:42:46 -0700 Subject: [PATCH 124/125] update the usage description in luh2.py --- tools/luh2/luh2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/luh2/luh2.py b/tools/luh2/luh2.py index 3f31038565..d0cd91afec 100644 --- a/tools/luh2/luh2.py +++ b/tools/luh2/luh2.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 # LUH2 python script -# Usage: python luh2.py -l -s +# Usage: python luh2.py -l -s \ +# -r -w -o import argparse, os, sys from luh2mod import ImportData, SetMaskLUH2, SetMaskSurfData From a6c3a74486fa4a1de574b4ec7e799d1299f1957d Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 7 Aug 2023 16:48:42 -0600 Subject: [PATCH 125/125] remove duplicate calculation of leaf_c --- biogeochem/EDPhysiologyMod.F90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 9aaf9d3d80..b0dca899f7 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -2013,9 +2013,6 @@ subroutine assign_cohort_SP_properties(currentCohort, htop, tlai, tsai, parea, i currentCohort%treelai = tlai currentCohort%treesai = tsai - leaf_c = leafc_from_treelai(tlai, currentCohort%pft, currentCohort%c_area, & - currentCohort%n, currentCohort%canopy_layer, currentCohort%vcmax25top) - if (init .eq. ifalse) then call SetState(currentCohort%prt, leaf_organ, carbon12_element, leaf_c, 1) endif