From fc6828bab6acd86d0c9e678ecf464f3c0f59e106 Mon Sep 17 00:00:00 2001 From: David Kopriva Date: Sun, 9 Aug 2026 18:04:36 -0700 Subject: [PATCH 1/7] Update BoundaryErrors.f90 Change the error output to be easy to plot the error by segement. --- Source/BoundaryOptimization/BoundaryErrors.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/BoundaryOptimization/BoundaryErrors.f90 b/Source/BoundaryOptimization/BoundaryErrors.f90 index 5f2fd0f9..96e450e9 100644 --- a/Source/BoundaryOptimization/BoundaryErrors.f90 +++ b/Source/BoundaryOptimization/BoundaryErrors.f90 @@ -266,7 +266,7 @@ SUBROUTINE WriteBoundaryErrors(project) eL2Norm = project % L2BoundaryError(j) % array(c) eH1Norm = project % H1BoundaryError(j) % array(c) - WRITE(normUnit,*) 0.5_RP*(gTStart + gTEnd), LOG10(eL2Norm + 1.0d-15), LOG10(eH1Norm + 1.0d-15) + WRITE(normUnit,*) gTStart, gTEnd, eL2Norm, eH1Norm END DO From 6d6d562e163df930196264d1e5716dea9ac06ccd Mon Sep 17 00:00:00 2001 From: David Kopriva Date: Mon, 10 Aug 2026 11:08:47 -0700 Subject: [PATCH 2/7] Update BoundaryErrors.f90 Add physical space positions of the segment end points. Also write out the number of boundary curves and segments per curve so that all information is available in the file without having to refer to the model. A header was added to `WriteBoundaryErrors' to describe the file format. --- .../BoundaryOptimization/BoundaryErrors.f90 | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/Source/BoundaryOptimization/BoundaryErrors.f90 b/Source/BoundaryOptimization/BoundaryErrors.f90 index 96e450e9..abc6c035 100644 --- a/Source/BoundaryOptimization/BoundaryErrors.f90 +++ b/Source/BoundaryOptimization/BoundaryErrors.f90 @@ -194,6 +194,35 @@ END SUBROUTINE ComputeBoundaryErrors !//////////////////////////////////////////////////////////////////////// ! SUBROUTINE WriteBoundaryErrors(project) +! +! ---------------------------------------------------------------------------- +! Write the L2 and H1 errors within each segment along each boundary. +! It writes to the path of the error file name appended with the string +! "_Norms" provided in the control file unless that value is "none" or +! not included. +! +! The format is: +! +! "Number of boundary curves = " # boundary curves +! For each boundary curve +! Boundary name, # Segments +! For each segment +! t_{start} x_{start} y_{start} t_{end} x_{end} y_{end} L2Error H1Error +! end +! end +! +! where +! t_{start} = start parametrization for the segment +! t_{end} = end parametrization for the segment +! x_{start},y_{start} = physical space location of segment start +! x_{end},y_{end} = physical space location of segment end +! L2Error = L2Error of the segment +! H1Error = H1 Error of the segment +! +! The format is redundant in that it duplicates the start and end points, +! but should make it easier to read the file and draw from it. +! ---------------------------------------------------------------------------- +! IMPLICIT NONE ! ! --------- @@ -215,6 +244,7 @@ SUBROUTINE WriteBoundaryErrors(project) CHARACTER(DEFAULT_CHARACTER_LENGTH) :: str REAL(KIND=RP) :: gTStart, gTEnd + REAL(KIND=RP) :: xs(3), xe(3) REAL(KIND=RP) :: eL2Norm, eH1Norm INTEGER :: normUnit INTEGER :: m, j, c @@ -252,21 +282,25 @@ SUBROUTINE WriteBoundaryErrors(project) ! Write them ! ---------- ! + WRITE(normUnit,*) "Number of boundary curves = ", model % numberOfChains() DO j = 1, model % numberOfChains() obj => modelChains(j) % object CALL castToSMChainedCurve(obj, modelChain) - WRITE(normUnit,*) TRIM(modelChain % curveName()) obj => boundaryPolynomials % objectAtIndex(j) CALL castObjToMultiSegmentCurve(obj,boundaryPolynomial) + + WRITE(normUnit,*) TRIM(modelChain % curveName()), ",", boundaryPolynomial % nSegments DO c = 1, boundaryPolynomial % nSegments gTStart = boundaryPolynomial % cuts(c-1) gTEnd = boundaryPolynomial % cuts(c) eL2Norm = project % L2BoundaryError(j) % array(c) eH1Norm = project % H1BoundaryError(j) % array(c) + xs = boundaryPolynomial % positionAt(gTStart) + xe = boundaryPolynomial % positionAt(gTEnd) - WRITE(normUnit,*) gTStart, gTEnd, eL2Norm, eH1Norm + WRITE(normUnit,*) gTStart, xs(1:2), gTEnd, xe(1:2), eL2Norm, eH1Norm END DO From 98ebeec5cd1bc79629b00e562e43574debdff324 Mon Sep 17 00:00:00 2001 From: Andrew Winters Date: Tue, 11 Aug 2026 11:21:35 +0200 Subject: [PATCH 3/7] change Max H1Error to Max H1 Error on output --- Documentation/docs/error-controlled-adaptive-meshing.md | 2 +- Source/HOHQMesh.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/docs/error-controlled-adaptive-meshing.md b/Documentation/docs/error-controlled-adaptive-meshing.md index 04af1bcb..9fe325fb 100644 --- a/Documentation/docs/error-controlled-adaptive-meshing.md +++ b/Documentation/docs/error-controlled-adaptive-meshing.md @@ -90,7 +90,7 @@ produces the output: Area Sign 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 Boundary Error Quality: - Boundary Name Max L2 Error Max H1Error + Boundary Name Max L2 Error Max H1 Error Outer Boundary 5.13545249E-08 5.45735801E-05 In addition to the usual element quality measures, one sees that the $\mathbb H^1$ error is indeed bounded by the requested tolerance. If there is more than one boundary, they are listed by boundary name. diff --git a/Source/HOHQMesh.f90 b/Source/HOHQMesh.f90 index afffce3f..673ecb84 100644 --- a/Source/HOHQMesh.f90 +++ b/Source/HOHQMesh.f90 @@ -186,7 +186,7 @@ SUBROUTINE HOHQMesh(projectDict, project, stats, didGenerate3DMesh, test) IF ( .NOT.test ) THEN IF ( SIZE(project % L2ErrorMax) > 0 ) THEN PRINT *, "Boundary Error Quality:" - WRITE(6,"(A32,4x,A12,A16)") "Boundary Name", "Max L2 Error", "Max H1Error" + WRITE(6,"(A32,4x,A12,A16)") "Boundary Name", "Max L2 Error", "Max H1 Error" DO k = 1, SIZE(project % L2ErrorMax) obj => project % model % allChains(k) % object CALL castToSMCurve(obj,boundaryCurve) From 542be92fdeb2ae128cf623b8a64a385a7f1ffae8 Mon Sep 17 00:00:00 2001 From: Andrew Winters Date: Tue, 11 Aug 2026 21:25:17 +0200 Subject: [PATCH 4/7] update docs --- .../docs/error-controlled-adaptive-meshing.md | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/Documentation/docs/error-controlled-adaptive-meshing.md b/Documentation/docs/error-controlled-adaptive-meshing.md index 9fe325fb..829442d5 100644 --- a/Documentation/docs/error-controlled-adaptive-meshing.md +++ b/Documentation/docs/error-controlled-adaptive-meshing.md @@ -12,15 +12,15 @@ It now can also adaptively mesh a model to provide optimal boundary approximatio ## How to Control the Boundary Errors Error control is added chain-by-chain in the model by telling HOHQMesh what norm to optimize ($\mathbb L^2$ or $\mathbb H^1$), the error tolerance, and to what derivatives the resulting boundary approximation will be smooth. The syntax is - \begin{CHAIN} - optimize = L2Norm OR H1Norm OR none - tolerance = - continuity = = highest derivative to be made smooth - connect = - . - . - . - \end{CHAIN} + \begin{CHAIN} + optimize = L2Norm OR H1Norm OR none + tolerance = + continuity = = highest derivative to be made smooth + connect = + . + . + . + \end{CHAIN} An `OUTER_BOUNDARY` implicitly includes a chain. So, the optimization keywords can directly be added to a `\begin{OUTER_BOUNDARY} ... \end{OUTER_BOUNDARY}` block. @@ -38,11 +38,11 @@ The options are: The syntax is the following: - connect = crv_1-crv_2,crv_3-crv_4,... + connect = crv_1-crv_2,crv_3-crv_4,... where the `crv_n` are the index of the curves in the chain. For example, if a chain contains ten curves and optimization is requested across the third and fourth curves in the list and across the sixth through ninth in the list, then - connect = 3-4,6-9 + connect = 3-4,6-9 **Note Well:** @@ -55,48 +55,48 @@ The options are: Whether or not boundary optimization is chosen, HOHQMesh will write out the maximum $\mathbb L^2$ and $\mathbb H^1$ boundary edge errors. Running the [`Examples/2D/BlobAdapt/BlobAdapt.control`](https://github.com/trixi-framework/HOHQMesh/blob/main/Examples/2D/BlobAdapt/BlobAdapt.control) example and requesting an `H1Norm` tolerance of $10^{-4}$ and first derivative continuity by - \begin{OUTER_BOUNDARY} - optimize = H1Norm - continuity = 1 - tolerance = 1.0e-4 - \begin{PARAMETRIC_EQUATION_CURVE} - name = blob - xEqn = x(t) = 4*cos(2*pi*t) - 3/5*cos(8*pi*t)^3 - yEqn = y(t) = 4*sin(2*pi*t) - 0.5*sin(11*pi*t)^2 - zEqn = z(t) = 0.0 - \end{PARAMETRIC_EQUATION_CURVE} - \end{OUTER_BOUNDARY} + \begin{OUTER_BOUNDARY} + optimize = H1Norm + continuity = 1 + tolerance = 1.0e-4 + \begin{PARAMETRIC_EQUATION_CURVE} + name = blob + xEqn = x(t) = 4*cos(2*pi*t) - 3/5*cos(8*pi*t)^3 + yEqn = y(t) = 4*sin(2*pi*t) - 0.5*sin(11*pi*t)^2 + zEqn = z(t) = 0.0 + \end{PARAMETRIC_EQUATION_CURVE} + \end{OUTER_BOUNDARY} produces the output: ******************* 2D Mesh Statistics: ******************* - Total time = 0.57661399999999996 - Number of nodes = 570 - Number of Edges = 1059 - Number of Elements = 490 - Number of Subdivisions = 4 - - Mesh Quality: - Measure Minimum Maximum Average Acceptable Low Acceptable High Reference - Signed Area 0.00122001 0.82263252 0.10243554 0.00000000 999.99900000 1.00000000 - Aspect Ratio 1.02370049 2.84878712 1.32371594 1.00000000 999.99900000 1.00000000 - Condition 1.00112287 3.80020102 1.21708413 1.00000000 4.00000000 1.00000000 - Edge Ratio 1.02962316 6.00757565 1.63781443 1.00000000 4.00000000 1.00000000 - Jacobian 0.00049569 0.75891397 0.07875994 0.00000000 999.99900000 1.00000000 - Minimum Angle 34.57990654 87.89988997 68.98664291 40.00000000 90.00000000 90.00000000 - Maximum Angle 91.84435669 150.95227640 114.13256251 90.00000000 135.00000000 90.00000000 - Area Sign 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 - - Boundary Error Quality: - Boundary Name Max L2 Error Max H1 Error - Outer Boundary 5.13545249E-08 5.45735801E-05 + Total time = 0.89582899999999999 + Number of nodes = 570 + Number of Edges = 1059 + Number of Elements = 490 + Number of Subdivisions = 4 + + Mesh Quality: + Measure Minimum Maximum Average Acceptable Low Acceptable High Reference + Signed Area 0.00122001 0.82263252 0.10243554 0.00000000 999.99900000 1.00000000 + Aspect Ratio 1.02370049 2.84878712 1.32371594 1.00000000 999.99900000 1.00000000 + Condition 1.00112287 3.80020102 1.21708413 1.00000000 4.00000000 1.00000000 + Edge Ratio 1.02962316 6.00757565 1.63781443 1.00000000 4.00000000 1.00000000 + Jacobian 0.00049569 0.75891397 0.07875994 0.00000000 999.99900000 1.00000000 + Minimum Angle 34.57990654 87.89988997 68.98664291 40.00000000 90.00000000 90.00000000 + Maximum Angle 91.84435669 150.95227640 114.13256251 90.00000000 135.00000000 90.00000000 + Area Sign 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 + + Boundary Error Quality: + Boundary Name Max L2 Error Max H1 Error + Outer Boundary 6.97837728E-08 5.63742411E-05 In addition to the usual element quality measures, one sees that the $\mathbb H^1$ error is indeed bounded by the requested tolerance. If there is more than one boundary, they are listed by boundary name. -HOHQMesh can optionally write out the boundary approximation errors to files for plotting and later analysis, whether or not the adaptive procedure is requested. Two files can be written prepended with the name of the control file. One contains the point-wise error along each boundary as a function of the chain curve parameter. The other contains the integrated ($\mathbb L^2$ or $\mathbb H^1$ norms), grouped by chain. To have these files written, include the following key in the [RUN_PARAMETERS](the-control-input.md#RunParameters) block: +HOHQMesh can optionally write out the boundary approximation errors to files for plotting and later analysis, whether or not the adaptive procedure is requested. The file can be written prepended with the name of the control file. It contains the integrated $\mathbb L^2$ and $\mathbb H^1$ norms, grouped by chain. To have these files written, include the following key in the [RUN_PARAMETERS](the-control-input.md#RunParameters) block: - error file name = + error file name = -Choose the name to be `none` to turn off printing out the errors, or simply delete the line from the file. \ No newline at end of file +Choose the name to be `none` to turn off printing out the errors, or simply delete the line from the control file. \ No newline at end of file From b8a4ca4431db569731033ad814dc801ff6df8b7a Mon Sep 17 00:00:00 2001 From: Andrew Winters Date: Wed, 12 Aug 2026 10:50:44 +0200 Subject: [PATCH 5/7] add stats file to benchmarks for BlobAdapt. Also update the docs that had the wrong keyword for stats file --- .../StatsFiles/Benchmarks/BlobAdapt.txt | 294 ++++++++++++++++++ Documentation/docs/the-control-file.md | 34 +- 2 files changed, 311 insertions(+), 17 deletions(-) create mode 100644 Benchmarks/StatsFiles/Benchmarks/BlobAdapt.txt diff --git a/Benchmarks/StatsFiles/Benchmarks/BlobAdapt.txt b/Benchmarks/StatsFiles/Benchmarks/BlobAdapt.txt new file mode 100644 index 00000000..fc1733e7 --- /dev/null +++ b/Benchmarks/StatsFiles/Benchmarks/BlobAdapt.txt @@ -0,0 +1,294 @@ + + ---------------- + Bad Element Info + ---------------- + + Element 220 + 3.4721981913810898 2.2527649308476123 0.0000000000000000 + 3.5429174795328664 2.2522760463398779 0.0000000000000000 + 3.4365036835270293 2.3991621042514875 0.0000000000000000 + 3.3935538089689494 2.2869296310466574 0.0000000000000000 + Problems: + Maximum Angle 156.91498601370748 + + ////////////////////////////////////////////////// + + ------------------------ + 2D Mesh Quality Measures + ------------------------ + +Signed Area Aspect Ratio Condition Edge Ratio Jacobian Minimum Angle Maximum Angle Area Sign + 5.2103E-01 1.1714E+00 1.1029E+00 1.4166E+00 3.7597E-01 8.0600E+01 1.1323E+02 1.0000E+00 + 8.3786E-01 1.1885E+00 1.1683E+00 1.3190E+00 6.1995E-01 7.0332E+01 1.2058E+02 1.0000E+00 + 8.2120E-01 1.1889E+00 1.1149E+00 1.3035E+00 6.0177E-01 7.6996E+01 1.1623E+02 1.0000E+00 + 8.1713E-01 1.1503E+00 1.1151E+00 1.2176E+00 6.7270E-01 7.0864E+01 1.1596E+02 1.0000E+00 + 7.3087E-01 1.1170E+00 1.0174E+00 1.1964E+00 6.2836E-01 8.3068E+01 9.9379E+01 1.0000E+00 + 7.6458E-01 1.1429E+00 1.0461E+00 1.2456E+00 6.4854E-01 7.7511E+01 1.0666E+02 1.0000E+00 + 9.2330E-01 1.0374E+00 1.0043E+00 1.0901E+00 8.6318E-01 8.4895E+01 9.2480E+01 1.0000E+00 + 9.1065E-01 1.0530E+00 1.0099E+00 1.1252E+00 8.4273E-01 8.2439E+01 9.4370E+01 1.0000E+00 + 7.6020E-01 1.1576E+00 1.0348E+00 1.3002E+00 6.1721E-01 7.6378E+01 9.8214E+01 1.0000E+00 + 7.5728E-01 1.1885E+00 1.1335E+00 1.3521E+00 5.4063E-01 7.5439E+01 1.1776E+02 1.0000E+00 + 8.5161E-01 1.0446E+00 1.0115E+00 1.0905E+00 7.9563E-01 8.1379E+01 9.5303E+01 1.0000E+00 + 8.0819E-01 1.0148E+00 1.0015E+00 1.0262E+00 8.0073E-01 8.7416E+01 9.3025E+01 1.0000E+00 + 8.2054E-01 1.0090E+00 1.0014E+00 1.0281E+00 8.0807E-01 8.7445E+01 9.2705E+01 1.0000E+00 + 8.4885E-01 1.0256E+00 1.0050E+00 1.0589E+00 8.1138E-01 8.4294E+01 9.3800E+01 1.0000E+00 + 5.9681E-01 1.2344E+00 1.0513E+00 1.4615E+00 4.7489E-01 7.6670E+01 1.0513E+02 1.0000E+00 + 7.0581E-01 1.1653E+00 1.1248E+00 1.2922E+00 4.9776E-01 7.9438E+01 1.1724E+02 1.0000E+00 + 8.5440E-01 1.0448E+00 1.0107E+00 1.0764E+00 8.0205E-01 8.1678E+01 9.5206E+01 1.0000E+00 + 7.5216E-01 1.0350E+00 1.0081E+00 1.0666E+00 7.0776E-01 8.5646E+01 9.7233E+01 1.0000E+00 + 6.7568E-01 1.1590E+00 1.0554E+00 1.2816E+00 5.5857E-01 7.6815E+01 1.0810E+02 1.0000E+00 + 7.9956E-01 1.1277E+00 1.0596E+00 1.2523E+00 6.4939E-01 7.8839E+01 1.0885E+02 1.0000E+00 + 7.2552E-01 1.1925E+00 1.0924E+00 1.3856E+00 6.0286E-01 7.0144E+01 1.1057E+02 1.0000E+00 + 4.7500E-01 1.0723E+00 1.0218E+00 1.1499E+00 4.1899E-01 8.4743E+01 1.0163E+02 1.0000E+00 + 3.6686E-02 1.1690E+00 1.0994E+00 1.3611E+00 2.7548E-02 7.6343E+01 1.1346E+02 1.0000E+00 + 6.8778E-02 1.1346E+00 1.0470E+00 1.3388E+00 5.8328E-02 7.8459E+01 9.5274E+01 1.0000E+00 + 3.8285E-02 1.3367E+00 1.1393E+00 1.6451E+00 2.4945E-02 7.3241E+01 1.1742E+02 1.0000E+00 + 6.6524E-02 1.0871E+00 1.0368E+00 1.1126E+00 6.4606E-02 7.5332E+01 1.0365E+02 1.0000E+00 + 5.5448E-02 1.1809E+00 1.0351E+00 1.2475E+00 4.8605E-02 8.1497E+01 9.9839E+01 1.0000E+00 + 4.0924E-02 1.3509E+00 1.2908E+00 1.6325E+00 2.3748E-02 6.8064E+01 1.2847E+02 1.0000E+00 + 5.6980E-02 1.1786E+00 1.0455E+00 1.2587E+00 4.9794E-02 7.6622E+01 1.0448E+02 1.0000E+00 + 7.5606E-02 1.0437E+00 1.0094E+00 1.0839E+00 7.1304E-02 8.4150E+01 9.7622E+01 1.0000E+00 + 4.9209E-02 1.1545E+00 1.0562E+00 1.2517E+00 4.1851E-02 7.5257E+01 1.0832E+02 1.0000E+00 + 9.4306E-02 1.4134E+00 1.2471E+00 1.9288E+00 5.5396E-02 6.7742E+01 1.2240E+02 1.0000E+00 + 8.0612E-02 1.5995E+00 1.3954E+00 2.1160E+00 4.7195E-02 5.5671E+01 1.2928E+02 1.0000E+00 + 1.7381E-01 1.5309E+00 1.1932E+00 1.9889E+00 1.0723E-01 6.6842E+01 1.1844E+02 1.0000E+00 + 1.2743E-01 1.1641E+00 1.0759E+00 1.5054E+00 1.0132E-01 7.8414E+01 1.0116E+02 1.0000E+00 + 2.5147E-01 1.1771E+00 1.1511E+00 1.3931E+00 2.0854E-01 6.4574E+01 1.1352E+02 1.0000E+00 + 1.8631E-01 1.1936E+00 1.0379E+00 1.2994E+00 1.5331E-01 7.9097E+01 1.0038E+02 1.0000E+00 + 6.8560E-02 1.5343E+00 1.4611E+00 1.9374E+00 4.3613E-02 5.2134E+01 1.3143E+02 1.0000E+00 + 4.4078E-02 1.1162E+00 1.0197E+00 1.2113E+00 3.6737E-02 8.1765E+01 1.0101E+02 1.0000E+00 + 8.0112E-02 1.4609E+00 1.3862E+00 2.0529E+00 4.5771E-02 6.0753E+01 1.2756E+02 1.0000E+00 + 2.1604E-01 1.2325E+00 1.1457E+00 1.3803E+00 1.5230E-01 7.5127E+01 1.1907E+02 1.0000E+00 + 2.0052E-01 1.1773E+00 1.0483E+00 1.3270E+00 1.6654E-01 7.6639E+01 1.0628E+02 1.0000E+00 + 3.0416E-01 1.0312E+00 1.0053E+00 1.0871E+00 2.9353E-01 8.6011E+01 9.3402E+01 1.0000E+00 + 4.5933E-02 1.0979E+00 1.0505E+00 1.1780E+00 3.8186E-02 8.1806E+01 1.0779E+02 1.0000E+00 + 8.3556E-02 1.4654E+00 1.2876E+00 2.0107E+00 5.2793E-02 6.1037E+01 1.2217E+02 1.0000E+00 + 8.6107E-02 1.5884E+00 1.4356E+00 2.2223E+00 4.6773E-02 5.7315E+01 1.3004E+02 1.0000E+00 + 2.4558E-01 1.2609E+00 1.1178E+00 1.4307E+00 1.8519E-01 7.0484E+01 1.1578E+02 1.0000E+00 + 3.1035E-01 1.2740E+00 1.1384E+00 1.4326E+00 2.4792E-01 6.2161E+01 1.1433E+02 1.0000E+00 + 3.4353E-01 1.6245E+00 1.3880E+00 2.0912E+00 2.0140E-01 5.5268E+01 1.2989E+02 1.0000E+00 + 1.8101E-01 1.9315E+00 1.7039E+00 3.0816E+00 4.8030E-02 3.9007E+01 1.3317E+02 1.0000E+00 + 3.4971E-01 1.4424E+00 1.4012E+00 2.1893E+00 2.0893E-01 5.6236E+01 1.1844E+02 1.0000E+00 + 2.5427E-01 1.1405E+00 1.0558E+00 1.3328E+00 2.1787E-01 7.4855E+01 9.9420E+01 1.0000E+00 + 2.2832E-01 1.0888E+00 1.0195E+00 1.1552E+00 2.2631E-01 8.1995E+01 9.7819E+01 1.0000E+00 + 6.8525E-02 1.6332E+00 1.3343E+00 2.4133E+00 3.4613E-02 6.3575E+01 1.2540E+02 1.0000E+00 + 1.9080E-01 1.1956E+00 1.0587E+00 1.2837E+00 1.5363E-01 7.7495E+01 1.0917E+02 1.0000E+00 + 2.4100E-01 1.2315E+00 1.2290E+00 1.4804E+00 1.4995E-01 7.3440E+01 1.2473E+02 1.0000E+00 + 3.1107E-01 1.5284E+00 1.4906E+00 2.1311E+00 1.7065E-01 5.6601E+01 1.3177E+02 1.0000E+00 + 1.6882E-01 1.0837E+00 1.0162E+00 1.1733E+00 1.4499E-01 8.3910E+01 1.0012E+02 1.0000E+00 + 3.1828E-01 1.4880E+00 1.3963E+00 2.0564E+00 1.8513E-01 5.8808E+01 1.2811E+02 1.0000E+00 + 1.7272E-01 1.0899E+00 1.0476E+00 1.1589E+00 1.4587E-01 8.1514E+01 1.0731E+02 1.0000E+00 + 3.1548E-01 1.4938E+00 1.3101E+00 2.0729E+00 1.8793E-01 6.1469E+01 1.2405E+02 1.0000E+00 + 3.2437E-01 1.5751E+00 1.3815E+00 2.1594E+00 1.7995E-01 5.8787E+01 1.2864E+02 1.0000E+00 + 3.1562E-01 1.5519E+00 1.3600E+00 1.9746E+00 1.9876E-01 5.5438E+01 1.2814E+02 1.0000E+00 + 1.9022E-01 1.1409E+00 1.0314E+00 1.2608E+00 1.5999E-01 8.4252E+01 1.0274E+02 1.0000E+00 + 3.8873E-01 1.5644E+00 1.4112E+00 2.3590E+00 1.8441E-01 6.4626E+01 1.2912E+02 1.0000E+00 + 2.1937E-01 1.0588E+00 1.0078E+00 1.1202E+00 2.0202E-01 8.3038E+01 9.2469E+01 1.0000E+00 + 3.0237E-01 1.3067E+00 1.1266E+00 1.5939E+00 2.0922E-01 6.3165E+01 1.0596E+02 1.0000E+00 + 3.9513E-01 1.4796E+00 1.1716E+00 1.9600E+00 2.4663E-01 6.2174E+01 1.1150E+02 1.0000E+00 + 2.1526E-01 1.7066E+00 1.7707E+00 2.5347E+00 5.4011E-02 4.9247E+01 1.4519E+02 1.0000E+00 + 2.9864E-01 1.4074E+00 1.3254E+00 1.9054E+00 1.5281E-01 7.0092E+01 1.2877E+02 1.0000E+00 + 7.4219E-02 2.0766E+00 1.5828E+00 2.4195E+00 3.7172E-02 5.3296E+01 1.3334E+02 1.0000E+00 + 1.3751E-01 1.2834E+00 1.2840E+00 1.4441E+00 9.1875E-02 6.4409E+01 1.2803E+02 1.0000E+00 + 1.5527E-01 1.0518E+00 1.0160E+00 1.1019E+00 1.4790E-01 7.9943E+01 9.8171E+01 1.0000E+00 + 2.4412E-01 1.5692E+00 1.5089E+00 2.2231E+00 1.4884E-01 5.0628E+01 1.2744E+02 1.0000E+00 + 1.4318E-01 1.1007E+00 1.0313E+00 1.2715E+00 1.1867E-01 7.8754E+01 9.8110E+01 1.0000E+00 + 2.8840E-01 1.6241E+00 1.5792E+00 2.2107E+00 1.5897E-01 5.1647E+01 1.3445E+02 1.0000E+00 + 3.1087E-01 1.1710E+00 1.0743E+00 1.4255E+00 2.4781E-01 7.2404E+01 1.0378E+02 1.0000E+00 + 1.2378E-01 1.3754E+00 1.2044E+00 1.6873E+00 7.6113E-02 6.9587E+01 1.2284E+02 1.0000E+00 + 2.1332E-01 1.0753E+00 1.0493E+00 1.1876E+00 1.8722E-01 7.7601E+01 1.0615E+02 1.0000E+00 + 2.5455E-01 1.0843E+00 1.0184E+00 1.1491E+00 2.3095E-01 7.9457E+01 9.6163E+01 1.0000E+00 + 1.8711E-01 1.2690E+00 1.2509E+00 1.4191E+00 1.1403E-01 7.2617E+01 1.2692E+02 1.0000E+00 + 2.3637E-01 1.1053E+00 1.0314E+00 1.1591E+00 2.1768E-01 7.6593E+01 1.0271E+02 1.0000E+00 + 2.8605E-01 1.4725E+00 1.3875E+00 2.0092E+00 1.6775E-01 5.9171E+01 1.2820E+02 1.0000E+00 + 1.7131E-01 1.1179E+00 1.0302E+00 1.2361E+00 1.3518E-01 7.9569E+01 1.0391E+02 1.0000E+00 + 2.8016E-01 1.4892E+00 1.3845E+00 2.0172E+00 1.6761E-01 5.8081E+01 1.2789E+02 1.0000E+00 + 2.9762E-01 1.4615E+00 1.3213E+00 1.8889E+00 1.9119E-01 5.8517E+01 1.2592E+02 1.0000E+00 + 3.3062E-01 1.4402E+00 1.2816E+00 1.9448E+00 1.9931E-01 6.3704E+01 1.2389E+02 1.0000E+00 + 1.9984E-01 1.1430E+00 1.0656E+00 1.2551E+00 1.5531E-01 8.0905E+01 1.1019E+02 1.0000E+00 + 2.8110E-01 1.0668E+00 1.0243E+00 1.1569E+00 2.6268E-01 8.1747E+01 1.0043E+02 1.0000E+00 + 2.5334E-01 1.1243E+00 1.0290E+00 1.2343E+00 2.2095E-01 7.7085E+01 1.0003E+02 1.0000E+00 + 1.4551E-01 1.4074E+00 1.1708E+00 1.5717E+00 9.8564E-02 6.8042E+01 1.2051E+02 1.0000E+00 + 1.5813E-01 1.2664E+00 1.2066E+00 1.5254E+00 9.3481E-02 7.6286E+01 1.2376E+02 1.0000E+00 + 2.2306E-01 1.0983E+00 1.0248E+00 1.1248E+00 2.0957E-01 7.8729E+01 1.0144E+02 1.0000E+00 + 2.4527E-01 1.0706E+00 1.0131E+00 1.1498E+00 2.1825E-01 8.0816E+01 9.3429E+01 1.0000E+00 + 1.5653E-01 1.3295E+00 1.1150E+00 1.4769E+00 1.1741E-01 7.1746E+01 1.1342E+02 1.0000E+00 + 2.0922E-01 1.1309E+00 1.0614E+00 1.3388E+00 1.7485E-01 7.6572E+01 1.0554E+02 1.0000E+00 + 2.7538E-01 1.4886E+00 1.3551E+00 2.0206E+00 1.6724E-01 5.8731E+01 1.2641E+02 1.0000E+00 + 1.6898E-01 1.2705E+00 1.0916E+00 1.6100E+00 1.1211E-01 6.8386E+01 1.0752E+02 1.0000E+00 + 2.6030E-01 1.6684E+00 1.4434E+00 2.5051E+00 1.4501E-01 5.5298E+01 1.2608E+02 1.0000E+00 + 3.5806E-01 1.0724E+00 1.0104E+00 1.1535E+00 3.2958E-01 8.2657E+01 9.6337E+01 1.0000E+00 + 2.7631E-01 1.0583E+00 1.0102E+00 1.1144E+00 2.5212E-01 8.1903E+01 9.4040E+01 1.0000E+00 + 3.2583E-01 1.0977E+00 1.0301E+00 1.2288E+00 2.7666E-01 7.6122E+01 9.7517E+01 1.0000E+00 + 2.3888E-01 1.0448E+00 1.0063E+00 1.1190E+00 2.2378E-01 8.6163E+01 9.4655E+01 1.0000E+00 + 1.5824E-01 1.2527E+00 1.0749E+00 1.3620E+00 1.3250E-01 7.7186E+01 1.0598E+02 1.0000E+00 + 2.0334E-01 1.1482E+00 1.1127E+00 1.3149E+00 1.4896E-01 7.8207E+01 1.1550E+02 1.0000E+00 + 6.3836E-02 1.5129E+00 1.6069E+00 2.4050E+00 3.3054E-02 5.6908E+01 1.3051E+02 1.0000E+00 + 8.0620E-02 1.4526E+00 1.6912E+00 1.8575E+00 3.7624E-02 5.8610E+01 1.4148E+02 1.0000E+00 + 2.6460E-02 1.3109E+00 1.1136E+00 1.4038E+00 2.1536E-02 6.9415E+01 1.1212E+02 1.0000E+00 + 7.1191E-02 1.3621E+00 1.4189E+00 1.7407E+00 3.5885E-02 7.3208E+01 1.3388E+02 1.0000E+00 + 1.0129E-01 1.5978E+00 1.5512E+00 1.8549E+00 5.4959E-02 5.3229E+01 1.3845E+02 1.0000E+00 + 4.6938E-02 1.2074E+00 1.1039E+00 1.4101E+00 3.7817E-02 6.5117E+01 1.0624E+02 1.0000E+00 + 6.8197E-02 1.4442E+00 1.2997E+00 1.9834E+00 4.1563E-02 5.4452E+01 1.1531E+02 1.0000E+00 + 3.5537E-02 1.3946E+00 1.5022E+00 1.8646E+00 1.9046E-02 6.0846E+01 1.3423E+02 1.0000E+00 + 5.4344E-02 1.0780E+00 1.0174E+00 1.1464E+00 5.0625E-02 8.0240E+01 9.9729E+01 1.0000E+00 + 2.3421E-02 1.6618E+00 1.7001E+00 2.3173E+00 1.2047E-02 5.0206E+01 1.3734E+02 1.0000E+00 + 1.7415E-02 1.5151E+00 1.4741E+00 2.0683E+00 1.0646E-02 4.8135E+01 1.2330E+02 1.0000E+00 + 1.0776E-02 1.1211E+00 1.0332E+00 1.2919E+00 8.9872E-03 8.0524E+01 9.9358E+01 1.0000E+00 + 9.3734E-02 1.6583E+00 1.5853E+00 2.2567E+00 4.6632E-02 5.3831E+01 1.3640E+02 1.0000E+00 + 6.8982E-02 1.4424E+00 1.3157E+00 1.8964E+00 4.4897E-02 5.3530E+01 1.1956E+02 1.0000E+00 + 4.5870E-02 1.0854E+00 1.0362E+00 1.2211E+00 3.8564E-02 8.2568E+01 1.0404E+02 1.0000E+00 + 1.0489E-01 1.6391E+00 1.4884E+00 2.2819E+00 6.0147E-02 5.2806E+01 1.3040E+02 1.0000E+00 + 5.0021E-02 1.0492E+00 1.0141E+00 1.0947E+00 4.5904E-02 8.5096E+01 9.9513E+01 1.0000E+00 + 1.0467E-01 1.6070E+00 1.4941E+00 2.2834E+00 5.9361E-02 5.3785E+01 1.3008E+02 1.0000E+00 + 5.4274E-02 1.1129E+00 1.0362E+00 1.1792E+00 4.7476E-02 7.9118E+01 1.0509E+02 1.0000E+00 + 5.9212E-02 1.0740E+00 1.0100E+00 1.1515E+00 5.1789E-02 8.2812E+01 9.7215E+01 1.0000E+00 + 5.3227E-02 1.1388E+00 1.0384E+00 1.2035E+00 4.5816E-02 7.9455E+01 1.0562E+02 1.0000E+00 + 2.2755E-02 1.5706E+00 1.3315E+00 2.1313E+00 1.3157E-02 5.9464E+01 1.2630E+02 1.0000E+00 + 1.1224E-02 1.0929E+00 1.0472E+00 1.1795E+00 9.8476E-03 7.9665E+01 1.0663E+02 1.0000E+00 + 2.1513E-02 1.5549E+00 1.3900E+00 2.2278E+00 1.1992E-02 5.9151E+01 1.2708E+02 1.0000E+00 + 4.5685E-02 1.1010E+00 1.0368E+00 1.2189E+00 3.8441E-02 8.1664E+01 1.0472E+02 1.0000E+00 + 9.2426E-02 1.6477E+00 1.5464E+00 2.2669E+00 4.4753E-02 5.6096E+01 1.3562E+02 1.0000E+00 + 6.7812E-02 1.4607E+00 1.2838E+00 1.8835E+00 4.4558E-02 5.4526E+01 1.1967E+02 1.0000E+00 + 2.7559E-01 1.7800E+00 1.6094E+00 2.6955E+00 1.4908E-01 4.9465E+01 1.3050E+02 1.0000E+00 + 1.6576E-01 1.2853E+00 1.0994E+00 1.6076E+00 1.1183E-01 6.5945E+01 1.0378E+02 1.0000E+00 + 2.5168E-01 1.4935E+00 1.4111E+00 1.9455E+00 1.6664E-01 5.1176E+01 1.2572E+02 1.0000E+00 + 3.3626E-01 1.6416E+00 1.4559E+00 2.1593E+00 1.8338E-01 5.4981E+01 1.3259E+02 1.0000E+00 + 2.5637E-01 1.4545E+00 1.2873E+00 1.9396E+00 1.6441E-01 5.5396E+01 1.1839E+02 1.0000E+00 + 1.7698E-01 1.1116E+00 1.0670E+00 1.2797E+00 1.4153E-01 7.9277E+01 1.0902E+02 1.0000E+00 + 3.5057E-01 1.1321E+00 1.0227E+00 1.1824E+00 3.1971E-01 8.1137E+01 9.8212E+01 1.0000E+00 + 2.5488E-01 1.1267E+00 1.0244E+00 1.2221E+00 2.2697E-01 7.9063E+01 9.6687E+01 1.0000E+00 + 2.8710E-01 1.2178E+00 1.0799E+00 1.3520E+00 2.4129E-01 6.9395E+01 1.0928E+02 1.0000E+00 + 1.4955E-01 1.7097E+00 1.2905E+00 2.3184E+00 8.7118E-02 5.9887E+01 1.2210E+02 1.0000E+00 + 1.7308E-01 1.3766E+00 1.2526E+00 1.6390E+00 1.0466E-01 6.7417E+01 1.2640E+02 1.0000E+00 + 9.1971E-02 1.2772E+00 1.1423E+00 1.4036E+00 7.2208E-02 6.1666E+01 1.1151E+02 1.0000E+00 + 7.9238E-02 1.6097E+00 1.4540E+00 2.0385E+00 4.4421E-02 5.4725E+01 1.3333E+02 1.0000E+00 + 7.5057E-02 1.4256E+00 1.2590E+00 2.0637E+00 4.7291E-02 6.4614E+01 1.1791E+02 1.0000E+00 + 5.2189E-02 1.2151E+00 1.0829E+00 1.4983E+00 3.6133E-02 7.3187E+01 1.0876E+02 1.0000E+00 + 8.1133E-02 1.1318E+00 1.0225E+00 1.1891E+00 7.5433E-02 8.2377E+01 9.7583E+01 1.0000E+00 + 5.0371E-02 1.2869E+00 1.3124E+00 1.4850E+00 2.8854E-02 7.2607E+01 1.3022E+02 1.0000E+00 + 2.0441E-02 1.3446E+00 1.0983E+00 1.7301E+00 1.3633E-02 6.8131E+01 1.0773E+02 1.0000E+00 + 4.1817E-03 1.8706E+00 1.7460E+00 2.7441E+00 2.0772E-03 4.2410E+01 1.3122E+02 1.0000E+00 + 6.3705E-02 1.1236E+00 1.0735E+00 1.3850E+00 5.1607E-02 8.0212E+01 1.0547E+02 1.0000E+00 + 3.6089E-02 1.5309E+00 1.5504E+00 1.7056E+00 1.7519E-02 5.9730E+01 1.3977E+02 1.0000E+00 + 1.3896E-02 1.8782E+00 1.6557E+00 2.7324E+00 7.4336E-03 4.6807E+01 1.3306E+02 1.0000E+00 + 9.1967E-03 1.4346E+00 1.4210E+00 1.8730E+00 4.7596E-03 6.3819E+01 1.3305E+02 1.0000E+00 + 1.1213E-02 1.2356E+00 1.2685E+00 1.4008E+00 7.4309E-03 6.7534E+01 1.2726E+02 1.0000E+00 + 1.4813E-02 1.1775E+00 1.0478E+00 1.3482E+00 1.1879E-02 8.0743E+01 1.0385E+02 1.0000E+00 + 1.3398E-02 1.2709E+00 1.1620E+00 1.3160E+00 1.0542E-02 6.6934E+01 1.2052E+02 1.0000E+00 + 5.3806E-02 1.1290E+00 1.0473E+00 1.3262E+00 4.1352E-02 7.9612E+01 1.0607E+02 1.0000E+00 + 1.0395E-02 1.1297E+00 1.0246E+00 1.2356E+00 8.7709E-03 8.2775E+01 1.0094E+02 1.0000E+00 + 1.8961E-02 1.4911E+00 1.4220E+00 2.1110E+00 9.8340E-03 6.2189E+01 1.3041E+02 1.0000E+00 + 1.5527E-02 1.5297E+00 1.3685E+00 1.8651E+00 1.0449E-02 5.3317E+01 1.2865E+02 1.0000E+00 + 7.0831E-02 1.4546E+00 1.4448E+00 1.7743E+00 4.8470E-02 5.2081E+01 1.3075E+02 1.0000E+00 + 3.1474E-02 1.1841E+00 1.2037E+00 1.2531E+00 2.2407E-02 7.1151E+01 1.2381E+02 1.0000E+00 + 8.0080E-02 1.5602E+00 1.6295E+00 2.0720E+00 4.2374E-02 5.2930E+01 1.3727E+02 1.0000E+00 + 4.9806E-02 1.3341E+00 1.3686E+00 1.6214E+00 2.3845E-02 7.1792E+01 1.3301E+02 1.0000E+00 + 2.1298E-01 1.2026E+00 1.1649E+00 1.3172E+00 1.4807E-01 7.4444E+01 1.2085E+02 1.0000E+00 + 2.3975E-01 1.1203E+00 1.0435E+00 1.1755E+00 2.1341E-01 7.3774E+01 1.0225E+02 1.0000E+00 + 7.4139E-02 1.6774E+00 1.8860E+00 1.9934E+00 3.2932E-02 4.9968E+01 1.4634E+02 1.0000E+00 + 2.8378E-02 1.2855E+00 1.1295E+00 1.4306E+00 2.4578E-02 6.4934E+01 1.1168E+02 1.0000E+00 + 4.1095E-02 1.5046E+00 1.3648E+00 1.9306E+00 2.3455E-02 4.7113E+01 1.1138E+02 1.0000E+00 + 1.9806E-01 1.0410E+00 1.0055E+00 1.0842E+00 1.8480E-01 8.7852E+01 9.5880E+01 1.0000E+00 + 1.9504E-01 1.0407E+00 1.0036E+00 1.0647E+00 1.8772E-01 8.5692E+01 9.3582E+01 1.0000E+00 + 2.1683E-01 1.0557E+00 1.0110E+00 1.1091E+00 2.0836E-01 8.2133E+01 9.5906E+01 1.0000E+00 + 2.0664E-01 1.0494E+00 1.0250E+00 1.1489E+00 1.9327E-01 8.0822E+01 9.9916E+01 1.0000E+00 + 1.3290E-01 1.2506E+00 1.2485E+00 1.4363E+00 8.3644E-02 7.0982E+01 1.2647E+02 1.0000E+00 + 1.1350E-01 1.2039E+00 1.0623E+00 1.4168E+00 1.0773E-01 8.3819E+01 9.3925E+01 1.0000E+00 + 9.0249E-02 1.1760E+00 1.0499E+00 1.3189E+00 7.5782E-02 8.1579E+01 1.0540E+02 1.0000E+00 + 5.2108E-02 1.3040E+00 1.2419E+00 1.5654E+00 2.9604E-02 7.4826E+01 1.2618E+02 1.0000E+00 + 4.5803E-02 1.4401E+00 1.1822E+00 1.8388E+00 2.7770E-02 6.9587E+01 1.2036E+02 1.0000E+00 + 3.7696E-02 1.3396E+00 1.2811E+00 1.6210E+00 2.0565E-02 7.2756E+01 1.2844E+02 1.0000E+00 + 3.5401E-02 1.3346E+00 1.1270E+00 1.4530E+00 2.7846E-02 6.8301E+01 1.1414E+02 1.0000E+00 + 3.1126E-02 1.4567E+00 1.4436E+00 2.4630E+00 1.4803E-02 5.8709E+01 1.1778E+02 1.0000E+00 + 2.9328E-02 1.4047E+00 1.2925E+00 2.2255E+00 1.5118E-02 6.5565E+01 1.2030E+02 1.0000E+00 + 2.8517E-02 1.2575E+00 1.1311E+00 1.4303E+00 2.2733E-02 6.2641E+01 1.1341E+02 1.0000E+00 + 3.5299E-02 1.2710E+00 1.1416E+00 1.6198E+00 2.0576E-02 6.9154E+01 1.1812E+02 1.0000E+00 + 7.6100E-02 1.1827E+00 1.0562E+00 1.4076E+00 5.7159E-02 7.1704E+01 1.0029E+02 1.0000E+00 + 1.3200E-01 1.1573E+00 1.0358E+00 1.2939E+00 1.0529E-01 7.5285E+01 9.8724E+01 1.0000E+00 + 1.4162E-01 1.2889E+00 1.1815E+00 1.5351E+00 9.8006E-02 6.8340E+01 1.2063E+02 1.0000E+00 + 2.0263E-01 1.4187E+00 1.1684E+00 1.6769E+00 1.2551E-01 7.1076E+01 1.2093E+02 1.0000E+00 + 2.4142E-01 1.2880E+00 1.1063E+00 1.4978E+00 1.8772E-01 6.6696E+01 1.0524E+02 1.0000E+00 + 9.4577E-02 1.5575E+00 1.2916E+00 1.7154E+00 6.9108E-02 6.0104E+01 1.2406E+02 1.0000E+00 + 7.3867E-02 1.4896E+00 1.2236E+00 1.9053E+00 5.9919E-02 7.3041E+01 1.0276E+02 1.0000E+00 + 1.2540E-01 1.2694E+00 1.2215E+00 1.7316E+00 8.8498E-02 7.6738E+01 1.1630E+02 1.0000E+00 + 1.7612E-01 1.1654E+00 1.1008E+00 1.3144E+00 1.4778E-01 7.5844E+01 1.1254E+02 1.0000E+00 + 1.7027E-01 1.1835E+00 1.1792E+00 1.7148E+00 1.3031E-01 7.6756E+01 1.0299E+02 1.0000E+00 + 8.2249E-02 1.7648E+00 1.3926E+00 1.9771E+00 5.6394E-02 5.4299E+01 1.2574E+02 1.0000E+00 + 6.0244E-02 1.6140E+00 1.3425E+00 2.2403E+00 3.2856E-02 6.0232E+01 1.2687E+02 1.0000E+00 + 1.2015E-01 1.6584E+00 1.3521E+00 2.1601E+00 4.7546E-02 5.4802E+01 1.3127E+02 1.0000E+00 + 1.7411E-01 1.1517E+00 1.0409E+00 1.3281E+00 1.5643E-01 8.5361E+01 9.6951E+01 1.0000E+00 + 2.2268E-01 1.1409E+00 1.0272E+00 1.2605E+00 1.9389E-01 7.9067E+01 9.5383E+01 1.0000E+00 + 1.2304E-01 1.3018E+00 1.5046E+00 2.3367E+00 6.5951E-02 6.9678E+01 1.1979E+02 1.0000E+00 + 1.5809E-01 1.2704E+00 1.1001E+00 1.5565E+00 1.2717E-01 7.6961E+01 1.0043E+02 1.0000E+00 + 1.1146E-01 1.7005E+00 1.5048E+00 2.5433E+00 4.5978E-02 4.3311E+01 1.1306E+02 1.0000E+00 + 5.6247E-02 1.9066E+00 1.4685E+00 2.0297E+00 3.6441E-02 5.6431E+01 1.2515E+02 1.0000E+00 + 1.1904E-01 1.9409E+00 1.5444E+00 2.8073E+00 5.0815E-02 4.3209E+01 1.2283E+02 1.0000E+00 + 1.5240E-01 1.7176E+00 3.5091E+00 4.3368E+00 5.4231E-02 4.9716E+01 1.3940E+02 1.0000E+00 + 1.6710E-01 1.1976E+00 1.1657E+00 1.6236E+00 1.2892E-01 7.0561E+01 1.0614E+02 1.0000E+00 + 1.4668E-01 1.3166E+00 1.4372E+00 2.4161E+00 8.2935E-02 6.8771E+01 1.0919E+02 1.0000E+00 + 1.0060E-01 1.5550E+00 1.6999E+00 2.8965E+00 6.0399E-02 6.1523E+01 1.0754E+02 1.0000E+00 + 1.6644E-01 1.9534E+00 1.7347E+00 2.1595E+00 7.3062E-02 4.8998E+01 1.4443E+02 1.0000E+00 + 1.2693E-01 1.1070E+00 1.0817E+00 1.4059E+00 1.0287E-01 7.8737E+01 1.0385E+02 1.0000E+00 + 5.9358E-02 1.1591E+00 1.1358E+00 1.5034E+00 4.6507E-02 7.1955E+01 1.0979E+02 1.0000E+00 + 2.5095E-02 1.3288E+00 1.5646E+00 1.3747E+00 1.3678E-02 6.2430E+01 1.4024E+02 1.0000E+00 + 1.9612E-02 1.9152E+00 1.8154E+00 3.2746E+00 9.2559E-03 5.2039E+01 1.1992E+02 1.0000E+00 + 4.8760E-02 1.2424E+00 1.1098E+00 1.6637E+00 3.4836E-02 7.2495E+01 1.0401E+02 1.0000E+00 + 1.7272E-02 1.8415E+00 1.4474E+00 2.2765E+00 9.2376E-03 4.7148E+01 1.2226E+02 1.0000E+00 + 2.8440E-03 2.1668E+00 1.9779E+00 3.5074E+00 1.5053E-03 5.0301E+01 1.1973E+02 1.0000E+00 + 3.2304E-03 1.3186E+00 1.7187E+00 1.7853E+00 1.5087E-03 6.3712E+01 1.4071E+02 1.0000E+00 + 1.0315E-02 2.0135E+00 2.5979E+00 2.5648E+00 2.3777E-03 5.3682E+01 1.5691E+02 1.0000E+00 + 6.3164E-03 1.6013E+00 1.2863E+00 2.0152E+00 3.6825E-03 5.3501E+01 1.1308E+02 1.0000E+00 + 5.4485E-03 1.2186E+00 1.0980E+00 1.3799E+00 4.1280E-03 7.7386E+01 1.1387E+02 1.0000E+00 + 6.1467E-03 1.1276E+00 1.0495E+00 1.1868E+00 5.5939E-03 7.2975E+01 1.0640E+02 1.0000E+00 + 1.0540E-02 2.0024E+00 1.6153E+00 2.8839E+00 4.7819E-03 4.0151E+01 1.2053E+02 1.0000E+00 + 2.0474E-02 1.2999E+00 1.1103E+00 1.5777E+00 1.3213E-02 6.4579E+01 1.0622E+02 1.0000E+00 + 2.4474E-02 1.2674E+00 1.2456E+00 1.6143E+00 1.6081E-02 7.4977E+01 1.2302E+02 1.0000E+00 + 5.7222E-02 1.2081E+00 1.1442E+00 1.6635E+00 4.4667E-02 7.7005E+01 9.8418E+01 1.0000E+00 + 1.0481E-01 1.1721E+00 1.0824E+00 1.4925E+00 7.6732E-02 7.6255E+01 1.0619E+02 1.0000E+00 + 9.5066E-02 1.2152E+00 1.1443E+00 1.4081E+00 7.8922E-02 6.4738E+01 1.1520E+02 1.0000E+00 + 1.1018E-01 1.4018E+00 1.1535E+00 1.7489E+00 7.0224E-02 7.0723E+01 1.1833E+02 1.0000E+00 + 2.9963E-01 1.5667E+00 1.2271E+00 1.8146E+00 2.0005E-01 6.4791E+01 1.1143E+02 1.0000E+00 + 2.0331E-01 1.2018E+00 1.0504E+00 1.3716E+00 1.6202E-01 7.4561E+01 9.8475E+01 1.0000E+00 + 1.6288E-01 1.0705E+00 1.0086E+00 1.1394E+00 1.4659E-01 8.3197E+01 9.4687E+01 1.0000E+00 + 1.5244E-01 1.0960E+00 1.0141E+00 1.1317E+00 1.4155E-01 8.3340E+01 9.7650E+01 1.0000E+00 + 1.5754E-01 1.3090E+00 1.0911E+00 1.6486E+00 1.1593E-01 7.0488E+01 1.0714E+02 1.0000E+00 + 5.9908E-02 1.8819E+00 1.6854E+00 2.2806E+00 3.3550E-02 4.4213E+01 1.3924E+02 1.0000E+00 + 3.5949E-02 1.3777E+00 1.1568E+00 1.5887E+00 2.6602E-02 7.3478E+01 1.1406E+02 1.0000E+00 + 5.6517E-02 2.2058E+00 1.9069E+00 2.6887E+00 1.9438E-02 4.8337E+01 1.4745E+02 1.0000E+00 + 3.6656E-02 1.2634E+00 1.0833E+00 1.4847E+00 3.4041E-02 7.7574E+01 1.0088E+02 1.0000E+00 + 2.8638E-02 1.4635E+00 1.2141E+00 1.6746E+00 2.0059E-02 5.8254E+01 1.1576E+02 1.0000E+00 + 2.6720E-02 1.2884E+00 1.1274E+00 1.4437E+00 2.0880E-02 6.3721E+01 1.1123E+02 1.0000E+00 + 2.3844E-02 1.3772E+00 1.1935E+00 1.6169E+00 1.7833E-02 6.1134E+01 1.2024E+02 1.0000E+00 + 2.3394E-02 1.4926E+00 1.2236E+00 1.7230E+00 1.6028E-02 5.8080E+01 1.1595E+02 1.0000E+00 + 3.9534E-02 1.3333E+00 1.1470E+00 1.8508E+00 2.5293E-02 7.1674E+01 1.1282E+02 1.0000E+00 + 2.8868E-02 1.1611E+00 1.0350E+00 1.3595E+00 2.3097E-02 8.0041E+01 1.0297E+02 1.0000E+00 + 2.0178E-02 1.8317E+00 1.5551E+00 2.1099E+00 9.0110E-03 5.5428E+01 1.3980E+02 1.0000E+00 + 1.3829E-02 1.0831E+00 1.0233E+00 1.1709E+00 1.3158E-02 8.2420E+01 9.9682E+01 1.0000E+00 + 8.9493E-03 1.3837E+00 1.1745E+00 1.7137E+00 6.4040E-03 6.1223E+01 1.1580E+02 1.0000E+00 + 1.0037E-02 1.3040E+00 1.1545E+00 1.7274E+00 5.9419E-03 6.9327E+01 1.1693E+02 1.0000E+00 + 2.6253E-02 1.3268E+00 1.1162E+00 1.7763E+00 1.6225E-02 6.8542E+01 1.1308E+02 1.0000E+00 + 2.5774E-02 1.3990E+00 1.3791E+00 1.7128E+00 1.8751E-02 5.2030E+01 1.2593E+02 1.0000E+00 + 2.2295E-02 1.2591E+00 1.0847E+00 1.5073E+00 1.6231E-02 6.8089E+01 1.0295E+02 1.0000E+00 + 4.4286E-02 1.2409E+00 1.0992E+00 1.5000E+00 2.8909E-02 7.3604E+01 1.1417E+02 1.0000E+00 + 4.7081E-02 1.2318E+00 1.2533E+00 1.5204E+00 3.5978E-02 6.1697E+01 1.2097E+02 1.0000E+00 + 5.3347E-02 1.3396E+00 1.1697E+00 1.7745E+00 3.2727E-02 6.0492E+01 1.0516E+02 1.0000E+00 + 1.1507E-01 1.3217E+00 1.2123E+00 1.4936E+00 7.2284E-02 7.1920E+01 1.2440E+02 1.0000E+00 + 6.8888E-02 1.8586E+00 1.9469E+00 3.2843E+00 3.7561E-02 4.5467E+01 1.1283E+02 1.0000E+00 + 9.8691E-02 1.7534E+00 1.4199E+00 2.2196E+00 6.4170E-02 4.8922E+01 1.2401E+02 1.0000E+00 + 1.9072E-01 1.3792E+00 1.2533E+00 1.7505E+00 1.0180E-01 7.1078E+01 1.2643E+02 1.0000E+00 + 1.3195E-01 1.2046E+00 1.0740E+00 1.2927E+00 1.1169E-01 7.0019E+01 1.0665E+02 1.0000E+00 + 1.0061E-01 1.3980E+00 1.1508E+00 1.6525E+00 7.4610E-02 6.4656E+01 1.1385E+02 1.0000E+00 + 1.0006E-01 1.2252E+00 1.1992E+00 1.4525E+00 6.0734E-02 7.7936E+01 1.2331E+02 1.0000E+00 + 1.9726E-01 1.2558E+00 1.0621E+00 1.4545E+00 1.4438E-01 7.4020E+01 1.0597E+02 1.0000E+00 + 1.8528E-01 1.9303E+00 1.6047E+00 2.6076E+00 6.0455E-02 4.8583E+01 1.3847E+02 1.0000E+00 + 9.7567E-02 1.1978E+00 1.0856E+00 1.4533E+00 7.2371E-02 6.7719E+01 1.0178E+02 1.0000E+00 + 8.7097E-02 1.2604E+00 1.1399E+00 1.3952E+00 6.9207E-02 6.1698E+01 1.1217E+02 1.0000E+00 + 7.8658E-02 1.4196E+00 1.1675E+00 1.7504E+00 5.4958E-02 6.7520E+01 1.0596E+02 1.0000E+00 + 1.7984E-01 1.1356E+00 1.0272E+00 1.2548E+00 1.4619E-01 7.7054E+01 9.8683E+01 1.0000E+00 + 2.1724E-01 1.1882E+00 1.0418E+00 1.3808E+00 1.7413E-01 7.9585E+01 1.0460E+02 1.0000E+00 + 3.0131E-01 1.5753E+00 1.3185E+00 1.8187E+00 1.5721E-01 6.5740E+01 1.3067E+02 1.0000E+00 + 3.0827E-01 1.2732E+00 1.1461E+00 1.6942E+00 2.2271E-01 7.9781E+01 1.1059E+02 1.0000E+00 + 1.2311E-01 1.7681E+00 1.3876E+00 2.2696E+00 6.7241E-02 4.9611E+01 1.2237E+02 1.0000E+00 + 4.2958E-01 1.2603E+00 1.1157E+00 1.5503E+00 3.1551E-01 6.5070E+01 1.0773E+02 1.0000E+00 + 3.7496E-01 1.0488E+00 1.0055E+00 1.1102E+00 3.5061E-01 8.7179E+01 9.4580E+01 1.0000E+00 diff --git a/Documentation/docs/the-control-file.md b/Documentation/docs/the-control-file.md index f3f25ec7..0c66c3c0 100644 --- a/Documentation/docs/the-control-file.md +++ b/Documentation/docs/the-control-file.md @@ -3,37 +3,37 @@ The `MODEL` and the `CONTROL_INPUT` blocks described above are put into a single file called the **control file**, which is finished with a `\end{FILE}` command. An example of a full control file that meshes a model with a circular outer boundary and two inner circular boundaries, and writes out a plot file with spectral element resolution, is shown below. There is also a template control file in the *Examples* directory. -Just some notes: +Just some notes: -1. Blocks do not have to be specified in any order (e.g. the `MODEL` could come first before the `CONTROL_INPUT`. `INNER_BOUNDARIES` could come before `OUTER_BOUNDARY`. Blocks must be defined within their appropriate block however, e.g. `OUTER_BOUNDARY` can only be defined in a `MODEL` block. -2. Keywords within a block can be specified in any order. The only ordering that is important is that within a `CHAIN`, the curves must be specified in order, counter-clockwise. +1. Blocks do not have to be specified in any order e.g. the `MODEL` could come first before the `CONTROL_INPUT` or `INNER_BOUNDARIES` could come before `OUTER_BOUNDARY`. Blocks must be defined within their appropriate block however, e.g. `OUTER_BOUNDARY` can only be defined in a `MODEL` block. +2. Keywords within a block can be specified in any order. The only ordering that is important is that within a `CHAIN`, the curves must be specified in order, counter-clockwise. 3. Spaces in keywords **are** significant, but not in any other contexts. For instance equals signs are aligned only for visual formatting. 4. Blank lines or lines starting with % are ignored. --- \begin{CONTROL_INPUT} - + \begin{RUN_PARAMETERS} - mesh file name = Circles3Mesh.mesh - plot file name = Circles3Plot.tec - statistics file name = Circles3Stats.txt - mesh file format = ISM - polynomial order = 6 - plot file format = sem + mesh file name = Circles3Mesh.mesh + plot file name = Circles3Plot.tec + stats file name = Circles3Stats.txt + mesh file format = ISM + polynomial order = 6 + plot file format = sem \end{RUN_PARAMETERS} - + \begin{BACKGROUND_GRID} background grid size = [4.0,4.0] \end{BACKGROUND_GRID} - + \begin{SPRING_SMOOTHER} smoothing type = LinearAndCrossbarSpring number of iterations = 20 \end{SPRING_SMOOTHER} - + \end{CONTROL_INPUT} - + \begin{MODEL} \begin{OUTER_BOUNDARY} @@ -46,7 +46,7 @@ Just some notes: \end{OUTER_BOUNDARY} \begin{INNER_BOUNDARIES} - + \begin{CHAIN} name = Boundary 1 \begin{PARAMETRIC_EQUATION_CURVE} @@ -56,7 +56,7 @@ Just some notes: zEqn = z(t) = 0.0 \end{PARAMETRIC_EQUATION_CURVE} \end{CHAIN} - + \begin{CHAIN} name = Boundary 2 \begin{PARAMETRIC_EQUATION_CURVE} @@ -66,7 +66,7 @@ Just some notes: zEqn = z(t) = 0.0 \end{PARAMETRIC_EQUATION_CURVE} \end{CHAIN} - + \begin{CHAIN} name = Boundary 3 \begin{PARAMETRIC_EQUATION_CURVE} From a18f677dfaf6ee33568eb57f8c845bf8ea52f160 Mon Sep 17 00:00:00 2001 From: Andrew Winters Date: Wed, 12 Aug 2026 11:33:46 +0200 Subject: [PATCH 6/7] have the boundary errors output file inherit its name from the stats file name --- Benchmarks/ControlFiles/BlobAdapt.control | 5 ++- .../docs/error-controlled-adaptive-meshing.md | 10 ++++-- .../BoundaryOptimization/BoundaryErrors.f90 | 32 +++++++++++-------- Source/Project/MeshProject.f90 | 17 +--------- 4 files changed, 28 insertions(+), 36 deletions(-) diff --git a/Benchmarks/ControlFiles/BlobAdapt.control b/Benchmarks/ControlFiles/BlobAdapt.control index 516a9ee2..094b5e9a 100644 --- a/Benchmarks/ControlFiles/BlobAdapt.control +++ b/Benchmarks/ControlFiles/BlobAdapt.control @@ -2,9 +2,8 @@ \begin{RUN_PARAMETERS} mesh file name = Benchmarks/MeshFiles/Tests/BlobAdapt.mesh - plot file name = Benchmarks/MeshFiles/Tests/BlobAdapt.tec - stats file name = none - error file name = Benchmarks/MeshFiles/Tests/BlobAdaptErrors.txt + plot file name = Benchmarks/PlotFiles/Tests/BlobAdapt.tec + stats file name = Benchmarks/StatsFiles/Tests/BlobAdapt.txt test file name = Benchmarks/BenchmarkData/BlobAdapt.txt mesh file format = ISM polynomial order = 6 diff --git a/Documentation/docs/error-controlled-adaptive-meshing.md b/Documentation/docs/error-controlled-adaptive-meshing.md index 829442d5..3c36e155 100644 --- a/Documentation/docs/error-controlled-adaptive-meshing.md +++ b/Documentation/docs/error-controlled-adaptive-meshing.md @@ -95,8 +95,12 @@ produces the output: In addition to the usual element quality measures, one sees that the $\mathbb H^1$ error is indeed bounded by the requested tolerance. If there is more than one boundary, they are listed by boundary name. -HOHQMesh can optionally write out the boundary approximation errors to files for plotting and later analysis, whether or not the adaptive procedure is requested. The file can be written prepended with the name of the control file. It contains the integrated $\mathbb L^2$ and $\mathbb H^1$ norms, grouped by chain. To have these files written, include the following key in the [RUN_PARAMETERS](the-control-input.md#RunParameters) block: +HOHQMesh can optionally write out the boundary approximation errors to a file for plotting and later analysis, whether or not the adaptive procedure is requested. If the statistics file key is present in the [RUN_PARAMETERS](the-control-input.md#RunParameters) block, e.g., - error file name = + stats file name = path/desiredFileName.txt -Choose the name to be `none` to turn off printing out the errors, or simply delete the line from the control file. \ No newline at end of file +then the boundary errors will be written to a separate file with the same name appended with `_ErrorNorms`. +It contains the integrated $\mathbb L^2$ and $\mathbb H^1$ norms, grouped by chain. +For the example above the boundary error file would be located in the same `path` as the statistics file +with the name `desiredFileName_ErrorNorms.txt`. +Choose the `stats file name` to be `none` to turn off printing out the errors, or simply delete the line from the control file. \ No newline at end of file diff --git a/Source/BoundaryOptimization/BoundaryErrors.f90 b/Source/BoundaryOptimization/BoundaryErrors.f90 index abc6c035..5e94dd64 100644 --- a/Source/BoundaryOptimization/BoundaryErrors.f90 +++ b/Source/BoundaryOptimization/BoundaryErrors.f90 @@ -197,20 +197,20 @@ SUBROUTINE WriteBoundaryErrors(project) ! ! ---------------------------------------------------------------------------- ! Write the L2 and H1 errors within each segment along each boundary. -! It writes to the path of the error file name appended with the string -! "_Norms" provided in the control file unless that value is "none" or -! not included. -! +! It writes to the path of the stats file name appended with the string +! "_ErrorNorms" provided in the control file unless the value for the +! stats file name is "none" or not included. +! ! The format is: -! -! "Number of boundary curves = " # boundary curves +! +! "Number of boundary curves = " # boundary curves ! For each boundary curve ! Boundary name, # Segments ! For each segment ! t_{start} x_{start} y_{start} t_{end} x_{end} y_{end} L2Error H1Error ! end ! end -! +! ! where ! t_{start} = start parametrization for the segment ! t_{end} = end parametrization for the segment @@ -248,8 +248,12 @@ SUBROUTINE WriteBoundaryErrors(project) REAL(KIND=RP) :: eL2Norm, eH1Norm INTEGER :: normUnit INTEGER :: m, j, c - - IF ( project % runParams % errorFileName == "none" ) RETURN +! +! ---------------------------------------------------------------------- +! If stats are not requested then boundary errors are not written either +! ---------------------------------------------------------------------- +! + IF ( project % runParams % statsFileName == "none" ) RETURN ! ! ------- ! Aliases @@ -263,12 +267,12 @@ SUBROUTINE WriteBoundaryErrors(project) ! Where to write the results ! -------------------------- ! - m = INDEX(STRING = project % runParams % errorFileName, SUBSTRING = ".") + m = INDEX(STRING = project % runParams % statsFileName, SUBSTRING = ".") IF ( m == -1 ) THEN - OPEN(NEWUNIT = normUnit, FILE = project % runParams % errorFileName //"_Norms") + OPEN(NEWUNIT = normUnit, FILE = project % runParams % statsFileName //"_ErrorNorms") ELSE - str = project % runParams % errorFileName - str = str(1:m-1) //"_Norms.txt" + str = project % runParams % statsFileName + str = str(1:m-1) //"_ErrorNorms.txt" OPEN(NEWUNIT = normUnit, FILE = str) END IF ! @@ -289,7 +293,7 @@ SUBROUTINE WriteBoundaryErrors(project) obj => boundaryPolynomials % objectAtIndex(j) CALL castObjToMultiSegmentCurve(obj,boundaryPolynomial) - + WRITE(normUnit,*) TRIM(modelChain % curveName()), ",", boundaryPolynomial % nSegments DO c = 1, boundaryPolynomial % nSegments diff --git a/Source/Project/MeshProject.f90 b/Source/Project/MeshProject.f90 index 903b5c4b..e8482389 100644 --- a/Source/Project/MeshProject.f90 +++ b/Source/Project/MeshProject.f90 @@ -56,7 +56,6 @@ Module MeshProjectClass CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: MESH_FILE_NAME_KEY = "mesh file name" CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: PLOT_FILE_NAME_KEY = "plot file name" CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: STATS_FILE_NAME_KEY = "stats file name" - CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: ERROR_FILE_NAME_KEY = "error file name" CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: MESH_FILE_FORMAT_NAME_KEY = "mesh file format" CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: POLYNOMIAL_ORDER_KEY = "polynomial order" CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH), PARAMETER :: PLOT_FORMAT_KEY = "plot file format" @@ -101,7 +100,6 @@ Module MeshProjectClass CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH) :: MeshFileName CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH) :: plotFileName CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH) :: statsFileName - CHARACTER(LEN=DEFAULT_CHARACTER_LENGTH) :: errorFileName INTEGER :: meshFileFormat INTEGER :: polynomialOrder INTEGER :: plotFileFormat ! = SKELETON_FORMAT OR = SEM_FORMAT @@ -1517,7 +1515,7 @@ SUBROUTINE SetRunParametersBlock( params, controlDict ) poster = "SetRunParametersBlock") params % statsFileName = "none" - msg = "Control file is missing the stats file name. Stats not written." + msg = "Control file is missing the stats file name. Stats and boundary errors not written." CALL SetStringValueFromDictionary(valueToSet = params % statsFileName, & sourceDict = paramsDict, & key = STATS_FILE_NAME_KEY, & @@ -1532,19 +1530,6 @@ SUBROUTINE SetRunParametersBlock( params, controlDict ) errorLevel = FT_ERROR_WARNING, & message = msg, & poster = "SetRunParametersBlock") -! -! -------------------------------------------------------------------------------- -! For now, no warnings or anything for not requesting the errors to be written out -! -------------------------------------------------------------------------------- -! - params % errorFileName = "none" - msg = "Control file is missing the errors file name. Errors not written." - CALL SetStringValueFromDictionary(valueToSet = params % errorFileName, & - sourceDict = paramsDict, & - key = ERROR_FILE_NAME_KEY, & - errorLevel = FT_ERROR_NONE, & - message = msg, & - poster = "SetRunParametersBlock") IF( fileFormat == "Basic" ) THEN params % meshFileFormat = BASIC_MESH_FORMAT From 9f57e390b80dec6055c6b6bcbf112163871caecb Mon Sep 17 00:00:00 2001 From: Andrew Winters Date: Wed, 12 Aug 2026 20:20:35 +0200 Subject: [PATCH 7/7] update warning message text with suggestion --- Source/Project/MeshProject.f90 | 2 +- Source/Project/Model/SMModel.f90 | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/Project/MeshProject.f90 b/Source/Project/MeshProject.f90 index e8482389..49ed63c4 100644 --- a/Source/Project/MeshProject.f90 +++ b/Source/Project/MeshProject.f90 @@ -1515,7 +1515,7 @@ SUBROUTINE SetRunParametersBlock( params, controlDict ) poster = "SetRunParametersBlock") params % statsFileName = "none" - msg = "Control file is missing the stats file name. Stats and boundary errors not written." + msg = "Control file is missing the stats file name. Stats and boundary errors are not written." CALL SetStringValueFromDictionary(valueToSet = params % statsFileName, & sourceDict = paramsDict, & key = STATS_FILE_NAME_KEY, & diff --git a/Source/Project/Model/SMModel.f90 b/Source/Project/Model/SMModel.f90 index 25077e32..2f2132e1 100644 --- a/Source/Project/Model/SMModel.f90 +++ b/Source/Project/Model/SMModel.f90 @@ -64,7 +64,7 @@ Module SMModelClass CHARACTER(LEN=LINE_LENGTH), PARAMETER :: TOPOGRAPHY_BLOCK_KEY = "TOPOGRAPHY" CHARACTER(LEN=LINE_LENGTH), PARAMETER :: H1NORM_KEY = "H1Norm" CHARACTER(LEN=LINE_LENGTH), PARAMETER :: L2NORM_KEY = "L2Norm" - + TYPE ObjectPointerWrapper CLASS(FTObject), POINTER :: object => NULL() END TYPE ObjectPointerWrapper @@ -140,19 +140,19 @@ SUBROUTINE destructModel(self) TYPE(SMModel) :: self CLASS(FTObject), POINTER :: obj INTEGER :: j - + IF ( ASSOCIATED(self % innerBoundariesIterator) ) THEN - CALL releaseFTLinkedListIterator(self % innerBoundariesIterator) + CALL releaseFTLinkedListIterator(self % innerBoundariesIterator) END IF - + IF ( ASSOCIATED(self % interfaceBoundariesIterator) ) THEN - CALL releaseFTLinkedListIterator(self % interfaceBoundariesIterator) + CALL releaseFTLinkedListIterator(self % interfaceBoundariesIterator) END IF - + IF ( ASSOCIATED(self % innerBoundaries) ) THEN - CALL releaseFTLinkedList(self % innerBoundaries) + CALL releaseFTLinkedList(self % innerBoundaries) END IF - + IF ( ASSOCIATED(self % outerBoundary) ) THEN CALL releaseChainedCurveClass(self % outerBoundary) END IF @@ -181,9 +181,9 @@ SUBROUTINE destructModel(self) END IF IF ( ASSOCIATED(self % allChains) ) THEN - DO j = 1, SIZE(self % allChains) + DO j = 1, SIZE(self % allChains) obj => self % allChains(j) % object - CALL release(obj) + CALL release(obj) END DO DEALLOCATE( self % allChains) END IF @@ -623,11 +623,11 @@ SUBROUTINE SetChainOptimizationParameters(curveChain, curveDict) ! Chain breaks are defined by the end of the numbered curve in the chain. Breaks ! are assumed at the end of every segment of the chain. Segments can be connected ! by removing breaks (this is easier than specifying which segments should have -! breaks.) For example, +! breaks.) For example, ! with five curves in the chain, connecting curve 2 and curve ! 3, write ! connect = 2-3 -! and to connect 2 & 3 and 4&5, +! and to connect 2 & 3 and 4 & 5, ! connect = 2-3, 4-5 ! where the separator is a comma. (Spaces are ignored) ! -------------------------------------------------------------------------------