Compadre 1.5.5
Loading...
Searching...
No Matches
GMLS_Manifold.py.in
Go to the documentation of this file.
1import subprocess
2import os
3import re
4import math
5import sys
6import argparse
7
8parser = argparse.ArgumentParser(description='convert files by adding cell centroids and ID (for cubed-sphere)')
9parser.add_argument('--porder', dest='porder', type=int, default=3, help='polynomial degree for basis')
10parser.add_argument('--grids', dest='grids', type=int, default=2, help='number of grids for refinement sequence')
11parser.add_argument('--solver-type', dest='solver_type', type=str, default='QR', help='solver type {QR,LU}')
12parser.add_argument('--in-trilinos', dest='in_trilinos', type=str, default='false', help='whether being called from inside of Trilinos')
13args = parser.parse_args()
14
15def check_bounds(porder, rate):
16 if (porder=="1"):
17 if rate<3 and rate>.9:
18 return True
19 else:
20 return False
21 else:
22 if rate>float(porder)-1.2:
23 return True
24 else:
25 return False
26
27num_target_sites = 100
28porder = args.porder
29grids = args.grids
30solver_type = args.solver_type
31
32errors = []
33
34target_operators=("Tangent Bundle", "Point Value", "Laplace-Beltrami", "Gaussian Curvature", "Surface Gradient \‍(Ambient\‍)", "Surface Vector \‍(VectorBasis\‍)", "Surface Divergence \‍(VectorBasis\‍)", "Surface Vector \‍(ScalarClones\‍)", "Surface Divergence \‍(ScalarClones\‍)")#, "Surface Gradient (Manifold)",
35for operator in target_operators:
36 errors.append([])
37
38for grid_num in range(grids):
39 with open(os.devnull, 'w') as devnull:
40 exe_name=""
41 if args.in_trilinos.lower()=="true":
42 exe_name = "@CMAKE_CURRENT_BINARY_DIR@/Compadre_GMLS_Manifold_Test.exe"
43 else:
44 exe_name = "@CMAKE_CURRENT_BINARY_DIR@/GMLS_Manifold_Test"
45 output_commands = [exe_name,"--p","%d"%porder,"--nt","%d"%num_target_sites,"--d","3","--ns","%d"%(20*num_target_sites*pow(4,grid_num)),"--solver",str(solver_type),"--problem","MANIFOLD","@KOKKOS_THREADS_ARG@=4"]
46 print(output_commands)
47 output = subprocess.check_output(output_commands, stderr=devnull)
48 #print(output)
49 for key, operator in enumerate(target_operators):
50 m = re.search('(?<=%s Error: )[0-9]+\.?[0-9]*(?:[Ee]\ *-?\ *[0-9]+)?'%operator, output.decode('utf-8'))
51 try:
52 errors[key].append(float(m.group(0)))
53 except:
54 print("Program exited early. Regular expression search for error failed.")
55 exit(-1)
56
57print(errors)
58
59for key, operator in enumerate(target_operators):
60 print("\n\n%s rates: porder:%s\n============="%(operator.replace('\\',''), porder))
61 for i in range(1,len(errors[key])):
62 if (errors[key][i]!=0):
63 rate = math.log(errors[key][i]/errors[key][i-1])/math.log(.5)
64 print(str(rate) + ", " + str(errors[key][i]) + ", " + str(errors[key][i-1]))
65 assert(check_bounds(porder, rate))
66 else:
67 print("NaN - Division by zero")
68
69print("Passed.")
70sys.exit(0)