@@ -34,24 +34,35 @@ def __init__(
3434 self ,
3535 name : str ,
3636 constrainedParticle : BaseParticle ,
37- constrainedLocation : int | str ,
3837 field : str ,
3938 prescribedStepDelta : dict ,
4039 model ,
40+ location : str = "center" ,
41+ faceID : int = None ,
42+ vertexID : int = None ,
4143 ):
4244 self ._name = name
4345 self ._constrainedParticle = constrainedParticle
4446 self ._field = field
4547 self ._prescribedStepDelta = prescribedStepDelta
4648 self ._fieldSize = getFieldSize (self ._field , model .domainSize )
4749 self ._nodes = dict ()
48- self ._constrainedLocation = constrainedLocation
4950
50- if isinstance (constrainedLocation , str ):
51- if constrainedLocation != "center" :
52- raise ValueError ("Constrain must be 'center' or a vertex index." )
53- # elif isinstance(constrainedLocation, int):
54- # raise ValueError(f"Constrain must be 'center' or a vertex index, got {type(constrainedLocation)}.")
51+ def _getConstraintLocation ():
52+ particle = self ._constrainedParticle
53+ if location == "center" :
54+ constraintLocation = particle .getCenterCoordinates ()
55+ elif location == "face" :
56+ if faceID is None :
57+ raise ValueError ("faceID must be specified when location is 'face'." )
58+ constraintLocation = particle .getFaceCoordinates (faceID )
59+ elif location == "vertex" :
60+ if vertexID is None :
61+ raise ValueError ("vertexID must be specified when location is 'vertex'." )
62+ constraintLocation = particle .getVertexCoordinates (vertexID )
63+ return constraintLocation
64+
65+ self ._getConstraintLocation = _getConstraintLocation
5566
5667 self ._nLagrangianMultipliers = len (self ._prescribedStepDelta )
5768 self .reactionForce = np .zeros (self ._fieldSize )
@@ -119,10 +130,12 @@ def applyConstraint(self, dU_: np.ndarray, PExt: np.ndarray, V: np.ndarray, time
119130 self .reactionForce .fill (0.0 )
120131 p = self ._constrainedParticle
121132
122- if self ._constrainedLocation == "center" :
123- constrainedCoordinates = p .getCenterCoordinates ()
124- elif isinstance (self ._constrainedLocation , int ):
125- constrainedCoordinates = p .getVertexCoordinates ()[self ._constrainedLocation ]
133+ # if self._constrainedLocation == "center":
134+ # constrainedCoordinates = p.getCenterCoordinates()
135+ # elif isinstance(self._constrainedLocation, int):
136+ # constrainedCoordinates = p.getVertexCoordinates()[self._constrainedLocation]
137+
138+ constrainedCoordinates = self ._getConstraintLocation ()
126139
127140 for lag , (i , prescribedComponent ) in enumerate (self ._prescribedStepDelta .items ()):
128141 # lag is the lagrange multiplier index
@@ -158,23 +171,27 @@ def applyConstraint(self, dU_: np.ndarray, PExt: np.ndarray, V: np.ndarray, time
158171def ParticleLagrangianWeakDirichletOnParticleSetFactory (
159172 baseName : str ,
160173 particleSet : list [BaseParticle ],
161- constrainedLocation : list [int ] | str ,
162174 field : str ,
163175 prescribedStepDelta : dict ,
164176 model : MPMModel ,
177+ location : str = "center" ,
178+ faceID : int = None ,
179+ vertexID : int | list [int ] = None ,
165180):
166181 constraints = dict ()
167182 for i , p in enumerate (particleSet ):
168- if isinstance (constrainedLocation , list ):
169- for vertIdx in constrainedLocation :
170- name = f"{ baseName } _{ i } _{ vertIdx } "
171- constraint = ParticleLagrangianWeakDirichlet (
172- name , p , vertIdx , field , prescribedStepDelta , model
173- )
183+ if location == "vertex" :
184+ if isinstance (vertexID , int ):
185+ name = f"{ baseName } _{ i } _v{ vertexID } "
186+ constraint = ParticleLagrangianWeakDirichlet ( name , p , field , prescribedStepDelta , model , location , faceID , vertexID )
174187 constraints [name ] = constraint
175- else :
188+ else :
189+ for vertIdx in vertexID :
190+ name = f"{ baseName } _{ i } _v{ vertIdx } "
191+ constraint = ParticleLagrangianWeakDirichlet ( name , p , field , prescribedStepDelta , model , location , faceID , vertIdx )
192+ constraints [name ] = constraint
193+ else :
176194 name = f"{ baseName } _{ i } "
177- constraint = ParticleLagrangianWeakDirichlet (name , p , constrainedLocation , field , prescribedStepDelta , model )
195+ constraint = ParticleLagrangianWeakDirichlet ( name , p , field , prescribedStepDelta , model , location , faceID , vertexID )
178196 constraints [name ] = constraint
179-
180197 return constraints
0 commit comments