Skip to content

Commit c216598

Browse files
authored
Add quadrature (#269)
* build(fpm): update to Julienne 3.6.0 This commit adopts a newer version of the Julienne dependency for a fix in reporting test execution times when compiling with LLVM flang. * feat(quadrature): Ext Gauss Div, compiler workards Given properly initialized `vector_1D_t v` and `scalar_1D_t f` objects, this commit adds types, type-bound functions, and operators supporting the evaluation of the following residual formed from the extended Gauss Divergence Theorem of Castillo & Miranda (2013): ```fortran associate(dV => f%dV, dA => v%dA()) residual = .SSS. (v .dot. .grad. f)*dV + .SSS. (f * .div. v)*dV - .SS. (f .x. (v .dot. dA)) end associate ``` where `.SS.` and `.SSS.` represent double and triple integrals over the problem domain and its bounding surface, respectively. feat(tensors_1D_t): add dV, dA calculators This commit 1. Adds a dV generic binding to tensor_1D_t for computing differential volumes for volume integration. In 1D, volume integrals are calculated on a per-unit-of-normal- surface-area basis so dV = dx*dy*dz = dx(1)(1). 2. Adds a dA procedure binding to vector_1D_t for computing surface-area differentials for surface integrals involving the dot product of a vector with a surface-normal. In 1D, surface integrals are calculated on a per-unit-of-normal- surface basis so dA = dy*dz = 1. build(ifx): work around ifx bugs 1. Symptom: crashing surface-integral unit test at grid resolutions above ~413 points. Fix: when ifx is detected, reduce grid points to 400 and slightly increase the error tolerance. 2. Symptom: test hangs if the `gradient_1D_t` type has a `weights` generic binding associated with the grandparent `tensor_1D_t` type's `gradient_1D_weights` binding. Fix: when ifx is detected, move the generic binding up to the parent `vector_1D_t` type. build(gfortran): work around gfortran issues 1. To eliminate gfortran 13-14 internal compiler errors on Ubuntu in CI, replace two `weights` generic binding invocations with invocations of the corresponding type-bound functions: `gradient_1D_weights` and `divergence_1D_weights`. 2. To work around missing featuers in gfortran 13-14, remove do-concurrent type-specs and locality specifiers when gfortran is detected. * doc(README): update ifx build/test command * doc(UML): add newest entities to class diagram * test(quadrature): ext Gauss div thm terms,residual The tests exhibit the following numerical integration behaviors: 1. At 500-cell resolution, a. 2nd-order quadrature converges quadratically: O(dx^2), b. 4th-order quadrature converges linearly: O(dx), and c. 4th-order quadrature yields maximum absolute errors roughly, three orders of magnitude smaller than the 2nd-order scheme. 2. At even just a 20-cell resolution, 2nd- and 4th-order schemes satisfy the discrete Extended Gauss Divergence Theorem down to a residual near machine zero: ~10^-14. This commit adds passing tests that check the 1D equivalents of the following three integral terms in the extended Gauss divergence theorem using 2nd & 4th-order mimetic quadratures. refact(tensors_1D): absorb child procs This commit moves the gradient_1D_weights and divergence_1D_weights type-bound procedures up to the parent tensor_1D_t type, making these procedures accessible via any tensor_1D_t child type. This facilitates assembly of the B boundary matrix required for inner products corresponding to surface integrals of the form .SS. (v*f) = <Bv,f> for a vector_1D_t v and a scalar_1D_t f. Previously, the weights functions were bound to the gradient_1D_t and divergence_1D_t types and were thus inaccessible in a calculation not involving those types. Now the multiplication operator above can query its operands for the weights and use them to consturct B via B = QD + (G^T)*P, Eq. (6) of Corbino & Castillo (2020) * feat(example): add optional args in EGDT program This commit adds optional arguments that can be used to print only specific terms in the extended Gauss Divergence Theorem example. The default behavior is still that all terms are computed, printed, and summed to produce a residual. Usage: fpm run \ --example extended-gauss-divergence \ --compiler flang-new \ --flag "-O3" \ -- [--help|-h] | [[--cells <integer>] [--order <integer>] [--xmin <double precision>] [--xmax <double precision>] [--div|d] [--grad|g] [--vf|f]] where pipes (|) separate square-bracketed optional arguments and angular brackets indicate user input values. fix(integral): .SSS. (f * .div. v)*dV This commit zero-extends divergence_1D_t values when computing f * .div. v to match the array sizes of the operands. feat(example): increase resolution, fmt output, work around gfortran bug This commit edits print-assembled-1D-operators.F90 to 1. Raise the grid resolution above the new minimum of 16 as required for computing the gradient quadrature weights when constructing a `gradient_1D_t` object and 2. Adds a `stop` statement to work arounnd an apparent gfortran bug: a malloc error. This commit edits div-grad-laplacian-1D.F90 to 1. Raise the grid resolution above the new minimum of 16 for as reqiured for computing the quadrature weights (which are not used in this program) when defining a `gradient_1D_t` object and 2. Improve the program output format. doc(example): Gauss divergence theorem AI prompt * feat(example): add optional args in EGDT program This commit adds optional arguments that can be used to print only specific terms in the extended Gauss Divergence Theorem example. The default behavior is still that all terms are computed, printed, and summed to produce a residual. Usage: fpm run \ --example extended-gauss-divergence \ --compiler flang-new \ --flag "-O3" \ -- [--help|-h] | [[--cells <integer>] [--order <integer>] [--xmin <double precision>] [--xmax <double precision>] [--div|d] [--grad|g] [--vf|f]] where pipes (|) separate square-bracketed optional arguments and angular brackets indicate user input values. fix(integral): .SSS. (f * .div. v)*dV This commit zero-extends divergence_1D_t values when computing f * .div. v to match the array sizes of the operands. feat(example): increase resolution, fmt output, work around gfortran bug This commit edits print-assembled-1D-operators.F90 to 1. Raise the grid resolution above the new minimum of 16 as required for computing the gradient quadrature weights when constructing a `gradient_1D_t` object and 2. Adds a `stop` statement to work arounnd an apparent gfortran bug: a malloc error. This commit edits div-grad-laplacian-1D.F90 to 1. Raise the grid resolution above the new minimum of 16 for as reqiured for computing the quadrature weights (which are not used in this program) when defining a `gradient_1D_t` object and 2. Improve the program output format. doc(example): Gauss divergence theorem AI prompt
1 parent 1d51241 commit c216598

23 files changed

Lines changed: 1016 additions & 118 deletions

doc/fortran-classes.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ classDiagram
1010
class tensor_1D_t
1111
class scalar_1D_t
1212
class vector_1D_t
13+
class gradient_1D_t
1314
class divergence_1D_t
1415
class laplacian_1D_t
1516
class gradient_operator_1D_t
@@ -19,25 +20,35 @@ class mimetic_matrix_1D_t
1920
tensor_1D_t <|-- scalar_1D_t : is a
2021
tensor_1D_t <|-- vector_1D_t : is a
2122
tensor_1D_t <|-- divergence_1D_t : is a
23+
24+
tensor_1D_t <|-- weighted_product_1D_t
25+
tensor_1D_t <|-- vector_dot_gradient_1D_t
26+
tensor_1D_t <|-- scalar_x_divergence_1D_t
27+
2228
divergence_1D_t <|-- laplacian_1D_t : is a
29+
vector_1D_t <|-- gradient_1D_t : is a
2330
mimetic_matrix_1D_t <|-- gradient_operator_1D_t : is a
2431
mimetic_matrix_1D_t <|-- divergence_operator_1D_t : is a
2532
2633
class scalar_1D_t{
2734
- gradient_operator_1D_ : gradient_operator_1D_t
28-
+ operator(.grad.) vector_1D_t
29-
+ operator(.laplacian.) scalar_1D_t
35+
+ operator(.grad.) gradient_1D_t
36+
+ operator(.laplacian.) laplacian_1D_t
3037
}
3138
3239
class vector_1D_t{
3340
- divergence_operator_1D_ : divergence_operator_1D_t
3441
+ operator(.div.) divergence_1D_t
3542
}
3643
44+
class gradient_1D_t{
45+
- weights : double precision[]
46+
}
47+
3748
class mimetic_matrix_1D_t{
38-
- upper_ :: double precision
39-
- inner_ :: double precision
40-
- lower_ :: double precision
49+
- upper_ :: double precision[]
50+
- inner_ :: double precision[]
51+
- lower_ :: double precision[]
4152
}
4253
4354
class gradient_operator_1D_t{

example/div-grad-laplacian-1D.F90

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,34 @@ double precision elemental function d2f_dx2(x)
2222
end module functions_m
2323

2424
program div_grad_laplacian_1D
25+
!! Compute the 2nd- and 4th-order mimetic approximations to the gradient and Laplacian of the
26+
!! above function f(x) on a 1D uniform, staggered grid.
2527
use functions_m
2628
use julienne_m, only : file_t, string_t, operator(.separatedBy.)
2729
use mole_m, only : scalar_1D_t, scalar_1D_initializer_i
2830
#ifdef __GFORTRAN__
29-
use mole_m, only : vector_1D_t, laplacian_1D_t
31+
use mole_m, only : vector_1D_t, laplacian_1D_t, gradient_1D_t
3032
#endif
3133
implicit none
3234

3335
procedure(scalar_1D_initializer_i), pointer :: scalar_1D_initializer => f
3436

3537
print *,new_line('')
36-
print *," 2nd-order approximations"
37-
print *," ========================"
38+
print *," Functions"
39+
print *," ========================"
40+
call execute_command_line("grep 'f =' example/div-grad-laplacian-1D.F90 | grep -v execute_command", wait=.true.)
41+
call execute_command_line("grep 'df_dx =' example/div-grad-laplacian-1D.F90 | grep -v execute_command", wait=.true.)
42+
call execute_command_line("grep 'd2f_dx2 =' example/div-grad-laplacian-1D.F90 | grep -v execute_command", wait=.true.)
43+
44+
print *,new_line('')
45+
print *," 2nd-order approximations"
46+
print *," ========================"
3847

3948
call output(order=2)
4049

4150
print *,new_line('')
42-
print *," 4th-order approximations"
43-
print *," ========================"
51+
print *," 4th-order approximations"
52+
print *," ========================"
4453

4554
call output(order=4)
4655

@@ -51,22 +60,22 @@ program div_grad_laplacian_1D
5160
subroutine output(order)
5261
integer, intent(in) :: order
5362

54-
associate( s => scalar_1D_t(scalar_1D_initializer, order=order, cells=10, x_min=0D0, x_max=20D0))
63+
associate( s => scalar_1D_t(scalar_1D_initializer, order=order, cells=20, x_min=0D0, x_max=20D0))
5564
associate( grad_s => .grad. s &
5665
,laplacian_s => .laplacian. s)
5766
associate( s_grid => s%grid() &
5867
,grad_s_grid => grad_s%grid() &
5968
,laplacian_s_grid => laplacian_s%grid())
6069
associate( s_table => tabulate( &
61-
string_t([character(len=18)::"x", "f(x) exp" , "f(x) act" ]) &
70+
string_t([character(len=22)::"x", "f(x) expected" , "f(x) actual" ]) &
6271
,s_grid, f(s_grid), s%values() &
6372
) &
6473
,grad_s_table => tabulate( &
65-
string_t([character(len=18)::"x", ".grad. f exp" , ".grad. f act" ]) &
74+
string_t([character(len=22)::"x", ".grad. f expected" , ".grad. f actual" ]) &
6675
,grad_s_grid, df_dx(grad_s_grid), grad_s%values() &
6776
) &
6877
,laplacian_s_table => tabulate( &
69-
string_t([character(len=18)::"x", ".laplacian. f exp", ".laplacian. f act"]) &
78+
string_t([character(len=22)::"x", ".laplacian. f expected", ".laplacian. f actual"]) &
7079
,laplacian_s_grid, d2f_dx2(laplacian_s_grid), laplacian_s%values()) &
7180
)
7281
call s_table%write_lines()
@@ -84,12 +93,12 @@ subroutine output(order)
8493
integer, intent(in) :: order
8594

8695
type(scalar_1D_t) s
87-
type(vector_1D_t) grad_s
96+
type(gradient_1D_t) grad_s
8897
type(laplacian_1D_t) laplacian_s
8998
type(file_t) s_table, grad_s_table, laplacian_s_table
9099
double precision, allocatable,dimension(:) :: s_grid, grad_s_grid, laplacian_s_grid
91100

92-
s = scalar_1D_t(scalar_1D_initializer, order=order, cells=10, x_min=0D0, x_max=20D0)
101+
s = scalar_1D_t(scalar_1D_initializer, order=order, cells=20, x_min=0D0, x_max=20D0)
93102
grad_s = .grad. s
94103
laplacian_s = .laplacian. s
95104

@@ -98,15 +107,15 @@ subroutine output(order)
98107
laplacian_s_grid = laplacian_s%grid()
99108

100109
s_table = tabulate( &
101-
string_t([character(len=18)::"x", "f(x) exp." , "f(x) act." ]) &
110+
string_t([character(len=22)::"x", "f(x) expected" , "f(x) actual" ]) &
102111
,s_grid, f(s_grid), s%values() &
103112
)
104113
grad_s_table = tabulate( &
105-
string_t([character(len=18)::"x", ".grad. f exp." , ".grad. f act." ]) &
114+
string_t([character(len=22)::"x", ".grad. f expected" , ".grad. f actual" ]) &
106115
,grad_s_grid, df_dx(grad_s_grid), grad_s%values() &
107116
)
108117
laplacian_s_table = tabulate( &
109-
string_t([character(len=18)::"x", ".laplacian. f exp.", ".laplacian. f act."]) &
118+
string_t([character(len=22)::"x", ".laplacian. f expected", ".laplacian. f actual"]) &
110119
,laplacian_s_grid, d2f_dx2(laplacian_s_grid), laplacian_s%values() &
111120
)
112121
call s_table%write_lines()
@@ -125,8 +134,8 @@ pure function tabulate(headings, abscissa, expected, actual) result(file)
125134
file = file_t([ &
126135
string_t("") &
127136
,headings .separatedBy. " " &
128-
,string_t("----------------------------------------------------------") &
129-
,[( string_t(abscissa(line)) // " " // string_t(expected(line)) // " " // string_t(actual(line)), line = 1, size(abscissa))] &
137+
,string_t("------------------------------------------------------------------") &
138+
,[( string_t(abscissa(line)) // " " // string_t(expected(line)) // " " // string_t(actual(line)), line = 1, size(abscissa))] &
130139
])
131140
end function
132141

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
module integrand_operands_m
2+
implicit none
3+
contains
4+
5+
pure function scalar(x) result(f)
6+
double precision, intent(in) :: x(:)
7+
double precision, allocatable :: f(:)
8+
f = (x**2)/2 ! <-- scalar function
9+
end function
10+
11+
pure function vector(x) result(v)
12+
double precision, intent(in) :: x(:)
13+
double precision, allocatable :: v(:)
14+
v = x ! <-- vector function
15+
end function
16+
17+
end module
18+
19+
program extended_gauss_divergence
20+
!! Print each term in the following residual formed from the extended Gauss-divergence
21+
!! theorem using one-dimensional (1D) 4th-(default) or 2nd-order mimetic discretizations:
22+
!! `residual = .SSS. (v .dot. .grad. f) * dV +.SSS. (f * .div. v) * dV - .SS. (f .x. (v .dot. dA))`
23+
!! where `.SSS.` and `.SS.` are the 1D equivalents of a volume integral over the whole
24+
!! domain and a surface integral over a domain boundary of unit area, respectively.
25+
use julienne_m, only : command_line_t
26+
use integrand_operands_m, only : scalar, vector
27+
use mole_m, only : scalar_1D_t, scalar_1D_initializer_i, vector_1D_t, vector_1D_initializer_i
28+
implicit none
29+
procedure(scalar_1D_initializer_i), pointer :: scalar_1D_initializer => scalar
30+
procedure(vector_1D_initializer_i), pointer :: vector_1D_initializer => vector
31+
32+
type numerical_arguments_t
33+
!! Define default initializations that can be overridden with the command-line arguments
34+
!! detailed by the usage information below
35+
integer :: cells_=200, order_=4
36+
double precision :: x_min_=0D0, x_max_=1D0
37+
end type
38+
39+
type text_flags_t
40+
logical div_, grad_, vf_
41+
end type
42+
43+
type(command_line_t) command_line
44+
double precision SSS_v_dot_grad_f_dV, SSS_f_div_v_dV, SS_f_v_dot_dA
45+
46+
if (command_line%argument_present([character(len=len("--help")) :: ("--help"), "-h"])) then
47+
stop new_line('') // new_line('') &
48+
// 'Usage:' // new_line('') &
49+
// ' fpm run \' // new_line('') &
50+
// ' --example extended-gauss-divergence \' // new_line('') &
51+
// ' --compiler flang-new \' // new_line('') &
52+
// ' --flag "-O3" \' // new_line('') &
53+
// ' -- [--help|-h] | [[--cells <integer>] [--order <integer>] [--xmin <double precision>] [--xmax <double precision>] [--div|d] [--grad|g] [--vf|f]]' &
54+
// new_line('') // new_line('') &
55+
// 'where pipes (|) separate square-bracketed optional arguments and angular brackets indicate user input values.' // new_line('')
56+
end if
57+
58+
call execute_command_line("grep '<-- scalar' example/extended-gauss-divergence.F90 | grep -v execute_command", wait=.true.)
59+
call execute_command_line("grep '<-- vector' example/extended-gauss-divergence.F90 | grep -v execute_command", wait=.true.)
60+
61+
#ifdef __GFORTRAN__
62+
command_line_arguments: &
63+
block
64+
type(numerical_arguments_t) args
65+
args = get_numerical_arguments()
66+
#else
67+
command_line_arguments: &
68+
associate(args => get_numerical_arguments())
69+
#endif
70+
text_flags: &
71+
associate(flags => text_flags_t( &
72+
div_ = command_line%argument_present( [ character(len=len("--div" )) :: "--div" , "-d" ] ) &
73+
,grad_ = command_line%argument_present( [ character(len=len("--grad")) :: "--grad", "-g" ] ) &
74+
,vf_ = command_line%argument_present( [ character(len=len("--vf" )) :: "--vf" , "-f" ] ) &
75+
))
76+
print_all: &
77+
associate(all_terms => merge(.true., .false., all([flags%div_, flags%grad_, flags%vf_]) .or. .not. any([flags%div_, flags%grad_, flags%vf_])))
78+
integrand_factors: &
79+
associate( &
80+
f => scalar_1D_t(scalar_1D_initializer, args%order_, args%cells_, args%x_min_, args%x_max_) &
81+
,v => vector_1D_t(vector_1D_initializer, args%order_, args%cells_, args%x_min_, args%x_max_) &
82+
)
83+
differential_volume: &
84+
associate(dV => f%dV())
85+
86+
if (flags%grad_ .or. all_terms) then
87+
SSS_v_dot_grad_f_dV = .SSS. (v .dot. .grad. f) * dV
88+
print '(a,g0)', ".SSS. (v .dot. .grad. f) * dV = ", SSS_v_dot_grad_f_dV
89+
end if
90+
91+
if (flags%div_ .or. all_terms) then
92+
SSS_f_div_v_dV = .SSS. (f * .div. v) * dV
93+
print '(a,g0)', ".SSS. ( f * .div. v) * dV = ", SSS_f_div_v_dV
94+
end if
95+
96+
end associate differential_volume
97+
98+
differential_area: &
99+
associate(dA => v%dA())
100+
if (flags%vf_ .or. all_terms) then
101+
SS_f_v_dot_dA = .SS. (f .x. (v .dot. dA))
102+
print '(a,g0)', " -.SS. (f .x. (v .dot. dA)) = ", -SS_f_v_dot_dA
103+
end if
104+
105+
if (all_terms) then
106+
print '(a)' , "----------------------------------------------------"
107+
print '(26x,a,g0,a)',"sum = ", SSS_v_dot_grad_f_dV + SSS_f_div_v_dV - SS_f_v_dot_dA, " (residual)"
108+
end if
109+
110+
end associate differential_area
111+
end associate integrand_factors
112+
end associate print_all
113+
end associate text_flags
114+
#ifndef __GFORTRAN__
115+
end associate command_line_arguments
116+
#else
117+
end block command_line_arguments
118+
#endif
119+
120+
contains
121+
122+
function get_numerical_arguments() result(numerical_arguments)
123+
type(numerical_arguments_t) numerical_arguments
124+
125+
#ifdef __GFORTRAN__
126+
character(len=:), allocatable :: cells_string, order_string, x_min_string, x_max_string
127+
cells_string = command_line%flag_value("--cells")
128+
order_string = command_line%flag_value("--order")
129+
x_min_string = command_line%flag_value("--x_min")
130+
x_max_string = command_line%flag_value("--x_max")
131+
#else
132+
associate( &
133+
cells_string => command_line%flag_value("--cells") &
134+
,order_string => command_line%flag_value("--order") &
135+
,x_min_string => command_line%flag_value("--x_min") &
136+
,x_max_string => command_line%flag_value("--x_max") &
137+
)
138+
#endif
139+
if (len(cells_string)/=0) read(cells_string,*) numerical_arguments%cells_
140+
if (len(order_string)/=0) read(order_string,*) numerical_arguments%order_
141+
if (len(x_min_string)/=0) read(x_min_string,*) numerical_arguments%x_min_
142+
if (len(x_max_string)/=0) read(x_max_string,*) numerical_arguments%x_max_
143+
#ifndef __GFORTRAN__
144+
end associate
145+
#endif
146+
147+
end function
148+
149+
end program
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
program print_assembled_1D_operators
2-
!! Print fully assembled memetic 1D gradient, divergence, and Laplacian matrices,
3-
!! including the zero elements.
2+
!! Print the fully assembled 2nd- and 4th-order mimetic gradient, divergence, and Laplacian
3+
!! operator matrices as comma-separated rows for 1D grids with the minimum number of cells (16)
4+
!! required for computing 4th-order gradient quadrature weights (Q).
45
use julienne_m, only : operator(.csv.), string_t, command_line_t
56
use mimetic_operators_1D_m, only : gradient_operator_1D_t, divergence_operator_1D_t
67
implicit none
@@ -29,12 +30,15 @@ program print_assembled_1D_operators
2930
default_usage: &
3031
associate(print_all => .not. any([gradient, divergence, len(order)/=0]))
3132

32-
if (print_all .or. (gradient .and. len(order)==0) .or. (gradient .and. order=="2")) call print_gradient_operator( k=2, dx=1D0, m=5)
33-
if (print_all .or. (divergence .and. len(order)==0) .or. (divergence .and. order=="2")) call print_divergence_operator(k=2, dx=1D0, m=5)
34-
if (print_all .or. (gradient .and. len(order)==0) .or. (gradient .and. order=="4")) call print_gradient_operator( k=4, dx=1D0, m=9)
35-
if (print_all .or. (divergence .and. len(order)==0) .or. (divergence .and. order=="4")) call print_divergence_operator(k=4, dx=1D0, m=9)
33+
if (print_all .or. (gradient .and. len(order)==0) .or. (gradient .and. order=="2")) call print_gradient_operator( k=2, dx=1D0, m=16)
34+
if (print_all .or. (divergence .and. len(order)==0) .or. (divergence .and. order=="2")) call print_divergence_operator(k=2, dx=1D0, m=16)
35+
if (print_all .or. (gradient .and. len(order)==0) .or. (gradient .and. order=="4")) call print_gradient_operator( k=4, dx=1D0, m=16)
36+
if (print_all .or. (divergence .and. len(order)==0) .or. (divergence .and. order=="4")) call print_divergence_operator(k=4, dx=1D0, m=16)
3637

3738
end associate default_usage
39+
#ifdef __GFORTRAN__
40+
stop
41+
#endif
3842
end associate command_line_settings
3943

4044
contains

fpm.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ name = "MOLE"
44
armadillo-code = {git = "https://gitlab.com/rouson/armadillo-code.git", tag = "fpm"}
55

66
[dev-dependencies]
7-
julienne = {git = "https://github.com/berkeleylab/julienne.git", tag = "3.3.0"}
7+
julienne = {git = "https://github.com/berkeleylab/julienne.git", tag = "3.6.0"}
88

99
[install]
1010
library = true

src/fortran/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ and placing the resulting executable program in your `PATH` suffices.
1515
| Vendor | Compiler | Version | Build/Test Command |
1616
|--------|-------------|----------|-------------------------------------------------------|
1717
| GCC | `gfortran` | 13 | fpm test --compiler gfortran --profile release |
18-
| Intel | `ifx` | 2025.1.2 | fpm test --compiler ifx --profile release --flag -fpp |
18+
| Intel | `ifx` | 2025.1.2 | FOR_COARRAY_NUM_IMAGES=1 fpm test --compiler ifx --flag "-fpp -O3 -coarray" --profile release |
1919
| LLVM | `flang-new` | 19 | fpm test --compiler flang-new --flag "-O3" |
2020
| NAG | `nagfor` | 7.2 | fpm test --compiler nagfor --flag "-O3 -fpp" |
2121

0 commit comments

Comments
 (0)