当前位置: 首页>>代码示例>>C++>>正文


C++ CFieldWorld::GetNA方法代码示例

本文整理汇总了C++中fem::field::CFieldWorld::GetNA方法的典型用法代码示例。如果您正苦于以下问题:C++ CFieldWorld::GetNA方法的具体用法?C++ CFieldWorld::GetNA怎么用?C++ CFieldWorld::GetNA使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在fem::field::CFieldWorld的用法示例。


在下文中一共展示了CFieldWorld::GetNA方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: assert

// add pattern to the diagonal
bool Ls::CLinearSystem_RigidField2::AddPattern_Field(const unsigned int id_field, const Fem::Field::CFieldWorld& world)
{
	if( !world.IsIdField(id_field) ) return false;
  const Fem::Field::CField& field = world.GetField(id_field);
	unsigned int id_field_parent;
	{
		if( field.GetIDFieldParent() == 0 ){ id_field_parent = id_field; }
		else{ id_field_parent = field.GetIDFieldParent(); }
	}

	const unsigned int nlen_value = field.GetNLenValue();

	int ilss_add;
	{	// Cornerブロックを作る
    unsigned int id_na_val = field.GetNodeSegInNodeAry(Fem::Field::CORNER).id_na_va;
		if( id_na_val != 0 ){
			assert( world.IsIdNA(id_na_val) );
      const Fem::Field::CNodeAry& na = world.GetNA(id_na_val);
      assert( m_ls.GetNLinSysSeg() == this->m_aSegRF.size() );
      ilss_add = m_ls.GetNLinSysSeg();
      this->m_aSegRF.push_back( CLinSysSegRF(id_field_parent,Fem::Field::CORNER) );
      int ires = m_ls.AddLinSysSeg( na.Size(), field.GetNLenValue() );
      assert( ires == ilss_add );
		}
		else{ ilss_add = -1; }
	}
	////////////////////////////////
	const std::vector<unsigned int> aIdEA = field.GetAryIdEA();
  assert( aIdEA.size() > 0 );
	for(unsigned int iiea=0;iiea<aIdEA.size();iiea++){
		const unsigned int id_ea = aIdEA[iiea];
    const Fem::Field::CElemAry& ea = world.GetEA(id_ea);
		// CORNER節点について
    if( field.GetIdElemSeg(id_ea,Fem::Field::CORNER,true,world) != 0 ){
			assert( world.IsIdEA(id_ea) );
      const unsigned int id_es_c = field.GetIdElemSeg(id_ea,Fem::Field::CORNER,true,world);
			assert( ea.IsSegID(id_es_c) );
      {
        Com::CIndexedArray crs;
        ea.MakePattern_FEM(id_es_c,crs);
        m_ls.AddMat_Dia(ilss_add, crs );			// cc行列を作る
      }
      if( field.GetIdElemSeg(id_ea,Fem::Field::BUBBLE,true,world) != 0 ){	// CORNER-BUBBLE
        assert(0);
			}
      if( field.GetIdElemSeg(id_ea,Fem::Field::EDGE,true,world) != 0 ){	// CONRER-EDGE
        assert(0);
			}
		}
		// EDGE節点について
    if( field.GetIdElemSeg(id_ea,Fem::Field::EDGE,true,world) != 0 ){
      assert(0);
		}
		// BUBBLE節点について
    if( field.GetIdElemSeg(id_ea,Fem::Field::BUBBLE,true,world) != 0 ){
      assert(0);
		}
	}
	return true;
}
开发者ID:gabriel-tandil,项目名称:SENSITIVE_COUTURE,代码行数:61,代码来源:linearsystem_rigidfield.cpp

示例2:

