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