예제 #1
0
파일: scene.cpp 프로젝트: speakman/qlc
void Scene::arm()
{
	m_channels.clear();

	/* Scenes cannot run unless they are children of Doc */
	Doc* doc = qobject_cast <Doc*> (parent());
	Q_ASSERT(doc != NULL);

	/* Get exact address numbers from fixtures and fixate them to this
	   scene for running. */
	QListIterator <SceneValue> it(m_values);
	while (it.hasNext() == true)
	{
		SceneValue scv(it.next());

		Fixture* fxi = doc->fixture(scv.fxi);
		Q_ASSERT(fxi != NULL);

		SceneChannel channel;
		channel.address = fxi->universeAddress() + scv.channel;
		channel.target = scv.value;

		m_channels.append(channel);
	}
}
예제 #2
0
파일: scene.cpp 프로젝트: Unknownly/qlcplus
uchar Scene::value(quint32 fxi, quint32 ch)
{
    SceneValue scv(fxi, ch, 0);
    int index = m_values.indexOf(scv);
    if (index == -1)
        return 0;
    else
        return m_values.at(index).value;
}
예제 #3
0
파일: scene.cpp 프로젝트: speakman/qlc
t_value Scene::value(t_fixture_id fxi, t_channel ch)
{
	SceneValue scv(fxi, ch, 0);
	int index = m_values.indexOf(scv);
	if (index == -1)
		return 0;
	else
		return m_values.at(index).value;
}
예제 #4
0
파일: chaserstep.cpp 프로젝트: fx5/qlcplus
bool ChaserStep::saveXML(QDomDocument* doc, QDomElement* root, int stepNumber, bool isSequence) const
{
    QDomElement tag;
    QDomText text;

    /* Step tag */
    tag = doc->createElement(KXMLQLCFunctionStep);
    root->appendChild(tag);

    /* Step number */
    tag.setAttribute(KXMLQLCFunctionNumber, stepNumber);

    /* Speeds */
    tag.setAttribute(KXMLQLCFunctionSpeedFadeIn, fadeIn);
    tag.setAttribute(KXMLQLCFunctionSpeedHold, hold);
    tag.setAttribute(KXMLQLCFunctionSpeedFadeOut, fadeOut);
    //tag.setAttribute(KXMLQLCFunctionSpeedDuration, duration); // deprecated from version 4.3.1
    if (note.isEmpty() == false)
        tag.setAttribute(KXMLQLCStepNote, note);

    if (isSequence)
    {
        /* it's a sequence step. Save values accordingly */
        tag.setAttribute(KXMLQLCSequenceSceneValues, values.count());
        QListIterator <SceneValue> it(values);
        QString stepValues;
        while (it.hasNext() == true)
        {
            SceneValue scv(it.next());
            if (scv.value != 0)
            {
                if (stepValues.isEmpty() == false)
                    stepValues.append(QString(","));
                stepValues.append(QString("%1,%2,%3").arg(scv.fxi).arg(scv.channel).arg(scv.value));
            }
        }
        if (stepValues.isEmpty() == false)
        {
            text = doc->createTextNode(stepValues);
            tag.appendChild(text);
        }
    }
    else
    {
        /* Step function ID */
        text = doc->createTextNode(QString::number(fid));
        tag.appendChild(text);
    }

    return true;
}
예제 #5
0
    void findImplicit(AstNodeAssign* nodep) {
	if (m_assignp) nodep->v3fatalSrc("Found a NodeAssign under another NodeAssign");
	m_assignp = nodep;
	m_assignError = false;
	m_extend = false;
	nodep->user1(true);
	// Record the LHS Var so we can check if the Var on the RHS is the same
	m_lhsVarRefp = findVarRefRecurse(nodep->lhsp());
	if (!m_lhsVarRefp) nodep->v3fatalSrc("Couldn't find a VarRef on the LHSP of an Assign");
	// Iterate children looking for ArraySel nodes. From that we get the number of elements
	// in the array so we know how many times we need to clone this assignment.
	nodep->iterateChildren(*this);
	if (nodep->user2() > 1) SliceCloneVisitor scv(nodep);
	m_assignp = NULL;
    }
