From 4c5faf3657e7ffbe9402c197335e3a651acff3e4 Mon Sep 17 00:00:00 2001
From: JM Etancelin <jean-matthieu.etancelin@univ-pau.fr>
Date: Mon, 23 Mar 2020 18:11:53 +0100
Subject: [PATCH] update some tests (for ctest)

---
 hysop/operator/tests/test_spectral_curl.py    | 185 ++++++++++--------
 .../tests/test_spectral_derivative.py         |  10 +
 2 files changed, 109 insertions(+), 86 deletions(-)

diff --git a/hysop/operator/tests/test_spectral_curl.py b/hysop/operator/tests/test_spectral_curl.py
index a5dcaf915..577b99734 100644
--- a/hysop/operator/tests/test_spectral_curl.py
+++ b/hysop/operator/tests/test_spectral_curl.py
@@ -1,4 +1,5 @@
-import random, primefac
+import random
+import primefac
 from hysop.deps import it, sm, random
 from hysop.constants import HYSOP_REAL, BoxBoundaryCondition
 from hysop.defaults import VelocityField, VorticityField
@@ -11,18 +12,19 @@ from hysop.tools.io_utils import IO
 from hysop.tools.numpywrappers import npw
 from hysop.tools.sympy_utils import truncate_expr, round_expr
 from hysop.tools.spectral_utils import make_multivariate_trigonometric_polynomial, \
-                                       make_multivariate_polynomial
+    make_multivariate_polynomial
 from hysop.operator.curl import SpectralCurl, Implementation
 from hysop.defaults import VorticityField, VelocityField
 
 from hysop import Field, Box
 
+
 class TestSpectralCurl(object):
 
     @classmethod
     def setup_class(cls,
-            enable_extra_tests=__ENABLE_LONG_TESTS__,
-            enable_debug_mode=False):
+                    enable_extra_tests=__ENABLE_LONG_TESTS__,
+                    enable_debug_mode=False):
 
         IO.set_default_path('/tmp/hysop_tests/test_spectral_curl')
 
@@ -30,53 +32,52 @@ class TestSpectralCurl(object):
         cls.size_max = 16
 
         cls.enable_extra_tests = enable_extra_tests
-        cls.enable_debug_mode  = enable_debug_mode
-        
+        cls.enable_debug_mode = enable_debug_mode
+
         from hysop.tools.sympy_utils import enable_pretty_printing
         enable_pretty_printing()
-    
+
     @classmethod
     def teardown_class(cls):
         pass
 
-
     @classmethod
-    def build_analytic_solutions(cls, polynomial, 
-                                      dim, nb_components,
-                                      lboundaries, rboundaries,
-                                      origin, end):
-        from hysop.symbolic.base  import TensorBase
+    def build_analytic_solutions(cls, polynomial,
+                                 dim, nb_components,
+                                 lboundaries, rboundaries,
+                                 origin, end):
+        from hysop.symbolic.base import TensorBase
         from hysop.symbolic.frame import SymbolicFrame
         from hysop.symbolic.field import laplacian, curl
 
-        assert len(lboundaries)==nb_components
-        assert len(rboundaries)==nb_components
-        
-        frame  = SymbolicFrame(dim=dim)
+        assert len(lboundaries) == nb_components
+        assert len(rboundaries) == nb_components
+
+        frame = SymbolicFrame(dim=dim)
         coords = frame.coords
-                
+
         def gen_Fin():
             Fins = ()
             for i in xrange(nb_components):
                 if polynomial:
                     fin, y = make_multivariate_polynomial(origin, end,
-                                                        lboundaries[i], rboundaries[i], 
-                                                        10, 4)
+                                                          lboundaries[i], rboundaries[i],
+                                                          10, 4)
                 else:
                     fin, y = make_multivariate_trigonometric_polynomial(origin, end,
-                            lboundaries[i], rboundaries[i], 2)
-                fin = fin.xreplace({yi: xi for (yi,xi) in zip(y, coords)})
+                                                                        lboundaries[i], rboundaries[i], 2)
+                fin = fin.xreplace({yi: xi for (yi, xi) in zip(y, coords)})
                 Fins += (fin,)
             return npw.asarray(Fins).view(TensorBase)
-        
-        Fins  = gen_Fin()
+
+        Fins = gen_Fin()
         Fouts = npw.atleast_1d(curl(Fins, frame))
 
