Part 2. Requirements for SCM
8. Tools and Usage Models Included in Case study
8.3 Subversion (1.4.x) with NSN SCM Usage Model 2
Las funciones de usuario de MechXML se definen mediante tres elementos y un atributo. Recuérdese que en los elementos de XML se incluye la informa- ción principal del modelo y en los atributos la información secundaria. En este caso la información principal de las funciones de usuario está contenida en tres elementos: lista de argumentos de entrada de la función, lista de argumentos de salida y función propiamente dicha. El elemento user_function tiene un atribu-
to id, que no aparece en la Figura 53, donde se define el nombre de la función de usuario.
Figura 53. Función de usuario en MechXML.
En la Figura 53 se pueden observar algunas características fundamentakles de los elementos de las funciones de usuario. Los argumentos de entrada no son obligatorios puesto que su cardinalidad puede variar entre cero e infinito. Esto es así porque puede haber funciones de usuario que no necesiten argumentos de entrada. Sin embargo es obligatorio dar, al menos, un argumento de salida, aunque tampoco en este caso hay límite superior en el número de argumentos de salida.
Como se puede ver en la Figura 53, en el caso del tercer elemento es posible elegir entre incluir directamente el código de la función (code) o indicar su localización (filename, que puede ser la dirección de un fichero local o en In- ternet). El nombre del fichero puede corresponder al código compilado (*.dll) o al código fuente (*.c).
Los argumentos serán siempre variables puntero, por motivos de compatibili- dad con programas en Fortran, cuyas subrutinas siempre reciben los argumen- tos por referencia. El orden en que se definen los argumentos en MechXML debe coincidir con el orden en que aparecen en la función. Las funciones de usuario han de ser siempre de tipo void. Los argumentos de entrada son de tipo
const, mientras que los argumentos de salida son punteros a variables que se
modifican dentro de la función.
<user_function id="wheel"> <input>time</input> <input>getPosZ(WHELL, pointB)</input> <output>Fx</output> <output>Fy</output> <output>Fz</output> <filename>D:/Users/jvidal/wheel.dll</filename> </user_function>
Figura 54. Ejemplo de función de usuario en MechXML donde se indica la localización.
El nombre de la función de usuario es wheel y tiene dos argumentos de entrada y tres de salida. El primer argumento de entrada es el tiempo, y el segundo – cuyo significado es un poco menos evidente– es la coordenada Z del punto
pointB del sólido WHEEL, respecto al sistema de referencia global. En esta
declaración de función, getPosZ es una de las formas neutras adoptadas para acceder a las variables internas del modelo. El nombre dado a los argumentos de salida sirve para hacer referencia a ellos más tarde en expresiones matemáti- cas. En este caso, el nombre de los argumentos de salida también recuerda que se trata de una fuerza. Se indica también la dirección del código ejecutable de la función (wheel.dll).
Como se ha comentado antes, otra posibilidad es la de incluir directamente en MechXML el código fuente de la función de usuario, en lugar de indicar su localización. El código sería el mostrado en la Figura 55.
<user_function id="wheel"> <input>time</input> <input>getPosZ(WHEEL, pointB)</input> <output>Fx</output> <output>Fy</output> <output>Fz</output> <code>
void wheel(const double *time, const double *posZ, double *Fx, double *Fy, double *Fz) { double delta = 0; double Krueda = 200000.0; if (*time < 0.2) delta = - (*posZ); else delta = - 0.05 - (*posZ); if (delta < 0) delta = 0; *Fx = 0; *Fy = 0; *Fz = Krueda*delta; } </code> </user_function>
Se trata de la misma función que en el ejemplo anterior, pero en esta ocasión se ha incluido el código fuente en lugar de la referencia al código compilado. Se puede observar cómo en el código de la función se cumplen las reglas que se han indicado anteriormente. Los argumentos son punteros, los argumentos de entrada son de tipo const, la función de usuario es de tipo void, etc.
En el ejemplo anterior, tanto la función de usuario como uno de los sólidos del mecanismo se llaman wheel. Para evitar confusiones se ha optado por poner el nombre del sólido en mayúsculas, aunque de cara al proceso de traducción pos- terior (parsing) no hay confusión posible, pues se trata de nombres de entida- des de distinta naturaleza.
<force id="wheel"> <body ref="WHEEL"> <point ref="pointB"/> </body> <userForce ref="wheel"/> </force>
Figura 56. Definición de una fuerza mediante una función de usuario.
En este caso la user_function determina una fuerza, y por tanto se debe incluir en la definición de fuerzas en MechXML, que se realiza en model o en analy-
sis. Por ejemplo, se podría acceder a la definición de esta fuerza de la forma
mostrada en la Figura 56. Con esta definición se llama a la fuerza de usuario
wheel, aplicada en el punto pointB del sólido WHEEL. Como se ha explicado
anteriormente, la llamada a las funciones de usuario también se puede hacer dentro de expresiones matemáticas. Esto permite una gran flexibilidad en la definición de los modelos. Las fuerzas sencillas se pueden definir simplemente por medio de expresiones algebraicas, y si se quiere incluir alguna condición más compleja se incluye la llamada a la oportuna función de usuario. Esta po- sibilidad se puede ver en la Figura 57.
<force id="wheel"> <body ref="WHEEL"> <point ref="pointB"/> </body> <Fx>0.0</Fx> <Fy>0.0</Fy> <Fz>wheel.Fz</Fz> </force>
Figura 57. Definición de una fuerza mediante una expresión algebraica.
Es posible llamar varias veces a la misma función de usuario en un mismo do- cumento MechXML. Por ejemplo, en el caso de realizar el modelo de un coche
es conveniente llamar cuatro veces a la función de usuario que calcula las fuer- zas de contacto neumático-carretera, para cada una de las cuatro ruedas.