//! set random field to the field
void Fem::Field::SetFieldValue_Random
(unsigned int id_field_to, unsigned int idofns, Fem::Field::FIELD_DERIVATION_TYPE fdt, 
 Fem::Field::CFieldWorld& world,
 double ave, double range)
{
  if( !world.IsIdField(id_field_to) ) return;
  Fem::Field::CField field_to = world.GetField(id_field_to);
	srand(0);
	if( field_to.GetNodeSegInNodeAry(CORNER).id_na_va != 0 ){
    const Fem::Field::CField::CNodeSegInNodeAry& m_na_c = field_to.GetNodeSegInNodeAry(CORNER);
		assert( world.IsIdNA(m_na_c.id_na_va) );
		CNodeAry& na = world.GetNA(m_na_c.id_na_va);
		if( !na.IsSegID(m_na_c.id_ns_va) ){
			std::cout << "Valueセグメントがない(速度場に設定しようとしている)" << std::endl;
			std::cout << "そのうちValueセグメントを追加で作る関数を加える" << std::endl;
			assert(0);
		}
		assert( na.IsSegID(m_na_c.id_ns_va) );
		CNodeAry::CNodeSeg& ns_val = na.GetSeg(m_na_c.id_ns_va);
		const unsigned int nnode = na.Size();
		for(unsigned int inode=0;inode<nnode;inode++){
			ns_val.SetValue(inode,0,rand()*2.0/(1.0+RAND_MAX)-1.0);
		}
	}
  if( field_to.GetNodeSegInNodeAry(EDGE).id_na_va != 0 ){
    const Fem::Field::CField::CNodeSegInNodeAry& m_na_e = field_to.GetNodeSegInNodeAry(EDGE);
		assert( world.IsIdNA(m_na_e.id_na_va) );
		CNodeAry& na = world.GetNA(m_na_e.id_na_va);
		assert( na.IsSegID(m_na_e.id_ns_va) );
		CNodeAry::CNodeSeg& ns_val = na.GetSeg(m_na_e.id_ns_va);
		const unsigned int nnode = na.Size();
		for(unsigned int inode=0;inode<nnode;inode++){
			ns_val.SetValue(inode,0,rand()*2.0/(1.0+RAND_MAX)-1.0);
		}
	}
  if( field_to.GetNodeSegInNodeAry(BUBBLE).id_na_va != 0 ){
    const Fem::Field::CField::CNodeSegInNodeAry& m_na_b = field_to.GetNodeSegInNodeAry(BUBBLE);  
		assert( world.IsIdNA(m_na_b.id_na_va) );
		CNodeAry& na = world.GetNA(m_na_b.id_na_va);
		assert( na.IsSegID(m_na_b.id_ns_va) );
		CNodeAry::CNodeSeg& ns_val = na.GetSeg(m_na_b.id_ns_va);
		const unsigned int nnode = na.Size();
		for(unsigned int inode=0;inode<nnode;inode++){
			ns_val.SetValue(inode,0,rand()*2.0/(1.0+RAND_MAX)-1.0);
		}
	}  
}
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:48,代码来源:field_value_setter.cpp

示例3: MakeResidual

double CLinearSystem_Save::MakeResidual(const Fem::Field::CFieldWorld& world)
{
	const unsigned int nseg = this->m_aSegField.size();
	if( nseg == 0 )	return 0.0;

	////////////////////////////////
	// updateに値をセットする
	for(unsigned  int ilss=0;ilss<nseg;ilss++){
		const CLinSysSeg_Field& ls = this->m_aSegField[ilss];
		CVector_Blk* update = this->m_ls.m_Update[ilss];
		unsigned int ilen1 = 0;
		{
			const Fem::Field::CField& field = world.GetField(ls.id_field);
			ilen1 = field.GetNLenValue();
			unsigned int id_na_val = field.GetNodeSegInNodeAry(CORNER).id_na_va;
			unsigned int id_ns_val = field.GetNodeSegInNodeAry(CORNER).id_ns_va;
			assert( world.IsIdNA(id_na_val) );
			const CNodeAry& na = world.GetNA(id_na_val);
			na.GetValueFromNodeSegment(id_ns_val,*update);
		}
		if( world.IsIdField(ls.id_field2) ){
			const Fem::Field::CField& field = world.GetField(ls.id_field2);
			unsigned int id_na_val = field.GetNodeSegInNodeAry(CORNER).id_na_va;
			unsigned int id_ns_val = field.GetNodeSegInNodeAry(CORNER).id_ns_va;
			assert( world.IsIdNA(id_na_val) );
			const CNodeAry& na = world.GetNA(id_na_val);
			na.GetValueFromNodeSegment(id_ns_val,*update,ilen1);
		}
	}

	for(unsigned int iseg=0;iseg<nseg;iseg++){
		(*m_ls.m_Residual[iseg]) = (*m_Force[iseg]);
	}

	for(unsigned int iseg=0;iseg<nseg;iseg++){
	for(unsigned int jseg=0;jseg<nseg;jseg++){
		if( m_Matrix_Boundary[iseg][jseg] == 0 ) continue;
		m_Matrix_Boundary[iseg][jseg]->MatVec( -1.0, (*m_ls.m_Update[jseg]), 1.0, (*m_ls.m_Residual[iseg]), true );
	}
	}
	return sqrt(this->DOT(-1,-1));
}
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:42,代码来源:linearsystem_fieldsave.cpp

示例4: UpdateValueOfField

