Source code for evalForms

# 24.09.2007, c
import sympy as s

##
# 25.09.2007, c
[docs]def create_scalar( name, n_ep ): vec = s.matrices.zeronm( n_ep, 1 ) for ip in range( n_ep ): vec[ip,0] = '%s%d' % (name, ip) return vec
## # 24.09.2007, c
[docs]def create_vector( name, n_ep, dim ): """ordering is DOF-by-DOF""" vec = s.matrices.zeronm( dim * n_ep, 1 ) for ii in range( dim ): for ip in range( n_ep ): vec[n_ep*ii+ip,0] = '%s%d%d' % (name, ii, ip) return vec
## # 24.09.2007, c
[docs]def create_scalar_base( name, n_ep ): phi = s.matrices.zeronm( 1, n_ep ) for ip in range( n_ep ): phi[0,ip] = '%s%d' % (name, ip) return phi
## # 24.09.2007, c # 25.09.2007
[docs]def create_vector_base( name, phic, dim ): n_ep = phic.shape[1] phi = s.matrices.zeronm( dim, dim * n_ep ) indx = [] for ii in range( dim ): phi[ii,n_ep*ii:n_ep*(ii+1)] = phic indx.append( ii ) return phi, indx
## # 24.09.2007, c
[docs]def create_scalar_base_grad( name, phic, dim ): n_ep = phic.shape[1] gc = s.matrices.zeronm( dim, n_ep ) for ii in range( dim ): for ip in range( n_ep ): gc[ii,ip] = '%s%d%d' % (name, ii, ip) return gc
## # 24.09.2007, c # 25.09.2007
[docs]def create_vector_base_grad( name, gc, transpose = False ): dim, n_ep = gc.shape g = s.matrices.zeronm( dim * dim, dim * n_ep ) indx = [] if transpose: for ir in range( dim ): for ic in range( dim ): g[dim*ir+ic,n_ep*ic:n_ep*(ic+1)] = gc[ir,:] indx.append( (ic, ir) ) else: for ir in range( dim ): for ic in range( dim ): g[dim*ir+ic,n_ep*ir:n_ep*(ir+1)] = gc[ic,:] indx.append( (ir, ic) ) return g, indx
## # 25.09.2007, c
[docs]def create_u_operator( u, transpose = False ): dim = u.shape[0] op_u = s.matrices.zeronm( dim * dim, dim ) if transpose: for ir in range( dim ): for ic in range( dim ): op_u[dim*ir+ic,ic] = u[ir] else: for ii in range( dim ): op_u[dim*ii:dim*(ii+1),ii] = u return op_u
## # 24.09.2007, c # 25.09.2007
[docs]def grad_vector_to_matrix( name, gv ): dim2 = gv.shape[0] dim = int( s.sqrt( dim2 ) ) gm = s.matrices.zeronm( dim, dim ) for ir in range( dim ): for ic in range( dim ): gm[ir,ic] = gv[dim*ir+ic,0] return gm
## # 24.09.2007, c # 25.09.2007
[docs]def substitute_continuous( expr, names, u, phi ): pu = phi * u for ii in range( phi.lines ): expr = expr.subs( pu[ii,0], names[ii] ) return expr
## # 25.09.2007, c
[docs]def create_vector_var_data( name, phi, vindx, g, gt, vgindx, u ): gu = g * u gum = grad_vector_to_matrix( 'gum', gu ) print 'g %s:\n' % name, gum gut = gt * u gutm = grad_vector_to_matrix( 'gutm', gut ) print 'gt %s:\n' % name, gutm pu = phi * u names = ['c%s%d' % (name, indx) for indx in vindx] cu = substitute_continuous( pu, names, u, phi ) print 'continuous %s:\n' % name, cu gnames = ['cg%s%d_%d' % (name, indx[0], indx[1]) for indx in vgindx] cgu = substitute_continuous( gu, gnames, u, g ) cgum = grad_vector_to_matrix( 'gum', cgu ) print 'continuous g %s:\n' % name, cgum cgut = substitute_continuous( gut, gnames, u, g ) cgutm = grad_vector_to_matrix( 'gutm', cgut ) print 'continuous gt %s:\n' % name, cgutm op_u = create_u_operator( cu ) print op_u op_ut = create_u_operator( cu, transpose = True ) print op_ut out = { 'g' : gu, 'g_m' : gum, 'q' : pu, 'c' : cu, 'cg' : cgu, 'cg_m' : cgum, 'cgt' : cgut, 'cgt_m' : cgutm, 'op' : op_u, 'opt' : op_ut, 'names' : names, 'gnames' : gnames, } return out
## # 25.09.2007, c
[docs]def create_scalar_var_data( name, phi, g, u ): gu = g * u pu = phi * u names = ['c%s' % name] cu = substitute_continuous( pu, names, u, phi ) print 'continuous %s:\n' % name, cu gnames = ['cg%s_%d' % (name, ii) for ii in range( g.shape[0] )] cgu = substitute_continuous( gu, gnames, u, g ) print 'continuous g %s:\n' % name, cgu op_gu = create_u_operator( cgu ) print op_gu out = { 'g' : gu, 'q' : pu, 'c' : cu, 'cg' : cgu, 'gop' : op_gu, 'names' : names, 'gnames' : gnames, } return out
## # 25.09.2007, c
[docs]def main(): n_ep = 3 dim = 2 u = create_vector( 'u', n_ep, dim ) v = create_vector( 'v', n_ep, dim ) b = create_vector( 'b', n_ep, dim ) p = create_scalar( 'p', n_ep ) q = create_scalar( 'q', n_ep ) r = create_scalar( 'r', n_ep ) ## print u ## print v phic = create_scalar_base( 'phic', n_ep ) phi, vindx = create_vector_base( 'phi', phic, dim ) gc = create_scalar_base_grad( 'gc', phic, dim ) g, vgindx = create_vector_base_grad( 'g', gc ) gt, aux = create_vector_base_grad( 'gt', gc, transpose = True ) ## print phi ## print phic ## print gc print g print gt ud = create_vector_var_data( 'u', phi, vindx, g, gt, vgindx, u ) vd = create_vector_var_data( 'v', phi, vindx, g, gt, vgindx, v ) bd = create_vector_var_data( 'b', phi, vindx, g, gt, vgindx, b ) pd = create_scalar_var_data( 'p', phic, gc, p ) qd = create_scalar_var_data( 'q', phic, gc, q ) rd = create_scalar_var_data( 'r', phic, gc, r ) print ud.keys() assert bool( bd['op'].T * g == bd['opt'].T * gt ) assert bool( bd['opt'].T * g == bd['op'].T * gt ) assert bool( bd['cgt_m'] == bd['cg_m'].T ) print '((b * grad) u), v)' form1 = vd['c'].T * bd['op'].T * ud['cg'] form2 = vd['c'].T * bd['opt'].T * ud['cgt'] print form1 print form2 print bool( form1 == form2 ) print '((v * grad) u), b)' form1 = vd['c'].T * bd['op'].T * ud['cgt'] form2 = vd['c'].T * bd['opt'].T * ud['cg'] print form1 print form2 print bool( form1 == form2 ) print '((u * grad) v), b)' form1 = vd['cgt'].T * bd['op'] * ud['c'] form2 = vd['cg'].T * bd['opt'] * ud['c'] print form1 print form2 print bool( form1 == form2 ) print '((b * grad) v), u)' form1 = vd['cg'].T * bd['op'] * ud['c'] form2 = vd['cgt'].T * bd['opt'] * ud['c'] print form1 print form2 print bool( form1 == form2 ) print '((v * grad) b), u)' form1 = vd['c'].T * bd['cgt_m'] * ud['c'] form2 = vd['c'].T * bd['cg_m'].T * ud['c'] print form1 print form2 print bool( form1 == form2 ) print '((b * grad) u), (b * grad) v)' form1 = vd['cg'].T * bd['op'] * bd['op'].T * ud['cg'] print form1 print '((u * grad) b), (b * grad) v)' form1 = vd['cg'].T * bd['op'] * bd['cg_m'] * ud['c'] print form1 print '(grad p, (b * grad) v)' form1 = vd['cg'].T * bd['op'] * pd['cg'] print form1 print '(grad q, (b * grad) u)' form1 = qd['cg'].T * bd['op'].T * ud['cg'] print form1 print '(grad q, (u * grad) b)' form1 = qd['cg'].T * bd['cg_m'] * ud['c'] print form1 print '(grad r, (u * grad) v)' form1 = vd['cgt'].T * rd['gop'] * ud['c'] print form1 return ud, vd, bd, pd, qd, rd
if __name__ == '__main__': ud, vd, bd, pd, qd, rd = main()