-        fFins  = tuple(sm.lambdify(coords, Fin) for Fin in Fins)
+        fFins = tuple(sm.lambdify(coords, Fin) for Fin in Fins)
         fFouts = tuple(sm.lambdify(coords, Fout) for Fout in Fouts)
 
-        analytic_expressions = {'Fin':Fins,  'Fout':Fouts}
-        analytic_functions   = {'Fin':fFins, 'Fout':fFouts}
+        analytic_expressions = {'Fin': Fins,  'Fout': Fouts}
+        analytic_functions = {'Fin': fFins, 'Fout': fFouts}
         return (analytic_expressions, analytic_functions)
 
     @staticmethod
@@ -93,20 +94,20 @@ class TestSpectralCurl(object):
         data[...] = npw.asarray(fn(*coords)).astype(dtype)
 
     def _test(self, dim, dtype, nb_components, max_runs=5,
-            polynomial=False, size_min=None, size_max=None):
+              polynomial=False, size_min=None, size_max=None):
         enable_extra_tests = self.enable_extra_tests
 
         size_min = first_not_None(size_min, self.size_min)
         size_max = first_not_None(size_max, self.size_max)
 
-        valid_factors = {2,3,5,7,11,13}
+        valid_factors = {2, 3, 5, 7, 11, 13}
         factors = {1}
         while (factors-valid_factors):
             factors.clear()
             shape = tuple(npw.random.randint(low=size_min, high=size_max+1, size=dim).tolist())
             for Si in shape:
-                factors.update( set(primefac.primefac(int(Si))) )
-        
+                factors.update(set(primefac.primefac(int(Si))))
+
         domain_boundaries = list(domain_boundary_iterator(dim=dim))
         periodic = domain_boundaries[0]
         domain_boundaries = domain_boundaries[1:]
@@ -114,51 +115,53 @@ class TestSpectralCurl(object):
         domain_boundaries.insert(0, periodic)
 
         for i, (lboundaries, rboundaries) in enumerate(domain_boundaries, 1):
-            
+
             domain = Box(origin=(npw.random.rand(dim)-0.5),
                          length=(0.5+npw.random.rand(dim)*2*npw.pi),
-                            lboundaries=lboundaries,
-                            rboundaries=rboundaries)
-            
-            if (dim==nb_components):
-                Fin  = VelocityField(name='Fin', domain=domain)
+                         lboundaries=lboundaries,
+                         rboundaries=rboundaries)
+
+            if (dim == nb_components):
+                Fin = VelocityField(name='Fin', domain=domain)
                 Fout = VorticityField(name='Fout', velocity=Fin)
             else:
-                Fin  = Field(name='Fin', domain=domain, dtype=dtype, nb_components=nb_components)
+                Fin = Field(name='Fin', domain=domain, dtype=dtype, nb_components=nb_components)
                 Fout = Fin.curl(name='Fout')
 
-            self._test_one(shape=shape, dim=dim, dtype=dtype, 
-                    domain=domain, Fin=Fin, Fout=Fout, polynomial=polynomial)
-            if (max_runs is not None) and (i==max_runs):
+            self._test_one(shape=shape, dim=dim, dtype=dtype,
+                           domain=domain, Fin=Fin, Fout=Fout, polynomial=polynomial)
+            if (max_runs is not None) and (i == max_runs):
                 missing = ((4**(dim+1) - 1) / 3) - i
                 print
-                print '>> MAX RUNS ACHIEVED FOR {}D DOMAINS -- SKIPING {} OTHER BOUNDARY CONDITIONS <<'.format(dim, missing)
+                print '>> MAX RUNS ACHIEVED FOR {}D DOMAINS -- SKIPING {} OTHER BOUNDARY CONDITIONS <<'.format(
+                    dim, missing)
                 print
                 print
                 break
         else:
-            assert (i==(4**(dim+1)-1)/3), (i+1, (4**(dim+1)-1)/3)
+            assert (i == (4**(dim+1)-1)/3), (i+1, (4**(dim+1)-1)/3)
             print
             print '>> TESTED ALL {}D BOUNDARY CONDITIONS <<'.format(dim)
             print
             print
 
     def _test_one(self, shape, dim, dtype,
-            domain, Fout, Fin, polynomial):
-        
+                  domain, Fout, Fin, polynomial):
+
         (analytic_expressions, analytic_functions) = \
             self.build_analytic_solutions(
-                dim=dim, nb_components=Fin.nb_components, polynomial=polynomial, 
-                lboundaries=[fin.lboundaries[::-1] for fin in Fin.fields], # => boundaries in variable order x0,...,xn
+                dim=dim, nb_components=Fin.nb_components, polynomial=polynomial,
+                lboundaries=[fin.lboundaries[::-1]
+                             for fin in Fin.fields],  # => boundaries in variable order x0,...,xn
                 rboundaries=[fin.rboundaries[::-1] for fin in Fin.fields],
                 origin=domain.origin[::-1],
                 end=domain.end[::-1])
