'''
The Coder Templates module provides templates that suport code generation in coder.py classes.
'''
__all__ = ['create_calib_c_template',
'create_calib_h_template',
'create_calib_pyx_template',
'create_code_for_born_functions',
'create_code_for_debye_function',
'create_code_for_dh_functions',
'create_fast_c_template',
'create_fast_h_template',
'create_fast_pyx_template',
'create_pyxbld_template',
'create_redundant_calib_TV_template',
'create_redundant_function_template',
'create_soln_calc_template',
'create_soln_calib_code_template',
'create_soln_calib_extra_template',
'create_soln_calib_include_template',
'create_soln_calib_pyx_template',
'create_soln_calib_template',
'create_soln_deriv_template',
'create_soln_fast_code_template',
'create_soln_fast_include_template',
'create_soln_fast_pyx_template',
'create_soln_pyxbld_template',
'create_soln_redun_template',
'create_soln_std_state_include_template',
'create_ordering_gaussj_template',
'create_ordering_code_template',
'create_complx_soln_calc_template',
'create_complx_soln_calib_template',
'create_speciation_code_template',
'create_speciation_ordering_code_template'
]
##############################
# Generic External Functions #
##############################
[docs]def create_calib_c_template(language='C'):
"""
Retrieves template for a C function file that implements calibration
mode calculation of model functions for a specific phase instance.
The calibration functions expose the model parameters using getters and
setters, which otherwise are fixed as constants in the *fast* routines,
allowing the compiler to optimize the resulting code.
The user does not normally call this function directly.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_calib_c_template_c()
elif language == 'C++':
return _create_calib_c_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_calib_h_template(language='C'):
"""
Retrieves template for an include file that implements calibration mode
calculation of model functions for a specific phase instance.
The calibration functions expose the model parameters using getters and
setters, which otherwise are fixed as constants in the *fast* routines,
allowing the compiler to optimize the resulting code.
The user does not normally call this function directly.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_calib_h_template_c()
elif language == 'C++':
return _create_calib_h_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_calib_pyx_template(language='C'):
"""
Retrieves calib code template for cython pyx file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_calib_pyx_template_c()
elif language == 'C++':
return _create_calib_pyx_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_code_for_born_functions(language='C'):
"""
Retrieves code that provides a reference to the Born functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_code_for_born_functions_c()
elif language == 'C++':
return _create_code_for_born_functions_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_code_for_debye_function(language='C'):
"""
Retrieves a block of code that provides an implementation of the Debye
function.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_code_for_debye_function_c()
elif language == 'C++':
return _create_code_for_debye_function_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_code_for_dh_functions(language='C'):
"""
Retrieves code that provides a reference to the Debye-Hückel
solvent functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_code_for_dh_functions_c()
elif language == 'C++':
return _create_code_for_dh_functions_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_fast_c_template(language='C'):
"""
Retrieves template for a C function file that implements fast
calculation of model functions for a specific phase instance.
The user does not normally call this function directly.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_fast_c_template_c()
elif language == 'C++':
return _create_fast_c_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_fast_h_template(language='C'):
"""
Retrieves template for an include file that implements fast calculation
of model functions for a specific phase instance.
The user does not normally call this function directly.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_fast_h_template_c()
elif language == 'C++':
return _create_fast_h_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_fast_pyx_template(language='C'):
"""
Retrieves fast code template for cython pyx file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_fast_pyx_template_c()
elif language == 'C++':
return _create_fast_pyx_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_pyxbld_template(language='C'):
"""
Retrieves template for cython pyxbld file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_pyxbld_template_c()
elif language == 'C++':
return _create_pyxbld_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_redundant_calib_TV_template(language='C'):
"""
Retrieves template for redundant thermodynamic functions associated with
Helmholtz models.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_redundant_calib_TV_template_c()
elif language == 'C++':
return _create_redundant_calib_TV_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_redundant_function_template(language='C', model_type='TP'):
"""
Retrieves template for redundant thermodynamic functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
model_type: string
Potential type, either Gibbs free energy ('TP') or Helmholtz free
energy ('TV')
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_redundant_function_template_c(model_type=model_type)
elif language == 'C++':
return _create_redundant_function_template_cpp(model_type=model_type)
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_calc_template(language='C'):
"""
Retrieves template for solution functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_calc_template_c()
elif language == 'C++':
return _create_soln_calc_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_calib_code_template(language='C'):
"""
Retrieves template for calibration code solution template.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_calib_code_template_c()
elif language == 'C++':
return _create_soln_calib_code_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_calib_include_template(language='C'):
"""
Retrieves template for calibration include file solution template.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_calib_include_template_c()
elif language == 'C++':
return _create_soln_calib_include_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_calib_pyx_template(language='C'):
"""
Retrieves calib solution code template for cython pyx file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_calib_pyx_template_c()
elif language == 'C++':
return _create_soln_calib_pyx_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_calib_template(language='C'):
"""
Retrieves template for solution calibration functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_calib_template_c()
elif language == 'C++':
return _create_soln_calib_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_deriv_template(language='C'):
"""
Retrieves template for solution derivative functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_deriv_template_c()
elif language == 'C++':
return _create_soln_deriv_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_fast_code_template(language='C'):
"""
Retrieves template for fast code solution template.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_fast_code_template_c()
elif language == 'C++':
return _create_soln_fast_code_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_fast_include_template(language='C'):
"""
Retrieves template for fast include file solution template.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_fast_include_template_c()
elif language == 'C++':
return _create_soln_fast_include_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_fast_pyx_template(language='C'):
"""
Retrieves fast solution code template for cython pyx file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_fast_pyx_template_c()
elif language == 'C++':
return _create_soln_fast_pyx_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_pyxbld_template(language='C'):
"""
Retrieves template for cython solution pyxbld file.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_pyxbld_template_c()
elif language == 'C++':
return _create_soln_pyxbld_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_redun_template(language='C'):
"""
Retrieves template for solution redundant functions.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_redun_template_c()
elif language == 'C++':
return _create_soln_redun_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_soln_std_state_include_template(language='C'):
"""
Retrieves template for standard state properties include template.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_soln_std_state_include_template_c()
elif language == 'C++':
return _create_soln_std_state_include_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_ordering_gaussj_template(language='C'):
"""
Retrieves template for generation of guassj code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_ordering_gaussj_template_c()
elif language == 'C++':
return _create_ordering_gaussj_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_ordering_code_template(language='C'):
"""
Retrieves template for generation of ordering code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_ordering_code_template_c()
elif language == 'C++':
return _create_ordering_code_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_complx_soln_calc_template(language='C'):
"""
Retrieves template for generation of solution property code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_complx_soln_calc_template_c()
elif language == 'C++':
return _create_complx_soln_calc_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_complx_soln_calib_template(language='C'):
"""
Retrieves template for generation of solution property code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_complx_soln_calib_template_c()
elif language == 'C++':
return _create_complx_soln_calib_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_speciation_code_template(language='C'):
"""
Retrieves template for generation of speciation code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_speciation_code_template_c()
elif language == 'C++':
return _create_speciation_code_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
[docs]def create_speciation_ordering_code_template(language='C'):
"""
Retrieves template for generation of speciation ordering code.
Parameters
----------
language : string
Language syntax for generated code, ("C" is the C99 programming
language)
Returns
-------
string :
The template string.
"""
if language == 'C':
return _create_speciation_ordering_code_template_c()
elif language == 'C++':
return _create_speciation_ordering_code_template_cpp()
else:
raise NotImplementedError('Language not implemented.')
return ""
##############################
# Standard State C templates #
##############################
def _create_calib_c_template_c():
"""
C language implementation of create_calib_c_template()
Returns
-------
string :
The template string.
"""
return """\
static char *identifier = "{git_identifier}";
{parameter_init_block}
{include_calc_h}
{include_calib_h}
const char *{phase}_{module}_calib_identifier(void) {{
return identifier;
}}
const char *{phase}_{module}_calib_name(void) {{
return "{phase}";
}}
const char *{phase}_{module}_calib_formula(void) {{
return "{formula}";
}}
const double {phase}_{module}_calib_mw(void) {{
return {mw};
}}
static const double elmformula[106] = {{
{elmvector[0]},{elmvector[1]},{elmvector[2]},{elmvector[3]},{elmvector[4]},{elmvector[5]},
{elmvector[6]},{elmvector[7]},{elmvector[8]},{elmvector[9]},{elmvector[10]},{elmvector[11]},
{elmvector[12]},{elmvector[13]},{elmvector[14]},{elmvector[15]},{elmvector[16]},{elmvector[17]},
{elmvector[18]},{elmvector[19]},{elmvector[20]},{elmvector[21]},{elmvector[22]},{elmvector[23]},
{elmvector[24]},{elmvector[25]},{elmvector[26]},{elmvector[27]},{elmvector[28]},{elmvector[29]},
{elmvector[30]},{elmvector[31]},{elmvector[32]},{elmvector[33]},{elmvector[34]},{elmvector[35]},
{elmvector[36]},{elmvector[37]},{elmvector[38]},{elmvector[39]},{elmvector[40]},{elmvector[41]},
{elmvector[42]},{elmvector[43]},{elmvector[44]},{elmvector[45]},{elmvector[46]},{elmvector[47]},
{elmvector[48]},{elmvector[49]},{elmvector[50]},{elmvector[51]},{elmvector[52]},{elmvector[53]},
{elmvector[54]},{elmvector[55]},{elmvector[56]},{elmvector[57]},{elmvector[58]},{elmvector[59]},
{elmvector[60]},{elmvector[61]},{elmvector[62]},{elmvector[63]},{elmvector[64]},{elmvector[65]},
{elmvector[66]},{elmvector[67]},{elmvector[68]},{elmvector[69]},{elmvector[70]},{elmvector[71]},
{elmvector[72]},{elmvector[73]},{elmvector[74]},{elmvector[75]},{elmvector[76]},{elmvector[77]},
{elmvector[78]},{elmvector[79]},{elmvector[80]},{elmvector[81]},{elmvector[82]},{elmvector[83]},
{elmvector[84]},{elmvector[85]},{elmvector[86]},{elmvector[87]},{elmvector[88]},{elmvector[89]},
{elmvector[90]},{elmvector[91]},{elmvector[92]},{elmvector[93]},{elmvector[94]},{elmvector[95]},
{elmvector[96]},{elmvector[97]},{elmvector[98]},{elmvector[99]},{elmvector[100]},{elmvector[101]},
{elmvector[102]},{elmvector[103]},{elmvector[104]},{elmvector[105]}
}};
const double *{phase}_{module}_calib_elements(void) {{
return elmformula;
}}
double {phase}_{module}_calib_g(double T, double P) {{
return {module}_g(T, P);
}}
double {phase}_{module}_calib_dgdt(double T, double P) {{
return {module}_dgdt(T, P);
}}
double {phase}_{module}_calib_dgdp(double T, double P) {{
return {module}_dgdp(T, P);
}}
double {phase}_{module}_calib_d2gdt2(double T, double P) {{
return {module}_d2gdt2(T, P);
}}
double {phase}_{module}_calib_d2gdtdp(double T, double P) {{
return {module}_d2gdtdp(T, P);
}}
double {phase}_{module}_calib_d2gdp2(double T, double P) {{
return {module}_d2gdp2(T, P);
}}
double {phase}_{module}_calib_d3gdt3(double T, double P) {{
return {module}_d3gdt3(T, P);
}}
double {phase}_{module}_calib_d3gdt2dp(double T, double P) {{
return {module}_d3gdt2dp(T, P);
}}
double {phase}_{module}_calib_d3gdtdp2(double T, double P) {{
return {module}_d3gdtdp2(T, P);
}}
double {phase}_{module}_calib_d3gdp3(double T, double P) {{
return {module}_d3gdp3(T, P);
}}
double {phase}_{module}_calib_s(double T, double P) {{
return {module}_s(T, P);
}}
double {phase}_{module}_calib_v(double T, double P) {{
return {module}_v(T, P);
}}
double {phase}_{module}_calib_cv(double T, double P) {{
return {module}_cv(T, P);
}}
double {phase}_{module}_calib_cp(double T, double P) {{
return {module}_cp(T, P);
}}
double {phase}_{module}_calib_dcpdt(double T, double P) {{
return {module}_dcpdt(T, P);
}}
double {phase}_{module}_calib_alpha(double T, double P) {{
return {module}_alpha(T, P);
}}
double {phase}_{module}_calib_beta(double T, double P) {{
return {module}_beta(T, P);
}}
double {phase}_{module}_calib_K(double T, double P) {{
return {module}_K(T, P);
}}
double {phase}_{module}_calib_Kp(double T, double P) {{
return {module}_Kp(T, P);
}}
int {phase}_{module}_get_param_number(void) {{
return {module}_get_param_number();
}}
const char **{phase}_{module}_get_param_names(void) {{
return {module}_get_param_names();
}}
const char **{phase}_{module}_get_param_units(void) {{
return {module}_get_param_units();
}}
void {phase}_{module}_get_param_values(double **values) {{
{module}_get_param_values(values);
}}
int {phase}_{module}_set_param_values(double *values) {{
return {module}_set_param_values(values);
}}
double {phase}_{module}_get_param_value(int index) {{
return {module}_get_param_value(index);
}}
int {phase}_{module}_set_param_value(int index, double value) {{
return {module}_set_param_value(index, value);
}}
double {phase}_{module}_dparam_g(double T, double P, int index) {{
return {module}_dparam_g(T, P, index);
}}
double {phase}_{module}_dparam_dgdt(double T, double P, int index) {{
return {module}_dparam_dgdt(T, P, index);
}}
double {phase}_{module}_dparam_dgdp(double T, double P, int index) {{
return {module}_dparam_dgdp(T, P, index);
}}
double {phase}_{module}_dparam_d2gdt2(double T, double P, int index) {{
return {module}_dparam_d2gdt2(T, P, index);
}}
double {phase}_{module}_dparam_d2gdtdp(double T, double P, int index) {{
return {module}_dparam_d2gdtdp(T, P, index);
}}
double {phase}_{module}_dparam_d2gdp2(double T, double P, int index) {{
return {module}_dparam_d2gdp2(T, P, index);
}}
double {phase}_{module}_dparam_d3gdt3(double T, double P, int index) {{
return {module}_dparam_d3gdt3(T, P, index);
}}
double {phase}_{module}_dparam_d3gdt2dp(double T, double P, int index) {{
return {module}_dparam_d3gdt2dp(T, P, index);
}}
double {phase}_{module}_dparam_d3gdtdp2(double T, double P, int index) {{
return {module}_dparam_d3gdtdp2(T, P, index);
}}
double {phase}_{module}_dparam_d3gdp3(double T, double P, int index) {{
return {module}_dparam_d3gdp3(T, P, index);
}}
\
"""
def _create_calib_h_template_c():
"""
C language implementation of create_calib_h_template()
Returns
-------
string :
The template string.
"""
return """\
const char *{phase}_{module}_calib_identifier(void);
const char *{phase}_{module}_calib_name(void);
const char *{phase}_{module}_calib_formula(void);
const double {phase}_{module}_calib_mw(void);
const double *{phase}_{module}_calib_elements(void);
double {phase}_{module}_calib_g(double T, double P);
double {phase}_{module}_calib_dgdt(double T, double P);
double {phase}_{module}_calib_dgdp(double T, double P);
double {phase}_{module}_calib_d2gdt2(double T, double P);
double {phase}_{module}_calib_d2gdtdp(double T, double P);
double {phase}_{module}_calib_d2gdp2(double T, double P);
double {phase}_{module}_calib_d3gdt3(double T, double P);
double {phase}_{module}_calib_d3gdt2dp(double T, double P);
double {phase}_{module}_calib_d3gdtdp2(double T, double P);
double {phase}_{module}_calib_d3gdp3(double T, double P);
double {phase}_{module}_calib_s(double T, double P);
double {phase}_{module}_calib_v(double T, double P);
double {phase}_{module}_calib_cv(double T, double P);
double {phase}_{module}_calib_cp(double T, double P);
double {phase}_{module}_calib_dcpdt(double T, double P);
double {phase}_{module}_calib_alpha(double T, double P);
double {phase}_{module}_calib_beta(double T, double P);
double {phase}_{module}_calib_K(double T, double P);
double {phase}_{module}_calib_Kp(double T, double P);
int {phase}_{module}_get_param_number(void);
const char **{phase}_{module}_get_param_names(void);
const char **{phase}_{module}_get_param_units(void);
void {phase}_{module}_get_param_values(double **values);
int {phase}_{module}_set_param_values(double *values);
double {phase}_{module}_get_param_value(int index);
int {phase}_{module}_set_param_value(int index, double value);
double {phase}_{module}_dparam_g(double T, double P, int index);
double {phase}_{module}_dparam_dgdt(double T, double P, int index);
double {phase}_{module}_dparam_dgdp(double T, double P, int index);
double {phase}_{module}_dparam_d2gdt2(double T, double P, int index);
double {phase}_{module}_dparam_d2gdtdp(double T, double P, int index);
double {phase}_{module}_dparam_d2gdp2(double T, double P, int index);
double {phase}_{module}_dparam_d3gdt3(double T, double P, int index);
double {phase}_{module}_dparam_d3gdt2dp(double T, double P, int index);
double {phase}_{module}_dparam_d3gdtdp2(double T, double P, int index);
double {phase}_{module}_dparam_d3gdp3(double T, double P, int index);
\
"""
def _create_calib_pyx_template_c():
"""
C language implementation of create_calib_pyx_template()
Returns
-------
string :
The template string.
"""
return """\
# Cython numpy wrapper code for arrays is taken from:
# http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html
# Author: Gael Varoquaux, BSD license
# cython: language_level=3
# Declare the prototype of the C functions
cdef extern from "{phase}_{module}_calib.h":
const char *{phase}_{module}_calib_identifier();
const char *{phase}_{module}_calib_name();
const char *{phase}_{module}_calib_formula();
const double {phase}_{module}_calib_mw();
const double *{phase}_{module}_calib_elements();
double {phase}_{module}_calib_g(double t, double p);
double {phase}_{module}_calib_dgdt(double t, double p);
double {phase}_{module}_calib_dgdp(double t, double p);
double {phase}_{module}_calib_d2gdt2(double t, double p);
double {phase}_{module}_calib_d2gdtdp(double t, double p);
double {phase}_{module}_calib_d2gdp2(double t, double p);
double {phase}_{module}_calib_d3gdt3(double t, double p);
double {phase}_{module}_calib_d3gdt2dp(double t, double p);
double {phase}_{module}_calib_d3gdtdp2(double t, double p);
double {phase}_{module}_calib_d3gdp3(double t, double p);
double {phase}_{module}_calib_s(double t, double p);
double {phase}_{module}_calib_v(double t, double p);
double {phase}_{module}_calib_cv(double t, double p);
double {phase}_{module}_calib_cp(double t, double p);
double {phase}_{module}_calib_dcpdt(double t, double p);
double {phase}_{module}_calib_alpha(double t, double p);
double {phase}_{module}_calib_beta(double t, double p);
double {phase}_{module}_calib_K(double t, double p);
double {phase}_{module}_calib_Kp(double t, double p);
int {phase}_{module}_get_param_number();
const char **{phase}_{module}_get_param_names();
const char **{phase}_{module}_get_param_units();
void {phase}_{module}_get_param_values(double **values);
int {phase}_{module}_set_param_values(double *values);
double {phase}_{module}_get_param_value(int index);
int {phase}_{module}_set_param_value(int index, double value);
double {phase}_{module}_dparam_g(double t, double p, int index);
double {phase}_{module}_dparam_dgdt(double t, double p, int index);
double {phase}_{module}_dparam_dgdp(double t, double p, int index);
double {phase}_{module}_dparam_d2gdt2(double t, double p, int index);
double {phase}_{module}_dparam_d2gdtdp(double t, double p, int index);
double {phase}_{module}_dparam_d2gdp2(double t, double p, int index);
double {phase}_{module}_dparam_d3gdt3(double t, double p, int index);
double {phase}_{module}_dparam_d3gdt2dp(double t, double p, int index);
double {phase}_{module}_dparam_d3gdtdp2(double t, double p, int index);
double {phase}_{module}_dparam_d3gdp3(double t, double p, int index);
from libc.stdlib cimport malloc, free
from cpython cimport PyObject, Py_INCREF
import ctypes
# Import the Python-level symbols of numpy
import numpy as np
# Import the C-level symbols of numpy
cimport numpy as np
# Numpy must be initialized. When using numpy from C or Cython you must
# _always_ do that, or you will have segfaults
np.import_array()
# here is the "wrapper" signature
def {prefix}_{phase}_{module}_calib_identifier():
result = <bytes> {phase}_{module}_calib_identifier()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_name():
result = <bytes> {phase}_{module}_calib_name()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_formula():
result = <bytes> {phase}_{module}_calib_formula()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_mw():
result = {phase}_{module}_calib_mw()
return result
def {prefix}_{phase}_{module}_calib_elements():
cdef const double *e = {phase}_{module}_calib_elements()
np_array = np.zeros(106)
for i in range(0,106):
np_array[i] = e[i]
return np_array
def {prefix}_{phase}_{module}_calib_g(double t, double p):
result = {phase}_{module}_calib_g(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_dgdt(double t, double p):
result = {phase}_{module}_calib_dgdt(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_dgdp(double t, double p):
result = {phase}_{module}_calib_dgdp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d2gdt2(double t, double p):
result = {phase}_{module}_calib_d2gdt2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d2gdtdp(double t, double p):
result = {phase}_{module}_calib_d2gdtdp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d2gdp2(double t, double p):
result = {phase}_{module}_calib_d2gdp2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d3gdt3(double t, double p):
result = {phase}_{module}_calib_d3gdt3(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d3gdt2dp(double t, double p):
result = {phase}_{module}_calib_d3gdt2dp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d3gdtdp2(double t, double p):
result = {phase}_{module}_calib_d3gdtdp2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_d3gdp3(double t, double p):
result = {phase}_{module}_calib_d3gdp3(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_s(double t, double p):
result = {phase}_{module}_calib_s(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_v(double t, double p):
result = {phase}_{module}_calib_v(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_cv(double t, double p):
result = {phase}_{module}_calib_cv(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_cp(double t, double p):
result = {phase}_{module}_calib_cp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_dcpdt(double t, double p):
result = {phase}_{module}_calib_dcpdt(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_alpha(double t, double p):
result = {phase}_{module}_calib_alpha(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_beta(double t, double p):
result = {phase}_{module}_calib_beta(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_K(double t, double p):
result = {phase}_{module}_calib_K(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_calib_Kp(double t, double p):
result = {phase}_{module}_calib_Kp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_get_param_number():
result = {phase}_{module}_get_param_number()
return result
def {prefix}_{phase}_{module}_get_param_names():
cdef const char **names = {phase}_{module}_get_param_names()
n = {phase}_{module}_get_param_number()
result = []
for i in range(0,n):
entry = <bytes> names[i]
result.append(entry.decode('UTF-8'))
return result
def {prefix}_{phase}_{module}_get_param_units():
cdef const char **units = {phase}_{module}_get_param_units()
n = {phase}_{module}_get_param_number()
result = []
for i in range(0,n):
entry = <bytes> units[i]
result.append(entry.decode('UTF-8'))
return result
def {prefix}_{phase}_{module}_get_param_values():
n = {phase}_{module}_get_param_number()
cdef double *m = <double *>malloc(n*sizeof(double))
{phase}_{module}_get_param_values(&m)
np_array = np.zeros(n)
for i in range(n):
np_array[i] = m[i]
free(m)
return np_array
def {prefix}_{phase}_{module}_set_param_values(np_array):
n = len(np_array)
cdef double *m = <double *>malloc(n*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_set_param_values(m);
free(m)
return result
def {prefix}_{phase}_{module}_get_param_value(int index):
result = {phase}_{module}_get_param_value(<int> index)
return result
def {prefix}_{phase}_{module}_set_param_value(int index, double value):
result = {phase}_{module}_set_param_value(<int> index, <double> value)
return result
def {prefix}_{phase}_{module}_dparam_g(double t, double p, int index):
result = {phase}_{module}_dparam_g(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_dgdt(double t, double p, int index):
result = {phase}_{module}_dparam_dgdt(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_dgdp(double t, double p, int index):
result = {phase}_{module}_dparam_dgdp(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d2gdt2(double t, double p, int index):
result = {phase}_{module}_dparam_d2gdt2(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d2gdtdp(double t, double p, int index):
result = {phase}_{module}_dparam_d2gdtdp(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d2gdp2(double t, double p, int index):
result = {phase}_{module}_dparam_d2gdp2(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d3gdt3(double t, double p, int index):
result = {phase}_{module}_dparam_d3gdt3(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d3gdt2dp(double t, double p, int index):
result = {phase}_{module}_dparam_d3gdt2dp(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d3gdtdp2(double t, double p, int index):
result = {phase}_{module}_dparam_d3gdtdp2(<double> t, <double> p, <int> index)
return result
def {prefix}_{phase}_{module}_dparam_d3gdp3(double t, double p, int index):
result = {phase}_{module}_dparam_d3gdp3(<double> t, <double> p, <int> index)
return result
\
"""
def _create_code_for_born_functions_c():
"""
C language implementation of create_code_for_born_functions()
Returns
-------
string :
The template string.
"""
return """\
double born_B(double t, double p);
double born_Q(double t, double p);
double born_N(double t, double p);
double born_U(double t, double p);
double born_Y(double t, double p);
double born_X(double t, double p);
double born_dUdT(double t, double p);
double born_dUdP(double t, double p);
double born_dNdT(double t, double p);
double born_dNdP(double t, double p);
double born_dXdT(double t, double p);
double gSolvent(double t, double p);
double DgSolventDt(double t, double p);
double DgSolventDp(double t, double p);
double D2gSolventDt2(double t, double p);
double D2gSolventDtDp(double t, double p);
double D2gSolventDp2(double t, double p);
double D3gSolventDt3(double t, double p);
double D3gSolventDt2Dp(double t, double p);
double D3gSolventDtDp2(double t, double p);
double D3gSolventDp3(double t, double p);
double D4gSolventDt4(double t, double p);
\
"""
def _create_code_for_debye_function_c():
"""
C language implementation of create_code_for_debye_function()
Returns
-------
string :
The template string.
"""
return """\
#include <float.h>
#include <assert.h>
static double chebvalat(double x) {
double c[17] = {
2.707737068327440945 / 2.0, 0.340068135211091751, -0.12945150184440869e-01, 0.7963755380173816e-03,
-0.546360009590824e-04, 0.39243019598805e-05, -0.2894032823539e-06, 0.217317613962e-07, -0.16542099950e-08,
0.1272796189e-09, -0.987963460e-11, 0.7725074e-12, -0.607797e-13, 0.48076e-14, -0.3820e-15, 0.305e-16, -0.24e-17
};
double x2 = 2 * x;
double c0 = c[17-2];
double c1 = c[17-1];
for (int i=3; i<18; i++) {
double tmp = c0;
c0 = c[17-i] - c1;
c1 = tmp + c1 * x2;
}
return c0 + c1 * x;
}
static double Debye(double x) {
//
// returns D_3(x) = 3/x^3\int_0^t t^3/(e^t - 1) dt
//
double val_infinity = 19.4818182068004875;
double sqrt_eps = sqrt(DBL_EPSILON);
double log_eps = log(DBL_EPSILON);
double xcut = -log_eps;
//Check for negative x (was returning zero)
assert(x >= 0.);
if (x < (2.0*sqrt(2.0)*sqrt_eps)) return 1.0 - 3.0*x/8.0 + x*x/20.0;
else if (x <= 4.0) {
double t = x*x/8.0 - 1.0;
double c = chebvalat(t);
return c - 0.375*x;
} else if (x < -(log(2.0)+log_eps)) {
int nexp = (int)(floor(xcut / x));
double ex = exp(-x);
double xk = nexp * x;
double rk = nexp;
double sum = 0.0;
for (int i=nexp; i>0; i--) {
double xk_inv = 1.0/xk;
sum *= ex;
sum += (((6.0*xk_inv + 6.0)*xk_inv + 3.0)*xk_inv + 1.0)/rk;
rk -= 1.0;
xk -= x;
}
return val_infinity / (x * x * x) - 3.0 * sum * ex;
} else if (x < xcut) {
double x3 = x*x*x;
double sum = 6.0 + 6.0*x + 3.0*x*x + x3;
return (val_infinity - 3.0*sum*exp(-x))/x3;
} else return ((val_infinity/x)/x)/x;
}
\
"""
def _create_code_for_dh_functions_c():
"""
C language implementation of create_code_for_dh_functions()
Returns
-------
string :
The template string.
"""
return """\
double Agamma(double t, double p);
double dAgammaDt(double t, double p);
double dAgammaDp(double t, double p);
double d2AgammaDt2(double t, double p);
double d2AgammaDtDp(double t, double p);
double d2AgammaDp2(double t, double p);
double d3AgammaDt3(double t, double p);
double d3AgammaDt2Dp(double t, double p);
double d3AgammaDtDp2(double t, double p);
double d3AgammaDp3(double t, double p);
double Bgamma(double t, double p);
double dBgammaDt(double t, double p);
double dBgammaDp(double t, double p);
double d2BgammaDt2(double t, double p);
double d2BgammaDtDp(double t, double p);
double d2BgammaDp2(double t, double p);
double d3BgammaDt3(double t, double p);
double d3BgammaDt2Dp(double t, double p);
double d3BgammaDtDp2(double t, double p);
double d3BgammaDp3(double t, double p);
double AsubG(double t, double p);
double AsubH(double t, double p);
double AsubJ(double t, double p);
double AsubV(double t, double p);
double AsubKappa(double t, double p);
double AsubEx(double t, double p);
double BsubG(double t, double p);
double BsubH(double t, double p);
double BsubJ(double t, double p);
double BsubV(double t, double p);
double BsubKappa(double t, double p);
double BsubEx(double t, double p);
\
"""
def _create_fast_c_template_c():
"""
C language implementation of create_fast_c_template()
Returns
-------
string :
The template string.
"""
return """\
static const char *identifier = "{git_identifier}";
{parameter_init_block}
{include_calc_h}
const char *{phase}_{module}_identifier(void) {{
return identifier;
}}
const char *{phase}_{module}_name(void) {{
return "{phase}";
}}
const char *{phase}_{module}_formula(void) {{
return "{formula}";
}}
const double {phase}_{module}_mw(void) {{
return {mw};
}}
static const double elmformula[106] = {{
{elmvector[0]},{elmvector[1]},{elmvector[2]},{elmvector[3]},{elmvector[4]},{elmvector[5]},
{elmvector[6]},{elmvector[7]},{elmvector[8]},{elmvector[9]},{elmvector[10]},{elmvector[11]},
{elmvector[12]},{elmvector[13]},{elmvector[14]},{elmvector[15]},{elmvector[16]},{elmvector[17]},
{elmvector[18]},{elmvector[19]},{elmvector[20]},{elmvector[21]},{elmvector[22]},{elmvector[23]},
{elmvector[24]},{elmvector[25]},{elmvector[26]},{elmvector[27]},{elmvector[28]},{elmvector[29]},
{elmvector[30]},{elmvector[31]},{elmvector[32]},{elmvector[33]},{elmvector[34]},{elmvector[35]},
{elmvector[36]},{elmvector[37]},{elmvector[38]},{elmvector[39]},{elmvector[40]},{elmvector[41]},
{elmvector[42]},{elmvector[43]},{elmvector[44]},{elmvector[45]},{elmvector[46]},{elmvector[47]},
{elmvector[48]},{elmvector[49]},{elmvector[50]},{elmvector[51]},{elmvector[52]},{elmvector[53]},
{elmvector[54]},{elmvector[55]},{elmvector[56]},{elmvector[57]},{elmvector[58]},{elmvector[59]},
{elmvector[60]},{elmvector[61]},{elmvector[62]},{elmvector[63]},{elmvector[64]},{elmvector[65]},
{elmvector[66]},{elmvector[67]},{elmvector[68]},{elmvector[69]},{elmvector[70]},{elmvector[71]},
{elmvector[72]},{elmvector[73]},{elmvector[74]},{elmvector[75]},{elmvector[76]},{elmvector[77]},
{elmvector[78]},{elmvector[79]},{elmvector[80]},{elmvector[81]},{elmvector[82]},{elmvector[83]},
{elmvector[84]},{elmvector[85]},{elmvector[86]},{elmvector[87]},{elmvector[88]},{elmvector[89]},
{elmvector[90]},{elmvector[91]},{elmvector[92]},{elmvector[93]},{elmvector[94]},{elmvector[95]},
{elmvector[96]},{elmvector[97]},{elmvector[98]},{elmvector[99]},{elmvector[100]},{elmvector[101]},
{elmvector[102]},{elmvector[103]},{elmvector[104]},{elmvector[105]}
}};
const double *{phase}_{module}_elements(void) {{
return elmformula;
}}
double {phase}_{module}_g(double T, double P) {{
return {module}_g(T, P);
}}
double {phase}_{module}_dgdt(double T, double P) {{
return {module}_dgdt(T, P);
}}
double {phase}_{module}_dgdp(double T, double P) {{
return {module}_dgdp(T, P);
}}
double {phase}_{module}_d2gdt2(double T, double P) {{
return {module}_d2gdt2(T, P);
}}
double {phase}_{module}_d2gdtdp(double T, double P) {{
return {module}_d2gdtdp(T, P);
}}
double {phase}_{module}_d2gdp2(double T, double P) {{
return {module}_d2gdp2(T, P);
}}
double {phase}_{module}_d3gdt3(double T, double P) {{
return {module}_d3gdt3(T, P);
}}
double {phase}_{module}_d3gdt2dp(double T, double P) {{
return {module}_d3gdt2dp(T, P);
}}
double {phase}_{module}_d3gdtdp2(double T, double P) {{
return {module}_d3gdtdp2(T, P);
}}
double {phase}_{module}_d3gdp3(double T, double P) {{
return {module}_d3gdp3(T, P);
}}
double {phase}_{module}_s(double T, double P) {{
return {module}_s(T, P);
}}
double {phase}_{module}_v(double T, double P) {{
return {module}_v(T, P);
}}
double {phase}_{module}_cv(double T, double P) {{
return {module}_cv(T, P);
}}
double {phase}_{module}_cp(double T, double P) {{
return {module}_cp(T, P);
}}
double {phase}_{module}_dcpdt(double T, double P) {{
return {module}_dcpdt(T, P);
}}
double {phase}_{module}_alpha(double T, double P) {{
return {module}_alpha(T, P);
}}
double {phase}_{module}_beta(double T, double P) {{
return {module}_beta(T, P);
}}
double {phase}_{module}_K(double T, double P) {{
return {module}_K(T, P);
}}
double {phase}_{module}_Kp(double T, double P) {{
return {module}_Kp(T, P);
}}
\
"""
def _create_fast_h_template_c():
"""
C language implementation of create_fast_h_template()
Returns
-------
string :
The template string.
"""
return """\
const char *{phase}_{module}_identifier(void);
const char *{phase}_{module}_name(void);
const char *{phase}_{module}_formula(void);
const double {phase}_{module}_mw(void);
const double *{phase}_{module}_elements(void);
double {phase}_{module}_g(double T, double P);
double {phase}_{module}_dgdt(double T, double P);
double {phase}_{module}_dgdp(double T, double P);
double {phase}_{module}_d2gdt2(double T, double P);
double {phase}_{module}_d2gdtdp(double T, double P);
double {phase}_{module}_d2gdp2(double T, double P);
double {phase}_{module}_d3gdt3(double T, double P);
double {phase}_{module}_d3gdt2dp(double T, double P);
double {phase}_{module}_d3gdtdp2(double T, double P);
double {phase}_{module}_d3gdp3(double T, double P);
double {phase}_{module}_s(double T, double P);
double {phase}_{module}_v(double T, double P);
double {phase}_{module}_cv(double T, double P);
double {phase}_{module}_cp(double T, double P);
double {phase}_{module}_dcpdt(double T, double P);
double {phase}_{module}_alpha(double T, double P);
double {phase}_{module}_beta(double T, double P);
double {phase}_{module}_K(double T, double P);
double {phase}_{module}_Kp(double T, double P);
\
"""
def _create_fast_pyx_template_c():
"""
C language implementation of create_fast_pyx_template()
Returns
-------
string :
The template string.
"""
return """\
# cython: language_level=3
import numpy as np
cimport numpy as cnp # cimport gives us access to NumPy's C API
# here we just replicate the function signature from the header
cdef extern from "{phase}_{module}_calc.h":
const char *{phase}_{module}_identifier();
const char *{phase}_{module}_name();
const char *{phase}_{module}_formula();
const double {phase}_{module}_mw();
const double *{phase}_{module}_elements();
double {phase}_{module}_g(double t, double p)
double {phase}_{module}_dgdt(double t, double p)
double {phase}_{module}_dgdp(double t, double p)
double {phase}_{module}_d2gdt2(double t, double p)
double {phase}_{module}_d2gdtdp(double t, double p)
double {phase}_{module}_d2gdp2(double t, double p)
double {phase}_{module}_d3gdt3(double t, double p)
double {phase}_{module}_d3gdt2dp(double t, double p)
double {phase}_{module}_d3gdtdp2(double t, double p)
double {phase}_{module}_d3gdp3(double t, double p)
double {phase}_{module}_s(double t, double p)
double {phase}_{module}_v(double t, double p)
double {phase}_{module}_cv(double t, double p)
double {phase}_{module}_cp(double t, double p)
double {phase}_{module}_dcpdt(double t, double p)
double {phase}_{module}_alpha(double t, double p)
double {phase}_{module}_beta(double t, double p)
double {phase}_{module}_K(double t, double p)
double {phase}_{module}_Kp(double t, double p)
# here is the "wrapper" signature
def {prefix}_{phase}_{module}_identifier():
result = <bytes> {phase}_{module}_identifier()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_name():
result = <bytes> {phase}_{module}_name()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_formula():
result = <bytes> {phase}_{module}_formula()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_mw():
result = {phase}_{module}_mw()
return result
def {prefix}_{phase}_{module}_elements():
cdef const double *e = {phase}_{module}_elements()
np_array = np.zeros(106)
for i in range(0,106):
np_array[i] = e[i]
return np_array
def {prefix}_{phase}_{module}_g(double t, double p):
result = {phase}_{module}_g(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_dgdt(double t, double p):
result = {phase}_{module}_dgdt(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_dgdp(double t, double p):
result = {phase}_{module}_dgdp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d2gdt2(double t, double p):
result = {phase}_{module}_d2gdt2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d2gdtdp(double t, double p):
result = {phase}_{module}_d2gdtdp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d2gdp2(double t, double p):
result = {phase}_{module}_d2gdp2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d3gdt3(double t, double p):
result = {phase}_{module}_d3gdt3(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d3gdt2dp(double t, double p):
result = {phase}_{module}_d3gdt2dp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d3gdtdp2(double t, double p):
result = {phase}_{module}_d3gdtdp2(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_d3gdp3(double t, double p):
result = {phase}_{module}_d3gdp3(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_s(double t, double p):
result = {phase}_{module}_s(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_v(double t, double p):
result = {phase}_{module}_v(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_cv(double t, double p):
result = {phase}_{module}_cv(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_cp(double t, double p):
result = {phase}_{module}_cp(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_dcpdt(double t, double p):
result = {phase}_{module}_dcpdt(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_alpha(double t, double p):
result = {phase}_{module}_alpha(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_beta(double t, double p):
result = {phase}_{module}_beta(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_K(double t, double p):
result = {phase}_{module}_K(<double> t, <double> p)
return result
def {prefix}_{phase}_{module}_Kp(double t, double p):
result = {phase}_{module}_Kp(<double> t, <double> p)
return result
\
"""
def _create_pyxbld_template_c():
"""
C language implementation of create_pyxbld_template()
Returns
-------
string :
The template string.
Notes
-----
setuptools.extension.Extension
self,
name,
sources,
include_dirs=None,
define_macros=None,
undef_macros=None,
library_dirs=None,
libraries=None,
runtime_library_dirs=None,
extra_objects=None,
extra_compile_args=None,
extra_link_args=None,
export_symbols=None,
swig_opts=None,
depends=None,
language=None,
optional=None,
**kw
-O0, -O1, -O2, -O3, -Ofast, -Os, -Oz, -Og, -O, -O4
Specify which optimization level to use:
-O0 Means “no optimization”: this level compiles the fastest and
generates the most debuggable code.
-O1 Somewhere between -O0 and -O2.
-O2 Moderate level of optimization which enables most optimizations.
-O3 Like -O2, except that it enables optimizations that take longer
to perform or that may generate larger code (in an attempt to make
the program run faster).
-Ofast Enables all the optimizations from -O3 along with other
agressive optimizations that may violate strict compliance with
language standards.
-Os Like -O2 with extra optimizations to reduce code size.
-Oz Like -Os (and thus -O2), but reduces code size further.
-Og Like -O1. In future versions, this option might disable
different optimizations in order to improve debuggability.
-O Equivalent to -O2.
-O4 and higher
"""
return """\
import numpy
# module name specified by `%%cython_pyximport` magic
# | just `modname + ".pyx"`
# | |
def make_ext(modname, pyxfilename):
from setuptools.extension import Extension
return Extension(modname,
sources=[pyxfilename, '{file_to_compile}'],
include_dirs=['.', numpy.get_include()],
define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
extra_compile_args=['-O3', '-Wno-unused-const-variable', '-Wno-unreachable-code-fallthrough', '-Wno-unused-variable'],
libraries=['gsl', 'swimdew'],
library_dirs=['/usr/local/lib'],
runtime_library_dirs=['/usr/local/lib'])
"""
def _create_redundant_calib_TV_template_c():
"""
C language implementation of create_redundant_calib_TV_template()
Returns
-------
string :
The template string.
"""
return """\
static double {module}_dparam_g(double T, double P, int index) {{
{module}_solve_V(T, P);
double dAdz = {module}_dparam_a(T, V, index);
return dAdz + P*V;
}}
static double {module}_dparam_dgdt(double T, double P, int index) {{
{module}_solve_V(T, P);
double dAdTdz = {module}_dparam_dadt(T, V, index);
return dAdTdz;
}}
static double {module}_dparam_dgdp(double T, double P, int index) {{
{module}_solve_V(T, P);
return 0.0; /* V; */
}}
static double {module}_dparam_d2gdt2(double T, double P, int index) {{
{module}_solve_V(T, P);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double d2AdT2dz = {module}_dparam_d2adt2(T, V, index);
double d2AdTdVdz = {module}_dparam_d2adtdv(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
/* return d2AdT2 - d2AdTdV*d2AdTdV/d2AdV2; */
return d2AdT2dz - 2.0*d2AdTdV*d2AdTdVdz/d2AdV2 + d2AdTdV*d2AdTdV*d2AdV2dz/d2AdV2/d2AdV2;
}}
static double {module}_dparam_d2gdtdp(double T, double P, int index) {{
{module}_solve_V(T, P);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double d2AdTdVdz = {module}_dparam_d2adtdv(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
/* return - d2AdTdV/d2AdV2; */
return - d2AdTdVdz/d2AdV2 + d2AdTdV*d2AdV2dz/d2AdV2/d2AdV2;
}}
static double {module}_dparam_d2gdp2(double T, double P, int index) {{
{module}_solve_V(T, P);
double d2AdV2 = {module}_d2adv2(T, V);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
/* return - 1.0/d2AdV2; */
return d2AdV2dz/d2AdV2/d2AdV2;
}}
static double {module}_dparam_d3gdt3(double T, double P, int index) {{
{module}_solve_V(T, P);
double d3AdT2dV = {module}_d3adt2dv(T, V);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double d3AdT3dz = {module}_dparam_d3adt3(T, V, index);
double d3AdT2dVdz = {module}_dparam_d3adt2dv(T, V, index);
double d3AdTdV2dz = {module}_dparam_d3adtdv2(T, V, index);
double d3AdV3dz = {module}_dparam_d3adv3(T, V, index);
double d2AdTdVdz = {module}_dparam_d2adtdv(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
double dVdT = - d2AdTdV/d2AdV2;
double dVdTdz = - d2AdTdVdz/d2AdV2 + d2AdTdV*d2AdV2dz/d2AdV2/d2AdV2;
double d2VdT2 = (-d3AdT2dV - 2.0*d3AdTdV2*dVdT - d3AdV3*dVdT*dVdT)/d2AdV2;
double d2VdT2dz = (-d3AdT2dVdz - 2.0*d3AdTdV2dz*dVdT - 2.0*d3AdTdV2*dVdTdz
- d3AdV3dz*dVdT*dVdT - 2.0*d3AdV3*dVdT*dVdTdz)/d2AdV2
- (-d3AdT2dV - 2.0*d3AdTdV2*dVdT - d3AdV3*dVdT*dVdT)*d2AdV2dz/d2AdV2/d2AdV2;
/* return d3AdT3 + 2.0*d3AdT2dV*dVdT + d3AdTdV2*dVdT*dVdT + d2AdTdV*d2VdT2; */
return d3AdT3dz + 2.0*d3AdT2dVdz*dVdT + 2.0*d3AdT2dV*dVdTdz + d3AdTdV2dz*dVdT*dVdT
+ 2.0*d3AdTdV2*dVdT*dVdTdz + d2AdTdVdz*d2VdT2 + d2AdTdV*d2VdT2dz;
}}
static double {module}_dparam_d3gdt2dp(double T, double P, int index) {{
{module}_solve_V(T, P);
double d3AdT2dV = {module}_d3adt2dv(T, V);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double d3AdT2dVdz = {module}_dparam_d3adt2dv(T, V, index);
double d3AdTdV2dz = {module}_dparam_d3adtdv2(T, V, index);
double d3AdV3dz = {module}_dparam_d3adv3(T,V, index);
double d2AdTdVdz = {module}_dparam_d2adtdv(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
double dVdT = -d2AdTdV/d2AdV2;
double dVdTdz = - d2AdTdVdz/d2AdV2 + d2AdTdV*d2AdV2dz/d2AdV2/d2AdV2;
double dVdP = -1.0/d2AdV2;
double dVdPdz = d2AdV2dz/d2AdV2/d2AdV2;
double d2VdTdP = (-d3AdTdV2*dVdP - d3AdV3*dVdT*dVdP)/d2AdV2;
double d2VdTdPdz = (-d3AdTdV2dz*dVdP -d3AdTdV2*dVdPdz
- d3AdV3dz*dVdT*dVdP - d3AdV3*dVdTdz*dVdP - d3AdV3*dVdT*dVdPdz)/d2AdV2
- (-d3AdTdV2*dVdP - d3AdV3*dVdT*dVdP)*d2AdV2dz/d2AdV2/d2AdV2;
/* return d3AdT2dV*dVdP + d3AdTdV2*dVdT*dVdP + d2AdTdV*d2VdTdP; */
return d3AdT2dVdz*dVdP + d3AdT2dV*dVdPdz + d3AdTdV2dz*dVdT*dVdP + d3AdTdV2*dVdTdz*dVdP
+ d3AdTdV2*dVdT*dVdPdz + d2AdTdVdz*d2VdTdP + d2AdTdV*d2VdTdPdz;
}}
static double {module}_dparam_d3gdtdp2(double T, double P, int index) {{
{module}_solve_V(T, P);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double d3AdTdV2dz = {module}_dparam_d3adtdv2(T, V, index);
double d3AdV3dz = {module}_dparam_d3adv3(T, V, index);
double d2AdTdVdz = {module}_dparam_d2adtdv(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
double dVdT = -d2AdTdV/d2AdV2;
double dVdTdz = - d2AdTdVdz/d2AdV2 + d2AdTdV*d2AdV2dz/d2AdV2/d2AdV2;
/* return (d3AdTdV2 + d3AdV3*dVdT)/d2AdV2/d2AdV2; */
return (d3AdTdV2dz + d3AdV3dz*dVdT + d3AdV3*dVdTdz)/d2AdV2/d2AdV2
- 2.0*(d3AdTdV2 + d3AdV3*dVdT)*d2AdV2dz/d2AdV2/d2AdV2/d2AdV2;
}}
static double {module}_dparam_d3gdp3(double T, double P, int index) {{
{module}_solve_V(T, P);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdV2 = {module}_d2adv2(T, V);
double d3AdV3dz = {module}_dparam_d3adv3(T, V, index);
double d2AdV2dz = {module}_dparam_d2adv2(T, V, index);
double dVdP = -1.0/d2AdV2;
double dVdPdz = d2AdV2dz/d2AdV2/d2AdV2;
/* return d3AdV3*dVdP/d2AdV2/d2AdV2; */
return d3AdV3dz*dVdP/d2AdV2/d2AdV2 + d3AdV3*dVdPdz/d2AdV2/d2AdV2
- 2.0*d3AdV3*dVdP*d2AdV2dz/d2AdV2/d2AdV2/d2AdV2;
}}
\
"""
def _create_redundant_function_template_c(model_type='TP'):
"""
C language implementation of create_redundant_function_template()
Parameters
----------
model_type: string
Potential type, either Gibbs free energy ('TP') or Helmholtz free
energy ('TV')
Returns
-------
string :
The template string.
"""
if model_type == 'TP':
return """\
static double {module}_s(double T, double P) {{
double result = -{module}_dgdt(T, P);
return result;
}}
static double {module}_v(double T, double P) {{
double result = {module}_dgdp(T, P);
return result;
}}
static double {module}_cv(double T, double P) {{
double result = -T*{module}_d2gdt2(T, P);
double dvdt = {module}_d2gdtdp(T, P);
double dvdp = {module}_d2gdp2(T, P);
result += T*dvdt*dvdt/dvdp;
return result;
}}
static double {module}_cp(double T, double P) {{
double result = -T*{module}_d2gdt2(T, P);
return result;
}}
static double {module}_dcpdt(double T, double P) {{
double result = -T*{module}_d3gdt3(T, P) - {module}_d2gdt2(T, P);
return result;
}}
static double {module}_alpha(double T, double P) {{
double result = {module}_d2gdtdp(T, P)/{module}_dgdp(T, P);
return result;
}}
static double {module}_beta(double T, double P) {{
double result = -{module}_d2gdp2(T, P)/{module}_dgdp(T, P);
return result;
}}
static double {module}_K(double T, double P) {{
double result = -{module}_dgdp(T, P)/{module}_d2gdp2(T, P);
return result;
}}
static double {module}_Kp(double T, double P) {{
double result = {module}_dgdp(T, P);
result *= {module}_d3gdp3(T, P);
result /= pow({module}_d2gdp2(T, P), 2.0);
return result - 1.0;
}}
\
"""
elif model_type == 'TV':
return """\
static double V = {v_initial_guess};
static void {module}_solve_V(double T, double P) {{
static double Told = 0.0;
static double Pold = 0.0;
// Update if *either* T or P changes (was only if both changed)
// if ((T != Told) && (P != Pold)) {{
if ((T != Told) || (P != Pold)) {{
Told = T;
Pold = P;
double f = 0.0;
int iter = 0;
do {{
f = -{module}_dadv(T, V) - P;
double df = -{module}_d2adv2(T, V);
if (df == 0.0) break;
V -= f/df;
if (V <= 0.0) V = 0.001;
else if (V >= 4.0*{v_initial_guess}) V = 4.0*{v_initial_guess};
iter++;
}} while ((fabs(f) > 0.001) && (iter < 200));
}}
}}
static double {module}_g(double T, double P) {{
{module}_solve_V(T, P);
double A = {module}_a(T, V);
return A + P*V;
}}
static double {module}_dgdt(double T, double P) {{
{module}_solve_V(T, P);
double dAdT = {module}_dadt(T, V);
return dAdT;
}}
static double {module}_dgdp(double T, double P) {{
{module}_solve_V(T, P);
return V;
}}
static double {module}_d2gdt2(double T, double P) {{
{module}_solve_V(T, P);
double d2AdT2 = {module}_d2adt2(T, V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
return d2AdT2 - d2AdTdV*d2AdTdV/d2AdV2;
}}
static double {module}_d2gdtdp(double T, double P) {{
{module}_solve_V(T, P);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
return - d2AdTdV/d2AdV2;
}}
static double {module}_d2gdp2(double T, double P) {{
{module}_solve_V(T, P);
double d2AdV2 = {module}_d2adv2(T, V);
return - 1.0/d2AdV2;
}}
static double {module}_d3gdt3(double T, double P) {{
{module}_solve_V(T, P);
double d3AdT3 = {module}_d3adt3(T, V);
double d3AdT2dV = {module}_d3adt2dv(T, V);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double dVdT = -d2AdTdV/d2AdV2;
double d2VdT2 = (-d3AdT2dV - 2.0*d3AdTdV2*dVdT - d3AdV3*dVdT*dVdT)/d2AdV2;
return d3AdT3 + 2.0*d3AdT2dV*dVdT + d3AdTdV2*dVdT*dVdT + d2AdTdV*d2VdT2;
}}
static double {module}_d3gdt2dp(double T, double P) {{
{module}_solve_V(T, P);
double d3AdT2dV = {module}_d3adt2dv(T, V);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double dVdT = -d2AdTdV/d2AdV2;
double dVdP = -1.0/d2AdV2;
double d2VdTdP = (-d3AdTdV2*dVdP - d3AdV3*dVdT*dVdP)/d2AdV2;
return d3AdT2dV*dVdP + d3AdTdV2*dVdT*dVdP + d2AdTdV*d2VdTdP;
}}
static double {module}_d3gdtdp2(double T, double P) {{
{module}_solve_V(T, P);
double d3AdTdV2 = {module}_d3adtdv2(T, V);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdTdV = {module}_d2adtdv(T, V);
double d2AdV2 = {module}_d2adv2(T, V);
double dVdT = -d2AdTdV/d2AdV2;
return (d3AdTdV2 + d3AdV3*dVdT)/d2AdV2/d2AdV2;
}}
static double {module}_d3gdp3(double T, double P) {{
{module}_solve_V(T, P);
double d3AdV3 = {module}_d3adv3(T,V);
double d2AdV2 = {module}_d2adv2(T, V);
double dVdP = -1.0/d2AdV2;
return d3AdV3*dVdP/d2AdV2/d2AdV2;
}}
static double {module}_s(double T, double P) {{
double result = -{module}_dgdt(T, P);
return result;
}}
static double {module}_v(double T, double P) {{
double result = {module}_dgdp(T, P);
return result;
}}
static double {module}_cv(double T, double P) {{
double result = -T*{module}_d2gdt2(T, P);
double dvdt = {module}_d2gdtdp(T, P);
double dvdp = {module}_d2gdp2(T, P);
result += T*dvdt*dvdt/dvdp;
return result;
}}
static double {module}_cp(double T, double P) {{
double result = -T*{module}_d2gdt2(T, P);
return result;
}}
static double {module}_dcpdt(double T, double P) {{
double result = -T*{module}_d3gdt3(T, P) - {module}_d2gdt2(T, P);
return result;
}}
static double {module}_alpha(double T, double P) {{
double result = {module}_d2gdtdp(T, P)/{module}_dgdp(T, P);
return result;
}}
static double {module}_beta(double T, double P) {{
double result = -{module}_d2gdp2(T, P)/{module}_dgdp(T, P);
return result;
}}
static double {module}_K(double T, double P) {{
double result = -{module}_dgdp(T, P)/{module}_d2gdp2(T, P);
return result;
}}
static double {module}_Kp(double T, double P) {{
double result = {module}_dgdp(T, P);
result *= {module}_d3gdp3(T, P);
result /= pow({module}_d2gdp2(T, P), 2.0);
return result - 1.0;
}}
\
"""
else:
print ("Unsupported model_type: ", model_type)
return ""
###############################
# Simple Solution C templates #
###############################
def _create_soln_calc_template_c():
"""
C language implementation of create_soln_calc_template()
Returns
-------
string :
The template string.
"""
return """\
static double {module}_{func}(double T, double P, double n[{number_components}]) {{
{moles_assign}
double result;
{g_code}
return result;
}}
\
"""
def _create_soln_calib_code_template_c():
"""
C language implementation of create_soln_calib_code_template()
Returns
-------
string :
The template string.
"""
return """\
static char *identifier = "{git_identifier}";
{code_block_two}
#include "{module}_calc.h"
#include "{module}_calib.h"
const char *{phase}_{module}_calib_identifier(void) {{
return identifier;
}}
const char *{phase}_{module}_calib_name(void) {{
return "{phase}";
}}
char *{phase}_{module}_calib_formula(double T, double P, double n[{number_components}]) {{
{code_block_five}
}}
double *{phase}_{module}_calib_conv_elm_to_moles(double *e) {{
{code_block_six}
}}
int {phase}_{module}_calib_test_moles(double *n) {{
{code_block_seven}
}}
const char *{phase}_{module}_calib_endmember_name(int index) {{
return (*endmember[index].name)();
}}
const char *{phase}_{module}_calib_endmember_formula(int index) {{
return (*endmember[index].formula)();
}}
const double {phase}_{module}_calib_endmember_mw(int index) {{
return (*endmember[index].mw)();
}}
const double *{phase}_{module}_calib_endmember_elements(int index) {{
return (*endmember[index].elements)();
}}
double {phase}_{module}_calib_endmember_mu0(int index, double t, double p) {{
return (*endmember[index].mu0)(t, p);
}}
double {phase}_{module}_calib_endmember_dmu0dT(int index, double t, double p) {{
return (*endmember[index].dmu0dT)(t, p);
}}
double {phase}_{module}_calib_endmember_dmu0dP(int index, double t, double p) {{
return (*endmember[index].dmu0dP)(t, p);
}}
double {phase}_{module}_calib_endmember_d2mu0dT2(int index, double t, double p) {{
return (*endmember[index].d2mu0dT2)(t, p);
}}
double {phase}_{module}_calib_endmember_d2mu0dTdP(int index, double t, double p) {{
return (*endmember[index].d2mu0dTdP)(t, p);
}}
double {phase}_{module}_calib_endmember_d2mu0dP2(int index, double t, double p) {{
return (*endmember[index].d2mu0dP2)(t, p);
}}
double {phase}_{module}_calib_endmember_d3mu0dT3(int index, double t, double p) {{
return (*endmember[index].d3mu0dT3)(t, p);
}}
double {phase}_{module}_calib_endmember_d3mu0dT2dP(int index, double t, double p) {{
return (*endmember[index].d3mu0dT2dP)(t, p);
}}
double {phase}_{module}_calib_endmember_d3mu0dTdP2(int index, double t, double p) {{
return (*endmember[index].d3mu0dTdP2)(t, p);
}}
double {phase}_{module}_calib_endmember_d3mu0dP3(int index, double t, double p) {{
return (*endmember[index].d3mu0dP3)(t, p);
}}
double {phase}_{module}_calib_g(double T, double P, double n[{number_components}]) {{
return {module}_g(T, P, n);
}}
void {phase}_{module}_calib_dgdn(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_dgdn(T, P, n, result);
}}
void {phase}_{module}_calib_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdn2(T, P, n, result);
}}
void {phase}_{module}_calib_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn3(T, P, n, result);
}}
double {phase}_{module}_calib_dgdt(double T, double P, double n[{number_components}]) {{
return {module}_dgdt(T, P, n);
}}
void {phase}_{module}_calib_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdndt(T, P, n, result);
}}
void {phase}_{module}_calib_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn2dt(T, P, n, result);
}}
void {phase}_{module}_calib_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn3dt(T, P, n, result);
}}
double {phase}_{module}_calib_dgdp(double T, double P, double n[{number_components}]) {{
return {module}_dgdp(T, P, n);
}}
void {phase}_{module}_calib_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdndp(T, P, n, result);
}}
void {phase}_{module}_calib_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn2dp(T, P, n, result);
}}
void {phase}_{module}_calib_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn3dp(T, P, n, result);
}}
double {phase}_{module}_calib_d2gdt2(double T, double P, double n[{number_components}]) {{
return {module}_d2gdt2(T, P, n);
}}
void {phase}_{module}_calib_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndt2(T, P, n, result);
}}
void {phase}_{module}_calib_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dt2(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dt2(T, P, n, result);
}}
double {phase}_{module}_calib_d2gdtdp(double T, double P, double n[{number_components}]) {{
return {module}_d2gdtdp(T, P, n);
}}
void {phase}_{module}_calib_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndtdp(T, P, n, result);
}}
void {phase}_{module}_calib_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dtdp(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dtdp(T, P, n, result);
}}
double {phase}_{module}_calib_d2gdp2(double T, double P, double n[{number_components}]) {{
return {module}_d2gdp2(T, P, n);
}}
void {phase}_{module}_calib_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndp2(T, P, n, result);
}}
void {phase}_{module}_calib_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dp2(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dp2(T, P, n, result);
}}
double {phase}_{module}_calib_d3gdt3(double T, double P, double n[{number_components}]) {{
return {module}_d3gdt3(T, P, n);
}}
void {phase}_{module}_calib_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndt3(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dt3(T, P, n, result);
}}
void {phase}_{module}_calib_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dt3(T, P, n, result);
}}
double {phase}_{module}_calib_d3gdt2dp(double T, double P, double n[{number_components}]) {{
return {module}_d3gdt2dp(T, P, n);
}}
void {phase}_{module}_calib_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndt2dp(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dt2dp(T, P, n, result);
}}
void {phase}_{module}_calib_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dt2dp(T, P, n, result);
}}
double {phase}_{module}_calib_d3gdtdp2(double T, double P, double n[{number_components}]) {{
return {module}_d3gdtdp2(T, P, n);
}}
void {phase}_{module}_calib_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndtdp2(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dtdp2(T, P, n, result);
}}
void {phase}_{module}_calib_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dtdp2(T, P, n, result);
}}
double {phase}_{module}_calib_d3gdp3(double T, double P, double n[{number_components}]) {{
return {module}_d3gdp3(T, P, n);
}}
void {phase}_{module}_calib_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndp3(T, P, n, result);
}}
void {phase}_{module}_calib_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dp3(T, P, n, result);
}}
void {phase}_{module}_calib_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dp3(T, P, n, result);
}}
double {phase}_{module}_calib_s(double T, double P, double n[{number_components}]) {{
return {module}_s(T, P, n);
}}
double {phase}_{module}_calib_v(double T, double P, double n[{number_components}]) {{
return {module}_v(T, P, n);
}}
double {phase}_{module}_calib_cv(double T, double P, double n[{number_components}]) {{
return {module}_cv(T, P, n);
}}
double {phase}_{module}_calib_cp(double T, double P, double n[{number_components}]) {{
return {module}_cp(T, P, n);
}}
double {phase}_{module}_calib_dcpdt(double T, double P, double n[{number_components}]) {{
return {module}_dcpdt(T, P, n);
}}
double {phase}_{module}_calib_alpha(double T, double P, double n[{number_components}]) {{
return {module}_alpha(T, P, n);
}}
double {phase}_{module}_calib_beta(double T, double P, double n[{number_components}]) {{
return {module}_beta(T, P, n);
}}
double {phase}_{module}_calib_K(double T, double P, double n[{number_components}]) {{
return {module}_K(T, P, n);
}}
double {phase}_{module}_calib_Kp(double T, double P, double n[{number_components}]) {{
return {module}_Kp(T, P, n);
}}
int {phase}_{module}_get_param_number(void) {{
return {module}_get_param_number();
}}
const char **{phase}_{module}_get_param_names(void) {{
return {module}_get_param_names();
}}
const char **{phase}_{module}_get_param_units(void) {{
return {module}_get_param_units();
}}
void {phase}_{module}_get_param_values(double **values) {{
{module}_get_param_values(values);
}}
int {phase}_{module}_set_param_values(double *values) {{
return {module}_set_param_values(values);
}}
double {phase}_{module}_get_param_value(int index) {{
return {module}_get_param_value(index);
}}
int {phase}_{module}_set_param_value(int index, double value) {{
return {module}_set_param_value(index, value);
}}
double {phase}_{module}_dparam_g(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_g(T, P, n, index);
}}
double {phase}_{module}_dparam_dgdt(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_dgdt(T, P, n, index);
}}
double {phase}_{module}_dparam_dgdp(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_dgdp(T, P, n, index);
}}
double {phase}_{module}_dparam_d2gdt2(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d2gdt2(T, P, n, index);
}}
double {phase}_{module}_dparam_d2gdtdp(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d2gdtdp(T, P, n, index);
}}
double {phase}_{module}_dparam_d2gdp2(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d2gdp2(T, P, n, index);
}}
double {phase}_{module}_dparam_d3gdt3(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d3gdt3(T, P, n, index);
}}
double {phase}_{module}_dparam_d3gdt2dp(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d3gdt2dp(T, P, n, index);
}}
double {phase}_{module}_dparam_d3gdtdp2(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d3gdtdp2(T, P, n, index);
}}
double {phase}_{module}_dparam_d3gdp3(double T, double P, double n[{number_components}], int index) {{
return {module}_dparam_d3gdp3(T, P, n, index);
}}
void {phase}_{module}_dparam_dgdn(double T, double P, double n[{number_components}], int index, double result[{number_components}]) {{
{module}_dparam_dgdn(T, P, n, index, result);
}}
\
"""
def _create_soln_calib_extra_template_c():
"""
C language implementation of create_soln_calib_extra_template()
Returns
-------
string :
The template string.
"""
return """\
static int {module}_get_param_number(void) {{
return {number_params};
}}
static const char *paramNames[{number_params}] = {names_params};
static const char *paramUnits[{number_params}] = {units_params};
static const char **{module}_get_param_names(void) {{
return paramNames;
}}
static const char **{module}_get_param_units(void) {{
return paramUnits;
}}
static void {module}_get_param_values(double **values) {{
{code_block_one}
}}
static int {module}_set_param_values(double *values) {{
{code_block_two}
return 1;
}}
static double {module}_get_param_value(int index) {{
double result = 0.0;
switch (index) {{
{code_block_three}
default:
break;
}}
return result;
}}
static int {module}_set_param_value(int index, double value) {{
int result = 1;
switch (index) {{
{code_block_four}
default:
result = 0;
break;
}}
return result;
}}
\
"""
def _create_soln_calib_include_template_c():
"""
C language implementation of create_soln_fcalib_include_template()
Returns
-------
string :
The template string.
"""
return """\
const char *{phase}_{module}_calib_identifier(void);
const char *{phase}_{module}_calib_name(void);
char *{phase}_{module}_calib_formula(double T, double P, double n[{number_components}]);
double *{phase}_{module}_calib_conv_elm_to_moles(double *e);
int {phase}_{module}_calib_test_moles(double *n);
const char *{phase}_{module}_calib_endmember_name(int index);
const char *{phase}_{module}_calib_endmember_formula(int index);
const double {phase}_{module}_calib_endmember_mw(int index);
const double *{phase}_{module}_calib_endmember_elements(int index);
double {phase}_{module}_calib_endmember_mu0(int index, double t, double p);
double {phase}_{module}_calib_endmember_dmu0dT(int index, double t, double p);
double {phase}_{module}_calib_endmember_dmu0dP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dT2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dTdP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dP2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dT3(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dT2dP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dTdP2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dP3(int index, double t, double p);
double {phase}_{module}_calib_g(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_dgdt(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_dgdp(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d2gdt2(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d2gdtdp(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d2gdp2(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d3gdt3(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d3gdt2dp(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d3gdtdp2(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_d3gdp3(double T, double P, double n[{number_components}]);
void {phase}_{module}_calib_dgdn(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_calib_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
double {phase}_{module}_calib_s(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_v(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_cv(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_cp(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_dcpdt(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_alpha(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_beta(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_K(double T, double P, double n[{number_components}]);
double {phase}_{module}_calib_Kp(double T, double P, double n[{number_components}]);
int {phase}_{module}_get_param_number(void);
const char **{phase}_{module}_get_param_names(void);
const char **{phase}_{module}_get_param_units(void);
void {phase}_{module}_get_param_values(double **values);
int {phase}_{module}_set_param_values(double *values);
double {phase}_{module}_get_param_value(int index);
int {phase}_{module}_set_param_value(int index, double value);
double {phase}_{module}_dparam_g(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_dgdt(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_dgdp(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdt2(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdtdp(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdp2(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdt3(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdt2dp(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdtdp2(double T, double P, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdp3(double T, double P, double n[{number_components}], int index);
void {phase}_{module}_dparam_dgdn(double T, double P, double n[{number_components}], int index, double result[{number_components}]);
\
"""
def _create_soln_calib_pyx_template_c():
"""
C language implementation of create_soln_calib_pyx_template()
Returns
-------
string :
The template string.
"""
return """\
# Cython numpy wrapper code for arrays is taken from:
# http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html
# Author: Gael Varoquaux, BSD license
# cython: language_level=3
# Declare the prototype of the C functions
cdef extern from "{phase}_{module}_calib.h":
const char *{phase}_{module}_calib_identifier();
const char *{phase}_{module}_calib_name();
char *{phase}_{module}_calib_formula(double T, double P, double n[{number_components}]);
double *{phase}_{module}_calib_conv_elm_to_moles(double *e);
int {phase}_{module}_calib_test_moles(double *n);
const char *{phase}_{module}_calib_endmember_name(int index);
const char *{phase}_{module}_calib_endmember_formula(int index);
const double {phase}_{module}_calib_endmember_mw(int index);
const double *{phase}_{module}_calib_endmember_elements(int index);
double {phase}_{module}_calib_endmember_mu0(int index, double t, double p);
double {phase}_{module}_calib_endmember_dmu0dT(int index, double t, double p);
double {phase}_{module}_calib_endmember_dmu0dP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dT2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dTdP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d2mu0dP2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dT3(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dT2dP(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dTdP2(int index, double t, double p);
double {phase}_{module}_calib_endmember_d3mu0dP3(int index, double t, double p);
double {phase}_{module}_calib_g(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_dgdt(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_dgdp(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d2gdt2(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d2gdtdp(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d2gdp2(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d3gdt3(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d3gdt2dp(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d3gdtdp2(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_d3gdp3(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_s(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_v(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_cv(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_cp(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_dcpdt(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_alpha(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_beta(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_K(double t, double p, double n[{number_components}])
double {phase}_{module}_calib_Kp(double t, double p, double n[{number_components}])
void {phase}_{module}_calib_dgdn(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}])
void {phase}_{module}_calib_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}])
int {phase}_{module}_get_param_number()
const char **{phase}_{module}_get_param_names()
const char **{phase}_{module}_get_param_units()
void {phase}_{module}_get_param_values(double **values)
int {phase}_{module}_set_param_values(double *values)
double {phase}_{module}_get_param_value(int index)
int {phase}_{module}_set_param_value(int index, double value)
double {phase}_{module}_dparam_g(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_dgdt(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_dgdp(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdt2(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdtdp(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d2gdp2(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdt3(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdt2dp(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdtdp2(double t, double p, double n[{number_components}], int index);
double {phase}_{module}_dparam_d3gdp3(double t, double p, double n[{number_components}], int index);
void {phase}_{module}_dparam_dgdn(double t, double p, double n[{number_components}], int index, double result[{number_components}])
from libc.stdlib cimport malloc, free
from cpython cimport PyObject, Py_INCREF
import ctypes
# Import the Python-level symbols of numpy
import numpy as np
# Import the C-level symbols of numpy
cimport numpy as np
# Numpy must be initialized. When using numpy from C or Cython you must
# _always_ do that, or you will have segfaults
np.import_array()
# here is the "wrapper" signature
def {prefix}_{phase}_{module}_calib_identifier():
result = <bytes> {phase}_{module}_calib_identifier()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_name():
result = <bytes> {phase}_{module}_calib_name()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_formula(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
r = {phase}_{module}_calib_formula(<double> t, <double> p, <double *> m)
result = <bytes> r
free (m)
free (r)
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_conv_elm_to_moles(np_array):
cdef double *e = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
e[i] = np_array[i]
r = {phase}_{module}_calib_conv_elm_to_moles(<double *> e)
result = []
for i in range({number_components}):
result.append(r[i])
free (e)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_conv_elm_to_tot_moles(np_array):
cdef double *e = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
e[i] = np_array[i]
r = {phase}_{module}_calib_conv_elm_to_moles(<double *> e)
result = 0.0
for i in range({number_components}):
result += r[i]
free (e)
free (r)
return result
def {prefix}_{phase}_{module}_calib_conv_elm_to_tot_grams(np_array):
cdef double *e = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
e[i] = np_array[i]
r = {phase}_{module}_calib_conv_elm_to_moles(<double *> e)
result = 0.0
for i in range({number_components}):
mw = {prefix}_{phase}_{module}_calib_endmember_mw(i)
result += r[i]*mw
free (e)
free (r)
return result
def {prefix}_{phase}_{module}_calib_conv_moles_to_tot_moles(np_array):
result = 0.0
for i in range({number_components}):
result += np_array[i]
return result
def {prefix}_{phase}_{module}_calib_conv_moles_to_mole_frac(np_array):
result = np.zeros({number_components})
sum = np.sum(np_array)
for i in range({number_components}):
result[i] += np_array[i]/sum
return result
def {prefix}_{phase}_{module}_calib_conv_moles_to_elm(np_array):
result = np.zeros(106)
for i in range({number_components}):
end = {prefix}_{phase}_{module}_calib_endmember_elements(i)
for j in range(0,106):
result[j] += np_array[i]*end[j]
return result
def {prefix}_{phase}_{module}_calib_test_moles(np_array):
cdef double *n = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
n[i] = np_array[i]
result = {phase}_{module}_calib_test_moles(<double *> n)
free (n)
return False if result == 0 else True
def {prefix}_{phase}_{module}_calib_endmember_number():
return {number_components}
def {prefix}_{phase}_{module}_calib_endmember_name(int index):
assert index in range(0,{number_components}), "index out of range"
result = {phase}_{module}_calib_endmember_name(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_endmember_formula(int index):
assert index in range(0,{number_components}), "index out of range"
result = {phase}_{module}_calib_endmember_formula(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_endmember_mw(int index):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_mw(index);
def {prefix}_{phase}_{module}_calib_endmember_elements(int index):
assert index in range(0,{number_components}), "index out of range"
r = {phase}_{module}_calib_endmember_elements(index);
result = []
for i in range(0,106):
result.append(r[i])
return np.array(result)
def {prefix}_{phase}_{module}_calib_species_number():
return {number_species}
def {prefix}_{phase}_{module}_calib_species_name(int index):
assert index in range(0,{number_species}), "index out of range"
result = {phase}_{module}_calib_endmember_name(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_species_formula(int index):
assert index in range(0,{number_species}), "index out of range"
result = {phase}_{module}_calib_endmember_formula(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_calib_species_mw(int index):
assert index in range(0,{number_species}), "index out of range"
return {phase}_{module}_calib_endmember_mw(index);
def {prefix}_{phase}_{module}_calib_species_elements(int index):
assert index in range(0,{number_species}), "index out of range"
r = {phase}_{module}_calib_endmember_elements(index);
result = []
for i in range(0,106):
result.append(r[i])
return np.array(result)
def {prefix}_{phase}_{module}_calib_endmember_mu0(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_mu0(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_dmu0dT(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_dmu0dT(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_dmu0dP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_dmu0dP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d2mu0dT2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d2mu0dT2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d2mu0dTdP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d2mu0dTdP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d2mu0dP2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d2mu0dP2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d3mu0dT3(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d3mu0dT3(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d3mu0dT2dP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d3mu0dT2dP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d3mu0dTdP2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d3mu0dTdP2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_endmember_d3mu0dP3(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_calib_endmember_d3mu0dP3(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_calib_g(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_g(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_dgdt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_dgdt(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_dgdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_dgdp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d2gdt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d2gdt2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d2gdtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d2gdtdp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d2gdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d2gdp2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d3gdt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d3gdt3(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d3gdt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d3gdt2dp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d3gdtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d3gdtdp2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_d3gdp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_d3gdp3(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_s(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_s(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_v(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_v(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_cv(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_cv(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_cp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_cp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_dcpdt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_dcpdt(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_alpha(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_alpha(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_beta(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_beta(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_K(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_K(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_Kp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_calib_Kp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_calib_dgdn(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_dgdn(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d2gdndt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d2gdndt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d2gdndp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d2gdndp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdndt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d3gdndt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdndtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d3gdndtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdndp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d3gdndp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdndt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d4gdndt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdndt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d4gdndt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdndtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d4gdndtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdndp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_calib_d4gdndp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d2gdn2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d2gdn2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdn2dt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d3gdn2dt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdn2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d3gdn2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdn2dt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d4gdn2dt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdn2dtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d4gdn2dtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdn2dp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d4gdn2dp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn2dt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn2dt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn2dt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn2dt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn2dtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn2dtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn2dp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn2dp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d3gdn3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d3gdn3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdn3dt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d4gdn3dt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d4gdn3dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d4gdn3dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn3dt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn3dt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn3dtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn3dtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d5gdn3dp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d5gdn3dp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d6gdn3dt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d6gdn3dt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d6gdn3dt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d6gdn3dt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d6gdn3dtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d6gdn3dtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_calib_d6gdn3dp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_calib_d6gdn3dp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_get_param_number():
result = {phase}_{module}_get_param_number()
return result
def {prefix}_{phase}_{module}_get_param_names():
cdef const char **names = {phase}_{module}_get_param_names()
n = {phase}_{module}_get_param_number()
result = []
for i in range(0,n):
entry = <bytes> names[i]
result.append(entry.decode('UTF-8'))
return result
def {prefix}_{phase}_{module}_get_param_units():
cdef const char **units = {phase}_{module}_get_param_units()
n = {phase}_{module}_get_param_number()
result = []
for i in range(0,n):
entry = <bytes> units[i]
result.append(entry.decode('UTF-8'))
return result
def {prefix}_{phase}_{module}_get_param_values():
n = {phase}_{module}_get_param_number()
cdef double *m = <double *>malloc(n*sizeof(double))
{phase}_{module}_get_param_values(&m)
np_array = np.zeros(n)
for i in range(n):
np_array[i] = m[i]
free(m)
return np_array
def {prefix}_{phase}_{module}_set_param_values(np_array):
n = len(np_array)
cdef double *m = <double *>malloc(n*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_set_param_values(m);
free(m)
return result
def {prefix}_{phase}_{module}_get_param_value(int index):
result = {phase}_{module}_get_param_value(<int> index)
return result
def {prefix}_{phase}_{module}_set_param_value(int index, double value):
result = {phase}_{module}_set_param_value(<int> index, <double> value)
return result
def {prefix}_{phase}_{module}_dparam_g(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_g(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_dgdt(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_dgdt(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_dgdp(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_dgdp(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d2gdt2(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d2gdt2(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d2gdtdp(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d2gdtdp(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d2gdp2(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d2gdp2(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d3gdt3(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d3gdt3(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d3gdt2dp(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d3gdt2dp(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d3gdtdp2(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d3gdtdp2(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_d3gdp3(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dparam_d3gdp3(<double> t, <double> p, <double *> m, <int> index)
free(m)
return result
def {prefix}_{phase}_{module}_dparam_dgdn(double t, double p, np_array, int index):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
cdef double *r = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
{phase}_{module}_dparam_dgdn(<double> t, <double> p, <double *> m, <int> index, <double *> r)
r_np_array = np.zeros(len(np_array))
for i in range(r_np_array.size):
r_np_array[i] = r[i]
free(m)
free(r)
return r_np_array
\
"""
def _create_soln_calib_template_c():
"""
C language implementation of create_soln_calib_template()
Returns
-------
string :
The template string.
"""
return """\
static double {module}_dparam_{func}(double T, double P, double n[{number_components}], int index) {{
{moles_assign}
double result = 0.0;
switch (index) {{
{switch_code}
default:
break;
}}
return result;
}}
\
"""
def _create_soln_deriv_template_c():
"""
C language implementation of create_soln_deriv_template()
Returns
-------
string :
The template string.
"""
return """\
static void {module}_{func}(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{moles_assign}
{derivative_code}
}}
\
"""
def _create_soln_fast_code_template_c():
"""
C language implementation of create_soln_fast_code_template()
Returns
-------
string :
The template string.
"""
return """\
static const char *identifier = "{git_identifier}";
{code_block_one}
#include "{module}_calc.h"
const char *{phase}_{module}_identifier(void) {{
return identifier;
}}
const char *{phase}_{module}_name(void) {{
return "{phase}";
}}
char *{phase}_{module}_formula(double T, double P, double n[{number_components}]) {{
{code_block_five}
}}
double *{phase}_{module}_conv_elm_to_moles(double *e) {{
{code_block_six}
}}
int {phase}_{module}_test_moles(double *n) {{
{code_block_seven}
}}
const char *{phase}_{module}_endmember_name(int index) {{
return (*endmember[index].name)();
}}
const char *{phase}_{module}_endmember_formula(int index) {{
return (*endmember[index].formula)();
}}
const double {phase}_{module}_endmember_mw(int index) {{
return (*endmember[index].mw)();
}}
const double *{phase}_{module}_endmember_elements(int index) {{
return (*endmember[index].elements)();
}}
double {phase}_{module}_endmember_mu0(int index, double t, double p) {{
return (*endmember[index].mu0)(t, p);
}}
double {phase}_{module}_endmember_dmu0dT(int index, double t, double p) {{
return (*endmember[index].dmu0dT)(t, p);
}}
double {phase}_{module}_endmember_dmu0dP(int index, double t, double p) {{
return (*endmember[index].dmu0dP)(t, p);
}}
double {phase}_{module}_endmember_d2mu0dT2(int index, double t, double p) {{
return (*endmember[index].d2mu0dT2)(t, p);
}}
double {phase}_{module}_endmember_d2mu0dTdP(int index, double t, double p) {{
return (*endmember[index].d2mu0dTdP)(t, p);
}}
double {phase}_{module}_endmember_d2mu0dP2(int index, double t, double p) {{
return (*endmember[index].d2mu0dP2)(t, p);
}}
double {phase}_{module}_endmember_d3mu0dT3(int index, double t, double p) {{
return (*endmember[index].d3mu0dT3)(t, p);
}}
double {phase}_{module}_endmember_d3mu0dT2dP(int index, double t, double p) {{
return (*endmember[index].d3mu0dT2dP)(t, p);
}}
double {phase}_{module}_endmember_d3mu0dTdP2(int index, double t, double p) {{
return (*endmember[index].d3mu0dTdP2)(t, p);
}}
double {phase}_{module}_endmember_d3mu0dP3(int index, double t, double p) {{
return (*endmember[index].d3mu0dP3)(t, p);
}}
double {phase}_{module}_g(double T, double P, double n[{number_components}]) {{
return {module}_g(T, P, n);
}}
void {phase}_{module}_dgdn(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_dgdn(T, P, n, result);
}}
void {phase}_{module}_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdn2(T, P, n, result);
}}
void {phase}_{module}_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn3(T, P, n, result);
}}
double {phase}_{module}_dgdt(double T, double P, double n[{number_components}]) {{
return {module}_dgdt(T, P, n);
}}
void {phase}_{module}_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdndt(T, P, n, result);
}}
void {phase}_{module}_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn2dt(T, P, n, result);
}}
void {phase}_{module}_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn3dt(T, P, n, result);
}}
double {phase}_{module}_dgdp(double T, double P, double n[{number_components}]) {{
return {module}_dgdp(T, P, n);
}}
void {phase}_{module}_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d2gdndp(T, P, n, result);
}}
void {phase}_{module}_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdn2dp(T, P, n, result);
}}
void {phase}_{module}_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn3dp(T, P, n, result);
}}
double {phase}_{module}_d2gdt2(double T, double P, double n[{number_components}]) {{
return {module}_d2gdt2(T, P, n);
}}
void {phase}_{module}_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndt2(T, P, n, result);
}}
void {phase}_{module}_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dt2(T, P, n, result);
}}
void {phase}_{module}_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dt2(T, P, n, result);
}}
double {phase}_{module}_d2gdtdp(double T, double P, double n[{number_components}]) {{
return {module}_d2gdtdp(T, P, n);
}}
void {phase}_{module}_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndtdp(T, P, n, result);
}}
void {phase}_{module}_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dtdp(T, P, n, result);
}}
void {phase}_{module}_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dtdp(T, P, n, result);
}}
double {phase}_{module}_d2gdp2(double T, double P, double n[{number_components}]) {{
return {module}_d2gdp2(T, P, n);
}}
void {phase}_{module}_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d3gdndp2(T, P, n, result);
}}
void {phase}_{module}_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdn2dp2(T, P, n, result);
}}
void {phase}_{module}_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn3dp2(T, P, n, result);
}}
double {phase}_{module}_d3gdt3(double T, double P, double n[{number_components}]) {{
return {module}_d3gdt3(T, P, n);
}}
void {phase}_{module}_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndt3(T, P, n, result);
}}
void {phase}_{module}_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dt3(T, P, n, result);
}}
void {phase}_{module}_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dt3(T, P, n, result);
}}
double {phase}_{module}_d3gdt2dp(double T, double P, double n[{number_components}]) {{
return {module}_d3gdt2dp(T, P, n);
}}
void {phase}_{module}_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndt2dp(T, P, n, result);
}}
void {phase}_{module}_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dt2dp(T, P, n, result);
}}
void {phase}_{module}_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dt2dp(T, P, n, result);
}}
double {phase}_{module}_d3gdtdp2(double T, double P, double n[{number_components}]) {{
return {module}_d3gdtdp2(T, P, n);
}}
void {phase}_{module}_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndtdp2(T, P, n, result);
}}
void {phase}_{module}_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dtdp2(T, P, n, result);
}}
void {phase}_{module}_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dtdp2(T, P, n, result);
}}
double {phase}_{module}_d3gdp3(double T, double P, double n[{number_components}]) {{
return {module}_d3gdp3(T, P, n);
}}
void {phase}_{module}_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d4gdndp3(T, P, n, result);
}}
void {phase}_{module}_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d5gdn2dp3(T, P, n, result);
}}
void {phase}_{module}_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}]) {{
{module}_d6gdn3dp3(T, P, n, result);
}}
double {phase}_{module}_s(double T, double P, double n[{number_components}]) {{
return {module}_s(T, P, n);
}}
double {phase}_{module}_v(double T, double P, double n[{number_components}]) {{
return {module}_v(T, P, n);
}}
double {phase}_{module}_cv(double T, double P, double n[{number_components}]) {{
return {module}_cv(T, P, n);
}}
double {phase}_{module}_cp(double T, double P, double n[{number_components}]) {{
return {module}_cp(T, P, n);
}}
double {phase}_{module}_dcpdt(double T, double P, double n[{number_components}]) {{
return {module}_dcpdt(T, P, n);
}}
double {phase}_{module}_alpha(double T, double P, double n[{number_components}]) {{
return {module}_alpha(T, P, n);
}}
double {phase}_{module}_beta(double T, double P, double n[{number_components}]) {{
return {module}_beta(T, P, n);
}}
double {phase}_{module}_K(double T, double P, double n[{number_components}]) {{
return {module}_K(T, P, n);
}}
double {phase}_{module}_Kp(double T, double P, double n[{number_components}]) {{
return {module}_Kp(T, P, n);
}}
\
"""
def _create_soln_fast_include_template_c():
"""
C language implementation of create_soln_fast_include_template()
Returns
-------
string :
The template string.
"""
return """\
const char *{phase}_{module}_identifier(void);
const char *{phase}_{module}_name(void);
char *{phase}_{module}_formula(double T, double P, double n[{number_components}]);
double *{phase}_{module}_conv_elm_to_moles(double *e);
int {phase}_{module}_test_moles(double *n);
const char *{phase}_{module}_endmember_name(int index);
const char *{phase}_{module}_endmember_formula(int index);
const double {phase}_{module}_endmember_mw(int index);
const double *{phase}_{module}_endmember_elements(int index);
double {phase}_{module}_endmember_mu0(int index, double t, double p);
double {phase}_{module}_endmember_dmu0dT(int index, double t, double p);
double {phase}_{module}_endmember_dmu0dP(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dT2(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dTdP(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dP2(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dT3(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dT2dP(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dTdP2(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dP3(int index, double t, double p);
double {phase}_{module}_g(double T, double P, double n[{number_components}]);
double {phase}_{module}_dgdt(double T, double P, double n[{number_components}]);
double {phase}_{module}_dgdp(double T, double P, double n[{number_components}]);
double {phase}_{module}_d2gdt2(double T, double P, double n[{number_components}]);
double {phase}_{module}_d2gdtdp(double T, double P, double n[{number_components}]);
double {phase}_{module}_d2gdp2(double T, double P, double n[{number_components}]);
double {phase}_{module}_d3gdt3(double T, double P, double n[{number_components}]);
double {phase}_{module}_d3gdt2dp(double T, double P, double n[{number_components}]);
double {phase}_{module}_d3gdtdp2(double T, double P, double n[{number_components}]);
double {phase}_{module}_d3gdp3(double T, double P, double n[{number_components}]);
void {phase}_{module}_dgdn(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
double {phase}_{module}_s(double T, double P, double n[{number_components}]);
double {phase}_{module}_v(double T, double P, double n[{number_components}]);
double {phase}_{module}_cv(double T, double P, double n[{number_components}]);
double {phase}_{module}_cp(double T, double P, double n[{number_components}]);
double {phase}_{module}_dcpdt(double T, double P, double n[{number_components}]);
double {phase}_{module}_alpha(double T, double P, double n[{number_components}]);
double {phase}_{module}_beta(double T, double P, double n[{number_components}]);
double {phase}_{module}_K(double T, double P, double n[{number_components}]);
double {phase}_{module}_Kp(double T, double P, double n[{number_components}]);
\
"""
def _create_soln_fast_pyx_template_c():
"""
C language implementation of create_soln_fast_pyx_template()
Returns
-------
string :
The template string.
"""
return """\
# Cython numpy wrapper code for arrays is taken from:
# http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html
# Author: Gael Varoquaux, BSD license
# cython: language_level=3
# Declare the prototype of the C functions
cdef extern from "{phase}_{module}_calc.h":
const char *{phase}_{module}_identifier();
const char *{phase}_{module}_name();
char *{phase}_{module}_formula(double T, double P, double n[{number_components}]);
double *{phase}_{module}_conv_elm_to_moles(double *e);
int {phase}_{module}_test_moles(double *n);
const char *{phase}_{module}_endmember_name(int index);
const char *{phase}_{module}_endmember_formula(int index);
const double {phase}_{module}_endmember_mw(int index);
const double *{phase}_{module}_endmember_elements(int index);
double {phase}_{module}_endmember_mu0(int index, double t, double p);
double {phase}_{module}_endmember_dmu0dT(int index, double t, double p);
double {phase}_{module}_endmember_dmu0dP(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dT2(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dTdP(int index, double t, double p);
double {phase}_{module}_endmember_d2mu0dP2(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dT3(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dT2dP(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dTdP2(int index, double t, double p);
double {phase}_{module}_endmember_d3mu0dP3(int index, double t, double p);
double {phase}_{module}_g(double t, double p, double n[{number_components}])
double {phase}_{module}_dgdt(double t, double p, double n[{number_components}])
double {phase}_{module}_dgdp(double t, double p, double n[{number_components}])
double {phase}_{module}_d2gdt2(double t, double p, double n[{number_components}])
double {phase}_{module}_d2gdtdp(double t, double p, double n[{number_components}])
double {phase}_{module}_d2gdp2(double t, double p, double n[{number_components}])
double {phase}_{module}_d3gdt3(double t, double p, double n[{number_components}])
double {phase}_{module}_d3gdt2dp(double t, double p, double n[{number_components}])
double {phase}_{module}_d3gdtdp2(double t, double p, double n[{number_components}])
double {phase}_{module}_d3gdp3(double t, double p, double n[{number_components}])
double {phase}_{module}_s(double t, double p, double n[{number_components}])
double {phase}_{module}_v(double t, double p, double n[{number_components}])
double {phase}_{module}_cv(double t, double p, double n[{number_components}])
double {phase}_{module}_cp(double t, double p, double n[{number_components}])
double {phase}_{module}_dcpdt(double t, double p, double n[{number_components}])
double {phase}_{module}_alpha(double t, double p, double n[{number_components}])
double {phase}_{module}_beta(double t, double p, double n[{number_components}])
double {phase}_{module}_K(double t, double p, double n[{number_components}])
double {phase}_{module}_Kp(double t, double p, double n[{number_components}])
void {phase}_{module}_dgdn(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdndt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdndp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdndp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdndp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d2gdn2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn2dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn2dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn2dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d3gdn3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn3dt(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d4gdn3dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dt2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dtdp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d5gdn3dp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dt3(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dt2dp(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dtdp2(double T, double P, double n[{number_components}], double result[{number_components}]);
void {phase}_{module}_d6gdn3dp3(double T, double P, double n[{number_components}], double result[{number_components}]);
from libc.stdlib cimport malloc, free
from cpython cimport PyObject, Py_INCREF
import ctypes
# Import the Python-level symbols of numpy
import numpy as np
# Import the C-level symbols of numpy
cimport numpy as np
# Numpy must be initialized. When using numpy from C or Cython you must
# _always_ do that, or you will have segfaults
np.import_array()
# here is the "wrapper" signature
def {prefix}_{phase}_{module}_identifier():
result = <bytes> {phase}_{module}_identifier()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_name():
result = <bytes> {phase}_{module}_name()
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_formula(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
r = {phase}_{module}_formula(<double> t, <double> p, <double *> m)
result = <bytes> r
free (m)
free (r)
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_conv_elm_to_moles(np_array):
cdef double *e = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
e[i] = np_array[i]
r = {phase}_{module}_conv_elm_to_moles(<double *> e)
result = []
for i in range({number_components}):
result.append(r[i])
free(r)
return np.array(result)
def {prefix}_{phase}_{module}_test_moles(np_array):
cdef double *n = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
n[i] = np_array[i]
result = {phase}_{module}_test_moles(<double *> n)
return False if result == 0 else True
def {prefix}_{phase}_{module}_endmember_number():
return {number_components}
def {prefix}_{phase}_{module}_endmember_name(int index):
assert index in range(0,{number_components}), "index out of range"
result = {phase}_{module}_endmember_name(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_endmember_formula(int index):
assert index in range(0,{number_components}), "index out of range"
result = {phase}_{module}_endmember_formula(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_endmember_mw(int index):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_mw(index);
def {prefix}_{phase}_{module}_endmember_elements(int index):
assert index in range(0,{number_components}), "index out of range"
r = {phase}_{module}_endmember_elements(index);
result = []
for i in range(0,106):
result.append(r[i])
return np.array(result)
def {prefix}_{phase}_{module}_species_number():
return {number_species}
def {prefix}_{phase}_{module}_species_name(int index):
assert index in range(0,{number_species}), "index out of range"
result = {phase}_{module}_endmember_name(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_species_formula(int index):
assert index in range(0,{number_species}), "index out of range"
result = {phase}_{module}_endmember_formula(index);
return result.decode('UTF-8')
def {prefix}_{phase}_{module}_species_mw(int index):
assert index in range(0,{number_species}), "index out of range"
return {phase}_{module}_endmember_mw(index);
def {prefix}_{phase}_{module}_species_elements(int index):
assert index in range(0,{number_species}), "index out of range"
r = {phase}_{module}_endmember_elements(index);
result = []
for i in range(0,106):
result.append(r[i])
return np.array(result)
def {prefix}_{phase}_{module}_endmember_mu0(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_mu0(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_dmu0dT(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_dmu0dT(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_dmu0dP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_dmu0dP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d2mu0dT2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d2mu0dT2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d2mu0dTdP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d2mu0dTdP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d2mu0dP2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d2mu0dP2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d3mu0dT3(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d3mu0dT3(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d3mu0dT2dP(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d3mu0dT2dP(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d3mu0dTdP2(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d3mu0dTdP2(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_endmember_d3mu0dP3(int index, double t, double p):
assert index in range(0,{number_components}), "index out of range"
return {phase}_{module}_endmember_d3mu0dP3(index, <double> t, <double> p);
def {prefix}_{phase}_{module}_g(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_g(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_dgdt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dgdt(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_dgdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dgdp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d2gdt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d2gdt2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d2gdtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d2gdtdp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d2gdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d2gdp2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d3gdt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d3gdt3(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d3gdt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d3gdt2dp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d3gdtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d3gdtdp2(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_d3gdp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_d3gdp3(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_s(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_s(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_v(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_v(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_cv(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_cv(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_cp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_cp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_dcpdt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_dcpdt(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_alpha(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_alpha(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_beta(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_beta(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_K(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_K(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_Kp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
result = {phase}_{module}_Kp(<double> t, <double> p, <double *> m)
free (m)
return result
def {prefix}_{phase}_{module}_dgdn(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_dgdn(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d2gdndt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d2gdndt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d2gdndp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d2gdndp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdndt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d3gdndt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdndtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d3gdndtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdndp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d3gdndp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdndt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d4gdndt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdndt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d4gdndt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdndtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d4gdndtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdndp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
cdef double *r = <double *>malloc({number_components}*sizeof(double))
{phase}_{module}_d4gdndp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range({number_components}):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d2gdn2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d2gdn2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdn2dt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d3gdn2dt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdn2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d3gdn2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdn2dt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d4gdn2dt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdn2dtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d4gdn2dtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdn2dp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d4gdn2dp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn2dt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn2dt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn2dt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn2dt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn2dtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn2dtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn2dp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
ndim = int({number_components}*({number_components}-1)/2 + {number_components})
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn2dp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d3gdn3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d3gdn3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdn3dt(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d4gdn3dt(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d4gdn3dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d4gdn3dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn3dt2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn3dt2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn3dtdp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn3dtdp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d5gdn3dp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d5gdn3dp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d6gdn3dt3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d6gdn3dt3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d6gdn3dt2dp(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d6gdn3dt2dp(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d6gdn3dtdp2(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d6gdn3dtdp2(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
def {prefix}_{phase}_{module}_d6gdn3dp3(double t, double p, np_array):
cdef double *m = <double *>malloc(len(np_array)*sizeof(double))
for i in range(np_array.size):
m[i] = np_array[i]
nc = {number_components}
ndim = int(nc*(nc+1)*(nc+2)/6)
cdef double *r = <double *>malloc(ndim*sizeof(double))
{phase}_{module}_d6gdn3dp3(<double> t, <double> p, <double *> m, <double *> r)
result = []
for i in range(ndim):
result.append(r[i])
free (m)
free (r)
return np.array(result)
\
"""
def _create_soln_pyxbld_template_c():
"""
C language implementation of create_pyxbld_template()
Returns
-------
string :
The template string.
Notes
-----
setuptools.extension.Extension
self,
name,
sources,
include_dirs=None,
define_macros=None,
undef_macros=None,
library_dirs=None,
libraries=None,
runtime_library_dirs=None,
extra_objects=None,
extra_compile_args=None,
extra_link_args=None,
export_symbols=None,
swig_opts=None,
depends=None,
language=None,
optional=None,
**kw
-O0, -O1, -O2, -O3, -Ofast, -Os, -Oz, -Og, -O, -O4
Specify which optimization level to use:
-O0 Means “no optimization”: this level compiles the fastest and
generates the most debuggable code.
-O1 Somewhere between -O0 and -O2.
-O2 Moderate level of optimization which enables most optimizations.
-O3 Like -O2, except that it enables optimizations that take longer
to perform or that may generate larger code (in an attempt to make
the program run faster).
-Ofast Enables all the optimizations from -O3 along with other
agressive optimizations that may violate strict compliance with
language standards.
-Os Like -O2 with extra optimizations to reduce code size.
-Oz Like -Os (and thus -O2), but reduces code size further.
-Og Like -O1. In future versions, this option might disable
different optimizations in order to improve debuggability.
-O Equivalent to -O2.
-O4 and higher
"""
return """\
import numpy
# module name specified by `%%cython_pyximport` magic
# | just `modname + ".pyx"`
# | |
def make_ext(modname, pyxfilename):
from setuptools.extension import Extension
return Extension(modname,
sources=[pyxfilename, {files_to_compile}],
define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
include_dirs=['.', numpy.get_include()],
extra_compile_args=['-O3', '-Wno-unused-const-variable', '-Wno-unreachable-code-fallthrough', '-Wno-unused-variable'])
\
"""
def _create_soln_redun_template_c():
"""
C language implementation of create_soln_deriv_template()
Returns
-------
string :
The template string.
"""
return """\
static double {module}_s(double T, double P, double n[{number_components}]) {{
double result = -{module}_dgdt(T, P, n);
return result;
}}
static double {module}_v(double T, double P, double n[{number_components}]) {{
double result = {module}_dgdp(T, P, n);
return result;
}}
static double {module}_cv(double T, double P, double n[{number_components}]) {{
double result = -T*{module}_d2gdt2(T, P, n);
double dvdt = {module}_d2gdtdp(T, P, n);
double dvdp = {module}_d2gdp2(T, P, n);
result += T*dvdt*dvdt/dvdp;
return result;
}}
static double {module}_cp(double T, double P, double n[{number_components}]) {{
double result = -T*{module}_d2gdt2(T, P, n);
return result;
}}
static double {module}_dcpdt(double T, double P, double n[{number_components}]) {{
double result = -T*{module}_d3gdt3(T, P, n) - {module}_d2gdt2(T, P, n);
return result;
}}
static double {module}_alpha(double T, double P, double n[{number_components}]) {{
double result = {module}_d2gdtdp(T, P, n)/{module}_dgdp(T, P, n);
return result;
}}
static double {module}_beta(double T, double P, double n[{number_components}]) {{
double result = -{module}_d2gdp2(T, P, n)/{module}_dgdp(T, P, n);
return result;
}}
static double {module}_K(double T, double P, double n[{number_components}]) {{
double result = -{module}_dgdp(T, P, n)/{module}_d2gdp2(T, P, n);
return result;
}}
static double {module}_Kp(double T, double P, double n[{number_components}]) {{
double result = {module}_dgdp(T, P, n);
result *= {module}_d3gdp3(T, P, n);
result /= pow({module}_d2gdp2(T, P, n), 2.0);
return result - 1.0;
}}
\
"""
def _create_soln_std_state_include_template_c():
"""
C language implementation of create_soln_std_state_include_template()
Returns
-------
string :
The template string.
Notes
-----
Structure looks like:
typedef struct _endmembers {
const char *(*name) (void);
const char *(*formula) (void);
const double (*mw) (void);
double (*mu0) (double t, double p);
double (*dmu0dT) (double t, double p);
double (*dmu0dP) (double t, double p);
double (*d2mu0dT2) (double t, double p);
double (*d2mu0dTdP) (double t, double p);
double (*d2mu0dP2) (double t, double p);
double (*d3mu0dT3) (double t, double p);
double (*d3mu0dT2dP) (double t, double p);
double (*d3mu0dTdP2) (double t, double p);
double (*d3mu0dP3) (double t, double p);
} Endmembers;
static Endmembers endmember[] = {
{
Albite_berman_name,
Albite_berman_formula,
Albite_berman_mw,
Albite_berman_g,
Albite_berman_dgdt,
Albite_berman_dgdp,
Albite_berman_d2gdt2,
Albite_berman_d2gdtdp,
Albite_berman_d2gdp2,
Albite_berman_d3gdt3,
Albite_berman_d3gdt2dp,
Albite_berman_d3gdtdp2,
Albite_berman_d3gdp3
},
{
Anorthite_berman_name,
Anorthite_berman_formula,
Anorthite_berman_mw,
Anorthite_berman_g,
Anorthite_berman_dgdt,
Anorthite_berman_dgdp,
Anorthite_berman_d2gdt2,
Anorthite_berman_d2gdtdp,
Anorthite_berman_d2gdp2,
Anorthite_berman_d3gdt3,
Anorthite_berman_d3gdt2dp,
Anorthite_berman_d3gdtdp2,
Anorthite_berman_d3gdp3
},
{
Sanidine_berman_name,
Sanidine_berman_formula,
Sanidine_berman_mw,
Sanidine_berman_g,
Sanidine_berman_dgdt,
Sanidine_berman_dgdp,
Sanidine_berman_d2gdt2,
Sanidine_berman_d2gdtdp,
Sanidine_berman_d2gdp2,
Sanidine_berman_d3gdt3,
Sanidine_berman_d3gdt2dp,
Sanidine_berman_d3gdtdp2,
Sanidine_berman_d3gdp3
}
};
static int nc = (sizeof endmember / sizeof(_endmembers));
"""
return """\
#include <stdlib.h>
#include <stdio.h>
{code_block_four}
typedef struct _endmembers {{
const char *(*name) (void);
const char *(*formula) (void);
const double (*mw) (void);
const double *(*elements) (void);
double (*mu0) (double t, double p);
double (*dmu0dT) (double t, double p);
double (*dmu0dP) (double t, double p);
double (*d2mu0dT2) (double t, double p);
double (*d2mu0dTdP) (double t, double p);
double (*d2mu0dP2) (double t, double p);
double (*d3mu0dT3) (double t, double p);
double (*d3mu0dT2dP) (double t, double p);
double (*d3mu0dTdP2) (double t, double p);
double (*d3mu0dP3) (double t, double p);
}} Endmembers;
static Endmembers endmember[] = {{
{code_block_three}
}};
static int nc = (sizeof endmember / sizeof(struct _endmembers));
static const double R=8.3143;
\
"""
def _create_ordering_gaussj_template_c():
"""
C language implementation of create_ordering_gaussj_template()
Returns
-------
string :
The template string.
"""
return """\
#define SWAP(a,b) {{temp=(a);(a)=(b);(b)=temp;}}
static void gaussj(double a[{NS}][{NS}]) {{
int indxc[{NS}], indxr[{NS}], ipiv[{NS}];
int i, icol = -1, irow = -1, j, k, l,ll;
double big, dum, pivinv, temp;
for (j=0; j<{NS}; j++) ipiv[j]=0;
for (i=0; i<{NS}; i++) {{
big=0.0;
for (j=0; j<{NS}; j++)
if (ipiv[j] != 1)
for (k=0; k<{NS}; k++) {{
if (ipiv[k] == 0) {{
if (fabs(a[j][k]) >= big) {{
big = fabs(a[j][k]);
irow = j;
icol = k;
}}
}} else if (ipiv[k] > 1) return;
}}
++(ipiv[icol]);
if (irow != icol) {{
for (l=0; l<{NS}; l++) SWAP(a[irow][l],a[icol][l])
}}
indxr[i] = irow;
indxc[i] = icol;
if (a[icol][icol] == 0.0) return;
pivinv = 1.0/a[icol][icol];
a[icol][icol] = 1.0;
for (l=0; l<{NS}; l++) a[icol][l] *= pivinv;
for (ll=0; ll<{NS}; ll++)
if (ll != icol) {{
dum = a[ll][icol];
a[ll][icol] = 0.0;
for (l=0; l<{NS}; l++) a[ll][l] -= a[icol][l]*dum;
}}
}}
for (l=({NS}-1); l>=0; l--) {{
if (indxr[l] != indxc[l])
for (k=0; k<{NS}; k++)
SWAP(a[k][indxr[l]],a[k][indxc[l]]);
}}
}}
"""
def _create_ordering_code_template_c():
"""
C language implementation of create_ordering_code_template()
Returns
-------
string :
The template string.
"""
return """\
static void order_s(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}]) {{
double dgds[{NS}], sOld[{NS}];
int i, j, iter = 0;
{ORDER_CODE_BLOCK_ZERO}
do {{
double deltaS[{NS}], steplength;
{ORDER_CODE_BLOCK_TWO}
for (i=0; i<{NS}; i++) sOld[i] = s[i];
{ORDER_CODE_BLOCK_THREE}
for (i=0; i<{NS}; i++) {{
for(j=0; j<{NS}; j++) s[i] += - invd2gds2[i][j]*dgds[j];
deltaS[i] = s[i] - sOld[i];
}}
steplength = 2.0;
{ORDER_CODE_BLOCK_FOUR}
if (steplength < 1.0) for (i=0; i<{NS}; i++)
s[i] = sOld[i] + steplength*deltaS[i];
#ifdef NEVER_DEFINED
printf("\\n");
printf("iter: %3d, step: %13.6e \\n", iter, steplength);
for (i=0; i<{NS}; i++) {{
printf(".s%d. %13.6e %13.6e %13.6e %13.6e \\n", i+1, sOld[i], s[i], deltaS[i], dgds[i]);
}}
#endif
iter++;
}} while (({ORDER_CODE_BLOCK_ONE}) && (iter < {MAX_ITER}));
}}
static void order_dsdn(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double dsdn[{NS}][{NC}]) {{
{ORDER_CODE_BLOCK_FIVE}
int i,j,k;
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
}}
static void order_dsdt(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double dsdt[{NS}]) {{
int i,j;
{ORDER_CODE_BLOCK_SIX}
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
}}
static void order_dsdp(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double dsdp[{NS}]) {{
int i,j;
{ORDER_CODE_BLOCK_SEVEN}
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
}}
static void order_d2sdn2(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdn2[{NS}][{NC}][{NC}]) {{
double dsdn[{NS}][{NC}], temp[{NS}];
int i, j, k, l, m, o;
{ORDER_CODE_BLOCK_EIGHT}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdn2 cube */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NC}; k++) {{
for (l=0; l<{NS}; l++) {{
temp[l] = d3gdn2ds[j][k][l];
for (m=0; m<{NS}; m++) {{
temp[l] += d3gdnds2[j][l][m]*dsdn[m][k]
+ d3gdnds2[k][l][m]*dsdn[m][j];
for (o=0; o<{NS}; o++)
temp[l] += d3gds3[l][m][o]*dsdn[m][j]*dsdn[o][k];
}}
}}
d2sdn2[i][j][k] = 0.0;
for (l=0; l<{NS}; l++) d2sdn2[i][j][k] += - invd2gds2[i][l]*temp[l];
}}
}}
}}
}}
static void order_d2sdndt(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdndt[{NS}][{NC}]) {{
double dsdn[{NS}][{NC}], dsdt[{NS}], temp[{NS}];
int i, j, k, l, m;
{ORDER_CODE_BLOCK_NINE}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute d2sdndt matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NS}; k++) {{
temp[k] = d3gdndsdt[j][k];
for (l=0; l<{NS}; l++) {{
temp[k] += d3gdnds2[j][k][l]*dsdt[l] + d3gds2dt[k][l]*dsdn[l][j];
for (m=0; m<{NS}; m++) temp[k] += d3gds3[k][l][m]*dsdn[l][j]*dsdt[m];
}}
}}
d2sdndt[i][j] = 0.0;
for (k=0; k<{NS}; k++) d2sdndt[i][j] += - invd2gds2[i][k]*temp[k];
}}
}}
}}
static void order_d2sdndp(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdndp[{NS}][{NC}]) {{
double dsdn[{NS}][{NC}], dsdp[{NS}], temp[{NS}];
int i, j, k, l, m;
{ORDER_CODE_BLOCK_TEN}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdndp matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NS}; k++) {{
temp[k] = d3gdndsdp[j][k];
for (l=0; l<{NS}; l++) {{
temp[k] += d3gdnds2[j][k][l]*dsdp[l] + d3gds2dp[k][l]*dsdn[l][j];
for (m=0; m<{NS}; m++) temp[k] += d3gds3[k][l][m]*dsdn[l][j]*dsdp[m];
}}
}}
d2sdndp[i][j] = 0.0;
for (k=0; k<{NS}; k++) d2sdndp[i][j] += - invd2gds2[i][k]*temp[k];
}}
}}
}}
static void order_d2sdt2(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdt2[{NS}]) {{
double dsdt[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_ELEVEN}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute d2sdt2 vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdt2[j];
for (k=0; k<{NS}; k++) {{
temp[j] += 2.0*d3gds2dt[j][k]*dsdt[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdt[k]*dsdt[l];
}}
}}
d2sdt2[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdt2[i] += - invd2gds2[i][j]*temp[j];
}}
}}
static void order_d2sdtdp(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdtdp[{NS}]) {{
double dsdt[{NS}], dsdp[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_TWELVE}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdtdp vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdtdp[j];
for (k=0; k<{NS}; k++) {{
temp[j] += d3gds2dt[j][k]*dsdp[k] + d3gds2dp[j][k]*dsdt[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdt[k]*dsdp[l];
}}
}}
d2sdtdp[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdtdp[i] += - invd2gds2[i][j]*temp[j];
}}
}}
static void order_d2sdp2(double T, double P, double n[{NC}], double s[{NS}],
double invd2gds2[{NS}][{NS}], double d2sdp2[{NS}]) {{
double dsdp[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_THIRTEEN}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdp2 vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdp2[j];
for (k=0; k<{NS}; k++) {{
temp[j] += 2.0*d3gds2dp[j][k]*dsdp[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdp[k]*dsdp[l];
}}
}}
d2sdp2[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdp2[i] += - invd2gds2[i][j]*temp[j];
}}
}}
\
"""
def _create_complx_soln_calc_template_c():
"""
C language implementation of create_soln_calc_template()
Returns
-------
string :
The template string.
"""
return """\
static double *retrieveGuess(double T, double P, double n[{number_components}]) {{
{moles_assign}
static double s[{number_ordering}];
static double nOld[{number_components}];
static int reset = 1;
for (int i=0; i<{number_ordering}; i++) if (isnan(s[i])) reset = 1;
for (int i=0; i<{number_components}; i++) if (nOld[i] != n[i]) {{
reset = 1;
break;
}}
if (reset) {{
{order_initial_guess}
for (int i=0; i<{number_components}; i++) nOld[i] = n[i];
reset = 0;
}}
return s;
}}
static double {module}_g(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
{order_assign}
double result = {g_code};
return result;
}}
static double {module}_dgdt(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
{order_assign}
double result = {dgdt_code};
return result;
}}
static double {module}_dgdp(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
{order_assign}
double result = {dgdp_code};
return result;
}}
static void {module}_dgdn(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dgdn[{number_components}];
int i;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
{order_assign}
{dgdn_code}
for (i=0; i<{number_components}; i++) result[i] = dgdn[i];
}}
static double {module}_d2gdt2(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}], d2gdsdt[{number_ordering}];
int i,j;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
{order_assign}
{fillD2GDS2}
{fillD2GDSDT}
double result = {d2gdt2_code};
for (i=0; i<{number_ordering}; i++) {{
result += 2.0*d2gdsdt[i]*dsdt[i];
for (j=0; j<{number_ordering}; j++) result += d2gds2[i][j]*dsdt[i]*dsdt[j];
}}
return result;
}}
static double {module}_d2gdtdp(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdp[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}], d2gdsdt[{number_ordering}],
d2gdsdp[{number_ordering}];
int i,j;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
{order_assign}
{fillD2GDS2}
{fillD2GDSDT}
{fillD2GDSDP}
double result = {d2gdtdp_code};
for (i=0; i<{number_ordering}; i++) {{
result += d2gdsdt[i]*dsdp[i] + d2gdsdp[i]*dsdt[i];
for (j=0; j<{number_ordering}; j++) result += d2gds2[i][j]*dsdt[i]*dsdp[j];
}}
return result;
}}
static void {module}_d2gdndt(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdn[{number_ordering}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gdndt[{number_components}], d2gdsdt[{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}];
int i,k,l;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
{order_assign}
{fillD2GDNDS}
{fillD2GDNDT}
{fillD2GDS2}
{fillD2GDSDT}
for (i=0; i<{number_components}; i++) {{
result[i] = d2gdndt[i];
for (k=0; k<{number_ordering}; k++) {{
result[i] += d2gdnds[i][k]*dsdt[k] + d2gdsdt[k]*dsdn[k][i];
for (l=0; l<{number_ordering}; l++) result[i] += d2gds2[k][l]*dsdt[k]*dsdn[l][i];
}}
}}
}}
static double {module}_d2gdp2(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdp[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}],d2gdsdp[{number_ordering}];
int i,j;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
{order_assign}
{fillD2GDS2}
{fillD2GDSDP}
double result = {d2gdp2_code};
for (i=0; i<{number_ordering}; i++) {{
result += 2.0*d2gdsdp[i]*dsdp[i];
for (j=0; j<{number_ordering}; j++) result += d2gds2[i][j]*dsdp[i]*dsdp[j];
}}
return result;
}}
static void {module}_d2gdndp(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdp[{number_ordering}], dsdn[{number_ordering}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gdndp[{number_components}], d2gdsdp[{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}];
int i,k,l;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
{order_assign}
{fillD2GDNDS}
{fillD2GDNDP}
{fillD2GDS2}
{fillD2GDSDP}
for (i=0; i<{number_components}; i++) {{
result[i] = d2gdndp[i];
for (k=0; k<{number_ordering}; k++) {{
result[i] += d2gdnds[i][k]*dsdp[k] + d2gdsdp[k]*dsdn[k][i];
for (l=0; l<{number_ordering}; l++) result[i] += d2gds2[k][l]*dsdp[k]*dsdn[l][i];
}}
}}
}}
static void {module}_d2gdn2(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdn[{number_ordering}][{number_components}];
double d2gdn2[{number_components}][{number_components}],
d2gdnds[{number_components}][{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}];
int i,j,k,l,m;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
{order_assign}
{fillD2GDN2}
{fillD2GDNDS}
{fillD2GDS2}
m = 0;
for (i=0; i<{number_components}; i++) {{
for (j=i; j<{number_components}; j++) {{
result[m] = d2gdn2[i][j];
for (k=0; k<{number_ordering}; k++) {{
result[m] += d2gdnds[i][k]*dsdn[k][j] + d2gdnds[j][k]*dsdn[k][i];
for (l=0; l<{number_ordering}; l++) result[m] += d2gds2[k][l]*dsdn[k][i]*dsdn[l][j];
}}
m += 1;
}}
}}
}}
static double {module}_d3gdt3(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], d2sdt2[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}], d2gdsdt[{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}],
d3gdsdt2[{number_ordering}];
int i,j,k;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_d2sdt2(T, P, n, s, invd2gds2, d2sdt2);
{order_assign}
{fillD2GDS2}
{fillD2GDSDT}
{fillD3GDS3}
{fillD3GDS2DT}
{fillD3GDSDT2}
double result = {d3gdt3_code};
for (i=0; i<{number_ordering}; i++) {{
result += 3.0*d3gdsdt2[i]*dsdt[i] + 3.0*d2gdsdt[i]*d2sdt2[i];
for (j=0; j<{number_ordering}; j++) {{
result += 3.0*d2gds2[i][j]*dsdt[i]*d2sdt2[j]
+ 3.0*d3gds2dt[i][j]*dsdt[i]*dsdt[j];
for (k=0; k<{number_ordering}; k++) result += d3gds3[i][j][k]*dsdt[i]*dsdt[j]*dsdt[k];
}}
}}
return result;
}}
static double {module}_d3gdt2dp(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdp[{number_ordering}];
double d2sdt2[{number_ordering}], d2sdtdp[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}],
d2gdsdt[{number_ordering}], d2gdsdp[{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}],
d3gdsdt2[{number_ordering}], d3gdsdtdp[{number_ordering}];
int i,j,k;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_d2sdt2(T, P, n, s, invd2gds2, d2sdt2);
order_d2sdtdp(T, P, n, s, invd2gds2, d2sdtdp);
{order_assign}
{fillD2GDS2}
{fillD2GDSDT}
{fillD2GDSDP}
{fillD3GDS3}
{fillD3GDS2DT}
{fillD3GDS2DP}
{fillD3GDSDT2}
{fillD3GDSDTDP}
double result = {d3gdt2dp_code};
for (i=0; i<{number_ordering}; i++) {{
result += d3gdsdt2[i]*dsdp[i] + 2.0*d2gdsdt[i]*d2sdtdp[i]
+ d2gdsdp[i]*d2sdt2[i] + 2.0*d3gdsdtdp[i]*dsdt[i];
for (j=0; j<{number_ordering}; j++) {{
result += 2.0*d3gds2dt[i][j]*dsdt[i]*dsdp[j]
+ d2gds2[i][j]*d2sdt2[i]*dsdp[j]
+ 2.0*d2gds2[i][j]*dsdt[i]*d2sdtdp[j]
+ d3gds2dp[i][j]*dsdt[i]*dsdt[j];
for (k=0; k<{number_ordering}; k++) result += d3gds3[i][j][k]*dsdt[i]*dsdt[j]*dsdp[k];
}}
}}
return result;
}}
static void {module}_d3gdndt2(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdn[{number_ordering}][{number_components}];
double d2sdt2[{number_ordering}], d2sdndt[{number_ordering}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gdndt[{number_components}], d2gdsdt[{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gdndsdt[{number_components}][{number_ordering}],
d3gdndt2[{number_components}], d3gdsdt2[{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}];
int i,j,k,l;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_d2sdt2(T, P, n, s, invd2gds2, d2sdt2);
order_d2sdndt(T, P, n, s, invd2gds2, d2sdndt);
{order_assign}
{fillD2GDNDS}
{fillD2GDNDT}
{fillD2GDS2}
{fillD2GDSDT}
{fillD3GDNDS2}
{fillD3GDNDSDT}
{fillD3GDNDT2}
{fillD3GDS3}
{fillD3GDS2DT}
{fillD3GDSDT2}
for (i=0; i<{number_components}; i++) {{
for (j=0,result[i]=d3gdndt2[i]; j<{number_ordering}; j++) {{
result[i] += d3gdsdt2[j]*dsdn[j][i] + 2.0*d2gdsdt[j]*d2sdndt[j][i]
+ 2.0*d3gdndsdt[i][j]*dsdt[j] + d2gdnds[i][j]*d2sdt2[j];
for (k=0; k<{number_ordering}; k++) {{
result[i] += d3gdnds2[i][j][k]*dsdt[j]*dsdt[k]
+ 2.0*d2gds2[j][k]*dsdt[j]*d2sdndt[k][i]
+ 2.0*d3gds2dt[j][k]*dsdn[j][i]*dsdt[k]
+ d2gds2[j][k]*dsdn[j][i]*d2sdt2[k];
for (l=0; l<{number_ordering}; l++)
result[i] += d3gds3[j][k][l]*dsdn[j][i]*dsdt[k]*dsdt[l];
}}
}}
}}
}}
static double {module}_d3gdtdp2(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdp[{number_ordering}];
double d2sdp2[{number_ordering}], d2sdtdp[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}], d2gdsdt[{number_ordering}],
d2gdsdp[{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}],
d3gdsdt2[{number_ordering}], d3gdsdtdp[{number_ordering}],
d3gdsdp2[{number_ordering}];
int i,j,k;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_d2sdp2(T, P, n, s, invd2gds2, d2sdp2);
order_d2sdtdp(T, P, n, s, invd2gds2, d2sdtdp);
{order_assign}
{fillD2GDS2}
{fillD2GDSDT}
{fillD2GDSDP}
{fillD3GDS3}
{fillD3GDS2DT}
{fillD3GDS2DP}
{fillD3GDSDT2}
{fillD3GDSDTDP}
{fillD3GDSDP2}
double result = {d3gdtdp2_code};
for (i=0; i<{number_ordering}; i++) {{
result += 2.0*d3gdsdtdp[i]*dsdp[i] + d2gdsdt[i]*d2sdp2[i]
+ 2.0*d2gdsdp[i]*d2sdtdp[i] + d3gdsdp2[i]*dsdt[i];
for (j=0; j<{number_ordering}; j++) {{
result += 2.0*d3gds2dp[i][j]*dsdt[i]*dsdp[j]
+ d2gds2[i][j]*dsdt[i]*d2sdp2[j]
+ 2.0*d2gds2[i][j]*d2sdtdp[i]*dsdp[j]
+ d3gds2dt[i][j]*dsdp[i]*dsdp[j];
for (k=0; k<{number_ordering}; k++) result += d3gds3[i][j][k]*dsdt[i]*dsdp[j]*dsdp[k];
}}
}}
return result;
}}
static void {module}_d3gdndtdp(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdt[{number_ordering}], dsdp[{number_ordering}], dsdn[{number_ordering}][{number_components}];
double d2sdtdp[{number_ordering}], d2sdndt[{number_ordering}][{number_components}];
double d2sdndp[{number_ordering}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}],
d2gdsdt[{number_ordering}], d2gdsdp[{number_ordering}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gdndsdt[{number_components}][{number_ordering}],
d3gdndsdp[{number_components}][{number_ordering}],
d3gdndtdp[{number_components}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}],
d3gdsdtdp[{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}];
int i,j,k,l;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_d2sdtdp(T, P, n, s, invd2gds2, d2sdtdp);
order_d2sdndt(T, P, n, s, invd2gds2, d2sdndt);
{order_assign}
{fillD2GDNDS}
{fillD2GDS2}
{fillD2GDSDT}
{fillD2GDSDP}
{fillD3GDNDS2}
{fillD3GDNDSDT}
{fillD3GDNDSDP}
{fillD3GDNDTDP}
{fillD3GDS3}
{fillD3GDS2DT}
{fillD3GDSDTDP}
{fillD3GDS2DP}
for (i=0; i<{number_components}; i++) {{
for (j=0,result[i]=d3gdndtdp[i]; j<{number_ordering}; j++) {{
result[i] += d3gdsdtdp[j]*dsdn[j][i] + d2gdsdt[j]*d2sdndp[j][i]
+ d3gdndsdt[i][j]*dsdp[j] + d2gdnds[i][j]*d2sdtdp[j]
+ d3gdndsdp[i][j]*dsdt[j] + d2gdsdp[j]*d2sdndt[j][i];
for (k=0; k<{number_ordering}; k++) {{
result[i] += d3gdnds2[i][j][k]*dsdt[j]*dsdp[k]
+ d2gds2[j][k]*dsdt[j]*d2sdndp[k][i]
+ d2gds2[j][k]*dsdp[j]*d2sdndt[k][i]
+ d3gds2dt[j][k]*dsdn[j][i]*dsdp[k]
+ d3gds2dp[j][k]*dsdn[j][i]*dsdt[k]
+ d2gds2[j][k]*dsdn[j][i]*d2sdtdp[k];
for (l=0; l<{number_ordering}; l++)
result[i] += d3gds3[j][k][l]*dsdn[j][i]*dsdt[k]*dsdp[l];
}}
}}
}}
}}
static void {module}_d3gdn2dt(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdn[{number_ordering}][{number_components}], dsdt[{number_ordering}];
double d2sdndt[{number_ordering}][{number_components}];
double d2sdn2[{number_ordering}][{number_components}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}], d2gdsdt[{number_ordering}],
d3gdn2ds[{number_components}][{number_components}][{number_ordering}],
d3gdn2dt[{number_components}][{number_components}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gdndsdt[{number_components}][{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dt[{number_ordering}][{number_ordering}];
int i,j,k,l,m,o;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_dsdt(T, P, n, s, invd2gds2, dsdt);
order_d2sdn2(T, P, n, s, invd2gds2, d2sdn2);
order_d2sdndt(T, P, n, s, invd2gds2, d2sdndt);
{order_assign}
{fillD2GDNDS}
{fillD2GDS2}
{fillD2GDSDT}
{fillD3GDN2DS}
{fillD3GDN2DT}
{fillD3GDNDS2}
{fillD3GDNDSDT}
{fillD3GDS3}
{fillD3GDS2DT}
o = 0;
for (i=0; i<{number_components}; i++) {{
for (j=i; j<{number_components}; j++) {{
result[o] = d3gdn2dt[i][j];
for (k=0; k<{number_ordering}; k++) {{
result[o] += d3gdn2ds[i][j][k]*dsdt[k]
+ d3gdndsdt[i][k]*dsdn[k][j]
+ d3gdndsdt[j][k]*dsdn[k][i]
+ d2gdsdt[k]*d2sdn2[k][i][j]
+ d2gdnds[i][k]*d2sdndt[k][j]
+ d2gdnds[j][k]*d2sdndt[k][i];
for (l=0; l<{number_ordering}; l++) {{
result[o] += d3gdnds2[i][k][l]*dsdn[k][j]*dsdt[l]
+ d3gdnds2[j][k][l]*dsdn[k][i]*dsdt[l]
+ d2gds2[k][l]*d2sdn2[k][i][j]*dsdt[l]
+ d3gds2dt[k][l]*dsdn[k][i]*dsdn[l][j]
+ d2gds2[k][l]*dsdn[k][i]*d2sdndt[l][j]
+ d2gds2[k][l]*dsdn[k][j]*d2sdndt[l][i];
for (m=0; m<{number_ordering}; m++)
result[o] += d3gds3[k][l][m]*dsdn[k][i]*dsdn[l][j]*dsdt[m];
}}
}}
o += 1;
}}
}}
}}
static double {module}_d3gdp3(double T, double P, double n[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdp[{number_ordering}], d2sdp2[{number_ordering}];
double d2gds2[{number_ordering}][{number_ordering}], d2gdsdp[{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}],
d3gdsdp2[{number_ordering}];
int i,j,k;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_d2sdp2(T, P, n, s, invd2gds2, d2sdp2);
{order_assign}
{fillD2GDS2}
{fillD2GDSDP}
{fillD3GDS3}
{fillD3GDS2DP}
{fillD3GDSDP2}
double result = {d3gdp3_code};
for (i=0; i<{number_ordering}; i++) {{
result += 3.0*d3gdsdp2[i]*dsdp[i] + 3.0*d2gdsdp[i]*d2sdp2[i];
for (j=0; j<{number_ordering}; j++) {{
result += 3.0*d2gds2[i][j]*dsdp[i]*d2sdp2[j]
+ 3.0*d3gds2dp[i][j]*dsdp[i]*dsdp[j];
for (k=0; k<{number_ordering}; k++) result += d3gds3[i][j][k]*dsdp[i]*dsdp[j]*dsdp[k];
}}
}}
return result;
}}
static void {module}_d3gdndp2(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdp[{number_ordering}], dsdn[{number_ordering}][{number_components}];
double d2sdp2[{number_ordering}], d2sdndp[{number_ordering}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gdndp[{number_components}], d3gdndp2[{number_components}],
d2gds2[{number_ordering}][{number_ordering}], d2gdsdp[{number_ordering}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gdndsdp[{number_components}][{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}],
d3gdsdp2[{number_ordering}];
int i,j,k,l;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_d2sdp2(T, P, n, s, invd2gds2, d2sdp2);
order_d2sdndp(T, P, n, s, invd2gds2, d2sdndp);
{order_assign}
{fillD2GDNDS}
{fillD2GDNDP}
{fillD2GDS2}
{fillD2GDSDP}
{fillD3GDNDS2}
{fillD3GDNDSDP}
{fillD3GDNDP2}
{fillD3GDS3}
{fillD3GDS2DP}
{fillD3GDSDP2}
for (i=0; i<{number_components}; i++) {{
for (j=0,result[i]=d3gdndp2[i]; j<{number_ordering}; j++) {{
result[i] += d3gdsdp2[j]*dsdn[j][i] + 2.0*d2gdsdp[j]*d2sdndp[j][i]
+ 2.0*d3gdndsdp[i][j]*dsdp[j] + d2gdnds[i][j]*d2sdp2[j];
for (k=0; k<{number_ordering}; k++) {{
result[i] += d3gdnds2[i][j][k]*dsdp[j]*dsdp[k]
+ 2.0*d2gds2[j][k]*dsdp[j]*d2sdndp[k][i]
+ 2.0*d3gds2dp[j][k]*dsdn[j][i]*dsdp[k]
+ d2gds2[j][k]*dsdn[j][i]*d2sdp2[k];
for (l=0; l<{number_ordering}; l++)
result[i] += d3gds3[j][k][l]*dsdn[j][i]*dsdp[k]*dsdp[l];
}}
}}
}}
}}
static void {module}_d3gdn2dp(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdn[{number_ordering}][{number_components}], dsdp[{number_ordering}];
double d2sdndp[{number_ordering}][{number_components}];
double d2sdn2[{number_ordering}][{number_components}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}], d2gdsdp[{number_ordering}],
d3gdn2ds[{number_components}][{number_components}][{number_ordering}],
d3gdn2dp[{number_components}][{number_components}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gdndsdp[{number_components}][{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}],
d3gds2dp[{number_ordering}][{number_ordering}];
int i,j,k,l,m,o;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_dsdp(T, P, n, s, invd2gds2, dsdp);
order_d2sdn2(T, P, n, s, invd2gds2, d2sdn2);
order_d2sdndp(T, P, n, s, invd2gds2, d2sdndp);
{order_assign}
{fillD2GDNDS}
{fillD2GDS2}
{fillD2GDSDP}
{fillD3GDN2DS}
{fillD3GDN2DP}
{fillD3GDNDS2}
{fillD3GDNDSDP}
{fillD3GDS3}
{fillD3GDS2DP}
o = 0;
for (i=0; i<{number_components}; i++) {{
for (j=i; j<{number_components}; j++) {{
result[o] = d3gdn2dp[i][j];
for (k=0; k<{number_ordering}; k++) {{
result[o] += d3gdn2ds[i][j][k]*dsdp[k]
+ d3gdndsdp[i][k]*dsdn[k][j]
+ d3gdndsdp[j][k]*dsdn[k][i]
+ d2gdsdp[k]*d2sdn2[k][i][j]
+ d2gdnds[i][k]*d2sdndp[k][j]
+ d2gdnds[j][k]*d2sdndp[k][i];
for (l=0; l<{number_ordering}; l++) {{
result[o] += d3gdnds2[i][k][l]*dsdn[k][j]*dsdp[l]
+ d3gdnds2[j][k][l]*dsdn[k][i]*dsdp[l]
+ d2gds2[k][l]*d2sdn2[k][i][j]*dsdp[l]
+ d3gds2dp[k][l]*dsdn[k][i]*dsdn[l][j]
+ d2gds2[k][l]*dsdn[k][i]*d2sdndp[l][j]
+ d2gds2[k][l]*dsdn[k][j]*d2sdndp[l][i];
for (m=0; m<{number_ordering}; m++)
result[o] += d3gds3[k][l][m]*dsdn[k][i]*dsdn[l][j]*dsdp[m];
}}
}}
o += 1;
}}
}}
}}
static void {module}_d3gdn3(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double dsdn[{number_ordering}][{number_components}];
double d2sdn2[{number_ordering}][{number_components}][{number_components}];
double d2gdnds[{number_components}][{number_ordering}],
d2gds2[{number_ordering}][{number_ordering}],
d3gdn3[{number_components}][{number_components}][{number_components}],
d3gdn2ds[{number_components}][{number_components}][{number_ordering}],
d3gdnds2[{number_components}][{number_ordering}][{number_ordering}],
d3gds3[{number_ordering}][{number_ordering}][{number_ordering}];
int i,j,k,l,m,q,o;
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
order_dsdn(T, P, n, s, invd2gds2, dsdn);
order_d2sdn2(T, P, n, s, invd2gds2, d2sdn2);
{order_assign}
{fillD2GDNDS}
{fillD2GDS2}
{fillD3GDN3}
{fillD3GDN2DS}
{fillD3GDNDS2}
{fillD3GDS3}
o = 0;
for (i=0; i<{number_components}; i++) {{
for (j=i; j<{number_components}; j++) {{
for (k=j; k<{number_components}; k++) {{
result[o] = d3gdn3[i][j][k];
for (l=0; l<{number_ordering}; l++) {{
result[o] += d3gdn2ds[i][j][l]*dsdn[l][k]
+ d3gdn2ds[j][k][l]*dsdn[l][i]
+ d3gdn2ds[k][i][l]*dsdn[l][j];
result[o] += d2gdnds[i][l]*d2sdn2[l][j][k]
+ d2gdnds[j][l]*d2sdn2[l][i][k]
+ d2gdnds[k][l]*d2sdn2[l][j][i];
for (m=0; m<{number_ordering}; m++) {{
result[o] += d3gdnds2[i][l][m]*dsdn[l][j]*dsdn[m][k]
+ d3gdnds2[j][l][m]*dsdn[l][k]*dsdn[m][i]
+ d3gdnds2[k][l][m]*dsdn[l][i]*dsdn[m][j];
result[o] += d2gds2[l][m]*d2sdn2[l][j][k]*dsdn[m][i]
+ d2gds2[l][m]*d2sdn2[l][i][k]*dsdn[m][j]
+ d2gds2[l][m]*d2sdn2[l][i][j]*dsdn[m][k];
for (q=0; q<{number_ordering}; q++)
result[o] += d3gds3[l][m][q]*dsdn[l][i]*dsdn[m][j]*dsdn[q][k];
}}
}}
o += 1;
}}
}}
}}
}}
static void {module}_d4gdndt3(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
int i;
for (i=0; i<{number_components}; i++) result[i] = 0.0;
}}
static void {module}_d4gdndt2dp(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
int i;
for (i=0; i<{number_components}; i++) result[i] = 0.0;
}}
static void {module}_d4gdndtdp2(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
int i;
for (i=0; i<{number_components}; i++) result[i] = 0.0;
}}
static void {module}_d4gdndp3(double T, double P, double n[{number_components}],
double result[{number_components}]) {{
int i;
for (i=0; i<{number_components}; i++) result[i] = 0.0;
}}
static void {module}_d4gdn2dt2(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d4gdn2dtdp(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d4gdn2dp2(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn2dt3(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn2dt2dp(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn2dtdp2(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn2dp3(double T, double P, double n[{number_components}],
double result[{number_symmetric_hessian_terms}]) {{
int i;
for (i=0; i<{number_symmetric_hessian_terms}; i++) result[i] = 0.0;
}}
static void {module}_d4gdn3dt(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d4gdn3dp(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn3dt2(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn3dtdp(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d5gdn3dp2(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d6gdn3dt3(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d6gdn3dt2dp(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d6gdn3dtdp2(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
static void {module}_d6gdn3dp3(double T, double P, double n[{number_components}],
double result[{number_symmetric_tensor_terms}]) {{
int i;
for (i=0; i<{number_symmetric_tensor_terms}; i++) result[i] = 0.0;
}}
\
"""
def _create_complx_soln_calib_template_c():
"""
C language implementation of create_complx_soln_calib_template()
Returns
-------
string :
The template string.
"""
return """\
{extra_ordering_code}
static double {module}_dparam_{func}(double T, double P, double n[{number_components}], int index) {{
{moles_assign}
double invd2gds2[{number_ordering}][{number_ordering}];
double *s = retrieveGuess(T, P, n);
order_s(T, P, n, s, invd2gds2);
{order_assign}
double result = 0.0;
switch (index) {{
{switch_code}
default:
break;
}}
return result;
}}
\
"""
def _create_speciation_code_template_c():
"""
C language implementation of create_speciation_code_template()
Returns
-------
string :
The template string.
"""
return """\
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_multiroots.h>
#include <gsl/gsl_permutation.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_cblas.h>
extern int nnlsWithConstraintMatrix(double **a, int m, int n, double *b, double *x, double *rnorm,
double *w, double *zz, int *index, int debug);
#undef MAX
#undef MIN
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define SQUARE(x) ((x)*(x))
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
struct system_params {{
gsl_vector *e;
gsl_vector *lnQ;
gsl_matrix *R;
gsl_matrix *Cb;
gsl_matrix *Cs;
}};
static int system_f(const gsl_vector *y, void *params, gsl_vector *f) {{
gsl_vector *e = ((struct system_params *) params)->e;
gsl_vector *lnQ = ((struct system_params *) params)->lnQ;
gsl_matrix *R = ((struct system_params *) params)->R;
gsl_matrix *Cb = ((struct system_params *) params)->Cb;
gsl_matrix *Cs = ((struct system_params *) params)->Cs;
int ne = e->size;
int ns = lnQ->size;
int nv = y->size-1;
double nT = exp(y->data[y->size-1]);
gsl_vector *prod = gsl_vector_alloc(lnQ->size);
for (int i=0; i<ns; i++) {{
double sum = gsl_vector_get(lnQ, i);
for (int j=0; j<nv; j++) sum += gsl_matrix_get(R, i, j)*y->data[j];
gsl_vector_set(prod, i, exp(sum));
}}
for (int i=0; i<ne; i++) {{
double sum = 0.0;
for (int j=0; j<ne; j++) sum += gsl_matrix_get(Cb, j, i)*exp(y->data[j]);
for (int j=0; j<ns; j++) sum += gsl_matrix_get(Cs, j, i)*prod->data[j];
gsl_vector_set(f, i, nT*sum - e->data[i]);
}}
double Xsum = 0.0;
for (int i=0; i<ne; i++) Xsum += exp(y->data[i]);
for (int i=0; i<ns; i++) Xsum += prod->data[i];
gsl_vector_set(f, ne, Xsum - 1.0);
gsl_vector_free(prod);
return GSL_SUCCESS;
}}
static int system_df(const gsl_vector *y, void *params, gsl_matrix *J) {{
gsl_vector *e = ((struct system_params *) params)->e;
gsl_vector *lnQ = ((struct system_params *) params)->lnQ;
gsl_matrix *R = ((struct system_params *) params)->R;
gsl_matrix *Cb = ((struct system_params *) params)->Cb;
gsl_matrix *Cs = ((struct system_params *) params)->Cs;
int ne = e->size;
int ns = lnQ->size;
int nv = y->size-1;
double nT = exp(y->data[y->size-1]);
gsl_vector *prod = gsl_vector_alloc(lnQ->size);
for (int i=0; i<ns; i++) {{
double sum = gsl_vector_get(lnQ, i);
for (int j=0; j<nv; j++) sum += gsl_matrix_get(R, i, j)*y->data[j];
gsl_vector_set(prod, i, exp(sum));
}}
for (int i=0; i<ne; i++) {{
for (int j=0; j<ne; j++) {{
double sum = gsl_matrix_get(Cb, i, j)*exp(y->data[j]);
for (int k=0; k<ns; k++) {{
sum += gsl_matrix_get(R, k, i)*prod->data[k]*gsl_matrix_get(Cs, k, j);
}}
gsl_matrix_set (J, i, j, nT*sum);
}}
double sum = 0.0;
for (int j=0; j<ne; j++) sum += gsl_matrix_get(Cb, j, i)*exp(y->data[j]);
for (int j=0; j<ns; j++) sum += gsl_matrix_get(Cs, j, i)*prod->data[j];
gsl_matrix_set(J, i, ne, nT*sum);
}}
for (int i=0; i<ne; i++) {{
double Xsum = exp(y->data[i]);
for (int j=0; j<ns; j++) Xsum += gsl_matrix_get(R, j, i)*prod->data[j];
gsl_matrix_set(J, ne, i, Xsum);
}}
gsl_matrix_set(J, ne, ne, 0.0);
gsl_vector_free(prod);
return GSL_SUCCESS;
}}
static int system_fdf(const gsl_vector *y, void *params, gsl_vector *f, gsl_matrix *J) {{
gsl_vector *e = ((struct system_params *) params)->e;
gsl_vector *lnQ = ((struct system_params *) params)->lnQ;
gsl_matrix *R = ((struct system_params *) params)->R;
gsl_matrix *Cb = ((struct system_params *) params)->Cb;
gsl_matrix *Cs = ((struct system_params *) params)->Cs;
int ne = e->size;
int ns = lnQ->size;
int nv = y->size-1;
double nT = exp(y->data[y->size-1]);
gsl_vector *prod = gsl_vector_alloc(lnQ->size);
for (int i=0; i<ns; i++) {{
double sum = gsl_vector_get(lnQ, i);
for (int j=0; j<nv; j++) sum += gsl_matrix_get(R, i, j)*y->data[j];
gsl_vector_set(prod, i, exp(sum));
}}
for (int i=0; i<ne; i++) {{
double sum = 0.0;
for (int j=0; j<ne; j++) sum += gsl_matrix_get(Cb, j, i)*exp(y->data[j]);
for (int j=0; j<ns; j++) sum += gsl_matrix_get(Cs, j, i)*prod->data[j];
gsl_vector_set(f, i, nT*sum - e->data[i]);
gsl_matrix_set(J, i, ne, nT*sum);
for (int j=0; j<ne; j++) {{
double sum = gsl_matrix_get(Cb, i, j)*exp(y->data[j]);
for (int k=0; k<ns; k++) {{
sum += gsl_matrix_get(R, k, i)*prod->data[k]*gsl_matrix_get(Cs, k, j);
}}
gsl_matrix_set (J, i, j, nT*sum);
}}
}}
double Xsum = 0.0;
for (int i=0; i<ne; i++) Xsum += exp(y->data[i]);
for (int i=0; i<ns; i++) Xsum += prod->data[i];
gsl_vector_set(f, ne, Xsum - 1.0);
for (int i=0; i<ne; i++) {{
double Xsum = exp(y->data[i]);
for (int j=0; j<ns; j++) Xsum += gsl_matrix_get(R, j, i)*prod->data[j];
gsl_matrix_set(J, ne, i, Xsum);
}}
gsl_matrix_set(J, ne, ne, 0.0);
gsl_vector_free(prod);
return GSL_SUCCESS;
}}
static void print_state (size_t iter, gsl_multiroot_fdfsolver *s) {{
printf ("iter = %3lu\\n", iter);
for (size_t i=0; i<s->x->size; i+=8) {{
printf ("Solution:\\n");
for (size_t j=i*8; j<MIN(i*8+8, s->x->size); j++) printf(" %10.3e", gsl_vector_get (s->x, j));
printf ("\\nFunction:\\n");
for (size_t j=i*8; j<MIN(i*8+8, s->x->size); j++) printf(" %10.3e", gsl_vector_get (s->f, j));
printf ("\\n");
}}
}}
#define ne {number_components}
#define ns {number_non_basis}
static void compute_lnQ(double t, double p, struct system_params *params) {{
// compute mu's and get lnQ from R: lnQ = -(mu0_s - np.matmul(R,mu0_b))/(8.3143*t)
double mu0_b[ne];
for (int i=0; i<ne; i++) mu0_b[i] = endmember[i].mu0(t, p);
for (int i=0; i<ns; i++) {{
double sum = endmember[i+ne].mu0(t, p);
for (int j=0; j<ne; j++) {{
sum -= gsl_matrix_get(params->R, i, j)*mu0_b[j];
}}
gsl_vector_set(params->lnQ, i, -sum/(8.3143*t));
}}
}}
static void gaussj(double a[ns][ns]);
static int speciate(double t, double p, double*e, double *b, double *s,
double invd2gds2[ns][ns], int debug) {{
static struct system_params params;
static int first = TRUE;
static gsl_vector *lnX;
static double tOld, pOld, eOld[ne], bOld[ne], sOld[ns], invd2gds2Old[ns][ns];
if (!first) {{
int same = (fabs(t-tOld) < 1.0e-2);
same &= (fabs(p-pOld) < 1.0e-2);
for (int i=0; i<ne; i++) same &= (fabs(e[i]-eOld[i]) < 1.0e-7);
if (same) {{
for (int i=0; i<ne; i++) {{
b[i] = bOld[i];
}}
for (int i=0; i<ns; i++) {{
s[i] = sOld[i];
for (int j=0; j<ns; j++) invd2gds2[i][j] = invd2gds2Old[i][j];
}}
return TRUE;
}}
}} else {{
first = FALSE;
params.e = gsl_vector_alloc(ne);
params.lnQ = gsl_vector_alloc(ns);
params.R = gsl_matrix_alloc(ns, ne);
params.Cb = gsl_matrix_alloc(ne, ne);
params.Cs = gsl_matrix_alloc(ns, ne);
lnX = gsl_vector_alloc(ne+1);
//
// Fill Cb, Cs matrices for this case
{fill_Cb}
{fill_Cs}
gsl_matrix *CbInv = gsl_matrix_alloc(ne, ne);
gsl_permutation *perm = gsl_permutation_alloc(ne);
gsl_permutation_init(perm);
gsl_linalg_LU_invert(params.Cb, perm, CbInv);
gsl_permutation_free(perm);
gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, params.Cs, CbInv, 0.0, params.R);
gsl_matrix_free(CbInv);
}}
// Fill lnQ for this case using R
// compute mu's and get lnQ from R: lnQ = -(mu0_s - np.matmul(R,mu0_b))/(8.3143*t)
compute_lnQ(t, p, ¶ms);
if (debug) {{
for (int i=0; i<ns; i++) printf("lnQ[%d] = %10.3e\\n", i,
gsl_vector_get(params.lnQ, i));
}}
// Now compute an initial guess
double **aNNLS = (double **) malloc((size_t) ns*sizeof(double *));
double *bNNLS = (double *) malloc((size_t) ns*sizeof(double));
double *xNNLS = (double *) malloc((size_t) (ne+ns)*sizeof(double));
double *wNNLS = (double *) malloc((size_t) (ne+ns)*sizeof(double));
double *zzNNLS = (double *) malloc((size_t) ns*sizeof(double));
int *indexNNLS = (int *) malloc((size_t) (ne+ns)*sizeof(int));
double rNorm=0.0;
for (int i=0; i<ns; i++) {{
bNNLS[i] = -gsl_vector_get(params.lnQ, i);
aNNLS[i] = (double *) malloc((size_t) (ne+ns)*sizeof(double));
for (int j=0; j<ne; j++) {{
aNNLS[i][j] = -gsl_matrix_get(params.R, i, j);
}}
for (int j=0; j<ns; j++) {{
aNNLS[i][ne+j] = (i == j) ? 1.0 : 0.0;
}}
}}
int success = nnlsWithConstraintMatrix(aNNLS, ns, ne+ns, bNNLS, xNNLS, &rNorm,
wNNLS, zzNNLS, indexNNLS, debug);
if (!success) printf("Speciate error. Failure in initial guess routine (NNLS).\\n");
if (debug) {{
printf ("NNLS solution: (rNorm = %10.3e)\\n", rNorm);
for (int i=0; i<ne+ns; i++) printf (" %10.2e", xNNLS[i]);
printf ("\\n");
}}
for (int i=0; i<ne; i++) gsl_vector_set(lnX, i, -xNNLS[i]);
for (int i=0; i<ns; i++) free(aNNLS[i]);
free (aNNLS); free(bNNLS); free(xNNLS); free(wNNLS); free(zzNNLS); free(indexNNLS);
// compute mu's and get lnQ from R: lnQ = -(mu0_s - np.matmul(R,mu0_b))/(8.3143*t)
compute_lnQ(t, p, ¶ms);
if (debug) {{
for (int i=0; i<ns; i++) printf("lnQ[%d] = %10.3e\\n", i,
gsl_vector_get(params.lnQ, i));
}}
// set e
double nT = 0.0;
for (int i=0; i<ne; i++) {{
gsl_vector_set(params.e, i, e[i]);
nT += e[i];
}}
gsl_vector_set(lnX, ne, log(nT));
// options:
// gsl_multiroot_fdfsolver_hybridsj
// gsl_multiroot_fdfsolver_hybridj
// gsl_multiroot_fdfsolver_newton
// gsl_multiroot_fdfsolver_gnewton
const gsl_multiroot_fdfsolver_type *Tgsl = {gsl_multiroot_method};
gsl_multiroot_fdfsolver *soln = gsl_multiroot_fdfsolver_alloc (Tgsl, ne+1);
int status;
size_t iter = 0;
gsl_multiroot_function_fdf f = {{&system_f, &system_df, &system_fdf, ne+1, ¶ms}};
gsl_multiroot_fdfsolver_set (soln, &f, lnX);
if (debug) print_state (iter, soln);
do {{
iter++;
status = gsl_multiroot_fdfsolver_iterate (soln);
if (debug) print_state (iter, soln);
if (status) break;
gsl_vector *x = gsl_multiroot_fdfsolver_root(soln);
gsl_vector *f = gsl_multiroot_fdfsolver_f(soln);
gsl_vector *dx = gsl_multiroot_fdfsolver_dx(soln);
if (debug) {{
for (int i=0; i<(ne+1); i++) {{
printf ("%3d f = %13.6g x = %13.6g dx = %13.6g\\n",
i, gsl_vector_get(f, i), gsl_vector_get(x, i), gsl_vector_get(dx, i));
}}
}}
// status = gsl_multiroot_test_residual (f, 1.e-7);
status = gsl_multiroot_test_delta (dx, x, 1.e-7, 1.e-10);
}} while (status == GSL_CONTINUE && iter < 50);
// Outputs:
// gsl_vector * gsl_multiroot_fdfsolver_root(const gsl_multiroot_fdfsolver * soln)
// gsl_vector * gsl_multiroot_fdfsolver_f(const gsl_multiroot_fdfsolver * soln)
// gsl_vector * gsl_multiroot_fdfsolver_dx(const gsl_multiroot_fdfsolver * soln)
// gsl_multiroot_test_delta(const gsl_vector * dx, const gsl_vector * x, double epsabs, double epsrel)
if (debug) {{
printf ("status = %s\\n", gsl_strerror (status));
print_state(iter, soln);
}}
gsl_vector *lnQ = params.lnQ;
gsl_matrix *R = params.R;
for (int i=0; i<ne; i++) b[i] = exp(gsl_vector_get (soln->x, i));
for (int i=0; i<ns; i++) {{
double sum = gsl_vector_get(lnQ, i);
for (int j=0; j<ne; j++) sum += gsl_matrix_get(R, i, j)*gsl_vector_get (soln->x, j);
s[i] = exp(sum);
}}
{fill_invd2gds2}
if (debug) {{
double eT = 0.0;
for (int i=0; i<ne; i++) {{
printf ("e[%d] = %g\\n", i, e[i]);
eT += e[i];
}}
printf ("eT = %g\\n", eT);
double Xsum = 0.0;
for (int i=0; i<ne; i++) {{
printf ("Xb[%d] = %g\\n", i, exp(gsl_vector_get (soln->x, i)));
Xsum += exp(gsl_vector_get (soln->x, i));
}}
gsl_vector *lnQ = params.lnQ;
gsl_matrix *R = params.R;
for (int i=0; i<ns; i++) {{
double sum = gsl_vector_get(lnQ, i);
for (int j=0; j<ne; j++) sum += gsl_matrix_get(R, i, j)*gsl_vector_get (soln->x, j);
printf ("Xs[%d] = %g\\n", i, exp(sum));
Xsum += exp(sum);
}}
printf ("Xsum = %g\\n", Xsum);
}}
tOld = t;
pOld = p;
for (int i=0; i<ne; i++) {{
bOld[i] = b[i];
eOld[i] = e[i];
}}
for (int i=0; i<ns; i++) {{
sOld[i] = s[i];
for (int j=0; j<ns; j++) invd2gds2Old[i][j] = invd2gds2[i][j];
}}
gsl_multiroot_fdfsolver_free (soln);
return TRUE;
}}
\
"""
def _create_speciation_ordering_code_template_c():
"""
C language implementation of create_speciation_ordering_code_template()
Returns
-------
string :
The template string.
"""
return """\
static void order_dsdn(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double dsdn[{NS}][{NC}]) {{
{ORDER_CODE_BLOCK_FIVE}
int i,j,k;
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
}}
static void order_dsdt(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double dsdt[{NS}]) {{
int i,j;
{ORDER_CODE_BLOCK_SIX}
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
}}
static void order_dsdp(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double dsdp[{NS}]) {{
int i,j;
{ORDER_CODE_BLOCK_SEVEN}
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
}}
static void order_d2sdn2(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdn2[{NS}][{NC}][{NC}]) {{
double dsdn[{NS}][{NC}], temp[{NS}];
int i, j, k, l, m, o;
{ORDER_CODE_BLOCK_EIGHT}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdn2 cube */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NC}; k++) {{
for (l=0; l<{NS}; l++) {{
temp[l] = d3gdn2ds[j][k][l];
for (m=0; m<{NS}; m++) {{
temp[l] += d3gdnds2[j][l][m]*dsdn[m][k]
+ d3gdnds2[k][l][m]*dsdn[m][j];
for (o=0; o<{NS}; o++)
temp[l] += d3gds3[l][m][o]*dsdn[m][j]*dsdn[o][k];
}}
}}
d2sdn2[i][j][k] = 0.0;
for (l=0; l<{NS}; l++) d2sdn2[i][j][k] += - invd2gds2[i][l]*temp[l];
}}
}}
}}
}}
static void order_d2sdndt(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdndt[{NS}][{NC}]) {{
double dsdn[{NS}][{NC}], dsdt[{NS}], temp[{NS}];
int i, j, k, l, m;
{ORDER_CODE_BLOCK_NINE}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute d2sdndt matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NS}; k++) {{
temp[k] = d3gdndsdt[j][k];
for (l=0; l<{NS}; l++) {{
temp[k] += d3gdnds2[j][k][l]*dsdt[l] + d3gds2dt[k][l]*dsdn[l][j];
for (m=0; m<{NS}; m++) temp[k] += d3gds3[k][l][m]*dsdn[l][j]*dsdt[m];
}}
}}
d2sdndt[i][j] = 0.0;
for (k=0; k<{NS}; k++) d2sdndt[i][j] += - invd2gds2[i][k]*temp[k];
}}
}}
}}
static void order_d2sdndp(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdndp[{NS}][{NC}]) {{
double dsdn[{NS}][{NC}], dsdp[{NS}], temp[{NS}];
int i, j, k, l, m;
{ORDER_CODE_BLOCK_TEN}
/* compute dsdn matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
dsdn[i][j] = 0.0;
for (k=0; k<{NS}; k++) dsdn[i][j] += - invd2gds2[i][k]*d2gdnds[j][k];
}}
}}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdndp matrix */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NC}; j++) {{
for (k=0; k<{NS}; k++) {{
temp[k] = d3gdndsdp[j][k];
for (l=0; l<{NS}; l++) {{
temp[k] += d3gdnds2[j][k][l]*dsdp[l] + d3gds2dp[k][l]*dsdn[l][j];
for (m=0; m<{NS}; m++) temp[k] += d3gds3[k][l][m]*dsdn[l][j]*dsdp[m];
}}
}}
d2sdndp[i][j] = 0.0;
for (k=0; k<{NS}; k++) d2sdndp[i][j] += - invd2gds2[i][k]*temp[k];
}}
}}
}}
static void order_d2sdt2(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdt2[{NS}]) {{
double dsdt[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_ELEVEN}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute d2sdt2 vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdt2[j];
for (k=0; k<{NS}; k++) {{
temp[j] += 2.0*d3gds2dt[j][k]*dsdt[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdt[k]*dsdt[l];
}}
}}
d2sdt2[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdt2[i] += - invd2gds2[i][j]*temp[j];
}}
}}
static void order_d2sdtdp(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdtdp[{NS}]) {{
double dsdt[{NS}], dsdp[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_TWELVE}
/* compute dsdt vector */
for (i=0; i<{NS}; i++) {{
dsdt[i] = 0.0;
for (j=0; j<{NS}; j++) dsdt[i] += - invd2gds2[i][j]*d2gdsdt[j];
}}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdtdp vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdtdp[j];
for (k=0; k<{NS}; k++) {{
temp[j] += d3gds2dt[j][k]*dsdp[k] + d3gds2dp[j][k]*dsdt[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdt[k]*dsdp[l];
}}
}}
d2sdtdp[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdtdp[i] += - invd2gds2[i][j]*temp[j];
}}
}}
static void order_d2sdp2(double T, double P, double n[{NC}], double b[{NC}],
double s[{NS}], double invd2gds2[{NS}][{NS}], double d2sdp2[{NS}]) {{
double dsdp[{NS}], temp[{NS}];
int i, j, k, l;
{ORDER_CODE_BLOCK_THIRTEEN}
/* compute dsdp vector */
for (i=0; i<{NS}; i++) {{
dsdp[i] = 0.0;
for (j=0; j<{NS}; j++) dsdp[i] += - invd2gds2[i][j]*d2gdsdp[j];
}}
/* compute d2sdp2 vector */
for (i=0; i<{NS}; i++) {{
for (j=0; j<{NS}; j++) {{
temp[j] = d3gdsdp2[j];
for (k=0; k<{NS}; k++) {{
temp[j] += 2.0*d3gds2dp[j][k]*dsdp[k];
for (l=0; l<{NS}; l++) temp[j] += d3gds3[j][k][l]*dsdp[k]*dsdp[l];
}}
}}
d2sdp2[i] = 0.0;
for (j=0; j<{NS}; j++) d2sdp2[i] += - invd2gds2[i][j]*temp[j];
}}
}}
\
"""
#######################
# C++ implementations #
#######################
def _create_calib_c_template_cpp():
"""
C++ language implementation of create_calib_c_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_calib_h_template_cpp():
"""
C++ language implementation of create_calib_h_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_calib_pyx_template_cpp():
"""
C++ language implementation of create_calib_pyx_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_code_for_born_functions_cpp():
"""
C++ language implementation of create_code_for_born_functions()
Returns
-------
string :
The template string.
"""
return ""
def _create_code_for_debye_function_cpp():
"""
C++ language implementation of create_code_for_debye_function()
Returns
-------
string :
The template string.
"""
return ""
def _create_code_for_dh_functions_cpp():
"""
C++ language implementation of create_code_for_dh_functions()
Returns
-------
string :
The template string.
"""
return ""
def _create_fast_c_template_cpp():
"""
C++ language implementation of create_fast_c_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_fast_h_template_cpp():
"""
C++ language implementation of create_fast_h_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_fast_pyx_template_cpp():
"""
C++ language implementation of create_fast_pyx_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_pyxbld_template_cpp():
"""
C++ language implementation of create_pyxbld_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_redundant_calib_TV_template_cpp():
"""
C++ language implementation of create_redundant_calib_TV_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_redundant_function_template_cpp(model_type='TP'):
"""
C++ language implementation of create_redundant_function_template()
Parameters
----------
model_type: string
Potential type, either Gibbs free energy ('TP') or Helmholtz free
energy ('TV')
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calc_template_cpp():
"""
C++ language implementation of create_soln_calc_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calib_code_template_cpp():
"""
C++ language implementation of create_soln_calib_code_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calib_extra_template_cpp():
"""
C++ language implementation of create_soln_calib_extra_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calib_include_template_cpp():
"""
C++ language implementation of create_soln_calib_include_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calib_pyx_template_cpp():
"""
C++ language implementation of create_soln_calib_pyx_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_calib_template_cpp():
"""
C++ language implementation of create_soln_calib_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_deriv_template_cpp():
"""
C++ language implementation of create_soln_deriv_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_fast_code_template_cpp():
"""
C++ language implementation of create_soln_fast_code_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_fast_include_template_cpp():
"""
C++ language implementation of create_soln_fast_include_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_fast_pyx_template_cpp():
"""
C++ language implementation of create_soln_fast_pyx_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_pyxbld_template_cpp():
"""
C++ language implementation of create_pyxbld_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_redun_template_cpp():
"""
C++ language implementation of create_soln_deriv_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_soln_std_state_include_template_cpp():
"""
C++ language implementation of create_soln_std_state_include_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_ordering_gaussj_template_cpp():
"""
C++ language implementation of create_ordering_gaussj_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_ordering_code_template_cpp():
"""
C++ language implementation of create_ordering_code_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_complx_soln_calc_template_cpp():
"""
C++ language implementation of create_complx_soln_calc_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_complx_soln_calib_template_cpp():
"""
C++ language implementation of create_complx_soln_calib_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_speciation_code_template_cpp():
"""
C++ language implementation of create_speciation_code_template()
Returns
-------
string :
The template string.
"""
return ""
def _create_speciation_ordering_code_template_cpp():
"""
C++ language implementation of create_speciation_ordering_code_template()
Returns
-------
string :
The template string.
"""
return ""