예제 #6
0
파일: scene.cpp 프로젝트: speakman/qlc
bool Scene::loadXML(const QDomElement* root)
{
	QString str;

	QDomNode node;
	QDomElement tag;

	Q_ASSERT(root != NULL);

	if (root->tagName() != KXMLQLCFunction)
	{
		qWarning("Function node not found!");
		return false;
	}

	/* Load scene contents */
	node = root->firstChild();
	while (node.isNull() == false)
	{
		tag = node.toElement();

		if (tag.tagName() == KXMLQLCBus)
		{
			/* Bus */
			str = tag.attribute(KXMLQLCBusRole);
			Q_ASSERT(str == KXMLQLCBusFade);

			setBus(tag.text().toUInt());
		}
		else if (tag.tagName() == KXMLQLCFunctionValue)
		{
			/* Channel value */
			SceneValue scv(&tag);
			if (scv.isValid() == true)
				setValue(scv);
		}
		else
		{
			qWarning() << "Unknown scene tag:" << tag.tagName();
		}

		node = node.nextSibling();
	}

	return true;
}
예제 #7
0
void SceneValue_Test::save()
{
	QDomDocument doc;
	QDomElement root;
	QDomElement tag;

	root = doc.createElement("Test");

	SceneValue scv(4, 8, 16);
	QVERIFY(scv.saveXML(&doc, &root) == true);

	tag = root.firstChild().toElement();
	QVERIFY(tag.tagName() == "Value");
	QVERIFY(tag.attribute("Fixture").toInt() == 4);
	QVERIFY(tag.attribute("Channel").toInt() == 8);
	QVERIFY(tag.text().toInt() == 16);
}
예제 #8
0
void ChannelsGroup::slotFixtureRemoved(quint32 fixtureId)
{
    bool hasChanged = false;

    QMutableListIterator<SceneValue> channelsIt(m_channels);
    while (channelsIt.hasNext())
    {
        SceneValue scv(channelsIt.next());
        if (scv.fxi == fixtureId)
        {
            channelsIt.remove();
            hasChanged = true;
        }
    }

    if (hasChanged)
        emit changed(this->id());
}
bool PhraseDictionaryMemory::Load(const std::vector<FactorType> &input
                                  , const std::vector<FactorType> &output
                                  , const string &filePath
                                  , const vector<float> &weight
                                  , size_t tableLimit
                                  , const LMList &languageModels
                                  , float weightWP)
{
    const StaticData &staticData = StaticData::Instance();

    m_tableLimit = tableLimit;


    // data from file
    InputFileStream inFile(filePath);

    // create hash file if necessary
    ofstream tempFile;
    string tempFilePath;

    vector< vector<string> >	phraseVector;
    string line, prevSourcePhrase = "";
    size_t count = 0;
    size_t line_num = 0;
    size_t numElement = NOT_FOUND; // 3=old format, 5=async format which include word alignment info

    while(getline(inFile, line))
    {
        ++line_num;
        vector<string> tokens = TokenizeMultiCharSeparator( line , "|||" );

        if (numElement == NOT_FOUND)
        {   // init numElement
            numElement = tokens.size();
            assert(numElement >= 3);
            // extended style: source ||| target ||| scores ||| [alignment] ||| [counts]
        }

        if (tokens.size() != numElement)
        {
            stringstream strme;
            strme << "Syntax error at " << filePath << ":" << line_num;
            UserMessage::Add(strme.str());
            abort();
        }

        const string &sourcePhraseString=tokens[0]
                                         ,&targetPhraseString=tokens[1]
                                                 ,&scoreString = tokens[2];

        bool isLHSEmpty = (sourcePhraseString.find_first_not_of(" \t", 0) == string::npos);
        if (isLHSEmpty && !staticData.IsWordDeletionEnabled()) {
            TRACE_ERR( filePath << ":" << line_num << ": pt entry contains empty target, skipping\n");
            continue;
        }

        const std::string& factorDelimiter = StaticData::Instance().GetFactorDelimiter();
        if (sourcePhraseString != prevSourcePhrase)
            phraseVector = Phrase::Parse(sourcePhraseString, input, factorDelimiter);

        vector<float> scoreVector = Tokenize<float>(scoreString);
        if (scoreVector.size() != m_numScoreComponent)
        {
            stringstream strme;
            strme << "Size of scoreVector != number (" <<scoreVector.size() << "!=" <<m_numScoreComponent<<") of score components on line " << line_num;
            UserMessage::Add(strme.str());
            abort();
        }

        // source
        Phrase sourcePhrase(Input);
        sourcePhrase.CreateFromString( input, phraseVector);
        //target
        TargetPhrase targetPhrase(Output);
        targetPhrase.SetSourcePhrase(&sourcePhrase);
        targetPhrase.CreateFromString( output, targetPhraseString, factorDelimiter);

        if (tokens.size() > 3)
            targetPhrase.SetAlignmentInfo(tokens[3]);

        // component score, for n-best output
        std::vector<float> scv(scoreVector.size());
        std::transform(scoreVector.begin(),scoreVector.end(),scv.begin(),TransformScore);
        std::transform(scv.begin(),scv.end(),scv.begin(),FloorScore);
        targetPhrase.SetScore(m_feature, scv, weight, weightWP, languageModels);

        AddEquivPhrase(sourcePhrase, targetPhrase);

        count++;
    }

    // sort each target phrase collection
    m_collection.Sort(m_tableLimit);

    return true;
}
예제 #10
0
void SceneEditor::init()
{
    QToolBar* toolBar;

    /* Actions */
    m_enableCurrentAction = new QAction(QIcon(":/check.png"),
                                        tr("Enable all channels in current fixture"), this);
    m_disableCurrentAction = new QAction(QIcon(":/uncheck.png"),
                                         tr("Disable all channels in current fixture"), this);
    m_copyAction = new QAction(QIcon(":/editcopy.png"),
                               tr("Copy current values to clipboard"), this);
    m_pasteAction = new QAction(QIcon(":/editpaste.png"),
                                tr("Paste clipboard values to current fixture"), this);
    m_copyToAllAction = new QAction(QIcon(":/editcopyall.png"),
                                    tr("Copy current values to all fixtures"), this);
    m_colorToolAction = new QAction(QIcon(":/color.png"),
                                    tr("Color tool for CMY/RGB-capable fixtures"), this);

    connect(m_enableCurrentAction, SIGNAL(triggered(bool)),
            this, SLOT(slotEnableCurrent()));
    connect(m_disableCurrentAction, SIGNAL(triggered(bool)),
            this, SLOT(slotDisableCurrent()));
    connect(m_copyAction, SIGNAL(triggered(bool)),
            this, SLOT(slotCopy()));
    connect(m_pasteAction, SIGNAL(triggered(bool)),
            this, SLOT(slotPaste()));
    connect(m_copyToAllAction, SIGNAL(triggered(bool)),
            this, SLOT(slotCopyToAll()));
    connect(m_colorToolAction, SIGNAL(triggered(bool)),
            this, SLOT(slotColorTool()));

    /* Toolbar */
    toolBar = new QToolBar(this);
    layout()->setMenuBar(toolBar);
    toolBar->addAction(m_enableCurrentAction);
    toolBar->addAction(m_disableCurrentAction);
    toolBar->addSeparator();
    toolBar->addAction(m_copyAction);
    toolBar->addAction(m_pasteAction);
    toolBar->addAction(m_copyToAllAction);
    toolBar->addSeparator();
    toolBar->addAction(m_colorToolAction);

    /* Tab widget */
    connect(m_tab, SIGNAL(currentChanged(int)),
            this, SLOT(slotTabChanged(int)));

    /* Add & remove buttons */
    connect(m_addFixtureButton, SIGNAL(clicked()),
            this, SLOT(slotAddFixtureClicked()));
    connect(m_removeFixtureButton, SIGNAL(clicked()),
            this, SLOT(slotRemoveFixtureClicked()));

    m_nameEdit->setText(m_scene->name());
    connect(m_nameEdit, SIGNAL(textEdited(const QString&)),
            this, SLOT(slotNameEdited(const QString&)));
    slotNameEdited(m_scene->name());

    /* Bus */
    connect(m_busCombo, SIGNAL(activated(int)),
            this, SLOT(slotBusComboActivated(int)));
    fillBusCombo();

    m_initializing = true;

    QListIterator <SceneValue> it(m_scene->values());
    while (it.hasNext() == true)
    {
        SceneValue scv(it.next());

        if (fixtureItem(scv.fxi) == NULL)
        {
            Fixture* fixture = _app->doc()->fixture(scv.fxi);
            if (fixture == NULL)
                continue;

            addFixtureItem(fixture);
            addFixtureTab(fixture);
        }

        setSceneValue(scv);
    }

    m_initializing = false;
}
예제 #11
0
void DimCRFVGeometry<TDim, TWorldDim>::
update_hanging(GridObject* pElem, const MathVector<worldDim>* vCornerCoords, const ISubsetHandler* ish,bool keepSCV,bool keepSCVF)
{
// 	If already update for this element, do nothing
	if(m_pElem == pElem) return; else m_pElem = pElem;
	
//  get grid
	Grid& grid = *(ish->grid());

//	refresh local data, if different roid given
	if(m_roid != pElem->reference_object_id())
	{
	//	remember new roid
		m_roid = (ReferenceObjectID) pElem->reference_object_id();

	//	update local data
		update_local_data();
		
		m_numDofs	= num_scv();
	}
	
	const LocalShapeFunctionSet<dim>& rTrialSpace =
				LocalFiniteElementProvider::get<dim>(m_roid, LFEID(LFEID::CROUZEIX_RAVIART, dim, 1));

	//  compute barycenter coordinates
	globalBary = vCornerCoords[0];
	for (size_t j=1;j<m_rRefElem.num(0);j++){
	   globalBary+=vCornerCoords[j];
	}
	globalBary*=1./(number)m_rRefElem.num(0);

// 	compute global informations for scvf
	for(size_t i = 0; i < num_scvf(); ++i)
	{
		for (size_t j=0;j<m_vSCVF[i].numCo-1;j++){
			m_vSCVF[i].vGloPos[j]=vCornerCoords[m_rRefElem.id(dim-2,i,0,j)];
		}
		m_vSCVF[i].vGloPos[m_vSCVF[i].numCo-1]=globalBary;
		AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, m_vSCVF[i].numCo);
		ElementNormal<face_type0,worldDim>(m_vSCVF[i].Normal,m_vSCVF[i].vGloPos);// face_type0 identical to scvf type
	}

