• Re: water injection unsatured zone

    The relative permeability is available in the Data panel (Auxiliary Data tree).
  • Re: Timelapse observations files

    I am not entirely sure whether or not you refer to time-dependent observations. If you refer to time-dependent observations, please find an example format below.


    DEF PARID LABEL NODE X Y Z SLICE ACTIVE NAME TIME TIME2 REF_VALUE WEIGHT GROUP SYNC_TIME FUNC
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Level 0 nan 0 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00002 0.1 nan 0.049978 0.246915 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00003 0.2 nan 0.099927 0.243907 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00004 0.5 nan 0.24955 0.235319 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00005 1 nan 0.49827 0.222308 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00006 2 nan 0.99342 0.200264 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00007 5 nan 2.4634 0.154717 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00008 10 nan 4.8624 0.112836 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~00009 20 nan 9.4763 0.074204 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000A 50 nan 21.961 0.038519 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000B 100 nan 38.925 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000C 200 nan 62.359 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000D 500 nan 90.915 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000E 1000 nan 99.081 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000F 2000 nan 99.984 0 heagp 1
    hea 400 Water Level 0 40 40 0 3 1 hea-Water_Leve~0000G 10000 nan 100 0 heagp 1
  • Re: How to determine heat rate transfer for a Heat-Transfer BC?

    The heat transfer-rates (in / out) are thermal resistance factors. As you correctly indicated, the transfer rate is the thermal conductivity devided by the thickness. In building physics these parameters are related with the heat and geometrical property of the material. In practical groundwater modelling, the parameter is rather related with the current landuse. Unfortunatly, I do not have a reference at hand. You could check the literature or scientific papers (Elsevier, Springer, AGU etc.).
  • Re: groundwater head is not decreasing in transient state calibration

    It's difficult to give a feedback without knowing the model in more details. Coudl you please contact the FEFLOW Support: https://www.mikepoweredbydhi.com/support

  • Re: Initial conditions for In-/Active Elements

    Great, thanks.
  • Re: Darcy Flux in z direction

    A plugin exists which allows you to export the different components. Please contact the FEFLOW support. https://www.mikepoweredbydhi.com/support

    Alternatively, you can use the following Python script and use it in FEFLOWin a fem-file.

    [font=courier][color=blue]
    # Assign scalar quantities of vector components to nodal distributions
    def postTimeStep(doc):
        for nNode in range(0,nNodes):
            doc.setNodalRefDistrValue(rID_velX, nNode, doc.getResultsXVelocityValue(nNode))
            doc.setNodalRefDistrValue(rID_velY, nNode, doc.getResultsYVelocityValue(nNode))
            doc.setNodalRefDistrValue(rID_velZ, nNode, doc.getResultsZVelocityValue(nNode))

        #print "PostTimeStep at t=" + str(doc.getAbsoluteSimulationTime())

    try:

        # Enable reference distribution recording
        bEnable = 1 # disable = 0, enable = 1

        # Create and enable distribution recording
        doc.createNodalRefDistr("Velocity_X")
        rID_velX = doc.getNodalRefDistrIdByName("Velocity_X")
        doc.enableNodalRefDistrRecording(rID_velX,bEnable)

        doc.createNodalRefDistr("Velocity_Y")
        rID_velY = doc.getNodalRefDistrIdByName("Velocity_Y")
        doc.enableNodalRefDistrRecording(rID_velY,bEnable)

        doc.createNodalRefDistr("Velocity_Z")
        rID_velZ = doc.getNodalRefDistrIdByName("Velocity_Z")
        doc.enableNodalRefDistrRecording(rID_velZ,bEnable)

        nNodes = doc.getNumberOfNodes()

    except Exception as err:
        print>>sys.stderr,'Error: '+str(err)+'!'
        sys.exit(-1);

    [/color][/font]

    In FEFLOW click on Scripting... and then on Edit Script. Copy + paste the script and start the simulation. Please check the User Data Distributions in the Data panel.

    Please note that the code is not carefully tested. Please test it in your model and review the code.


  • Re: The info from inspection panel disappeared

    Could you please let me know some settings of your computer (operating system, graphic card, version, FEFLOW Version and Update number). You will find the latter information in FEFLOW if you klick on Help and then on About.
  • Re: Hardware Suggestions/Overview

    Hi Adam,

    I have a similar observation. As you pointed out, the PCG solver is fast for transient flow models, because the matrix assembly is highly parallelized. According to my observations, the SAMG is quite fast for steady-state or quasi steady flow models.

    Yes, the number of nodes are very interesting with regard to serial VS. parallel. Moreover, the number of cores are also interesting. More cores do not necessarily imply faster computations. Most likely a drastic / exaggerated example: if the number of cores are "high" and if the number of nodes are "low", a reduction of cores could even accelerate the computations.

  • Re: Export of results

    In the Data panel, please double-click on Pressure. Go to the View Components panel and right-click on Zero Isosurface and export. As requested, you can export as a shape or as a dxf. However, you need to clip outside of FEFLOW using for example GIS.
  • Re: Initial conditions for In-/Active Elements

    Please find a tiny code snippet below, which illustrates the workflow. The workflow is based on a Python script. The scripts loads the FEFLOW kernel externally.

    The snippet does the following:

    1. Get the element members of the selection with the name “sheet_piles_elements”
    2. Start a simulation
    3. Deactivate the elements of the selection “sheet_piles_elements” after 200 d
    4. Re-activate the elements of the same selection after 300 d and initialize corresponding nodal heads with a value of 10 m. Nodes which has been previously completely surrounded by inactive elements are considered only. I detected these nodes based on selections, but you could also check whether or not a nodal head values correspond to nan (not a number).

    Please note that the tiny snippet has not been carefully tested (e.g. 3D, unsaturated flow etc). Accordingly, I cannot provide any warranty that the script works correctly. Instead, the script is simple starting point into inactive elements using the FEFLOW API.

    [font=courier][color=blue]
    import sys, os

    sys.path.append('C:\\Program Files\\DHI\\2017\\FEFLOW 7.1\\bin64')
    import ifm
    from ifm import Enum


    try:

        def onTimeStepConstraint(doc, tNow, dT):

            timeIntervals = [100., 200., 300.]
            for i in range(0, len(timeIntervals) - 1):
                if timeIntervals[i] < tNow < timeIntervals[i + 1]:
                    if tNow + dT > timeIntervals[i + 1]:
                        dT = timeIntervals[i + 1] - tNow

            if tNow == deactivation_time:
                print "Elements will be deactivated at t = ", tNow

                for inactive_element in inactive_elements_list:
                    doc.setMatElementActive(inactive_element, inactive_element_state)

            if tNow == activation_time:
                print "Elements will be activated at t = ", tNow
                for inactive_element in inactive_elements_list:
                    doc.setMatElementActive(inactive_element, active_element_state)

                for inactive_node in inactive_node_list_reduced:
                    doc.setPredictorHeadTimeValue(inactive_node, initializing_value)
                    doc.setResultsFlowHeadValue(inactive_node, initializing_value)

            return dT

        cwd = os.getcwd()

        FEM_FILE_in = cwd + "\\..\\femdata\\barrier_in.fem"
        FEM_FILE_out = cwd + "\\..\\femdata\\barrier_out.fem"
        DAC_FILE_out = cwd + "\\..\\results\\barrier.dac"

        # Time to deactivate elements
        deactivation_time = 200
        # Time to activate elements and process variable initialization
        activation_time = 300

        inactive_elements_list = []
        inactive_node_list = []
        connected_node_list = []
        inactive_node_list_reduced = []
        sel_type_element = 1  # element=0
        sel_type_node = 0  # nodal=0
        inactive_element_state = 0 # inactive = 0
        active_element_state = 1 # active = 1
        initializing_value = 10

        # Load FEFLOW document
        doc=ifm.loadDocument(FEM_FILE_in)


        # Prepare selections
        element_selection_id = doc.findSelection(sel_type_element, "sheet_piles_elements")
        doc.createSelection(sel_type_node, "sheet_piles_nodes")
        node_selection_id = doc.findSelection(sel_type_node, "sheet_piles_nodes")

        nElements = doc.getNumberOfElements()
        nNodes = doc.getNumberOfNodes()

        # Get inactive element list
        for element_id in range(nElements):
            if doc.selectionItemIsSet(sel_type_element, element_selection_id, element_id) == 1:
                inactive_elements_list.append(element_id)


        for inactive_element in inactive_elements_list:

            # Nodes connected to elements
            for ElementNode in range(0, doc.getNumberOfElementNodes(inactive_element)):
                ElementNode_id = doc.getNode(inactive_element, ElementNode)

                # Elements connected to node
                inactive_NodeElements_list = [ElementNode_id, doc.getNumberOfNodeElements(ElementNode_id)]
                for NodeElement in range(0, doc.getNumberOfNodeElements(ElementNode_id)):
                    NodeElement_id = doc.getElement(ElementNode_id, NodeElement)

                    if doc.selectionItemIsSet(sel_type_element, element_selection_id, NodeElement_id) == 1:
                        inactive_NodeElements_list.append(1)

                connected_node_list.append(inactive_NodeElements_list)

        # Make nodal selection for initialization of process variable head
        for node_incident_list in connected_node_list:
            if node_incident_list[1] == node_incident_list.count(1):
                doc.setSelectionItem(sel_type_node, node_selection_id, node_incident_list[0])
                inactive_node_list.append(node_incident_list[0])

        # Remove doubles
        for inactive_node in inactive_node_list:
            if inactive_node not in inactive_node_list_reduced:
                inactive_node_list_reduced.append(inactive_node)

        # Enable parameter recording in output dac-file for inactive elements (pseudo material)
        doc.enableParamRecording(Enum.P_INACTIVE_ELE)

        doc.saveDocument(FEM_FILE_out)
        doc.startSimulator(DAC_FILE_out)
        doc.stopSimulator()

    except Exception as err:
    print >> sys.stderr, err
    exit(-1);
    [/color][/font]