-        
+
         def format_expr(e):
             return truncate_expr(round_expr(e, 3), 80)
 
-        msg='\nTesting {}D Curl: dtype={} shape={} polynomial={}, bc=[{}]'.format(
-                dim, dtype.__name__, shape, polynomial, domain.format_boundaries())
+        msg = '\nTesting {}D Curl: dtype={} shape={} polynomial={}, bc=[{}]'.format(
+            dim, dtype.__name__, shape, polynomial, domain.format_boundaries())
         print msg
         print ' >Input analytic field is (truncated):'
         for (fin, fins) in zip(Fin.fields, analytic_expressions['Fin']):
@@ -169,55 +172,55 @@ class TestSpectralCurl(object):
         print ' >Testing all implementations:'
 
         implementations = SpectralCurl.implementations().keys()
-        variables = { Fout:shape, Fin:shape }
+        variables = {Fout: shape, Fin: shape}
 
         def iter_impl(impl):
             base_kwds = dict(Fin=Fin, Fout=Fout, variables=variables,
                              implementation=impl,
                              name='curl_{}'.format(str(impl).lower()))
             if impl is Implementation.PYTHON:
-                msg='   *Python FFTW: '
+                msg = '   *Python FFTW: '
                 print msg,
                 yield SpectralCurl(**base_kwds)
             elif impl is Implementation.OPENCL:
-                msg='   *OpenCl CLFFT: '
+                msg = '   *OpenCl CLFFT: '
                 print msg
                 for cl_env in iter_clenv():
-                    msg='     |platform {}, device {}'.format(cl_env.platform.name.strip(),
-                                                              cl_env.device.name.strip())
+                    msg = '     |platform {}, device {}'.format(cl_env.platform.name.strip(),
+                                                                cl_env.device.name.strip())
                     print msg,
                     yield SpectralCurl(cl_env=cl_env, **base_kwds)
             else:
-                msg='Unknown implementation to test {}.'.format(impl)
+                msg = 'Unknown implementation to test {}.'.format(impl)
                 raise NotImplementedError(msg)
 
         # Compare to analytic solution
         Fout_ref = None
         Fin_ref = None
         for impl in implementations:
-            for (i,op) in enumerate(iter_impl(impl)):
+            for (i, op) in enumerate(iter_impl(impl)):
                 from hysop.tools.debug_dumper import DebugDumper
-                name='{}_{}'.format(impl, i)
+                name = '{}_{}'.format(impl, i)
 
                 op = op.build()
-                
+
                 dFin = op.get_input_discrete_field(Fin).as_contiguous_dfield()
                 dFout = op.get_output_discrete_field(Fout).as_contiguous_dfield()
-                
+
                 dFin.initialize(self.__analytic_init, dtype=dtype,
-                                    fns=analytic_functions['Fin'])
+                                fns=analytic_functions['Fin'])
 
                 if (Fout_ref is None):
                     dFout.initialize(self.__analytic_init, dtype=dtype,
-                                    fns=analytic_functions['Fout'])
-                    Fin_ref = tuple( data.get().handle.copy() for data in dFin.data )
-                    Fout_ref = tuple( data.get().handle.copy() for data in dFout.data )
+                                     fns=analytic_functions['Fout'])
+                    Fin_ref = tuple(data.get().handle.copy() for data in dFin.data)
+                    Fout_ref = tuple(data.get().handle.copy() for data in dFout.data)
                 dFout.initialize(self.__random_init, dtype=dtype)
 
                 op.apply(simulation=None)
 
-                Wout = tuple( data.get().handle.copy() for data in dFin.data )
-                Uout = tuple( data.get().handle.copy() for data in dFout.data )
+                Wout = tuple(data.get().handle.copy() for data in dFin.data)
+                Uout = tuple(data.get().handle.copy() for data in dFout.data)
                 self._check_output(impl, op, Fin_ref, Fout_ref, Wout, Uout)
                 print
 