// 	compute size of scv
	for(size_t i = 0; i < num_scv(); ++i)
	{
		// side nodes in reverse order to fulfill standard element order
		for (int j=0;j<m_vSCV[i].numCorners-1;j++){
			m_vSCV[i].vGloPos[m_vSCV[i].numCorners-2-j]=vCornerCoords[m_rRefElem.id(dim-1,i,0,j)];
		}
		AveragePositions(m_vGlobUnkCoords[i], m_vSCV[i].vGloPos, m_vSCV[i].numCorners-1);
		m_vSCV[i].vGlobIP = m_vGlobUnkCoords[i];
		
		m_vSCV[i].vGloPos[m_vSCV[i].numCorners-1]=globalBary;
		// 	compute volume of scv and normal to associated element face
		//CRSCVSizeAndNormal<dim>(m_vSCV[i].Vol,m_vSCV[i].Normal,m_vSCV[i].vGloPos,m_vSCV[i].numCorners);
		if (m_vSCV[i].numCorners-1==dim){
		     m_vSCV[i].Vol = ElementSize<scv_type0,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type0, worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		} else { // m_vSCV[i].numCorners-2==dim , only possible in 3d (pyramid)
		     m_vSCV[i].Vol = ElementSize<scv_type1,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type1,worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		};
		// nodes are in reverse order therefore reverse sign to get outward normal
		m_vSCV[i].Normal*=-1;
	}
	
	//	get reference mapping
	DimReferenceMapping<dim, worldDim>& rMapping = ReferenceMappingProvider::get<dim, worldDim>(m_roid);
	rMapping.update(vCornerCoords);
	
	//  check for hanging nodes
	if (dim==2){
		std::vector<Edge*> vEdges;
		CollectEdgesSorted(vEdges, grid, pElem);
		for(size_t side = 0; side < vEdges.size(); ++side){
			ConstrainingEdge* constrainingObj = dynamic_cast<ConstrainingEdge*>(vEdges[side]);
			if(constrainingObj == NULL) continue;
			
			// found constraining edge
			MathVector<worldDim> globalMidpoint = m_vSCV[side].vGlobIP;
			MathVector<dim> localMidpoint = m_vSCV[side].vLocIP;
			// get edge corners
			size_t edgeCo[2];
			for (size_t j=0;j<2;j++) edgeCo[j] = m_rRefElem.id(1,side,0,j);
			// compute dof positions on constraining edge,
			// replace dof "side" with first and insert second at the end
			// set up new scvs
			// keepSCV parameter specifies if scv "side" gets replaced by new one
			size_t ind=side;
			size_t keepOffset=0;
			MathVector<worldDim> normal = m_vSCV[side].Normal;
			normal*=0.5;
			number vol    = 0.5*m_vSCV[side].Vol;
 			if (keepSCV){ 
				ind=m_numSCV+1;
				keepOffset=1;
			}
			for (int d=0;d<worldDim;d++)
				m_vGlobUnkCoords[ind][d] = 0.5 * (vCornerCoords[edgeCo[0]][d] + globalMidpoint[d]);
			for (int d=0;d<dim;d++)
				m_vLocUnkCoords[ind][d] = 0.5 * (m_rRefElem.corner(edgeCo[0])[d] + localMidpoint[d]);
			for (int d=0;d<worldDim;d++)
				m_vGlobUnkCoords[m_numSCV][d] = 0.5 * (vCornerCoords[edgeCo[1]][d] + globalMidpoint[d]);
			for (int d=0;d<dim;d++)
				m_vLocUnkCoords[m_numSCV][d] = 0.5 * (m_rRefElem.corner(edgeCo[1])[d] + localMidpoint[d]);
			// handle corresponding scvfs
			// if keepSCVF copy them into constrained scvf array
			if (keepSCVF){
				for (size_t j=0;j<2;j++){
					m_vConstrainedSCVF[m_numConstrainedSCVF+j] = m_vSCVF[edgeCo[j]];
					if (m_vConstrainedSCVF[edgeCo[j]].To==side){
						m_vConstrainedSCVF[edgeCo[j]].From=side;
						m_vConstrainedSCVF[edgeCo[j]].Normal*=-1;
					}
				}
				m_numConstrainedSCVF += 2;
			}
			for (size_t j=0;j<2;j++){
				if (m_vSCVF[edgeCo[j]].From==side) m_vSCVF[edgeCo[j]].From=m_numDofs+j;
				if (m_vSCVF[edgeCo[j]].To==side) m_vSCVF[edgeCo[j]].To=m_numDofs+j;
			}
			m_vSCV[ind].Normal = normal;
			m_vSCV[ind].Vol = vol;
			m_vSCV[ind].nodeID = m_numDofs;
			m_vSCV[ind].vGlobIP = m_vGlobUnkCoords[ind];
			m_vSCV[ind].vLocIP = m_vLocUnkCoords[ind];
			m_vSCV[ind].numSH = rTrialSpace.num_sh();
			m_vSCV[ind].vGloPos[0]=vCornerCoords[edgeCo[0]];
			m_vSCV[ind].vGloPos[1]=globalMidpoint;
			m_vSCV[ind].vGloPos[2]=globalBary;
			m_vSCV[ind].vLocPos[0]=m_rRefElem.corner(edgeCo[0]);
			m_vSCV[ind].vLocPos[1]=localMidpoint;
			m_vSCV[ind].vLocPos[2]=localBary;
			m_vSCV[ind].numCorners = 3;
			rTrialSpace.shapes(&(m_vSCV[ind].vShape[0]), m_vSCV[ind].local_ip());
			rTrialSpace.grads(&(m_vSCV[ind].vLocalGrad[0]), m_vSCV[ind].local_ip());
			// second scv inserted at the end
			m_vSCV[m_numSCV].Normal = normal;
			m_vSCV[m_numSCV].Vol = vol;
			m_vSCV[m_numSCV].nodeID = m_numDofs+1;
			m_vSCV[m_numSCV].vGlobIP = m_vGlobUnkCoords[m_numSCV];
			m_vSCV[m_numSCV].vLocIP = m_vLocUnkCoords[m_numSCV];
			m_vSCV[m_numSCV].numSH = rTrialSpace.num_sh();
			m_vSCV[m_numSCV].vGloPos[0]=vCornerCoords[edgeCo[1]];
			m_vSCV[m_numSCV].vGloPos[1]=globalMidpoint;
			m_vSCV[m_numSCV].vGloPos[2]=globalBary;
			m_vSCV[m_numSCV].vLocPos[0]=m_rRefElem.corner(edgeCo[1]);
			m_vSCV[m_numSCV].vLocPos[1]=localMidpoint;
			m_vSCV[m_numSCV].vLocPos[2]=localBary;
			m_vSCV[m_numSCV].numCorners = 3;
			rTrialSpace.shapes(&(m_vSCV[m_numSCV].vShape[0]), m_vSCV[m_numSCV].local_ip());
			rTrialSpace.grads(&(m_vSCV[m_numSCV].vLocalGrad[0]), m_vSCV[m_numSCV].local_ip());
			// insert new scvf
			m_vSCVF[m_numSCVF].From = m_numDofs;
			m_vSCVF[m_numSCVF].To = m_numDofs+1;
			m_vSCVF[m_numSCVF].vLocPos[0] = localMidpoint;
			m_vSCVF[m_numSCVF].vLocPos[1] = localBary;
			m_vSCVF[m_numSCVF].vGloPos[0] = globalMidpoint;
			m_vSCVF[m_numSCVF].vGloPos[1] = globalBary;
			m_vSCVF[m_numSCVF].numSH = rTrialSpace.num_sh();
			for (int d=0;d<dim;d++) m_vSCVF[m_numSCVF].localIP[d] = 0.5*(localMidpoint[d] + localBary[d]);
			for (int d=0;d<worldDim;d++) m_vSCVF[m_numSCVF].globalIP[d] = 0.5*(globalMidpoint[d] + globalBary[d]);
			rTrialSpace.shapes(&(m_vSCVF[m_numSCVF].vShape[0]), m_vSCVF[m_numSCVF].local_ip());
			rTrialSpace.grads(&(m_vSCVF[m_numSCVF].vLocalGrad[0]), m_vSCVF[m_numSCVF].local_ip());
			ElementNormal<face_type0,worldDim>(m_vSCVF[m_numSCVF].Normal,m_vSCVF[m_numSCVF].vGloPos);
			// insert new constrained dof object
			m_vCD[m_numConstrainedDofs].i = side;
			m_vCD[m_numConstrainedDofs].numConstrainingDofs = 2;
			m_vCD[m_numConstrainedDofs].cDofInd[0] = m_numDofs;
			m_vCD[m_numConstrainedDofs].cDofInd[1] = m_numDofs+1;
			m_vCD[m_numConstrainedDofs].cDofWeights[0] = 0.5;
			m_vCD[m_numConstrainedDofs].cDofWeights[1] = 0.5;
			m_numSCV+=1+keepOffset;
			m_numSCVF+=1;
			m_numDofs+=2;
			m_numConstrainedDofs+=1;
			m_roid = ROID_UNKNOWN;
		}
	} else {
		// dim == 3
		std::vector<Face*> vFaces;
		CollectFacesSorted(vFaces, grid, pElem);
		handledEdges.clear();
		for(size_t face = 0; face < vFaces.size(); ++face){
			ConstrainingFace* constrainingObj = dynamic_cast<ConstrainingFace*>(vFaces[face]);
			if(constrainingObj == NULL) continue;
			// found constraining face
			MathVector<worldDim> globalMidpoint = m_vSCV[face].vGlobIP;
			MathVector<dim> localMidpoint = m_vSCV[face].vLocIP;
			number faceVol = m_vSCV[face].Vol;
			MathVector<worldDim> faceNormal = m_vSCV[face].Normal;
			// get face corners and edges
			size_t faceCo[4];
			size_t faceEdge[4];
			// number of corners of face = number of edges
			size_t numFaceCo = m_rRefElem.num(2,face,0);
			for (size_t j=0;j<numFaceCo;j++) faceCo[j] = m_rRefElem.id(2,face,0,j);
			for (size_t j=0;j<numFaceCo;j++) faceEdge[j] = m_rRefElem.id(2,face,1,j);
			number volSum=0;
			size_t keepOffset=0;
			if (keepSCV) keepOffset=1;
			// compute coordinates of each face and fill scv values
			for (size_t i=0;i<numFaceCo;i++){
				size_t co = faceCo[i];
				size_t nOfEdges=0;
				size_t nbEdges[2];
				// find 2 edges in face belonging to node
				for (size_t j=0;j<m_rRefElem.num(0,co,1);j++){
					size_t candidate = m_rRefElem.id(0,co,1,j);
					bool found = false;
					for (size_t k=0;k<numFaceCo;k++){
						if (faceEdge[k]==candidate){
							found = true;
							break;
						}
					}
					if (found==true){
						nbEdges[nOfEdges] = candidate;
						nOfEdges++;
						if (nOfEdges==2) break;
					}
				}
				// in triangular case switch edges if necessary for correct orientation
				if (numFaceCo==3){
					if (faceEdge[i]==nbEdges[1]){
						nbEdges[1] = nbEdges[0];
						nbEdges[0] = faceEdge[i];
					}
				}
				// keepSCV parameter specifies if scv "side" gets replaced by new one
				size_t ind = m_numSCV+i-1+keepOffset;
				if (i==0){
					if (keepSCV) ind=m_numSCV;
					else ind = face;
				}
				// others are inserted at the end
				m_vSCV[ind].vGloPos[0] = vCornerCoords[co];
				m_vSCV[ind].vLocPos[0] = m_rRefElem.corner(co);
				for (int d=0;d<worldDim;d++){
 					 // edge 0 midpoint
  					m_vSCV[ind].vGloPos[1][d] = 0.5 * ( vCornerCoords[m_rRefElem.id(1,nbEdges[0],0,0)][d] + vCornerCoords[m_rRefElem.id(1,nbEdges[0],0,1)][d] );
					m_vSCV[ind].vLocPos[1][d] = 0.5 * ( m_rRefElem.corner(m_rRefElem.id(1,nbEdges[0],0,0))[d] + m_rRefElem.corner(m_rRefElem.id(1,nbEdges[0],0,1))[d] );
					// edge 1 midpoint
					m_vSCV[ind].vGloPos[numFaceCo-1][d] = 0.5 * ( vCornerCoords[m_rRefElem.id(1,nbEdges[1],0,0)][d] + vCornerCoords[m_rRefElem.id(1,nbEdges[1],0,1)][d] );
					m_vSCV[ind].vLocPos[numFaceCo-1][d] = 0.5 * ( m_rRefElem.corner(m_rRefElem.id(1,nbEdges[1],0,0))[d] + m_rRefElem.corner(m_rRefElem.id(1,nbEdges[1],0,1))[d] );
				}
				if (numFaceCo==4) m_vSCV[ind].vGloPos[2] = globalMidpoint;
				m_vSCV[ind].vGloPos[numFaceCo] = globalBary;
				m_vSCV[ind].vLocPos[numFaceCo] = localBary;
				m_vSCV[ind].numCorners = numFaceCo + 1;
				AveragePositions(m_vGlobUnkCoords[ind], m_vSCV[ind].vGloPos, m_vSCV[ind].numCorners-1);
				AveragePositions(m_vLocUnkCoords[ind], m_vSCV[ind].vLocPos, m_vSCV[ind].numCorners-1);
				m_vSCV[ind].vLocIP = m_vLocUnkCoords[ind];
				m_vSCV[ind].vGlobIP = m_vGlobUnkCoords[ind];
				m_vSCV[ind].numSH = rTrialSpace.num_sh();
				if (numFaceCo==3) m_vSCV[ind].Vol = ElementSize<scv_type0,worldDim>(m_vSCV[ind].vGloPos);
				else m_vSCV[ind].Vol = ElementSize<scv_type1,worldDim>(m_vSCV[ind].vGloPos);
				if (m_vSCV[ind].Vol<0) m_vSCV[ind].Vol *= -1;
				volSum+=m_vSCV[ind].Vol;
				m_vSCV[ind].Normal = faceNormal;
				m_vSCV[ind].Normal *= (number) m_vSCV[ind].Vol / faceVol;
				rTrialSpace.shapes(&(m_vSCV[ind].vShape[0]), m_vSCV[ind].local_ip());
				rTrialSpace.grads(&(m_vSCV[ind].vLocalGrad[0]), m_vSCV[ind].local_ip());
				m_vSCV[ind].nodeID = m_numDofs+i;
			}
			// compute inner scv in triangular case
			if (numFaceCo==3){
				size_t ind = m_numSCV+2+keepOffset;
				m_vSCV[ind].Vol = faceVol - volSum;
				m_vSCV[ind].nodeID=m_numDofs+3;
				m_vSCV[ind].Normal = faceNormal;
				m_vSCV[ind].Normal *= (number) m_vSCV[ind].Vol / faceVol;
				m_vSCV[ind].vGlobIP = m_vSCV[face].vGloPos[1];
				m_vSCV[ind].vLocIP = m_vSCV[face].vLocPos[1];
				for (size_t j=0;j<2;j++){
					m_vSCV[ind].vGlobIP += m_vSCV[m_numSCV+j].vGloPos[1];
					m_vSCV[ind].vLocIP += m_vSCV[m_numSCV+j].vLocPos[1];
				}
				m_vSCV[ind].vGlobIP *= (number)1.0/3.0;
				m_vSCV[ind].vLocIP *= (number)1.0/3.0;
				m_vGlobUnkCoords[ind] = m_vSCV[ind].vGlobIP;
				m_vLocUnkCoords[ind] = m_vSCV[ind].vLocIP;
				m_vSCV[ind].numCorners = numFaceCo + 1;
				m_vSCV[ind].numSH = rTrialSpace.num_sh();
				rTrialSpace.shapes(&(m_vSCV[ind].vShape[0]), m_vSCV[ind].local_ip());
				rTrialSpace.grads(&(m_vSCV[ind].vLocalGrad[0]), m_vSCV[ind].local_ip());
			}
			// copy scvfs into constrained scvfs
			if (keepSCVF){
				for (size_t i=0;i<numFaceCo;i++){
					size_t edge = faceEdge[i];
					m_vConstrainedSCVF[m_numConstrainedSCVF+i] = m_vSCVF[edge];
					if (m_vConstrainedSCVF[m_numConstrainedSCVF+i].To==face){
						m_vConstrainedSCVF[m_numConstrainedSCVF+i].From=face;
						m_vConstrainedSCVF[m_numConstrainedSCVF+i].Normal*=-1;
					}
				}
				m_numConstrainedSCVF += numFaceCo;
			}
			// insert new scvfs, first the ones associated to edges of face
			for (size_t i=0;i<numFaceCo;i++){
				size_t edge = faceEdge[i];
				size_t from = m_vSCVF[edge].From;
				size_t to   = m_vSCVF[edge].To;
				MathVector<worldDim> normal = m_vSCVF[edge].Normal;
				normal*=0.5;
				size_t edgeCo[2];
				size_t scvID[2];
				for (size_t j=0;j<2;j++){
					edgeCo[j] = m_rRefElem.id(1,edge,0,j);
					// find corresponding face vertex (= corresponding scv index)
					for (size_t k=0;k<numFaceCo;k++){
						if (faceCo[k]==edgeCo[j]){
							scvID[j] = m_numDofs+k;
							break;
						}
					}
				}
				// look if edge has already been handled
				if (m_numConstrainedDofs>0){
					bool found=false;
					for (size_t j=0;j<handledEdges.size();j++){
						if (handledEdges[j].index==edge){
							HandledEdge& hE=handledEdges[j];
							found=true;
							// set new from/to values
							for (size_t k=0;k<2;k++){
								if (hE.from){
									m_vSCVF[hE.scvfIndex+k].To=scvID[k];	
								} else {
									m_vSCVF[hE.scvfIndex+k].From=scvID[k];
								}
							}
							// mark edge so associated scvf is not overwritten
							faceEdge[i]=deleted;
							break;
						}
					}
					if (found==true) continue;
				}
				HandledEdge hEdge;
				hEdge.index=edge;
				hEdge.scvfIndex=m_numSCVF;
				MathVector<worldDim> edgeMidGlob;
				MathVector<dim> edgeMidLoc;
				for (int d=0;d<worldDim;d++){
					edgeMidGlob[d] = 0.5 * (vCornerCoords[edgeCo[0]][d]  + vCornerCoords[edgeCo[1]][d]);
					edgeMidLoc[d] = 0.5 * (m_rRefElem.corner(edgeCo[0])[d] +  m_rRefElem.corner(edgeCo[1])[d]);
				}
				for (size_t j=0;j<2;j++){
					hEdge.associatedSCV[j] = scvID[j];
					if (from==face){
						m_vSCVF[m_numSCVF].From = scvID[j];
						m_vSCVF[m_numSCVF].To   = to;
						hEdge.from=true;
					} else {
						m_vSCVF[m_numSCVF].From = from;
						m_vSCVF[m_numSCVF].To 	= scvID[j];
						hEdge.from=false;
					}
					m_vSCVF[m_numSCVF].Normal = normal;
					m_vSCVF[m_numSCVF].vGloPos[0] = vCornerCoords[edgeCo[j]];
					m_vSCVF[m_numSCVF].vLocPos[0] = m_rRefElem.corner(edgeCo[j]);
					m_vSCVF[m_numSCVF].vGloPos[1] = edgeMidGlob;
					m_vSCVF[m_numSCVF].vLocPos[1] = edgeMidLoc;
					m_vSCVF[m_numSCVF].vGloPos[2] = globalBary;
					m_vSCVF[m_numSCVF].vLocPos[2] = localBary;
					m_vSCVF[m_numSCVF].numSH = rTrialSpace.num_sh();
					AveragePositions(m_vSCVF[m_numSCVF].localIP, m_vSCVF[m_numSCVF].vLocPos, m_vSCVF[m_numSCVF].numCo);
					AveragePositions(m_vSCVF[m_numSCVF].globalIP, m_vSCVF[m_numSCVF].vGloPos, m_vSCVF[m_numSCVF].numCo);
					rTrialSpace.shapes(&(m_vSCVF[m_numSCVF].vShape[0]), m_vSCVF[m_numSCVF].local_ip());
					rTrialSpace.grads(&(m_vSCVF[m_numSCVF].vLocalGrad[0]), m_vSCVF[m_numSCVF].local_ip());
					m_numSCVF++;
				}
				handledEdges.push_back(hEdge);
			}
			// scvfs inside the face
			// insert remaining inner scvfs into positions of edge associated scvs
			for (size_t j=0;j<numFaceCo;j++){
				// replaces edge associated scvf
				size_t ii = faceEdge[j];
				if (ii==deleted){ 
					ii = m_numSCVF;
					m_numSCVF++;
				}
				if (numFaceCo==3){
					// compute inner scvfs in triangular case
					m_vSCVF[ii].From = m_numDofs+3;
					m_vSCVF[ii].To = m_numDofs+j;
					size_t ind = face;
					if (j>0) ind = m_numSCV+j-1;
					m_vSCVF[ii].vLocPos[0] = m_vSCV[ind].vLocPos[1];
					m_vSCVF[ii].vLocPos[1] = m_vSCV[ind].vLocPos[2];
					m_vSCVF[ii].vGloPos[0] = m_vSCV[ind].vGloPos[1];
					m_vSCVF[ii].vGloPos[1] = m_vSCV[ind].vGloPos[2];
				}else{
					// compute inner scvfs in quadrilateral case
					m_vSCVF[ii].To = m_numDofs+j;
					m_vSCVF[ii].From = m_numDofs + ((j+1) % 4);
					for (int d=0;d<worldDim;d++){
						m_vSCVF[ii].vLocPos[0][d] = 0.5*( m_rRefElem.corner(faceCo[j])[d] + m_rRefElem.corner(faceCo[(j+1) % 4])[d] );
						m_vSCVF[ii].vGloPos[0][d] = 0.5*( vCornerCoords[faceCo[j]][d] + vCornerCoords[faceCo[(j+1) % 4]][d] );
					}
					m_vSCVF[ii].vLocPos[1] = localMidpoint;
					m_vSCVF[ii].vGloPos[1] = globalMidpoint;
				}
				m_vSCVF[ii].vLocPos[2] = localBary;
				m_vSCVF[ii].vGloPos[2] = globalBary;	
				m_vSCVF[ii].numSH = rTrialSpace.num_sh();
				ElementNormal<face_type0,worldDim>(m_vSCVF[ii].Normal,m_vSCVF[ii].vGloPos);
				AveragePositions(m_vSCVF[ii].globalIP,m_vSCVF[ii].vGloPos,3);
				AveragePositions(m_vSCVF[ii].localIP,m_vSCVF[ii].vLocPos,3);
				rTrialSpace.shapes(&(m_vSCVF[ii].vShape[0]), m_vSCVF[ii].local_ip());
				rTrialSpace.grads(&(m_vSCVF[ii].vLocalGrad[0]), m_vSCVF[ii].local_ip());
			}
			// insert new constrained dof object
			m_vCD[m_numConstrainedDofs].i = face;
			m_vCD[m_numConstrainedDofs].numConstrainingDofs = 4;
			for (size_t i=0;i<4;i++){
				m_vCD[m_numConstrainedDofs].cDofInd[i] = m_numDofs+i;
				size_t ind=face;
				if (i>0) ind = m_numSCV+i-1;
				m_vCD[m_numConstrainedDofs].cDofWeights[i] = (number)m_vSCV[ind].Vol / faceVol;
			}
			m_numSCV+=3+keepOffset;
			m_numDofs+=4;
			m_numConstrainedDofs+=1;
			m_roid = ROID_UNKNOWN;
		}
	}// end of hanging node check

	//\todo compute with one virt. call
