The algorithms for the Modularized Flux Testbed (MFT) can be downloaded through this web site or taken from our public FTP site (anonymous FTP to coaps.fsu.edu, change directories to pub/bourasssa/mft).

The following files can be used to call the MFT library from 'Python'.

MFT23.py: the library of algorithms,

The programs test_MFT.py (fluxes and height adjustment) can be used to test the installation. The input data in testdata_MFT.dat (the first matrix in the file) can be used to verify that the code is working. The same file has output data from test_MFT.py in the 2nd matrix in the file.

testdata_MFT.dat: input and output data for the test_MFT program.

stability_analysis_CD.py: program for plotting the drag coefficient as a function of wind speed for a set of air-sea temperature differences. This code allows the user to easily examine how different parameterizations and/or the inclusion of physical processes influences the drag coeffient.

stability_analysis_CH.py: program for plotting the heat transfer coefficient as a function of wind speed for a set of air-sea temperature differences. This code allows the user to easily examine how different parameterizations and/or the inclusion of physical processes influences the heat transfer coeffient.

Use of the Test Routine

This code is designed for Linux systems, and might have to be modified for other platforms. The test_MFT program can be used to check for compiler related changes in output. The test_MFT code also demonstrates how to call the main MFT routines. The test_MFT program reads in data from the file testdata_MFT.dat, and outputs to the screen. This output should match the second table in the file testdata_MFT.dat.

Example Variable Declaration and Calls

It is a lot easier to program if you have examples, and even better if you can cut and paste. These examples are taken from the test_MFT codes.

MFT_fluxes Example

from __future__ import print_function
from MFT23.py import *
import sys

flux_model = -1         #BVW model=0; negative numbers use the options below  
z0_mom_prm = 6          # https://www.coaps.fsu.edu/~bourassa/MFT_html/ht_adj_docs.php#z0_mom_prm 
z0_TQ_prm = 1           # https://www.coaps.fsu.edu/~bourassa/MFT_html/ht_adj_docs.php#z0_TQ_prm 
stable_prm = 3          # https://www.coaps.fsu.edu/~bourassa/MFT_html/ht_adj_docs.php#stable_prm 

warn = 0                #warning are given for 1, and are hidden for 0     
eqv_neut = 0            #output winds are winds rather than equivalent neutral winds  
z_wanted = 10.0         #height to which winds, potential temp, and humidity are adjusted  
Qnet = 5.0              # not used (in development for cool skin layer)  
sst_prm = 0             # not used (in development for cool skin layer)  
oil_fract_area = 0.0    # Fraction of surface covered by oil 
z_over_L = 0.0
zo_m = [0.0000, 0.0000]
sfc_current1 = 0.0
sfc_current2 = 0.0
missing = -9999.0

try:
    data_file = open("testdata12.dat", "r")
except IOError:
    print("Could not read file.")
    sys.exit()
       
data_file.readline()
print( "run  U   |ustar| ustar1 ustar2 tstar   qstar     zref/L     cp     wa   Hsig   tau1   tau2    shf   lhf    u(z)   v(z)   t(z)   q(z)   z0")
for x in range(0,62):
    data_in_row = data_file.readline().split()
    for a in [2, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16]:
        data_in_row[a] = float(data_in_row[a])
    for b in [0, 1, 4, 6, 8, 17]:
        data_in_row[b] = int(data_in_row[b])
       
    if len(data_in_row) == 18 : 
        num, dyn_in_prm, dyn_in_val, dyn_in_val2, ss_prm, ss_val, air_moist_prm, air_moist_val, sfc_moist_prm, sfc_moist_val, t_skin, t_air, ref_ht_wind, ref_ht_tq, pressure, salinity, CONVECT, astab = data_in_row
           
        count, shf, lhf, tau, u_star, t_star, q_star, z_over_L, wave_age, dom_phase_spd, hsig, zo_out, 
                u_at_z, t_at_z, q_at_z = MFT_fluxes( dyn_in_prm, dyn_in_val, dyn_in_val2, sfc_current1, sfc_current2, CONVECT, 
                pressure, air_moist_prm, air_moist_val, sfc_moist_prm, sfc_moist_val,
                salinity, ss_prm, ss_val, t_air, sst_prm, t_skin, ref_ht_wind, ref_ht_tq,
                z_wanted, astab, eqv_neut_prm, Qnet, warn, flux_model, z0_mom_prm, z0_TQ_prm, stable_prm,
                oil_fract_area, z_over_L, zo_m, missing )
       
        if count <= 1 :
            print("non-convergence:" )

        print( "%2i %5.2f %6.3f %6.3f %6.3f %7.4f %9.6f %8.5f %6.2f %6.2f %5.2f %6.3f %6.3f %6.2f %6.2f %6.2f %6.2f %6.3f %8.6f"  
            (x+1, dyn_in_val, m.sqrt( u_star[0] * u_star[0] + u_star[1] * u_star[1] ),
            u_star[0], u_star[1], t_star, q_star, z_over_L, dom_phs_spd,
            wave_age, h_sig,tau[0], tau[1], shf, lhf, u_at_z[0], u_at_z[1], t_at_z, q_at_z, zo_out), sep="")

Additional Information

The bulk of the documentation is in the subroutine pmix.

Status: ht_adj and MFT_fluxes are appear to be robust for fluxes, but there are a few combinations of options that don't work together. That wave output is clearly wrong (it will be fixed in a future update).

Warnings:

1) There are very few checks on the range of input parameters: unbelievable input will result in unbelievable output and/or crash the code. I plan to make the code more robust to bad input.

2) Use the output count. If it is zero or less, there is a problem. In some cases the fluxes are near zero, but in other cases they are grossly unreliable.

3) Taylor and Yelland parameterization is based on questionable assumptions about sea state.

Last update: 22 Sept. 2023


home page
URL research
URL publications URL scatterometry URL flux
model URL contact info URL