@@ -229,9 +232,9 @@ class TestSpectralCurl(object):
         check_instance(Uout, tuple, values=npw.ndarray, size=len(Fout_ref))
 
         msg0 = 'Reference field {} is not finite.'
-        for (fields, name) in zip((Fin_ref, Fout_ref),('Fin_ref', 'Fout_ref')):
-            for (i,field) in enumerate(fields):
-                iname = '{}{}'.format(name,i)
+        for (fields, name) in zip((Fin_ref, Fout_ref), ('Fin_ref', 'Fout_ref')):
+            for (i, field) in enumerate(fields):
+                iname = '{}{}'.format(name, i)
                 mask = npw.isfinite(field)
                 if not mask.all():
                     print
@@ -243,8 +246,8 @@ class TestSpectralCurl(object):
                     raise ValueError(msg)
 
         for (out_buffers, ref_buffers, name) in zip((Wout, Uout), (Fin_ref, Fout_ref), ('Fin', 'Fout')):
-            for i, (fout,fref) in enumerate(zip(out_buffers, ref_buffers)):
-                iname = '{}{}'.format(name,i)
+            for i, (fout, fref) in enumerate(zip(out_buffers, ref_buffers)):
+                iname = '{}{}'.format(name, i)
                 assert fout.dtype == fref.dtype, iname
                 assert fout.shape == fref.shape, iname
                 assert not npw.any(npw.isnan(fref))
@@ -257,7 +260,7 @@ class TestSpectralCurl(object):
                 elif has_inf:
                     deps = 'inf'
                 else:
-                    eps  = npw.finfo(fout.dtype).eps
+                    eps = npw.finfo(fout.dtype).eps
                     dist = npw.abs(fout-fref)
                     dinf = npw.max(dist)
                     try:
@@ -277,26 +280,26 @@ class TestSpectralCurl(object):
                 print
                 if cls.enable_debug_mode:
                     print 'REFERENCE INPUTS:'
-                    for (i,w) in enumerate(Fin_ref):
+                    for (i, w) in enumerate(Fin_ref):
                         print 'Fin{}'.format(i)
                         print w
                         print
                     if (name == 'Fout'):
                         print 'REFERENCE OUTPUT:'
-                        for (i,u) in enumerate(Fout_ref):
+                        for (i, u) in enumerate(Fout_ref):
                             print 'Fout{}'.format(i)
                             print u
                             print
                         print
                         print 'OPERATOR {} OUTPUT:'.format(op.name.upper())
                         print
-                        for (i,u) in enumerate(Uout):
+                        for (i, u) in enumerate(Uout):
                             print 'Fout{}'.format(i)
                             print u
                             print
                     else:
                         print 'MODIFIED INPUTS:'
-                        for (i,w) in enumerate(Wout):
+                        for (i, w) in enumerate(Wout):
                             print 'Fin{}'.format(i)
                             print w
                             print
@@ -306,34 +309,44 @@ class TestSpectralCurl(object):
                 msg = msg.format(name, i, impl)
                 raise RuntimeError(msg)
 
-
     def test_2d_float32__1(self, **kwds):
-        self._test(dim=2, dtype=npw.float32, nb_components=1, **kwds)
+        if HYSOP_REAL == npw.float32:
+            self._test(dim=2, dtype=npw.float32, nb_components=1, **kwds)
+
     def test_2d_float32__2(self, **kwds):
-        self._test(dim=2, dtype=npw.float32, nb_components=2, **kwds)
+        if HYSOP_REAL == npw.float32:
+            self._test(dim=2, dtype=npw.float32, nb_components=2, **kwds)
+
     def test_3d_float32(self, **kwds):
-        self._test(dim=3, dtype=npw.float32, nb_components=3, **kwds)
-    
+        if HYSOP_REAL == npw.float32:
+            self._test(dim=3, dtype=npw.float32, nb_components=3, **kwds)
+
     def test_2d_float64__1(self, **kwds):
-        self._test(dim=2, dtype=npw.float64, nb_components=1, **kwds)
+        if HYSOP_REAL == npw.float64:
+            self._test(dim=2, dtype=npw.float64, nb_components=1, **kwds)
+
     def test_2d_float64__2(self, **kwds):