//	compute jacobian for linear mapping
	if(rMapping.is_linear())
	{
		MathMatrix<worldDim,dim> JtInv;
		rMapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip());
		const number detJ = rMapping.sqrt_gram_det(m_vSCVF[0].local_ip());

		for(size_t i = 0; i < num_scvf(); ++i)
		{
			m_vSCVF[i].JtInv = JtInv;
			m_vSCVF[i].detj = detJ;
		}

		for(size_t i = 0; i < num_scv(); ++i)
		{
			m_vSCV[i].JtInv = JtInv;
			m_vSCV[i].detj = detJ;
		}
	}
//	else compute jacobian for each integration point
	else
	{
		for(size_t i = 0; i < num_scvf(); ++i)
		{
			rMapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip());
			m_vSCVF[i].detj = rMapping.sqrt_gram_det(m_vSCVF[i].local_ip());
		}
		for(size_t i = 0; i < num_scv(); ++i)
		{
			rMapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip());
			m_vSCV[i].detj = rMapping.sqrt_gram_det(m_vSCV[i].local_ip());
		}
	}

//	compute global gradients
	for(size_t i = 0; i < num_scvf(); ++i)
		for(size_t sh = 0; sh < scvf(i).num_sh(); ++sh)
			MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]);

	for(size_t i = 0; i < num_scv(); ++i)
		for(size_t sh = 0; sh < scv(i).num_sh(); ++sh)
			MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]);

