Object-Oriented Finite Elements and Domain Decomposition Método del Element Finito Lu = f x∈Ω u = 0 en ∂Ω Lu = −∇ ⋅ a ⋅ ∇ u + ∇ ⋅ (bu ) + cu ∫ ( ∇u ⋅ a ⋅∇w − ub ⋅∇w + cuw)dx = ∫ Ω Ω fwdx Método del Element Finito ∫ ( ∇w ⋅ a ⋅∇u − ub ⋅∇w + cwu )dx = ∫ Ω Ω fwdx A( w, u ) = f ( w) Base ϕ1 ,..., ϕ N , N ∑A u j =1 ij j = fi N u ( x) = ∑ u jϕ j ( x) j =1 Aij = A(ϕi , ϕ j ) fi = f (ϕi ) A ⋅u = f Discretización del Dominio malla β Ω ∂Ω Rectángulo ααα Rα Hipercubo Variantes Forma Bilinear y su cálculo Condiciones de Frontera Geometría Tipo de Elemento (Triángulo, Rectángulo, etc.) Espacio de Funciones en el Elemento Procedimiento de Solución Código Ideal Forma Bilinear Condiciones de Frontera PROGRAMA Elemento Finito de CÁLCULO Geometría Solución Matricial Código Usual ElementoFinito Condiciones Forma de Frontera Bilinear Solución Geometría Matricial Programa de Cálculo OBJETIVO Desarrollar Sistema de Cómputo para Elemento Finito con Módulos Intercambiables Programación Orientada a Objetos OOP Simula -67 OSLO Dahl y Nygaard Smalltalk (1970s) Xerox Park Alan Kay C++ (1980s) Stroustrup Eiffel / Clos / Self / Beta Java 1990s SUN C# Microsoft VCR como Objeto Play Rewind Fast Forward On/Off Eject Stop/Pause Clases y Objetos class Vcr { String model; String type; Datos boolean on; boolean tape; float dist; void insert(Tape c); void eject(); Metodos void play(); void rewind(float t);\ void fastForward(float t); void stop(); void onOff(); void volume(float v); } Vcr vcr = new Vcr(“Sony”, “vhs”); Tape tape = new Tape(); vcr.onOff(); vcr.insert(tape); vcr.play(); vcr.stop(); vcr.eject(); If (vcr.on && vcr.tape()) { vcr.eject(); vcr.onOff(); } Herencia y SubClases Class Coche Class VW Class Jaguar Class Cirrus Caracteristicas Sobresalientes de OOP Constructor: Type t = new T(…); Invocación: x = t.method(…); Herencia: Class A { } Class A1 extends A { } Código Reutilizable Clases para Elemento Finito Node, Elem FiniteElement (RectLinFem, TriQuadFem, …) Geometry CalcFem -> LocalCalc LinearOp -> BilinearForm GlobalCalc LinearSolve (SolveLU, SolveCGM,..) EllipProblem Colaboración entre Clases Geometry geom = Geometry.factory(2, …); FiniteElement finElem = FiniteElement.factory(2, …); EllipProblem prob = new EllipProblem(numProb); LinearSolve linSolve = LinearSolve.solveLU(); LocalCalc = new LocalCalc(geom, finElem); GlobalCalc calcFem = new GlobalCalc(2, “fem”, geom); Solver sol = new Solver(geom, finElem, prob, calcFem, localCalc, linSolve); Solver.solve(); Geometría Lista de Elementos (nodos/vértices) Lista de Nodos (coordinadas) Lista de Elementos/Nodo Elementos/Caras de frontera Objeto de localización: (x1,…,xn)->elemento Elemento Finito (general) Forma estandard (rectangulo, simplejo) Número y llamadas a sus funciones y derivadas // mapeo a la forma estandard // Caras y normales Integración numerica Interpolación Elemento Finito Transformación Afina (0,1) T λ2 (0,0) (x2 , y2 ) λ1 (1,0) (x, y) (x0, y0) (x1, y1) λ1 x 0 λ1 x = T = + M y λ2 y0 λ2 x − x0 λ1 −1 x −1 =T =M y λ2 y − y0 Elemento Finito (Específico) Definición de polinomios y derivadas en el espacio estandard Elemento Finito General Rectangulo Lineales Triangulo Lineales Triangulo Cúbicos Cálculo Local Evalúa Forma Bilineal/Elemento i, j = 1,..., ne Ae (φi ,φ j ) = ∫ ( ∇φi ⋅ a ⋅∇φ j −φ jb ⋅∇φi + cφφ i j )dx Ωe Fe(φi ) = ∫ f φidx Ωe i → global(i) fem.initElem(elem); nf=fem.numFunciones(); ng=fem.numGauss(); for i=1,…,nf for j=1,…,nf for g=1,…,ng x=fem.getGaussCoord(g); wi=fem.eval(i, 0, x); wj=fem.eval(j, 0, x); w1i=fem.eval(i, 1, x); w1j=fem.eval(j, 1, x); aij[g] = forma.eval(x, wi, w1i, wj, w1j) end g; ar[i][j]=fem.integrate(aij); end j; end i; Cálculo Global Numeración de Funciones Crear mapeo local --> LocalCalc Asignación de Incógnitas Valores o Vector de Frontera Formación del Lado Derecho Invocación Cálculo Local Cálculo Global Numeración 12 13 8 9 4 0 5 1 14 2 3 0 1 15 10 6 2 11 2 3 0 1 7 3 Método de Solución Resuelve A⋅ x = b Métodos Directos Factorización LU Métodos Krylov Gradiente Conjugado Descomposición de Dominio Schwarz/Schur/FETI yi = f o r i = 1, ..., n n ∑ j =1 a ij x j yi ← 0 f o r e = 1, ..., n e f o r p = 1, ..., n f i ← e l e m ( e ) .e q m a p ( p ) if (i < 0 ) c o n tin u e f o r q = 1, ..., n f j ← e l e m ( e ) .e q m a p ( q ) if (j < 0 ) c o n tin u e y i = y j + e l e m ( e ) .a r ( p , q ) * x j Descomposición de Dominio Σ Ω j Ωi Ωi Descomposición de Dominio Partition Define partición como {pe1, …, pem} Solución Global en términos de soluciones de problemas intermedios – de manera iterativa PartitionElement (pei) Solución Local en una región intermedia Fábricas Geometry geom = PDEGeomFactory.newPDEGeom(…); FiniteElement fem = FiniteElementFactory.newFiniteElement(…); EllipProblem = EllipFactory.newEllipProblem(…); LinearSolve = SolveFactory.newLinSolve(…); Conclusiones Metodología Exitosa Alta Eficiencia en Desarrollo Recomendaciones Entender el Modelo Establecer Proyecto en Geofísica y/o Ingenieria para Uso Común