bool CLinearSystem_SaveDiaM_Newmark::UpdateValueOfField(
		unsigned int id_field, Fem::Field::CFieldWorld& world, Fem::Field::FIELD_DERIVATION_TYPE fdt )
{
	if( !world.IsIdField(id_field) ) return false;
	CField& field = world.GetField(id_field);

	{
		unsigned int id_na_val = field.GetNodeSegInNodeAry(CORNER).id_na_va;
		if( id_na_val != 0 ){
			const unsigned int ilss0 = this->FindIndexArray_Seg(id_field,CORNER,world);
			CVector_Blk* pUpdate = this->m_ls.m_Update[ilss0];
			assert( pUpdate != 0 );
			CNodeAry& na = world.GetNA(id_na_val);
			const unsigned int nblk = na.Size();
			CNodeAry::CNodeSeg& ns_u = field.GetNodeSeg(CORNER,true,world,VALUE);
			CNodeAry::CNodeSeg& ns_v = field.GetNodeSeg(CORNER,true,world,VELOCITY);
			assert( ns_v.Length() == ns_u.Length() );
			const unsigned int nlen = ns_u.Length();
			const CBCFlag& bc_flag = m_ls.GetBCFlag(ilss0);//this->m_ls.m_BCFlag[ilss0];
			assert( nblk == bc_flag.NBlk() );
            assert( (int)nlen == bc_flag.LenBlk() );
			double* velo0 = new double [nlen];
			double* velo1 = new double [nlen];
			for(unsigned int iblk=0;iblk<nblk;iblk++){
				ns_v.GetValue(iblk,velo0);
				ns_u.GetValue(iblk,velo1);
				for(unsigned int ilen=0;ilen<nlen;ilen++){
					if( bc_flag.GetBCFlag(iblk,ilen) == 0 ){
						const double velo1 = pUpdate->GetValue(iblk,ilen);
						// 値を更新
						ns_u.AddValue(iblk,ilen,dt*(1-gamma)*velo0[ilen]+dt*gamma*velo1);
					}
					else{
						pUpdate->SetValue(iblk,ilen,velo0[ilen]);
//						pUpdate->SetValue(iblk,ilen,velo1[ilen]);
					}
				}
			}
			delete[] velo0;
			const unsigned int id_ns_v = field.GetNodeSegInNodeAry(CORNER).id_ns_ve;
			na.SetValueToNodeSegment(id_ns_v,*pUpdate);
		}
	}
	return true;
}
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:45,代码来源:linearsystem_fieldsave.cpp

示例5: SetVector_fromField

bool CZLinearSystem_GeneralEigen::SetVector_fromField(int iv1,
	unsigned int id_field, const Fem::Field::CFieldWorld& world, Fem::Field::FIELD_DERIVATION_TYPE fdt )
{
	if( !world.IsIdField(id_field) ){ assert(0); return false; }
	const CField& field = world.GetField(id_field);
	if( field.GetFieldType() != ZSCALAR ) return false;
	
	const unsigned int nseg = this->m_aSeg.size();
	if( nseg == 0 )	return true;

	std::vector< CZVector_Blk* >* paVec1 = 0;
    if(      iv1 >= 0 && iv1 < (int)this->GetTmpVectorArySize() ) paVec1 = &m_TmpVectorArray[iv1];
	else if( iv1 == -1 ) paVec1 = &this->m_Residual;
	else if( iv1 == -2 ) paVec1 = &this->m_Update;
	else assert(0);


	// コーナー節点について値を更新
	{
/*		const int ilss0 = this->FindIndexArray_Seg(id_field,CORNER,world);
		assert( ilss0 != -1 );
		std::cout << ilss0 << std::endl;*/
        unsigned int ilss0 = 0;
		assert( ilss0 < (*paVec1).size() );
		CZVector_Blk* pVec = (*paVec1)[ilss0];
		const CField& field = world.GetField(id_field);
		unsigned int id_na = field.GetNodeSegInNodeAry(CORNER).id_na_va;
		const CNodeAry& na = world.GetNA(id_na);
		const CNodeAry::CNodeSeg& ns = field.GetNodeSeg(CORNER,true,world,fdt);
		const unsigned int nblk = na.Size();
		const unsigned int nlen = ns.Length();
		assert( nlen == 2 );
		double* val = new double [nlen];
		for(unsigned int iblk=0;iblk<nblk;iblk++){
			ns.GetValue(iblk,val);
			pVec->SetValue(iblk,0, Com::Complex(val[0],val[1]) );
		}
		delete[] val;
	}
	return true;
}
开发者ID:gabriel-tandil,项目名称:SENSITIVE_COUTURE,代码行数:41,代码来源:zlinearsystem.cpp

示例6: SetVector_fromField

bool CLinearSystem_Eigen::SetVector_fromField(int iv1,
	unsigned int id_field, const Fem::Field::CFieldWorld& world, Fem::Field::FIELD_DERIVATION_TYPE fdt )
{
	if( !world.IsIdField(id_field) ){ assert(0); return false; }
//	const CField& field = world.GetField(id_field);
	const unsigned int nseg = this->m_aSegField.size();
	if( nseg == 0 )	return true;

    assert( nseg == 1 );

    MatVec::CVector_Blk& vec = m_ls.GetVector(iv1,0);
/*	std::vector< CVector_Blk* >* paVec1 = 0;
	if( iv1 >= 0 && iv1 < (int)this->GetTmpVectorArySize() ) paVec1 = &m_ls.m_TmpVectorArray[iv1];
	else if( iv1 == -1 ) paVec1 = &this->m_ls.m_Residual;
	else if( iv1 == -2 ) paVec1 = &this->m_ls.m_Update;
	else assert(0);*/


	// コーナー節点について値を更新
	{
		const CField& field = world.GetField(id_field);
		unsigned int id_na = field.GetNodeSegInNodeAry(CORNER).id_na_va;
		const CNodeAry& na = world.GetNA(id_na);
		const CNodeAry::CNodeSeg& ns = field.GetNodeSeg(CORNER,true,world,fdt);
		const unsigned int nblk = na.Size();
		const unsigned int nlen = ns.Length();
		double* val = new double [nlen];
		for(unsigned int iblk=0;iblk<nblk;iblk++){
			ns.GetValue(iblk,val);
			for(unsigned int ilen=0;ilen<nlen;ilen++){
				vec.SetValue(iblk,ilen,val[ilen]);
			}
		}
		delete[] val;
	}
	return true;
}
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:37,代码来源:linearsystem_fieldsave.cpp