// 	copy ip points in list (SCVF)
	for(size_t i = 0; i < num_scvf(); ++i)
		m_vGlobSCVF_IP[i] = scvf(i).global_ip();

//	if no boundary subsets required, return
	if(num_boundary_subsets() == 0 || ish == NULL) return;
	else update_boundary_faces(pElem, vCornerCoords, ish);
}
예제 #12
0
void DimCRFVGeometry<TDim, TWorldDim>::
update(GridObject* pElem, const MathVector<worldDim>* vCornerCoords, const ISubsetHandler* ish)
{
// 	If already update for this element, do nothing
	if(m_pElem == pElem) return; else m_pElem = pElem;

//	refresh local data, if different roid given
	if(m_roid != pElem->reference_object_id())
	{
	//	remember new roid
		m_roid = (ReferenceObjectID) pElem->reference_object_id();

	//	update local data
		update_local_data();
	}

//	get reference element
	try{
	const DimReferenceElement<dim>& m_rRefElem
		= ReferenceElementProvider::get<dim>(m_roid);

	//  compute barycenter coordinates
	globalBary = vCornerCoords[0];
	for (size_t j=1;j<m_rRefElem.num(0);j++){
	   globalBary+=vCornerCoords[j];
	}
	globalBary*=1./(number)m_rRefElem.num(0);

// 	compute global informations for scvf
	for(size_t i = 0; i < num_scvf(); ++i)
	{
		for (size_t j=0;j<m_vSCVF[i].numCo-1;j++){
			m_vSCVF[i].vGloPos[j]=vCornerCoords[m_rRefElem.id(dim-2,i,0,j)];
		}
		m_vSCVF[i].vGloPos[m_vSCVF[i].numCo-1]=globalBary;
		AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, m_vSCVF[i].numCo);
		ElementNormal<face_type0,worldDim>(m_vSCVF[i].Normal,m_vSCVF[i].vGloPos);// face_type0 identical to scvf type
	}

// 	compute size of scv
	for(size_t i = 0; i < num_scv(); ++i)
	{
		// side nodes in reverse order to fulfill standard element order
		for (int j=0;j<m_vSCV[i].numCorners-1;j++){
			m_vSCV[i].vGloPos[m_vSCV[i].numCorners-2-j]=vCornerCoords[m_rRefElem.id(dim-1,i,0,j)];
		}
		AveragePositions(m_vGlobUnkCoords[i], m_vSCV[i].vGloPos, m_vSCV[i].numCorners-1);
		m_vSCV[i].vGlobIP = m_vGlobUnkCoords[i];
		
		m_vSCV[i].vGloPos[m_vSCV[i].numCorners-1]=globalBary;
		// 	compute volume of scv and normal to associated element face
		//CRSCVSizeAndNormal<dim>(m_vSCV[i].Vol,m_vSCV[i].Normal,m_vSCV[i].vGloPos,m_vSCV[i].numCorners);
		if (m_vSCV[i].numCorners-1==dim){
		     m_vSCV[i].Vol = ElementSize<scv_type0,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type0, worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		} else { // m_vSCV[i].numCorners-2==dim , only possible in 3d (pyramid)
		     m_vSCV[i].Vol = ElementSize<scv_type1,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type1,worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		};
		// nodes are in reverse order therefore reverse sign to get outward normal
		m_vSCV[i].Normal*=-1;
	}

//	get reference mapping
	DimReferenceMapping<dim, worldDim>& rMapping = ReferenceMappingProvider::get<dim, worldDim>(m_roid);
	rMapping.update(vCornerCoords);

	//\todo compute with on virt. call
//	compute jacobian for linear mapping
	if(rMapping.is_linear())
	{
		MathMatrix<worldDim,dim> JtInv;
		rMapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip());
		const number detJ = rMapping.sqrt_gram_det(m_vSCVF[0].local_ip());

		for(size_t i = 0; i < num_scvf(); ++i)
		{
			m_vSCVF[i].JtInv = JtInv;
			m_vSCVF[i].detj = detJ;
		}

		for(size_t i = 0; i < num_scv(); ++i)
		{
			m_vSCV[i].JtInv = JtInv;
			m_vSCV[i].detj = detJ;
		}
	}