-        self._test(dim=2, dtype=npw.float64, nb_components=2, **kwds)
+        if HYSOP_REAL == npw.float64:
+            self._test(dim=2, dtype=npw.float64, nb_components=2, **kwds)
+
     def test_3d_float64(self, **kwds):
-        self._test(dim=3, dtype=npw.float64, nb_components=3, **kwds)
+        if HYSOP_REAL == npw.float64:
+            self._test(dim=3, dtype=npw.float64, nb_components=3, **kwds)
 
     def perform_tests(self):
         max_2d_runs = None if __ENABLE_LONG_TESTS__ else 2
         max_3d_runs = None if __ENABLE_LONG_TESTS__ else 2
 
-        if __ENABLE_LONG_TESTS__ or (HYSOP_REAL==npw.float32):
+        if __ENABLE_LONG_TESTS__ or (HYSOP_REAL == npw.float32):
             self.test_2d_float32__1(max_runs=max_2d_runs)
             self.test_2d_float32__2(max_runs=max_2d_runs)
             self.test_3d_float32(max_runs=max_3d_runs)
-        if __ENABLE_LONG_TESTS__ or (HYSOP_REAL==npw.float64):
+        if __ENABLE_LONG_TESTS__ or (HYSOP_REAL == npw.float64):
             self.test_2d_float64__1(max_runs=max_2d_runs)
             self.test_2d_float64__2(max_runs=max_2d_runs)
             self.test_3d_float64(max_runs=max_3d_runs)
 
+
 if __name__ == '__main__':
     TestSpectralCurl.setup_class(enable_extra_tests=False,
                                  enable_debug_mode=False)
diff --git a/hysop/operator/tests/test_spectral_derivative.py b/hysop/operator/tests/test_spectral_derivative.py
index 373bf7815..5b3d93075 100644
--- a/hysop/operator/tests/test_spectral_derivative.py
+++ b/hysop/operator/tests/test_spectral_derivative.py
@@ -322,22 +322,28 @@ class TestSpectralDerivative(object):
                 raise RuntimeError(msg)
 
     def test_1d_trigonometric_float32(self, **kwds):
+        kwds.update({'max_derivative': 3})
         self._test(dim=1, dtype=npw.float32, polynomial=False, **kwds)
 
     def test_2d_trigonometric_float32(self, **kwds):
+        kwds.update({'max_derivative': 1, 'max_runs': None})
         self._test(dim=2, dtype=npw.float32, polynomial=False, **kwds)
 
     def test_3d_trigonometric_float32(self, **kwds):
+        kwds.update({'max_derivative': 1, 'max_runs': 5})
         if __ENABLE_LONG_TESTS__:
             self._test(dim=3, dtype=npw.float32, polynomial=False, **kwds)
 
     def test_1d_trigonometric_float64(self, **kwds):
+        kwds.update({'max_derivative': 3})
         self._test(dim=1, dtype=npw.float64, polynomial=False, **kwds)
 
     def test_2d_trigonometric_float64(self, **kwds):
+        kwds.update({'max_derivative': 1, 'max_runs': None})
         self._test(dim=2, dtype=npw.float64, polynomial=False, **kwds)
 
     def test_3d_trigonometric_float64(self, **kwds):
+        kwds.update({'max_derivative': 1, 'max_runs': 5})
         if __ENABLE_LONG_TESTS__:
             self._test(dim=3, dtype=npw.float64, polynomial=False, **kwds)
 
@@ -348,6 +354,7 @@ class TestSpectralDerivative(object):
         self._test(dim=2, dtype=npw.float32, polynomial=True, **kwds)
 
     def test_3d_polynomial_float32(self, **kwds):
+        kwds.update({'max_derivative': 1})
         if __ENABLE_LONG_TESTS__:
             self._test(dim=3, dtype=npw.float32, polynomial=True, **kwds)
 
@@ -355,6 +362,9 @@ class TestSpectralDerivative(object):
         self.test_1d_trigonometric_float32(max_derivative=3)
         self.test_2d_trigonometric_float32(max_derivative=1, max_runs=None)
         self.test_3d_trigonometric_float32(max_derivative=1, max_runs=5)
+        self.test_1d_trigonometric_float64(max_derivative=3)
+        self.test_2d_trigonometric_float64(max_derivative=1, max_runs=None)
+        self.test_3d_trigonometric_float64(max_derivative=1, max_runs=5)
 
         if __ENABLE_LONG_TESTS__:
             # self.test_1d_trigonometric_float64(max_derivative=3)
-- 
GitLab