Retrieving DFT method


Hello there,

Apologies if this is a silly question: is there a way I can retrieve the DFT method used for each calculation? For example, AFLOW has the attribute dft_type:

Description: Returns information about the pseudopotential type, the exchange correlation functional used (normal or hybrid) and use of GW.

Or, does MP always use a specific DFT method, as this suggests:

We use density functional theory as implemented in the Vienna Ab Initio Simulation Package (VASP) software[1] to evaluate the total energy of compounds. For the exchange-correlational functional, we employ a mix of Generalized Gradient Approximation (GGA) and GGA+U, as described later in this manual. We use the Projector Augmented Wave (PAW) method for modeling core electrons with an energy cutoff of 520 eV.

How can I tell which method is used? Apologies again if this is a silly question, and thank you for your time.


Hi @carlyman,

If you scroll to the bottom of a given materials detail page, such as this one for BaTiO3 mp-5020, you will see a calculation summary:

A given material (mp-id) is a summary of several calculations we call ‘tasks’ which each have their own id. If you click on the links to any individual task (e.g. ‘GGA Structure Optimization’), you can see the detail inputs for that task.

In general, most calculations on Materials Project all use PBE+U, with the same set of U values and pseudopotentials. More information on these is available in the documentation.

Finally, if you want programmatic access to this information, please use our API. Our API documentation is available here but it is most easily used through the Python code pymatgen MPRester interface. For example:

from pymatgen import MPRester
with MPRester() as mpr:
    task_data = mpr.get_task_data('mp-5020')

would return a dictionary with keys such as is_hubbard and hubbards which specifies if that task used a Hubbard-U value etc.

Hope this helps,



(Note, “# of K-points None” is currently an error because a database key has changed. This will be fixed shortly.)


G’day Matt,

Thanks for the reply. I neglected to mention earlier that I am using the REST interface, sorry about that.

The associated JSON fragment (from for the material you refer to has the following attributes:

"is_hubbard": false,
"hubbards": {}

Could you generalise that for is_hubbard:
false -> GGA
true -> GGA+U

I checked all the associated tasks at the task endpoint, and they all have the same values as the vasp endpoint.

Thanks again in advance.


Could you generalise that for is_hubbard:
false -> GGA
true -> GGA+U

Yes, this is correct. And if true, the specific U values should be in the hubbards dict. And currently, the only tasks we have are all PBE or PBE+U, no other functionals are currently present in our online database.

For a given structure, it’s also possible to re-generate the VASP inputs using pymatgen (specifically and MPRelaxSet, MPStaticSet etc.), so if you want to see why a specific U value was used etc., pymatgen is the place to look, or you can consult our documentation/papers.

We have gone through a very significant database schema change recently (see Significant release of new database schema and additional data) so if you do see anything from the REST endpoints that doesn’t seem to make sense, please do report it (and thank you for doing so!).


G’day Matt,

Again, thanks so much for your reply, you’ve been very helpful.

MP is one of the better REST interfaces I have interfaced with for my current project I must say, and is closer to a the commercial implementations I work with in my day job. This is a good thing, and I think I can speak for everyone in thanking your team for the hard work providing this service in the first instance, as well as keeping the lights on.

Some suggestions, if I may:

  • In some cases, I have noticed data types change. I don’t have the specific example to hand (I think it might have even been Task IDs or ICSD IDs) sorry but the problem was that the data type was not consistent. In one request, it was nullable, in another it was a single value, and in another is was an array. Ideally, if the value is 0-n then it will always be an array. If I see it again, I’ll let you know
  • How do I know to use v2 of the service? I’ve has some success with REST services sending an ‘X-Route-Deprecated’ header back with responses, with the value of the header being the new location of the service. If consumers know to inspect these headers, they can move to the later version endpoints as soon as they see the header
  • Where can we see a delta between end point versions? Is there a change log? It’d be nice to keep up-to-date with the latest version of the end points, as well as object models and take advantage of any new functionality on offer

Thanks again, most appreciated.