//	else compute jacobian for each integration point
	else
	{
		for(size_t i = 0; i < num_scvf(); ++i)
		{
			rMapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip());
			m_vSCVF[i].detj = rMapping.sqrt_gram_det(m_vSCVF[i].local_ip());
		}
		for(size_t i = 0; i < num_scv(); ++i)
		{
			rMapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip());
			m_vSCV[i].detj = rMapping.sqrt_gram_det(m_vSCV[i].local_ip());
		}
	}

//	compute global gradients
	for(size_t i = 0; i < num_scvf(); ++i)
		for(size_t sh = 0; sh < scvf(i).num_sh(); ++sh)
			MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]);

	for(size_t i = 0; i < num_scv(); ++i)
		for(size_t sh = 0; sh < scv(i).num_sh(); ++sh)
			MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]);

// 	copy ip points in list (SCVF)
	for(size_t i = 0; i < num_scvf(); ++i)
		m_vGlobSCVF_IP[i] = scvf(i).global_ip();

	}
	UG_CATCH_THROW("DimCRFVGeometry: update failed.");

//	if no boundary subsets required, return
	if(num_boundary_subsets() == 0 || ish == NULL) return;
	else update_boundary_faces(pElem, vCornerCoords, ish);
}
예제 #13
0
void CRFVGeometry<TElem, TWorldDim>::
update(GridObject* elem, const MathVector<worldDim>* vCornerCoords, const ISubsetHandler* ish)
{
	UG_ASSERT(dynamic_cast<TElem*>(elem) != NULL, "Wrong element type.");
	TElem* pElem = static_cast<TElem*>(elem);

// 	If already update for this element, do nothing
	if(m_pElem == pElem) return; else m_pElem = pElem;

	//  compute barycenter coordinates
	globalBary = vCornerCoords[0];
	m_vCo[0] = vCornerCoords[0];
	for (size_t j=1;j<m_rRefElem.num(0);j++){
	   globalBary+=vCornerCoords[j];
	   m_vCo[j] = vCornerCoords[j];
	}
	globalBary*=1./(number)m_rRefElem.num(0);

// 	compute global informations for scvf
	for(size_t i = 0; i < num_scvf(); ++i)
	{
		for (size_t j=0;j<m_vSCVF[i].numCo-1;j++){
			m_vSCVF[i].vGloPos[j]=vCornerCoords[m_rRefElem.id(dim-2,i,0,j)];
		}
		m_vSCVF[i].vGloPos[m_vSCVF[i].numCo-1]=globalBary;
		AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, m_vSCVF[i].numCo);
		ElementNormal<face_type0,worldDim>(m_vSCVF[i].Normal,m_vSCVF[i].vGloPos);// face_type0 identical to scvf type
	}

