Re: Define Nodes in .comm file
- Christian
- Topic Author
- Offline
- New Member
-
Less
More
- Posts: 18
- Thank you received: 0
10 years 8 months ago #7631
by Christian
Re: Define Nodes in .comm file was created by Christian
Hey Kees,
Do you also know, if MAIL_PY() is able to give out the area of an element?
That would be great
Cheers,
Christian
Do you also know, if MAIL_PY() is able to give out the area of an element?
That would be great

Cheers,
Christian
- kwou
-
- Offline
- Moderator
-
10 years 8 months ago - 10 years 8 months ago #7632
by kwou
Interest: structural mechanics, solar energy (picture at 'my location' shows too little pv panels)
--
kind regards - kees
Replied by kwou on topic Re: Define Nodes in .comm file
Hoi Christian
PY_MAIL() does not provided data for the area of an element, see eg. the file partition, line 534 in the utilitai directory:
<path_to_CodeAster>/aster114test/run/11.4/lib/python2.7/site-packages/Utilitai/partition.py
I have tried to calculate the area for my RBE3 contribution, but it is a simplified version (ie only corner nodes are considered for linear elemetnts, see code below.
I guess there must be a part in de code that provides this information, but probably deeper hidden.
(still need to update that part of the contribution ...: www.caelinux.org/wiki/index.php/Contrib:KeesWouters/bc/rbe3)
PY_MAIL() does not provided data for the area of an element, see eg. the file partition, line 534 in the utilitai directory:
<path_to_CodeAster>/aster114test/run/11.4/lib/python2.7/site-packages/Utilitai/partition.py
I have tried to calculate the area for my RBE3 contribution, but it is a simplified version (ie only corner nodes are considered for linear elemetnts, see code below.
I guess there must be a part in de code that provides this information, but probably deeper hidden.
from Utilitai.partition import *
from numpy import *
#from math import *
if info>1:
print 'in CA_geeometry: '
print mesh
print ElemGroupStr
PyMesh = MAIL_PY() ## convert CodeAster mesh to Python
PyMesh.FromAster(mesh);
nonu = PyMesh.dime_maillage[0] ## number of nodes
elnu = PyMesh.dime_maillage[2] ## number of elements
NodeCoord = PyMesh.cn ## xyz coordinates of nodes (nonu*3 matrix)
ElemConnect = PyMesh.co ## node numbers of elements (elnu*x matrix)
NodeList = list(PyMesh.correspondance_noeuds)
ElemList = list(PyMesh.correspondance_mailles)
ElemType = list(PyMesh.tm)
NodeGroup = PyMesh.gno ## list of GROUP_NO groups
ElemGroup = PyMesh.gma ## list of GROUP_MA groups, eg groupstr
#NodeList = list(CmeshCA.correspondance_noeuds)
#ElemList = list(CmeshCA.correspondance_mailles)
#ElemType = list(CmeshCA.tm)
if info>=0:
print 'groups by argument:%s'%(ElemGroupStr)
print ElemGroup[ElemGroupStr]
#P1 = numpy.array([0.0,2.0,3.0]) ## p1 and p2 are points defining the rotation axis
#P2 = numpy.array([2.0,2.0,3.0]) ## define your own rotation axis in comm file
# ideally the rotation axis is derived from the set of nodes --> to be done
NodeCount = 0
TorsionDistribution=[] ## initialise Torsion node list group
#NumberOfNodes=len(NodeGroup[ElemGroupStr])
NumberOfElems=len(ElemGroup[ElemGroupStr])
ElemNodeGroup = [0]*4*NumberOfElems
FXX = [0]*4*NumberOfElems
FYY = [0]*4*NumberOfElems
ElemCount = 0
print 'ElemNodeGroup: ',ElemNodeGroup,len(ElemNodeGroup)
for ii in xrange(NumberOfElems):
ElemNumber = ElemGroup[ElemGroupStr][ii]
print 'ElemNumber: ',ii,ElemCount,ElemNumber
ElemNode0 = ElemConnect[ElemNumber][0]
ElemNode1 = ElemConnect[ElemNumber][1]
ElemNode2 = ElemConnect[ElemNumber][2]
ElemNode3 = ElemConnect[ElemNumber][3]
print 'index: ',ElemCount,552,ii,NumberOfElems
ElemNodeGroup[0+ElemCount]=ElemNode0
ElemNodeGroup[1+ElemCount]=ElemNode1
ElemNodeGroup[2+ElemCount]=ElemNode2
ElemNodeGroup[3+ElemCount]=ElemNode3
ElemCount+=4
print 'ElemNodeGroup: ',ElemNodeGroup,len(ElemNodeGroup)
#np.unique1d([1,2,6,4,2,3,2], return_index=True)
#print 'unique: ',unique([1,2,6,4,2,3,2])
ElemNodeGroupUnique = unique(ElemNodeGroup)
print 'unique elemNodeGroup: ',ElemNodeGroup
print 'unique elemNodeGroup: ',ElemNodeGroupUnique
NumberOfNodesGroup = len(ElemNodeGroupUnique)
TorsionDistribution=[] ## initialise Torsion node list group
ElemCount = 0
SumArea = 0.0
for ii in xrange(NumberOfElems):
ElemNumber = ElemGroup[ElemGroupStr][ii]
print 'ElemNumber: ',ii,ElemCount,ElemNumber
ElemNode0 = ElemConnect[ElemNumber][0]
ElemNode1 = ElemConnect[ElemNumber][1]
ElemNode2 = ElemConnect[ElemNumber][2]
ElemNode3 = ElemConnect[ElemNumber][3]
#ElemNode4 = ElemConnect[ElemNumber][4]
#ElemNode5 = ElemConnect[ElemNumber][5]
#ElemNode6 = ElemConnect[ElemNumber][6]
#ElemNode7 = ElemConnect[ElemNumber][7]
#print 'ElemNode1: ',ElemNode0,ElemNode1,ElemNode2,ElemNode3,ElemNode4,ElemNode5,ElemNode6,ElemNode7
print 'ElemNode1: ',ElemNode0,ElemNode1,ElemNode2,ElemNode3
NNxyz0 = NodeCoord[ElemNode0]
NNxyz1 = NodeCoord[ElemNode1]
NNxyz2 = NodeCoord[ElemNode2]
NNxyz3 = NodeCoord[ElemNode3]
print 'ElemCoordinates: ',NNxyz0,NNxyz1,NNxyz2,NNxyz3
# determine area of element surface A~||(x2-x0).(x3-x1)||
dx20 = NNxyz2[0]-NNxyz0[0]
dy20 = NNxyz2[1]-NNxyz0[1]
dz20 = NNxyz2[2]-NNxyz0[2]
dx31 = NNxyz3[0]-NNxyz1[0]
dy31 = NNxyz3[1]-NNxyz1[1]
dz31 = NNxyz3[2]-NNxyz1[2]
aa = dy20*dz31-dz20*dy31 ## cross product of diagonals
bb = dz20*dx31-dx20*dz31
cc = dx20*dy31-dy20*dx31
AreaElem = 0.5*sqrt(aa*aa+bb*bb+cc*cc) ## Area = 0.5*||cross(d1,d2))||
##AreaElem = 1.000 ## trick size of elements
SumArea += AreaElem
print 'AreaElem: ',AreaElem,SumArea
#NNp1 = NodeNumber+1 # node numbers are increased by 1: Salome <--> Code Aster
xcoord = NNxyz0[0]
ycoord = NNxyz0[1]
print xcoord,ycoord,AreaElem,Ftorsion
Fx = -AreaElem*ycoord
Fy = +AreaElem*xcoord
FXX[ElemCount] = Fx
FYY[ElemCount] = Fy
xcoord = NNxyz1[0]
ycoord = NNxyz1[1]
#print xcoord,ycoord,AreaElem,Ftorsion
Fx = -AreaElem*ycoord
Fy = +AreaElem*xcoord
FXX[ElemCount+1] = Fx
FYY[ElemCount+1] = Fy
xcoord = NNxyz2[0]
ycoord = NNxyz2[1]
#print xcoord,ycoord,AreaElem,Ftorsion
Fx = -AreaElem*ycoord
Fy = +AreaElem*xcoord
FXX[ElemCount+2] = Fx
FYY[ElemCount+2] = Fy
xcoord = NNxyz3[0]
ycoord = NNxyz3[1]
#print xcoord,ycoord,AreaElem,Ftorsion
Fx = -AreaElem*ycoord
Fy = +AreaElem*xcoord
FXX[ElemCount+3] = Fx
FYY[ElemCount+3] = Fy
#print 'eCount,Node1234,FXX/FYY: ',ElemCount+0,ElemNode0,NNxyz0[0],NNxyz0[1],FXX[ElemCount+0],FYY[ElemCount+0]
#print 'eCount,Node1234,FXX/FYY: ',ElemCount+1,ElemNode1,NNxyz1[0],NNxyz1[1],FXX[ElemCount+1],FYY[ElemCount+1]
#print 'eCount,Node1234,FXX/FYY: ',ElemCount+2,ElemNode2,NNxyz2[0],NNxyz2[1],FXX[ElemCount+2],FYY[ElemCount+2]
#print 'eCount,Node1234,FXX/FYY: ',ElemCount+3,ElemNode3,NNxyz3[0],NNxyz3[1],FXX[ElemCount+3],FYY[ElemCount+3]
ElemCount+=4
#print 'xxxxxxxxxxxxxxxxxxxxx'
#print 'xxxxxxxxxxxxxxxxxxxxx'
##for ii in xrange(len(FYY)):
#3 print 'ii/Node/FXX/FYY: ',ii,ElemNodeGroup[ii],FXX[ii],FYY[ii]
(still need to update that part of the contribution ...: www.caelinux.org/wiki/index.php/Contrib:KeesWouters/bc/rbe3)
Interest: structural mechanics, solar energy (picture at 'my location' shows too little pv panels)
--
kind regards - kees
Last edit: 10 years 8 months ago by kwou.
Moderators: catux
Time to create page: 0.143 seconds