示例7: if

bool CDrawerFace::Update
(const Fem::Field::CFieldWorld& world)
{
	const Fem::Field::CField& field = world.GetField(m_id_field);
	// set the vertex array
	unsigned int id_na_c_co = field.GetNodeSegInNodeAry(CORNER).id_na_co;
	assert( world.IsIdNA(id_na_c_co) );
	const Fem::Field::CNodeAry& na_c_co = world.GetNA(id_na_c_co);
  assert( field.IsNodeSeg(CORNER,false,world) );
	const Fem::Field::CNodeAry::CNodeSeg& ns_c_co = field.GetNodeSeg(CORNER,false,world);
	const unsigned int ndim = ns_c_co.Length();
	const unsigned int npoin_co = na_c_co.Size();
	unsigned int npoin;	
	{ // calc the number of point
		if( m_is_draw_nsv ){
			unsigned int id_na_c_val = field.GetNodeSegInNodeAry(CORNER).id_na_va;
			assert( world.IsIdNA(id_na_c_val) );
			const Fem::Field::CNodeAry& na_c_val = world.GetNA(id_na_c_val);
			npoin = na_c_val.Size();
		}
		else{ npoin = npoin_co; }
	}
//	std::cout << m_vertex_ary.NPoin() << " " << npoin << std::endl;
	assert( m_vertex_ary.NPoin() == npoin );

	if( !m_isnt_value_disp ){	// including displacement
		unsigned int id_na_c_val = field.GetNodeSegInNodeAry(CORNER).id_na_va;
		assert( world.IsIdNA(id_na_c_val) );
		const Fem::Field::CNodeAry& na_c_val = world.GetNA(id_na_c_val);
		const Fem::Field::CNodeAry::CNodeSeg& ns_c_val = field.GetNodeSeg(CORNER,true,world,VALUE|VELOCITY|ACCELERATION);
		if( ndim == 2 && (field.GetFieldType()==SCALAR||field.GetFieldType()==ZSCALAR) )	// 垂直方向の変位として捉える
		{
			assert( m_vertex_ary.NDim() == 3 );
			double coord[2], value[2];
			for(unsigned int ipoin=0;ipoin<npoin;ipoin++){
				unsigned int ipoin_co = field.GetMapVal2Co(ipoin);
				assert( ipoin_co < npoin_co );
				ns_c_val.GetValue(ipoin,value);
				ns_c_co.GetValue(ipoin_co,coord);
				this->m_vertex_ary.pVertexArray[ipoin*3+0] = coord[0];
				this->m_vertex_ary.pVertexArray[ipoin*3+1] = coord[1];
				this->m_vertex_ary.pVertexArray[ipoin*3+2] = value[0];
			}
		}
		else{
			assert( m_vertex_ary.NDim() == ndim );
			assert( ndim == ns_c_val.Length() ); // Coordの次元とValueの次元が合ってなければならない
			assert( npoin_co == na_c_co.Size() );
			assert( na_c_val.Size() == npoin );
			assert( ndim <= 3 );
			double coord[3], value[3];
			for(unsigned int ipoin=0;ipoin<npoin;ipoin++){
				unsigned int ipoin_co = field.GetMapVal2Co(ipoin);
				assert( ipoin_co < npoin_co );
				ns_c_val.GetValue(ipoin,value);
				ns_c_co.GetValue(ipoin_co,coord);
				for(unsigned int idim=0;idim<ndim;idim++){
					this->m_vertex_ary.pVertexArray[ipoin*ndim+idim] = coord[idim]+value[idim];
				}
			}
		}
	}
	else{		
		assert( m_vertex_ary.NDim() == ndim );
		for(unsigned int ipoin=0;ipoin<npoin;ipoin++){
			unsigned int ipoin_co = field.GetMapVal2Co(ipoin);
			assert( ipoin_co < npoin_co );
			double* pval = &this->m_vertex_ary.pVertexArray[ipoin*ndim];
			ns_c_co.GetValue(ipoin_co,pval);
		}
	}

	////////////////////////////////////////////////
	// make color
  
	if( world.IsIdField(id_field_val) )
	{
		const Fem::Field::CField& field_val = world.GetField(id_field_val);
		Fem::Field::FIELD_DERIVATION_TYPE fdt;
		{	// 描画する値の微分タイプ(できるだけVALUEを選択)
			unsigned int fdt_all = field_val.GetFieldDerivativeType();
			if(      fdt_all & VALUE        ){ fdt = VALUE; }
			else if( fdt_all & VELOCITY     ){ fdt = VELOCITY; }
			else if( fdt_all & ACCELERATION ){ fdt = ACCELERATION; }
			else{ assert(0); }
		}
		if( !color_map->IsMinMaxFix() ){	// 値の最大値最小値を求める
			double min_val, max_val;
			field_val.GetMinMaxValue(min_val,max_val,world,0,fdt);
			color_map->SetMinMax(min_val,max_val);
		}
		unsigned int id_na_c_val = field_val.GetNodeSegInNodeAry(CORNER).id_na_va;
		unsigned int id_na_b_val = field_val.GetNodeSegInNodeAry(BUBBLE).id_na_va;
		if(      world.IsIdNA(id_na_c_val) ){
			const CNodeAry::CNodeSeg& ns_v = field_val.GetNodeSeg(CORNER,true,world,fdt);
			double val[10];
			if( pColorArray == 0 ){ pColorArray = new float [npoin*4]; }
			for(unsigned int ipoin=0;ipoin<npoin;ipoin++){
				ns_v.GetValue(ipoin,val);
        color_map->GetColor(&pColorArray[ipoin*4],val[0]);
//.........这里部分代码省略.........
开发者ID:CrazyHeex,项目名称:delfem,代码行数:101,代码来源:drawer_field_face.cpp

示例8: if

bool View::CIndexArrayElem::SetColor
(unsigned int id_es_v, unsigned int id_ns_v, const Fem::Field::CFieldWorld& world,
 const std::auto_ptr<CColorMap>& color_map )
{
	if( itype == Fem::Field::TRI )	// TRI
	{
		if( !world.IsIdEA(id_ea) ) return false;
		const CElemAry& ea = world.GetEA(id_ea);
		if( !ea.IsSegID(id_es) ) return false;
		if( ea.ElemType() != TRI ) return false;
		const CElemAry::CElemSeg& es_v = ea.GetSeg(id_es_v);
//		assert( es_v.Size() == 1 );
		unsigned int id_na_v = es_v.GetIdNA();
		assert( world.IsIdNA(id_na_v) );
		const CNodeAry& na = world.GetNA(id_na_v);
		assert( es_v.GetMaxNoes() < na.Size() );
		assert( na.IsSegID(id_ns_v) );
		const CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_v);
		assert( ns.Length() == 1 );
		if( this->pColor == 0 ){ this->pColor = new float [nElem*3]; }
		for(unsigned int itri=0;itri<nElem;itri++){
			unsigned int inode0;
			es_v.GetNodes(itri,&inode0);
			double val;
			ns.GetValue(inode0,&val);
			color_map->GetColor(pColor+itri*3,val);
		}
		return true;
	}
	else if( itype == Fem::Field::QUAD )
	{
		if( !world.IsIdEA(id_ea) ) return false;
		const CElemAry& ea = world.GetEA(id_ea);
		if( !ea.IsSegID(id_es) ) return false;
		if( ea.ElemType() != QUAD ) return false;
		const CElemAry::CElemSeg& es_v = ea.GetSeg(id_es_v);
		assert( es_v.Length() == 1 );
		unsigned int id_na_v = es_v.GetIdNA();
		assert( world.IsIdNA(id_na_v) );
		const CNodeAry& na = world.GetNA(id_na_v);
		assert( es_v.GetMaxNoes() < na.Size() );
		assert( na.IsSegID(id_ns_v) );
		const CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_v);
		assert( ns.Length() == 1 );
		if( this->pColor == 0 ){ this->pColor = new float [nElem*3]; }
		for(unsigned int iquad=0;iquad<nElem;iquad++){
			unsigned int inode0;
			es_v.GetNodes(iquad,&inode0);
			double val;
			ns.GetValue(inode0,&val);
			color_map->GetColor(pColor+iquad*3,val);
		}
		return true;
	}
	else if( itype == Fem::Field::TET )
	{
		if( !world.IsIdEA(id_ea) ) return false;
		const CElemAry& ea = world.GetEA(id_ea);
		const unsigned int ntet = ea.Size();
		if( !ea.IsSegID(id_es) ) return false;
		if( ea.ElemType() != TET ) return false;
		const CElemAry::CElemSeg& es_v = ea.GetSeg(id_es_v);
		assert( es_v.Length() == 1 );
		unsigned int id_na_v = es_v.GetIdNA();
		assert( world.IsIdNA(id_na_v) );
		const CNodeAry& na = world.GetNA(id_na_v);
		assert( es_v.GetMaxNoes() < na.Size() );
		assert( na.IsSegID(id_ns_v) );
		const CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_v);
		assert( ns.Length() == 1 );
		if( this->pColor == 0 ){ this->pColor = new float [nElem*3]; }
		for(unsigned int iface=0;iface<nElem;iface++){
			unsigned int itet = aIndElem[iface];
			assert( itet < ntet );
			unsigned int inode0;
			es_v.GetNodes(itet,&inode0);
			double val;
			ns.GetValue(inode0,&val);
			color_map->GetColor(pColor+iface*3,val);
		}
		return true;
	}
	else if( itype == Fem::Field::HEX )
	{	
		if( !world.IsIdEA(id_ea) ) return false;
		const CElemAry& ea = world.GetEA(id_ea);
		const unsigned int nhex = ea.Size();
		if( !ea.IsSegID(id_es) ) return false;
		if( ea.ElemType() != HEX ) return false;
		const CElemAry::CElemSeg& es_v = ea.GetSeg(id_es_v);
		assert( es_v.Length() == 1 );
		unsigned int id_na_v = es_v.GetIdNA();
		assert( world.IsIdNA(id_na_v) );
		const CNodeAry& na = world.GetNA(id_na_v);
		assert( es_v.GetMaxNoes() < na.Size() );
		assert( na.IsSegID(id_ns_v) );
		const CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_v);
		assert( ns.Length() == 1 );
		if( this->pColor == 0 ){ this->pColor = new float [nElem*3]; }
		for(unsigned int iface=0;iface<nElem;iface++){
//.........这里部分代码省略.........
开发者ID:gabriel-tandil,项目名称:SENSITIVE_COUTURE,代码行数:101,代码来源:drawer_field.cpp

示例9: assert

// ÉXÉJÉâÅ[ÇÃâûóÕëäìñílÇí«â¡Ç∑ÇÈÅDǪÇÃǧÇøÉÇÅ[ÉhÇǬÇØÇÈ
// mode = 0 : É~Å[É[ÉX
// mode = 1 : ç≈ëÂâûóÕ
// äÙâΩäwìIÇ»îÒê¸å`ê´Ççló∂Ç∑ÇÈǩǫǧǩÇÕÅCEqnObjÇå©ÇƒåàÇflÇÈÇÊǧDžÇ∑ÇÈ
bool CEqnSystem_Solid2D::SetEquivStressValue(unsigned int id_field_str, Fem::Field::CFieldWorld& world)
{	
	if( !world.IsIdField(id_field_str) ) return false;
	Fem::Field::CField& field_str = world.GetField(id_field_str);
	if( field_str.GetFieldType() != SCALAR ) return false;

	if( !world.IsIdField(m_IdFieldDisp) ) return false;
	Fem::Field::CField& field_dis = world.GetField(m_IdFieldDisp);

	const std::vector<unsigned int>& aIdEA_from = field_dis.GetAryIdEA();
	const std::vector<unsigned int>& aIdEA_to   = field_str.GetAryIdEA();
	if( aIdEA_from.size() != aIdEA_to.size() ) return false;

	const unsigned int niea = aIdEA_from.size();
	for(unsigned int iiea=0;iiea<niea;iiea++)
	{
		Fem::Field::INTERPOLATION_TYPE type_from, type_to;
		{
			if( aIdEA_from[iiea] != aIdEA_to[iiea] ){
				assert(0);
				return false;
			}
			const unsigned int id_ea = aIdEA_from[iiea];
			type_from = field_dis.GetInterpolationType(id_ea,world);
			type_to   = field_str.GetInterpolationType(id_ea,world);
		}

		unsigned int nnoes, ndim;
		if( type_from==TRI11 && type_to==TRI1001 ){
			nnoes = 3; ndim = 2;
		}
		else{
			std::cout << "Error!-->Not Implimented!" << std::endl;
			std::cout << type_from << " " << type_to << std::endl;
			assert(0);
			getchar();
		}

		unsigned int id_ea = aIdEA_to[iiea];
		const CElemAry& ea = world.GetEA(id_ea);
		const CElemAry::CElemSeg& es_c_co = field_dis.GetElemSeg(id_ea,CORNER,false,world);
		const CElemAry::CElemSeg& es_c_va = field_dis.GetElemSeg(id_ea,CORNER,true, world);
		const CElemAry::CElemSeg& es_b_va = field_str.GetElemSeg(id_ea,BUBBLE,true, world);

		Fem::Field::CField::CNodeSegInNodeAry nans_c = field_dis.GetNodeSegInNodeAry(CORNER);
		assert( world.IsIdNA(nans_c.id_na_co) );
		assert( world.IsIdNA(nans_c.id_na_va) );
		const CNodeAry& na_c_co = world.GetNA( nans_c.id_na_co);
		const CNodeAry::CNodeSeg& ns_c_co = na_c_co.GetSeg( nans_c.id_ns_co);
		const CNodeAry& na_c_va = world.GetNA( nans_c.id_na_va);
		const CNodeAry::CNodeSeg& ns_c_va = na_c_va.GetSeg( nans_c.id_ns_va);

		Fem::Field::CField::CNodeSegInNodeAry nans_b = field_str.GetNodeSegInNodeAry(BUBBLE);
		unsigned int id_na_b_va = nans_b.id_na_va;
		unsigned int id_ns_b_va = nans_b.id_ns_va;

		assert( world.IsIdNA(id_na_b_va) );
		CNodeAry& na_b_va = world.GetNA(id_na_b_va);
		CNodeAry::CNodeSeg& ns_b_va = na_b_va.GetSeg(id_ns_b_va);

    const unsigned int nnoes_c = es_c_co.Length();
    assert( nnoes_c < 64 );
		unsigned int noes[64];
    const CEqn_Solid2D& eqn = this->GetEquation(id_ea);
		for(unsigned int ielem=0;ielem<ea.Size();ielem++){
			////////////////
			double coord[16][3];
			// ç¿ïW(coord)Ç∆íl(value)ÇçÏÇÈ
			es_c_co.GetNodes(ielem,noes);
			for(unsigned int inoes=0;inoes<nnoes;inoes++){
				unsigned int ipoi0 = noes[inoes];
				assert( ipoi0 < na_c_co.Size() );
				ns_c_co.GetValue(ipoi0,coord[inoes]);
			}
			////////////////
			double disp[16][3];	// êflì_ïœà 
			es_c_va.GetNodes(ielem,noes);
			for(unsigned int inoes=0;inoes<nnoes;inoes++){
				unsigned int ipoi0 = noes[inoes];
				assert( ipoi0 < na_c_va.Size() );
				for(unsigned int idim=0;idim<ndim;idim++){
					ns_c_va.GetValue(ipoi0,disp[inoes]);
				}
			}
			////////////////
			double dudx[2][2];	// ïœå`å˘îz
			if( type_from == TRI11 ){
				double dldx[3][2];
				double const_term[3];
				TriDlDx(dldx,const_term, coord[0],coord[1],coord[2]);
				for(unsigned int i=0;i<ndim*ndim;i++){ (&dudx[0][0])[i] = 0.0; }
				for(unsigned int knoes=0;knoes<nnoes;knoes++){
					dudx[0][0] += disp[knoes][0]*dldx[knoes][0];
					dudx[0][1] += disp[knoes][0]*dldx[knoes][1];
					dudx[1][0] += disp[knoes][1]*dldx[knoes][0];
					dudx[1][1] += disp[knoes][1]*dldx[knoes][1];
//.........这里部分代码省略.........
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:101,代码来源:eqnsys_solid.cpp

示例10: if

//! set mathematical expression to the field
bool Fem::Field::SetFieldValue_MathExp
(unsigned int id_field_to, unsigned int idofns, Fem::Field::FIELD_DERIVATION_TYPE fdt, 
 Fem::Field::CFieldWorld& world,
 std::string math_exp, double t)
{
  Fem::Field::CField& field = world.GetField(id_field_to);
  
	if( idofns >= field.GetNLenValue() ) return false;
	if( !(field.GetFieldDerivativeType() & fdt) ) return false;
  
  const std::vector<unsigned int>& aIdEA = field.GetAryIdEA();  
  
  if( field.GetNodeSegInNodeAry(CORNER).id_na_va != 0 ){
    CEval eval;
    {
      eval.SetKey("x",0.0 );
      eval.SetKey("y",0.0 );
      eval.SetKey("z",0.0 );
      eval.SetKey("t",t   );
      if( !eval.SetExp(math_exp) ) return false;
    }
    const CField::CNodeSegInNodeAry& nsna = field.GetNodeSegInNodeAry(CORNER);
    assert( world.IsIdNA(nsna.id_na_va) );
    CNodeAry& na_va = world.GetNA(nsna.id_na_va);	
    unsigned int id_ns_va;
    {
      if(      fdt & VALUE        ) id_ns_va = nsna.id_ns_va;
      else if( fdt & VELOCITY     ) id_ns_va = nsna.id_ns_ve;
      else if( fdt & ACCELERATION ) id_ns_va = nsna.id_ns_ac;
      else{ assert(0); }
      assert( na_va.IsSegID(id_ns_va) );
      const CNodeAry::CNodeSeg& ns = na_va.GetSeg(id_ns_va);
      assert( idofns < ns.Length() );
    }
    assert( na_va.IsSegID(id_ns_va) );
    CNodeAry::CNodeSeg& ns_va = na_va.GetSeg(id_ns_va);
    assert( world.IsIdNA(nsna.id_na_co) );
    CNodeAry& na_co = world.GetNA(nsna.id_na_co);
    unsigned int id_ns_co = nsna.id_ns_co;
    assert( na_co.IsSegID(id_ns_co) );
    const CNodeAry::CNodeSeg& ns_co = na_co.GetSeg(id_ns_co);
    const unsigned int ndim = field.GetNDimCoord();
    assert( ns_co.Length() == ndim );
    assert( ndim <= 3 );
    double coord[3];
    if( !field.IsPartial() ){	// 親フィールドなら節点を全部参照している。
      for(unsigned int inode=0;inode<na_va.Size();inode++){
        unsigned int inode_co = field.GetMapVal2Co(inode);
        ns_co.GetValue(inode_co,coord);
        switch(ndim){
          case 3: eval.SetKey("z",coord[2]);
          case 2: eval.SetKey("y",coord[1]);
          case 1: eval.SetKey("x",coord[0]);
            break;
          default:
            assert(0);
            break;
        }
        double val = eval.Calc();
        ns_va.SetValue(inode,idofns,val);
      }
    }
    else{	// 要素に参照される節点だけを指している。
      for(unsigned int iei=0;iei<aIdEA.size();iei++){
        unsigned int id_ea = aIdEA[iei];          
        CElemAry& ea = world.GetEA(id_ea);
        unsigned int id_es_c_va = field.GetIdElemSeg(id_ea,CORNER,true,world);
        assert( ea.IsSegID(id_es_c_va) );
        const CElemAry::CElemSeg& es_c_va = ea.GetSeg(id_es_c_va);
        const unsigned int nnoes = es_c_va.Length();
        unsigned int noes[16];
        for(unsigned int ielem=0;ielem<ea.Size();ielem++){
          es_c_va.GetNodes(ielem,noes);
          for(unsigned int inoes=0;inoes<nnoes;inoes++){
            const unsigned int inode0 = noes[inoes];
            unsigned int inode_co0 = field.GetMapVal2Co(inode0);
            ns_co.GetValue(inode_co0,coord);
            switch(ndim){
              case 3: eval.SetKey("z",coord[2]);
              case 2: eval.SetKey("y",coord[1]);
              case 1: eval.SetKey("x",coord[0]);
                break;
              default:
                assert(0);
                break;
            }
            double val = eval.Calc();
            ns_va.SetValue(inode0,idofns,val);
          }
        }
      }
    }
  }
  ////////////////////////////////
  if( field.GetNodeSegInNodeAry(BUBBLE).id_na_va != 0 ){		
    CEval eval;
    {
      eval.SetKey("x",0.0 );
      eval.SetKey("y",0.0 );
//.........这里部分代码省略.........
开发者ID:ryujimiya,项目名称:delfem4net,代码行数:101,代码来源:field_value_setter.cpp

示例11: UpdateValueOfField

bool CZLinearSystem::UpdateValueOfField( 
	unsigned int id_field, Fem::Field::CFieldWorld& world, Fem::Field::FIELD_DERIVATION_TYPE fdt )
{
	if( !world.IsIdField(id_field) ) return false;
	const CField& field = world.GetField(id_field);
	{
		unsigned int id_na_val=0, id_ns_val=0;
		{	// CORNERについて更新
			const CField::CNodeSegInNodeAry& nsna_c = field.GetNodeSegInNodeAry(CORNER);
			id_na_val = nsna_c.id_na_va;
			if(      fdt == VALUE )        id_ns_val = nsna_c.id_ns_va;
			else if( fdt == VELOCITY )     id_ns_val = nsna_c.id_ns_ve;
			else if( fdt == ACCELERATION ) id_ns_val = nsna_c.id_ns_ac;
			else{ assert(0); }
		}
		if( id_na_val != 0 ){
			CZVector_Blk* m_Update = this->GetUpdatePtr(id_field,CORNER,world);
			assert( m_Update != 0 );
			CNodeAry& na = world.GetNA(id_na_val);
			assert( na.IsSegID(id_ns_val) );
			na.AddValueToNodeSegment(id_ns_val,*m_Update,1.0);
//			CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_val);
		}
	}
	{
		unsigned int id_na_val=0, id_ns_val=0;
		{	// EDGEについて更新
			const CField::CNodeSegInNodeAry& nsna_c = field.GetNodeSegInNodeAry(EDGE);
			id_na_val = nsna_c.id_na_va;
			if(      fdt == VALUE )        id_ns_val = nsna_c.id_ns_va;
			else if( fdt == VELOCITY )     id_ns_val = nsna_c.id_ns_ve;
			else if( fdt == ACCELERATION ) id_ns_val = nsna_c.id_ns_ac;
			else{ assert(0); }
		}
		if( id_na_val != 0 ){
			CZVector_Blk* m_Update = this->GetUpdatePtr(id_field,EDGE,world);
			assert( m_Update != 0 );
			CNodeAry& na = world.GetNA(id_na_val);
			assert( na.IsSegID(id_ns_val) );
			na.AddValueToNodeSegment(id_ns_val,*m_Update,1.0);
//			CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_val);
//			ns.is_updated = true;
		}
	}
	{
		unsigned int id_na_val=0, id_ns_val=0;
		{	// BUBBLEについて更新
			const CField::CNodeSegInNodeAry& nsna_c = field.GetNodeSegInNodeAry(BUBBLE);
			id_na_val = nsna_c.id_na_va;
			if(      fdt == VALUE )        id_ns_val = nsna_c.id_ns_va;
			else if( fdt == VELOCITY )     id_ns_val = nsna_c.id_ns_ve;
			else if( fdt == ACCELERATION ) id_ns_val = nsna_c.id_ns_ac;
			else{ assert(0); }
		}
		if( id_na_val != 0 ){
			CZVector_Blk* m_Update = this->GetUpdatePtr(id_field,BUBBLE,world);
			assert( m_Update != 0 );
			CNodeAry& na = world.GetNA(id_na_val);
			assert( na.IsSegID(id_ns_val) );
			na.AddValueToNodeSegment(id_ns_val,*m_Update,1.0);
//			CNodeAry::CNodeSeg& ns = na.GetSeg(id_ns_val);
//			ns.is_updated = true;
		}
	}
	return true;
}
开发者ID:gabriel-tandil,项目名称:SENSITIVE_COUTURE,代码行数:66,代码来源:zlinearsystem.cpp


注:本文中的fem::field::CFieldWorld::GetNA方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。