// 	compute size of scv
	for(size_t i = 0; i < num_scv(); ++i)
	{
		// side nodes in reverse order to fulfill standard element order
		for (int j=0;j<m_vSCV[i].numCorners-1;j++){
			m_vSCV[i].vGloPos[m_vSCV[i].numCorners-2-j]=vCornerCoords[m_rRefElem.id(dim-1,i,0,j)];
		}
		AveragePositions(m_vGlobUnkCoords[i], m_vSCV[i].vGloPos, m_vSCV[i].numCorners-1);
		m_vSCV[i].vGlobIP = m_vGlobUnkCoords[i];

		m_vSCV[i].vGloPos[m_vSCV[i].numCorners-1]=globalBary;
		// 	compute volume of scv and normal to associated element face
		//CRSCVSizeAndNormal<dim>(m_vSCV[i].Vol,m_vSCV[i].Normal,m_vSCV[i].vGloPos,m_vSCV[i].numCorners);
		if (m_vSCV[i].numCorners-1==dim){
		     m_vSCV[i].Vol = ElementSize<scv_type0,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type0, worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		} else { // m_vSCV[i].numCorners-2==dim , only possible in 3d (pyramid)
		     m_vSCV[i].Vol = ElementSize<scv_type1,worldDim>(m_vSCV[i].vGloPos);
		     ElementNormal<face_type1, worldDim>(m_vSCV[i].Normal, m_vSCV[i].vGloPos);
		};
		// nodes are in reverse order therefore reverse sign to get outward normal
		m_vSCV[i].Normal*=-1;
	}

// 	Shapes and Derivatives
	m_mapping.update(vCornerCoords);

//	compute jacobian for linear mapping
	if(ReferenceMapping<ref_elem_type, worldDim>::isLinear)
	{
		MathMatrix<worldDim,dim> JtInv;
		m_mapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip());
		const number detJ = m_mapping.sqrt_gram_det(m_vSCVF[0].local_ip());

		for(size_t i = 0; i < num_scvf(); ++i)
		{
			m_vSCVF[i].JtInv = JtInv;
			m_vSCVF[i].detj = detJ;
		}

		for(size_t i = 0; i < num_scv(); ++i)
		{
			m_vSCV[i].JtInv = JtInv;
			m_vSCV[i].detj = detJ;
		}
	}
//	else compute jacobian for each integration point
	else
	{
		for(size_t i = 0; i < num_scvf(); ++i)
		{
			m_mapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip());
			m_vSCVF[i].detj = m_mapping.sqrt_gram_det(m_vSCVF[i].local_ip());
		}
		for(size_t i = 0; i < num_scv(); ++i)
		{
			m_mapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip());
			m_vSCV[i].detj = m_mapping.sqrt_gram_det(m_vSCV[i].local_ip());
		}
	}

//	compute global gradients
	for(size_t i = 0; i < num_scvf(); ++i)
		for(size_t sh = 0; sh < scvf(i).num_sh(); ++sh)
			MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]);

	for(size_t i = 0; i < num_scv(); ++i)
		for(size_t sh = 0; sh < scv(i).num_sh(); ++sh)
			MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]);

// 	copy ip points in list (SCVF)
	for(size_t i = 0; i < num_scvf(); ++i)
		m_vGlobSCVF_IP[i] = scvf(i).global_ip();

