def test_ref_coors_iga(self): from sfepy.discrete.iga.domain import IGDomain domain = IGDomain.from_file( op.join(sfepy.data_dir, 'meshes/iga/block2d.iga')) omega = domain.create_region('Omega', 'all') field = Field.from_args('iga', nm.float64, 'scalar', omega, approx_order='iga', poly_space_base='iga') mcoors = field.nurbs.cps conn = field.get_econn('volume', field.region) bbox = domain.eval_mesh.get_bounding_box() ray = nm.linspace(bbox[0, 0], bbox[1, 0], 11) coors = nm.c_[ray, ray] ref_coors, cells, status = gi.get_ref_coors(field, coors, strategy='general', close_limit=0.0, verbose=False) self.report(ref_coors) self.report(cells) self.report(status) ok = nm.all(status == 0) ctx = field.create_basis_context() for ic, cell in enumerate(cells): ctx.iel = cell bf = ctx.evaluate(ref_coors[ic:ic + 1]) cell_coors = mcoors[conn[cell]] coor = nm.dot(bf, cell_coors).ravel() _ok = nm.allclose(coor, coors[ic], atol=1e-14, rtol=0.0) if not _ok: self.report('point %d:' % ic) self.report(' - wrong reference coordinates %s!' % ref_coors[ic]) self.report(' - given point: %s' % coors[ic]) self.report(' - found point: %s' % coor) ok = ok and _ok return ok
def test_ref_coors_iga(self): from sfepy.discrete.iga.domain import IGDomain domain = IGDomain.from_file(op.join(sfepy.data_dir, 'meshes/iga/block2d.iga')) omega = domain.create_region('Omega', 'all') field = Field.from_args('iga', nm.float64, 'scalar', omega, approx_order='iga', poly_space_base='iga') mcoors = field.nurbs.cps conn = field.get_econn('volume', field.region) bbox = domain.eval_mesh.get_bounding_box() ray = nm.linspace(bbox[0, 0], bbox[1, 0], 11) coors = nm.c_[ray, ray] ref_coors, cells, status = gi.get_ref_coors(field, coors, strategy='general', close_limit=0.0, verbose=False) self.report(ref_coors) self.report(cells) self.report(status) ok = nm.all(status == 0) ctx = field.create_basis_context() for ic, cell in enumerate(cells): ctx.iel = cell bf = ctx.evaluate(ref_coors[ic:ic+1]) cell_coors = mcoors[conn[cell]] coor = nm.dot(bf, cell_coors).ravel() _ok = nm.allclose(coor, coors[ic], atol=1e-14, rtol=0.0) if not _ok: self.report('point %d:' % ic) self.report(' - wrong reference coordinates %s!' % ref_coors[ic]) self.report(' - given point: %s' % coors[ic]) self.report(' - found point: %s' % coor) ok = ok and _ok return ok
def from_conf(conf, init_fields=True, init_equations=True, init_solvers=True): if conf.options.get('absolute_mesh_path', False): conf_dir = None else: conf_dir = op.dirname(conf.funmod.__file__) functions = Functions.from_conf(conf.functions) if conf.get('filename_mesh') is not None: from sfepy.discrete.fem.domain import FEDomain mesh = Mesh.from_file(conf.filename_mesh, prefix_dir=conf_dir) domain = FEDomain(mesh.name, mesh) if conf.options.get('ulf', False): domain.mesh.coors_act = domain.mesh.coors.copy() elif conf.get('filename_domain') is not None: from sfepy.discrete.iga.domain import IGDomain domain = IGDomain.from_file(conf.filename_domain) else: raise ValueError('missing filename_mesh or filename_domain!') obj = Problem('problem_from_conf', conf=conf, functions=functions, domain=domain, auto_conf=False, auto_solvers=False) obj.set_regions(conf.regions, obj.functions) obj.clear_equations() if init_fields: obj.set_fields(conf.fields) if init_equations: obj.set_equations(conf.equations, user={'ts' : obj.ts}) if init_solvers: obj.set_solvers(conf.solvers, conf.options) return obj
def from_conf(conf, init_fields=True, init_equations=True, init_solvers=True): if conf.options.get('absolute_mesh_path', False): conf_dir = None else: conf_dir = op.dirname(conf.funmod.__file__) functions = Functions.from_conf(conf.functions) if conf.get('filename_mesh') is not None: from sfepy.discrete.fem.domain import FEDomain mesh = Mesh.from_file(conf.filename_mesh, prefix_dir=conf_dir) domain = FEDomain(mesh.name, mesh) if conf.options.get('ulf', False): domain.mesh.coors_act = domain.mesh.coors.copy() elif conf.get('filename_domain') is not None: from sfepy.discrete.iga.domain import IGDomain domain = IGDomain.from_file(conf.filename_domain) else: raise ValueError('missing filename_mesh or filename_domain!') obj = Problem('problem_from_conf', conf=conf, functions=functions, domain=domain, auto_conf=False, auto_solvers=False) obj.set_regions(conf.regions, obj.functions) obj.clear_equations() if init_fields: obj.set_fields(conf.fields) if init_equations: obj.set_equations(conf.equations, user={'ts' : obj.ts}) if init_solvers: obj.set_solvers(conf.solvers, conf.options) return obj
def main(): parser = ArgumentParser(description=__doc__.rstrip(), formatter_class=RawDescriptionHelpFormatter) parser.add_argument('-o', '--output-dir', default='.', help=helps['output_dir']) parser.add_argument('--R1', metavar='R1', action='store', dest='R1', default='0.5', help=helps['R1']) parser.add_argument('--R2', metavar='R2', action='store', dest='R2', default='1.0', help=helps['R2']) parser.add_argument('--C1', metavar='C1', action='store', dest='C1', default='0.0,0.0', help=helps['C1']) parser.add_argument('--C2', metavar='C2', action='store', dest='C2', default='0.0,0.0', help=helps['C2']) parser.add_argument('--order', metavar='int', type=int, action='store', dest='order', default=2, help=helps['order']) parser.add_argument('-v', '--viewpatch', action='store_true', dest='viewpatch', default=False, help=helps['viewpatch']) options = parser.parse_args() # Creation of the NURBS-patch with igakit R1 = eval(options.R1) R2 = eval(options.R2) C1 = list(eval(options.C1)) C2 = list(eval(options.C2)) order = options.order viewpatch = options.viewpatch create_patch(R1, R2, C1, C2, order=order, viewpatch=viewpatch) # Setting a Domain instance filename_domain = data_dir + '/meshes/iga/concentric_circles.iga' domain = IGDomain.from_file(filename_domain) # Sub-domains omega = domain.create_region('Omega', 'all') Gamma_out = domain.create_region('Gamma_out', 'vertices of set xi01', kind='facet') Gamma_in = domain.create_region('Gamma_in', 'vertices of set xi00', kind='facet') # Field (featuring order elevation) order_increase = order - domain.nurbs.degrees[0] order_increase *= int(order_increase > 0) field = Field.from_args('fu', nm.float64, 'scalar', omega, approx_order='iga', space='H1', poly_space_base='iga') # Variables u = FieldVariable('u', 'unknown', field) # unknown function v = FieldVariable('v', 'test', field, primary_var_name='u') # test function # Integral integral = Integral('i', order=2 * field.approx_order) # Term t = Term.new('dw_laplace( v, u )', integral, omega, v=v, u=u) # Equation eq = Equation('laplace', t) eqs = Equations([eq]) # Boundary Conditions u_in = EssentialBC('u_in', Gamma_in, {'u.all': 7.0}) u_out = EssentialBC('u_out', Gamma_out, {'u.all': 3.0}) # solvers ls = ScipyDirect({}) nls_status = IndexedStruct() nls = Newton({}, lin_solver=ls, status=nls_status) # problem instance pb = Problem('potential', equations=eqs, active_only=True) # Set boundary conditions pb.set_bcs(ebcs=Conditions([u_in, u_out])) # solving pb.set_solver(nls) status = IndexedStruct() state = pb.solve(status=status, save_results=True, verbose=True) # Saving the results to a classic VTK file filename = os.path.join(options.output_dir, 'concentric_circles.vtk') ensure_path(filename) pb.save_state(filename, state)