This selects a single node in an element group. It's useful if, for example, pressure is determined up to a constant, and you want to fix it.

r.

----- Reply message -----
From: "Steve Spicklemire" <s...@spvi.com>
To: <sfep...@googlegroups.com>
Cc: "Steve Spicklemire" <s...@spvi.com>
Subject: Cylindrical coordinates
Date: Sun, Jun 10, 2012 15:14


Do you know.. how do most folks use 'node of group x' syntax?

thanks,
-steve

On Jun 10, 2012, at 7:06 AM, Steve Spicklemire wrote:

> OK.. no prob. I can write equations for each boundary... just thought there might be an easier way. ;-)
>
> -steve
>
> On Jun 10, 2012, at 6:39 AM, Robert Cimrman wrote:
>
>> Hi Steve,
>>
>> I cannotbhelp you much with gmsh - try asking the gmsh authors directly, if it is possible at all to export nodal group ids.
>>
>> r.
>>
>> ----- Reply message -----
>> From: "Steve Spicklemire" <s...@spvi.com>
>> To: <sfep...@googlegroups.com>
>> Cc: "Steve Spicklemire" <s...@spvi.com>
>> Subject: Cylindrical coordinates
>> Date: Sat, Jun 9, 2012 15:01
>>
>>
>> Hi Richard,
>>
>> I don't *think* that's the problem.
>>
>> What follows is a ridiculously long winded explanation of the fact that I don't know how to specify groups of nodes in a .geo file. I've played around with various possibilities (Physical Line, Physical Point, etc.), but none seems to do the trick. My current plan is to start with a .geo template file that my app will render with particular values depending on user-prescribed variables. Once a .geo file is saved on disk, I can run gmsh/mesh_to_vtk.py and then sfepy. Anyway.. sorry for the verbosity.. but here it goes!
>>
>> -------------
>>
>> When I specify the BCs this way (case 1) everything works:
>>
>> regions = {
>>   'Omega' : ('all', {}),
>>   'Omega_Source' : ('nodes in (y<0.15)', {}),
>>   'Omega_Target' : ('nodes in (y>0.25)', {}),
>> }
>>
>> But this is awkward since I'll have some potentially complicated geometries. I'd rather "tag" some surfaces/lines as belonging to a particular group and using the syntax (case 2):
>>
>> regions = {
>>   'Omega' : ('all', {}),
>>   'Omega_Source' : ('nodes of group 1', {}),
>>   'Omega_Target' : ('nodes of group 2', {}),
>> }
>>
>> Where group 1 and group 2 are set up in my original .geo file.
>>
>> (BTW I think the socket api for gmsh is only for connecting a solver or a postprocessor using gmsh as the UI, not for creating meshes from outside applications)
>>
>> Let's say I start with a drastically simple .geo file like so:
>>
>> lc = 0.1;
>>
>> Point(1) = {0, 0, 0, lc};
>> Point(2) = {.1, 0,  0, lc} ;
>> Point(3) = {.1, .3, 0, lc} ;
>> Point(4) = {0,  .3, 0, lc} ;
>>
>> Line(1) = {1,2} ;
>> Line(2) = {3,2} ;
>> Line(3) = {3,4} ;
>> Line(4) = {4,1} ;
>>
>> Line Loop(5) = {4,1,-2,3} ;
>>
>> Plane Surface(6) = {5} ;
>>
>> Physical Point(1) = {1,2} ;
>> Physical Point(2) = {3,4} ;
>>
>> Physical Surface(7) = {6};
>>
>> (I'm hoping that "Physical Point(1)" might correspond to "group 1" in the region definition (case 2) and "Physical Point(2)" may be "group 2". No luck on that I'm afraid.)
>>
>> I use gmsh to convert it to a mesh:
>>
>> aluminum:sfepy steve$ gmsh -2 t1.geo -format mesh
>> Info    : Running 'gmsh -2 t1.geo -format mesh' [1 node(s), max. 1 thread(s)]
>> Info    : Started on Sat Jun  9 06:33:30 2012
>> Info    : Reading 't1.geo'...
>> Info    : Done reading 't1.geo'
>> Info    : Meshing 1D...
>> Info    : Meshing curve 1 (Line)
>> Info    : Meshing curve 2 (Line)
>> Info    : Meshing curve 3 (Line)
>> Info    : Meshing curve 4 (Line)
>> Info    : Done meshing 1D (0.000122 s)
>> Info    : Meshing 2D...
>> Info    : Meshing surface 6 (Plane, MeshAdapt)
>> Info    : Done meshing 2D (0.001485 s)
>> Info    : 6 vertices 14 elements
>> Info    : Writing 't1.mesh'...
>> Info    : Done writing 't1.mesh'
>> Info    : Stopped on Sat Jun  9 06:33:30 2012
>>
>> Now I've got the following, but no hints of group 1 or group 2 ;-(.
>>
>> MeshVersionFormatted 1
>> Dimension
>> 3
>> Vertices
>> 6
>>                   0                         0                         0      1
>>                 0.1                         0                         0      2
>>                 0.1                       0.3                         0      3
>>                   0                       0.3                         0      4
>>                 0.1          0.15000000000017                         0      2
>>                   0          0.15000000000017                         0      4
>> Triangles
>> 4
>> 1 2 6 6
>> 2 5 6 6
>> 3 4 6 6
>> 5 3 6 6
>> End
>>
>> Sadly, sfepy see's this as 3D.
>>
>> aluminum:sfepy steve$ ./dump-info.py t1.mesh
>> sfepy: reading mesh (t1.mesh)...
>> sfepy: ...done in 0.00 s
>> Mesh:t1
>> conns:
>>   list: [array([[0, 1, 5],
>>          [1, 4, 5],
>>          [2, 3, 5],
>>          [4, 2, 5]])]
>> coors:
>>   (6, 3) array of float64
>> descs:
>>   list: ['2_3']
>> dim:
>>   3
>> dims:
>>   list: [2]
>> el_offsets:
>>   (2,) array of int32
>> io:
>>   None
>> mat_ids:
>>   list: [array([6, 6, 6, 6])]
>> n_e_ps:
>>   (1,) array of int32
>> n_el:
>>   4
>> n_els:
>>   (1,) array of int32
>> n_nod:
>>   6
>> name:
>>   t1
>> ngroups:
>>   (6,) array of float64
>> nodal_bcs:
>>   dict with keys: []
>> setup_done:
>>   0
>>
>> (BTW dump_info is just the following script:
>>
>> aluminum:sfepy steve$ cat dump-info.py
>> #!/usr/bin/env python
>>
>> from sfepy.fem import Mesh
>> import sys
>>
>> m = Mesh.from_file(sys.argv[1])
>>
>> print m
>> )
>>
>> I can use the same trick that schroedinger.py does and convert it a .vtk which gets interpreted as 2D:
>>
>> aluminum:sfepy steve$ ./script/mesh_to_vtk.py t1.mesh tmp/t1.vtk
>>
>> Now I've got:
>>
>> aluminum:sfepy steve$ cat tmp/t1.vtk
>> # vtk DataFile Version 2.0
>> generated by mesh_to_vtk.py
>> ASCII
>> DATASET UNSTRUCTURED_GRID
>> POINTS 6 float
>> 0 0 0
>> 0.1 0 0
>> 0.1 0.3 0
>> 0 0.3 0
>> 0.1 0.15000000000017 0
>> 0 0.15000000000017 0
>> CELLS 4 16
>> 3 0 1 5
>> 3 1 4 5
>> 3 2 3 5
>> 3 4 2 5
>> CELL_TYPES 4
>> 5
>> 5
>> 5
>> 5
>> CELL_DATA 4
>>
>> SCALARS mat_id int 1
>> LOOKUP_TABLE default
>> 6
>> 6
>> 6
>> 6
>>
>> aluminum:sfepy steve$ ./dump-info.py tmp/t1.vtk
>> sfepy: reading mesh (tmp/t1.vtk)...
>> sfepy: ...done in 0.00 s
>> Mesh:tmp/t1
>> conns:
>>   list: [array([[0, 1, 5],
>>          [1, 4, 5],
>>          [2, 3, 5],
>>          [4, 2, 5]])]
>> coors:
>>   (6, 2) array of float64
>> descs:
>>   list: ['2_3']
>> dim:
>>   2
>> dims:
>>   list: [2]
>> el_offsets:
>>   (2,) array of int32
>> io:
>>   None
>> mat_ids:
>>   list: [array([6, 6, 6, 6])]
>> n_e_ps:
>>   (1,) array of int32
>> n_el:
>>   4
>> n_els:
>>   (1,) array of int32
>> n_nod:
>>   6
>> name:
>>   tmp/t1
>> ngroups:
>>   (6,) array of int32
>> nodal_bcs:
>>   dict with keys: []
>> setup_done:
>>   0
>>
>> Which get's correctly loaded up as 2D, but also no hint of group 1 and group 2.
>>
>> Now... if I run simple.py with regions defined as
>>
>> regions = {
>>   'Omega' : ('all', {}),
>>   'Omega_Source' : ('nodes in (y<0.15)', {}),
>>   'Omega_Target' : ('nodes in (y>0.25)', {}),
>> }
>>
>> everything is fine, and I get the correct result:
>>
>> aluminum:sfepy steve$ python simple.py es-foo.py
>> sfepy: left over: ['newregions', 'verbose', '__builtins__', 'get_r_dependence', '__doc__', '__name__', 'data_dir', 'nm', '__package__', '_filename', '__file__']
>> sfepy: reading mesh (/Users/steve/Development/sfepy/tmp/t1.vtk)...
>> sfepy: ...done in 0.00 s
>> sfepy: creating regions...
>> sfepy:     Omega_Target
>> sfepy:     Omega
>> sfepy:     Omega_Source
>> sfepy: ...done in 0.01 s
>> sfepy: equation "Laplace equation":
>> sfepy: dw_laplace.i1.Omega( m.val, v, u ) = 0
>> sfepy: setting up dof connectivities...
>> sfepy: ...done in 0.00 s
>> sfepy: using solvers:
>>              nls: newton
>>               ls: ls
>> sfepy: updating variables...
>> sfepy: ...done
>> sfepy: matrix shape: (2, 2)
>> sfepy: assembling matrix graph...
>> sfepy: ...done in 0.00 s
>> sfepy: matrix structural nonzeros: 4 (1.00e+00% fill)
>> sfepy: updating materials...
>> sfepy:     m
>> sfepy: ...done in 0.00 s
>> sfepy: nls: iter: 0, residual: 1.600781e+01 (rel: 1.000000e+00)
>> sfepy:   rezidual:    0.00 [s]
>> sfepy:      solve:    0.00 [s]
>> sfepy:     matrix:    0.00 [s]
>> sfepy: nls: iter: 1, residual: 4.076197e-15 (rel: 2.546380e-16)
>>
>> results look good:
>>
>> aluminum:sfepy steve$ cat t1.vtk
>> # vtk DataFile Version 2.0
>> step 0 time 0.000000e+00 normalized time 0.000000e+00, generated by simple.py
>> ASCII
>> DATASET UNSTRUCTURED_GRID
>>
>> POINTS 6 float
>> 0.000000e+00 0.000000e+00 0.000000e+00
>> 1.000000e-01 0.000000e+00 0.000000e+00
>> 1.000000e-01 3.000000e-01 0.000000e+00
>> 0.000000e+00 3.000000e-01 0.000000e+00
>> 1.000000e-01 1.500000e-01 0.000000e+00
>> 0.000000e+00 1.500000e-01 0.000000e+00
>>
>> CELLS 4 16
>> 3 0 1 5
>> 3 1 4 5
>> 3 2 3 5
>> 3 4 2 5
>>
>> CELL_TYPES 4
>> 5
>> 5
>> 5
>> 5
>>
>> POINT_DATA 6
>>
>> SCALARS node_groups int 1
>> LOOKUP_TABLE default
>> 0
>> 0
>> 0
>> 0
>> 0
>> 0
>>
>> SCALARS u float 1
>> LOOKUP_TABLE default
>> 0.000000e+00
>> 0.000000e+00
>> 1.500000e+02
>> 1.500000e+02
>> 1.102273e+02
>> 1.147727e+02
>>
>> CELL_DATA 4
>> SCALARS mat_id int 1
>> LOOKUP_TABLE default
>> 6
>> 6
>> 6
>> 6
>>
>> But if I try the regions defined by group I get:
>>
>> aluminum:sfepy steve$ python simple.py es-foo.py
>> sfepy: left over: ['verbose', '__builtins__', 'get_r_dependence', '__doc__', '__name__', 'data_dir', 'nm', '__package__', 'oldregions', '_filename', '__file__']
>> sfepy: reading mesh (/Users/steve/Development/sfepy/tmp/t1.vtk)...
>> sfepy: ...done in 0.00 s
>> sfepy: creating regions...
>> sfepy:     Omega_Target
>> sfepy:     Omega
>> sfepy:     Omega_Source
>> sfepy: ...done in 0.01 s
>> sfepy: equation "Laplace equation":
>> sfepy: dw_laplace.i1.Omega( m.val, v, u ) = 0
>> sfepy: setting up dof connectivities...
>> sfepy: ...done in 0.00 s
>> sfepy: using solvers:
>>              nls: newton
>>               ls: ls
>> sfepy: updating variables...
>> sfepy: ...done
>> sfepy: matrix shape: (6, 6)
>> sfepy: assembling matrix graph...
>> sfepy: ...done in 0.00 s
>> sfepy: matrix structural nonzeros: 24 (6.67e-01% fill)
>> sfepy: updating materials...
>> sfepy:     m
>> sfepy: ...done in 0.00 s
>> sfepy: nls: iter: 0, residual: 0.000000e+00 (rel: 0.000000e+00)
>>
>> aluminum:sfepy steve$ cat t1.vtk
>> # vtk DataFile Version 2.0
>> step 0 time 0.000000e+00 normalized time 0.000000e+00, generated by simple.py
>> ASCII
>> DATASET UNSTRUCTURED_GRID
>>
>> POINTS 6 float
>> 0.000000e+00 0.000000e+00 0.000000e+00
>> 1.000000e-01 0.000000e+00 0.000000e+00
>> 1.000000e-01 3.000000e-01 0.000000e+00
>> 0.000000e+00 3.000000e-01 0.000000e+00
>> 1.000000e-01 1.500000e-01 0.000000e+00
>> 0.000000e+00 1.500000e-01 0.000000e+00
>>
>> CELLS 4 16
>> 3 0 1 5
>> 3 1 4 5
>> 3 2 3 5
>> 3 4 2 5
>>
>> CELL_TYPES 4
>> 5
>> 5
>> 5
>> 5
>>
>> POINT_DATA 6
>>
>> SCALARS node_groups int 1
>> LOOKUP_TABLE default
>> 0
>> 0
>> 0
>> 0
>> 0
>> 0
>>
>> SCALARS u float 1
>> LOOKUP_TABLE default
>> 0.000000e+00
>> 0.000000e+00
>> 0.000000e+00
>> 0.000000e+00
>> 0.000000e+00
>> 0.000000e+00
>>
>> CELL_DATA 4
>> SCALARS mat_id int 1
>> LOOKUP_TABLE default
>> 6
>> 6
>> 6
>> 6
>>
>> Everything is just zero. ;-(
>>
>> Just for completeness here is my test 'es-foo.py' file:
>>
>> r"""
>> Laplace equation with variable material in 2D
>>
>> """
>> import numpy as nm
>> from sfepy import data_dir
>>
>> #filename_mesh = data_dir + '/es-lens.mesh'
>> #filename_mesh = data_dir + '/tmp/es-lens.vtk'
>> filename_mesh = data_dir + '/tmp/t1.vtk'
>>
>> options = {
>>   'nls' : 'newton',
>>   'ls' : 'ls',
>> }
>>
>> materials = {
>>   'm' : 'get_r_dependence',
>> }
>>
>> oldregions = {
>>   'Omega' : ('all', {}),
>>   'Omega_Source' : ('nodes in (y<0.15)', {}),
>>   'Omega_Target' : ('nodes in (y>0.25)', {}),
>> }
>>
>> regions = {
>>   'Omega' : ('all', {}),
>>   'Omega_Source' : ('nodes of group 1', {}),
>>   'Omega_Target' : ('nodes of group 2', {}),
>> }
>>
>> fields = {
>>   'potential' : ('real', 1, 'Omega', 1),
>> }
>>
>> variables = {
>>   'u' : ('unknown field', 'potential', 0),
>>   'v' : ('test field',    'potential', 'u'),
>> }
>>
>> ebcs = {
>>   'u1' : ('Omega_Source', {'u.0' : 0.0}),
>>   'u2' : ('Omega_Target', {'u.0' : 150.0}),
>> }
>>
>> integrals = {
>>   'i1' : ('v', 'gauss_o1_d2'),
>> }
>>
>> equations = {
>>   'Laplace equation' :
>>   """dw_laplace.i1.Omega( m.val, v, u ) = 0 """
>> }
>>
>> solvers = {
>>   'ls' : ('ls.scipy_direct', {}),
>>   'newton' : ('nls.newton',
>>               {'i_max'      : 1,
>>                'eps_a'      : 1e-10,
>>                }),
>> }
>>
>> def get_r_dependence(ts, coors, mode=None, **kwargs):
>>   """
>>   We want to add an r factor to the laplacian integral.
>>
>>   For scalar parameters, the shape has to be set to `(coors.shape[0], 1, 1)`.
>>   """
>>   if mode == 'qp':
>>       x = coors[:,1]
>>       val = x.copy()
>>       val.shape = (coors.shape[0], 1, 1)
>>       return {'val' : val}
>>
>> functions = {
>>   'get_r_dependence' : (get_r_dependence,),
>> }
>>
>> Anyway... sorry for the extremely long winded explanation!
>>
>> Thanks for any insight.
>> -steve
>>
>>
>> On Jun 9, 2012, at 2:08 AM, Robert Cimrman wrote:
>>
>>> The ebcs appear to be given correctly. They should be applied automatically, when using simple.py. In your eigenvalue problem solver you should take care of that by calling problem.time_update(), as in schroedinger_app.py, line 104.
>>>
>>> Does it help?
>>>
>>> r.
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups "sfepy-devel" group.
>> To post to this group, send email to sfepy...@googlegroups.com.
>> To unsubscribe from this group, send email to sfepy-devel...@googlegroups.com.
>> For more options, visit this group at http://groups.google.com/group/sfepy-devel?hl=en.
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups "sfepy-devel" group.
>> To post to this group, send email to sfepy...@googlegroups.com.
>> To unsubscribe from this group, send email to sfepy-devel...@googlegroups.com.
>> For more options, visit this group at http://groups.google.com/group/sfepy-devel?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups "sfepy-devel" group.
> To post to this group, send email to sfepy...@googlegroups.com.
> To unsubscribe from this group, send email to sfepy-devel...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/sfepy-devel?hl=en.
>

--
You received this message because you are subscribed to the Google Groups "sfepy-devel" group.
To post to this group, send email to sfepy...@googlegroups.com.
To unsubscribe from this group, send email to sfepy-devel...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/sfepy-devel?hl=en.