//	if no boundary subsets required, return
	if(num_boundary_subsets() == 0 || ish == NULL) return;
	else update_boundary_faces(pElem, vCornerCoords, ish);
}
예제 #14
0
파일: IO.cpp 프로젝트: clement91190/eurobot
void Pince::in_state_func()
{
    switch (state)
    {
        case RANGE_DEPART :
            a1();
            scv();
            slr();
            break;
        case TAPE_VERTICAL :
            a1();
            scv();
            slt();
            break;
        case INTERMEDIAIRE_SORTIE :
            set_time_out(400, trigger_to_be);
            a1();
            slo();
            scv();
            break;
        case HORIZ_VERT :
            a1();
            slo();
            scn();
            break;
        case NOMINAL_VIDE : 
            set_time_out(500, trigger_to_be);
            a0();
            slo();
            scn();
            break;
        case ACTIF_TORCHE :
            a0();
            slo();
            scn();
            break;
        case PRISE_TORCHE : 
            Serial.println('# PRISE');
            a0();
            slf();
            scn();
            break;
        case ACTIF_FEU :
            a0();
            slo();
            scn();
            break;
        case PRISE_FEU :
            Serial.println('# PRISE');
            set_time_out(500, TIME_OUT);
            a0();
            slf();
            scn();
            break;
        case WAIT_COOL_OK :
            break;
        case MONTE_COOL :
            set_time_out(800, TIME_OUT);
            a1();
            slf();
            scn();
            break;
        case MONTE_COOL2 :
            a1();
            slf();
            scn();
            break;
        case RETOURNE_COOL_N :
            set_time_out(500, TIME_OUT);
            a1();
            slf();
            scr();
            break;
        case DESCEND_COOL_N :
            a0();
            slf();
            scr();
            break;
        case POSE_COOL_N :
            set_time_out(500, TIME_OUT);
            a0();
            slo();
            scr();
            break;
        case INT1_COOL_N : 
            set_time_out(500, TIME_OUT);
            a1();
            slo();
            scr();
            break;
        case INT2_COOL_N : 
            set_time_out(500, TIME_OUT);
            a1();
            slf();
            scr();
            break;
        case INT3_COOL_N :
            set_time_out(500, TIME_OUT);
            a1();
            slf();
            scn();
            break;
        case INT_RANGE :
            a1();
            slo();
            break;
        case INT2_RANGE :
            set_time_out(10, trigger_to_be);
            a1();
            slo();
            break;
    }
}
예제 #15
0
파일: scene_test.cpp 프로젝트: speakman/qlc
void Scene_Test::values()
{
    Scene s(m_doc);
    QVERIFY(s.values().size() == 0);

    /* Value 3 to fixture 1's channel number 2 */
    s.setValue(1, 2, 3);
    QVERIFY(s.values().size() == 1);
    QVERIFY(s.values().at(0).fxi == 1);
    QVERIFY(s.values().at(0).channel == 2);
    QVERIFY(s.values().at(0).value == 3);

    /* Value 6 to fixture 4's channel number 5 */
    SceneValue scv(4, 5, 6);
    s.setValue(scv);
    QVERIFY(s.values().size() == 2);
    QVERIFY(s.values().at(0).fxi == 1);
    QVERIFY(s.values().at(0).channel == 2);
    QVERIFY(s.values().at(0).value == 3);
    QVERIFY(s.values().at(1).fxi == 4);
    QVERIFY(s.values().at(1).channel == 5);
    QVERIFY(s.values().at(1).value == 6);

    /* Replace previous value 3 with 15 for fixture 1's channel number 2 */
    s.setValue(1, 2, 15);
    QVERIFY(s.values().size() == 2);
    QVERIFY(s.values().at(0).fxi == 1);
    QVERIFY(s.values().at(0).channel == 2);
    QVERIFY(s.values().at(0).value == 15);
    QVERIFY(s.values().at(1).fxi == 4);
    QVERIFY(s.values().at(1).channel == 5);
    QVERIFY(s.values().at(1).value == 6);

    QVERIFY(s.value(1, 2) == 15);
    QVERIFY(s.value(3, 2) == 0); // No such channel
    QVERIFY(s.value(4, 5) == 6);

    /* No channel 5 for fixture 1 in the scene, unset shouldn't happen */
    s.unsetValue(1, 5);
    QVERIFY(s.values().size() == 2);
    QVERIFY(s.values().at(0).fxi == 1);
    QVERIFY(s.values().at(0).channel == 2);
    QVERIFY(s.values().at(0).value == 15);
    QVERIFY(s.values().at(1).fxi == 4);
    QVERIFY(s.values().at(1).channel == 5);
    QVERIFY(s.values().at(1).value == 6);

    /* Remove fixture 1's channel 2 from the scene */
    s.unsetValue(1, 2);
    QVERIFY(s.values().size() == 1);
    QVERIFY(s.values().at(0).fxi == 4);
    QVERIFY(s.values().at(0).channel == 5);
    QVERIFY(s.values().at(0).value == 6);

    /* No fixture 1 anymore */
    s.unsetValue(1, 2);
    QVERIFY(s.values().size() == 1);
    QVERIFY(s.values().at(0).fxi == 4);
    QVERIFY(s.values().at(0).channel == 5);
    QVERIFY(s.values().at(0).value == 6);

    /* Remove fixture 4's channel 5 from the scene */
    s.unsetValue(4, 5);
    QVERIFY(s.values().size() == 0);
}
예제 #16
0
void Bras::in_state_func()
{
    switch (state)
    {
        case RANGE_DEPART :
            scr(); 
            a0();
            spb();
            pf();
            break;
        case INT_RANGE :
            //va bumper
            scn(); 
            a0();
            spb();
            pf();
            break;
        case INT2_RANGE :
            set_time_out(400, trigger_to_be);
            scn(); 
            a0();
            spb();
            pf();
            break;
         case GO_ATTENTE :
            scn(); 
            a1();
            spb();
            pf();
            break;

        case ATTENTE_ACTIF :
            scn(); 
            a1();
            spb();
            pf();
            break;

        case DESCENTE_LAT :
            scn(); 
            a4();
            spb();
            pf();
            break;
        case DESCENTE_POMPE_LAT :
            scn(); 
            a4();
            spb();
            po();
            break;
        case PRISE_LAT :
            scn(); 
            a4();
            spb();
            po();
            break;
        case MONTE_VERT :
            set_time_out(500, TIME_OUT);
            scn(); 
            a0();
            spv();
            po();
            break;
        case MONTE :
            scn(); 
            a0();
            spb();
            po();
            break;
        case RANGE_PRISE :
            set_time_out(2000, TIME_OUT);
            scl(); 
            a0();
            spb();
            po();
            break;
        case LACHE :
            set_time_out(300, TIME_OUT);
            scl(); 
            a0();
            spb();
            pf();
            break;
        case MONTE_ECH :
            scn(); 
            a3();
            spb();
            po();
            break;

        case MONTE_ECH_VERT :
            sce(); 
            a3();
            spr();
            po();
            break;
       
        case RETOURNE_ECH :
            call_for_help();
            sce(); 
            a3();
            spr();
            po();
            break;
        case REPLACE_APRES_ECH :
            set_time_out(300, TIME_OUT);
            scn(); 
            a3();
            spb();
            pf();
            break;

        case SEND_MINE :
            scv(); 
            a4();
            spv();
            pf();
            break;
        case SENDMASTER_PRET :
            scv(); 
            a4();
            spv();
            po();
            break;
        case PRISE_VERT :
            scv(); 
            a4();
            spv();
            po();
            break;

        case PRISE_COPAIN :
            a2(); 
            sce();
            spb();
            po();
            break;
    }
}