Water Scarcity GFM
Il Gap Filling Module Scarsita Idrica calcola l'impronta della scarsita idrica dei prodotti alimentari combinando dati di consumo idrico specifici del prodotto con indici regionali di stress idrico. Questo approccio tiene conto del fatto che il consumo di acqua in regioni con scarsita idrica ha un impatto ambientale maggiore dello stesso consumo in regioni con abbondanza d'acqua.
Riferimento Rapido
| Proprieta | Descrizione |
|---|---|
| Eseguito su | ModeledActivityNode con genitore FoodProductFlowNode contenente un nome prodotto |
| Dipendenze | OriginGapFillingWorker |
| Input Chiave | Tipo di prodotto (termine FoodEx2), paese di origine |
| Output | Flusso di consumo di acqua scarsa in metri cubi |
| Trigger | Prodotto abbinato a un identificatore di impronta della scarsita idrica |
Quando Viene Eseguito
Il modulo si attiva quando:
- Un
ModeledActivityNodeha un genitoreFoodProductFlowNodecon un nome prodotto - Il prodotto e abbinato a un identificatore di impronta della scarsita idrica nel glossario
- Il modulo e pianificato sul nodo foglia Brightway (all'origine)
Output Chiave
Il modulo aggiunge un flusso di consumo di acqua scarsa al grafo di calcolo:
- Consumo di Acqua Scarsa: Misurato in metri cubi (m3) per chilogrammo di prodotto
- Collegato a un
ElementaryResourceEmissionNodeper il calcolo dell'impatto
Metodologia Scientifica
Il modello di scarsita idrica utilizza fattori dell'Indice di Stress Idrico (WSI) forniti da Scherer e Pfister (2016). Questa metodologia include esplicitamente lo stress idrico regionale come fattore di ponderazione per il consumo di acqua dolce, fornendo una misura ambientalmente piu significativa del semplice volume d'acqua.
Approccio dell'Indice di Stress Idrico
L'impronta della scarsita idrica e calcolata usando la formula:
Acqua Scarsa [L/kg] = Consumo di Acqua Blu [L/kg] * Indice di Stress Idrico [adimensionale]
Dove:
- Consumo di Acqua Blu: La quantita di acque superficiali e sotterranee consumate durante la produzione
- Indice di Stress Idrico: Un fattore regionale che rappresenta la scarsita idrica (scala da 0 a 1)
Stress Idrico Regionale
Lo stress idrico dipende da:
- La quantita di acqua consumata in una regione rispetto all'acqua naturalmente disponibile dalle precipitazioni
- Correzioni per l'acqua che viene restituita al bacino idrografico (per esempio, dopo il raffreddamento nella produzione di elettricita)
Il database include fattori di scarsita idrica differenziati per 162 paesi, consentendo valutazioni regionali accurate.
Flusso di Calcolo
Quantita Prodotto [g] -> Converti in [kg] -> Fattore WSI [L acqua scarsa/kg] -> Acqua Scarsa [L]
Il calcolo viene eseguito al livello piu basso del grafo e aggregato fino al prodotto principale.
Dettagli di Implementazione
Fonte dei Dati
I fattori di scarsita idrica sono memorizzati in EDB_water_expected_wsi_per_kg_country_excel_corrected.xlsx, che contiene:
- Identificatori prodotto (WS_ID)
- Fattori WSI specifici per paese per 162 paesi
- Valori mediani per calcoli di fallback
Logica di Abbinamento
I prodotti sono abbinati ai dati di scarsita idrica attraverso:
- Termini FoodEx2 dal nome del prodotto
- Collegamenti al glossario che mappano combinazioni di termini a identificatori di scarsita idrica
water_scarcity_term_uid = self.gfm_factory.linked_water_scarcity_terms.get(
frozenset([term.uid for term in parent_flow_product_name_terms])
)
Gestione del Codice Paese
Il modulo gestisce i codici paese come segue:
- Recupera la proprieta
flow_locationdal prodotto o dai nodi genitori - Converte i codici ISO a 3 lettere in codici a 2 lettere usando
iso_3166_map_3_to_2_letter - Cerca il fattore WSI specifico del paese
Comportamento di Fallback
| Scenario | Comportamento |
|---|---|
| Nessuna origine trovata | Usa la mediana di tutti i paesi disponibili |
| Origini multiple trovate | Usa la mediana di tutti i paesi disponibili |
| Origine non nella tabella WSI | Usa la mediana per quel prodotto tra tutti i paesi |
| Prodotto non nella tabella WSI | Scarsita idrica impostata a zero |
| Prodotto senza ID WSI | Scarsita idrica impostata a zero |
Esclusione del Trasporto
Il modulo salta i flussi relativi al trasporto per evitare doppi conteggi:
if product_name_term.sub_class_of == self.gfm_factory.root_transport_term.uid:
transport_term = True
if transport_term:
continue
Gestione dei Prodotti Essiccati
Per gli ingredienti che sono suddivisi in versioni fresche ed essiccate (tramite il Water Loss GFM):
- La scarsita idrica e calcolata per la quantita di ingrediente fresco
- La scarsita idrica e calcolata anche per la quantita di ingrediente fresco corrispondente alla versione essiccata
- Questo tiene correttamente conto della maggiore quantita di prodotto fresco necessaria per produrre versioni essiccate
Modifiche al Grafo
Il modulo esegue le seguenti modifiche al grafo:
Passo 1: Rimuovere l'Arco Originale
remove_edge_mutation = RemoveEdgeMutation(
from_node_uid=parent_flow.uid,
to_node_uid=self.node.uid,
)
Passo 2: Creare l'Attivita di Consumo Idrico
water_consumption_activity = FoodProcessingActivityNode.model_construct(
uid=UuidStr(uuid4()),
production_amount=self.node.production_amount.duplicate(),
)
Passo 3: Ristabilire le Connessioni di Flusso
Il modulo crea un nuovo nodo di flusso alimentare tra l'attivita di consumo idrico e il nodo Brightway originale.
Passo 4: Aggiungere il Flusso di Acqua Scarsa
scarce_water_consumption_flow = FlowNode.model_construct(
uid=UuidStr(uuid4()),
product_name=NamesProp.unvalidated_construct(
terms=[
GlossaryTermProp.unvalidated_construct(
term_uid=self.gfm_factory.scarce_water_consumption_term.uid
)
]
),
amount_in_original_source_unit=QuantityProp.unvalidated_construct(
# Il segno negativo indica il consumo
value=-production_amount_in_kg * scarce_water_consumption_m3_per_kg,
unit_term_uid=self.gfm_factory.cubic_meter_term.uid,
for_reference=ReferenceAmountEnum.amount_for_activity_production_amount,
),
)
Passo 5: Collegare al Nodo Risorsa Elementare
Il flusso di acqua scarsa e collegato a un ElementaryResourceEmissionNode condiviso per la valutazione dell'impatto.
Riferimento Codice Completo
Logica di Pianificazione del Worker
def should_be_scheduled(self) -> bool:
"""Whether to schedule water scarcity gap filling worker."""
if (
isinstance(self.node, ModeledActivityNode)
and self.node.get_parent_nodes()
and any(
isinstance(parent_node, FoodProductFlowNode) and parent_node.product_name
for parent_node in self.node.get_parent_nodes()
)
):
return True
return False
Verifica della Prontezza all'Esecuzione
def can_run_now(self) -> GapFillingWorkerStatusEnum:
"""Whether water scarcity gap filling worker can be executed."""
global_gfm_state = self.get_global_gfm_state()
# Attendi la determinazione dell'origine
if global_gfm_state.get(OriginGapFillingWorker.__name__, 0) == NodeGfmStateEnum.scheduled.value:
return GapFillingWorkerStatusEnum.reschedule
# Esegui solo sul nodo foglia Brightway
if any(isinstance(sub_node, FoodProductFlowNode) for sub_node in self.node.get_sub_nodes()):
return GapFillingWorkerStatusEnum.cancel
return GapFillingWorkerStatusEnum.ready
Calcolo della Scarsita Idrica
# Converti la quantita di produzione in chilogrammi
production_amount_unit: Term = self.node.production_amount.get_unit_term()
production_amount_in_kg = UnitWeightConverter.convert_between_same_unit_types(
self.node.production_amount.value,
production_amount_unit,
self.gfm_factory.kilogram_term,
"mass-in-g",
)
# Cerca il fattore specifico del paese
if flow_country_code in water_scarcity_term.data:
scarce_water_consumption_m3_per_kg = water_scarcity_term.data[flow_country_code]
else:
# Fallback alla mediana
scarce_water_consumption_m3_per_kg = water_scarcity_term.data["median"]
# Calcola il consumo di acqua scarsa
scarce_water_value = -production_amount_in_kg * scarce_water_consumption_m3_per_kg
Inizializzazione della Factory
Il WaterScarcityGapFillingFactory inizializza i seguenti dati in cache:
Termini delle Unita
self.cubic_meter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_cubic-meter", root_unit_term.access_group_uid)
)
self.liter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_liter", root_unit_term.access_group_uid)
)
self.kilogram_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_kilogram", root_unit_term.access_group_uid)
)
Cache dei Collegamenti al Glossario
water_scarcity_glossary_links = await self.service_provider.glossary_link_service.get_glossary_links_by_gfm(
gap_filling_module="WaterScarcity"
)
for water_scarcity_glossary_link in water_scarcity_glossary_links:
self.linked_water_scarcity_terms[
frozenset(water_scarcity_glossary_link.term_uids)
] = water_scarcity_glossary_link.linked_term_uid
Esempio di Calcolo
Scenario: 500g di pomodori dalla Spagna
Passo 1: Convertire in Chilogrammi
500g = 0,5 kg
Passo 2: Cercare il Fattore WSI
Dal database della scarsita idrica per i pomodori in Spagna:
Fattore WSI = 142,3 L di acqua scarsa/kg
Passo 3: Calcolare l'Acqua Scarsa
Acqua Scarsa = 0,5 kg * 142,3 L/kg = 71,15 L di acqua scarsa
Passo 4: Convertire in Metri Cubi
71,15 L = 0,07115 m3 di acqua scarsa
Confronto per Origine
Gli stessi pomodori da origini diverse avrebbero impatti diversi:
| Origine | Fattore WSI (L/kg) | Acqua Scarsa (L) per 500g |
|---|---|---|
| Spagna | 142,3 | 71,15 |
| Paesi Bassi | 12,8 | 6,40 |
| Marocco | 285,6 | 142,80 |
| Italia | 98,4 | 49,20 |
Questo dimostra perche i fattori di stress idrico specifici dell'origine sono critici per una valutazione ambientale accurata.
Limitazioni Note
Copertura dei Dati
- 162 paesi coperti: La maggior parte dei principali paesi produttori di alimenti e inclusa
- Paesi mancanti: Alcuni paesi potrebbero non avere dati WSI; vengono usati valori mediani come fallback
- Copertura prodotti: Non tutti i prodotti alimentari hanno ID di scarsita idrica assegnati
Limitazioni dell'Ereditarieta
L'implementazione attuale non supporta l'ereditarieta degli ID di scarsita idrica tra prodotti correlati:
- Nel sistema legacy, i prodotti potevano ereditare ID WSI da prodotti collegati
- Nell'implementazione attuale, i prodotti senza un ID WSI diretto ricevono zero scarsita idrica
- Questo puo risultare in una sottostima per alcuni prodotti (per esempio, farine speciali che potrebbero ereditare dalla farina generica)
Risoluzione dei Dati
- Solo risoluzione a livello di paese (nessuna differenziazione sub-nazionale)
- Non tiene conto delle variazioni stagionali nello stress idrico
- Usa valori attesi (medi) piuttosto che dati specifici dell'anno reale
Fallback alla Mediana
Quando vengono usati valori mediani (origine sconosciuta, dati paese mancanti), non viene visualizzato alcun avviso nell'output. Questo e un comportamento noto documentato nelle revisioni scientifiche.
Fonti dei Dati
Fonte Primaria
Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.
I dati sulla scarsita idrica combinano:
- Consumo di acqua blu da database Life Cycle Assessment
- Valori dell'Indice di Stress Idrico basati sulla disponibilita idrica a livello di bacino idrografico
Struttura del Database
I fattori di scarsita idrica sono memorizzati nell'Eaternity Database (EDB) con:
water-scarcity-footprint-id: Collega i prodotti alle voci di dati WSI- Valori specifici per paese: Memorizzati per ogni combinazione prodotto-paese
- Valori mediani: Pre-calcolati per scenari di fallback
Riferimenti
-
Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.
-
Pfister, S., Koehler, A., & Hellweg, S. (2009). Assessing the environmental impacts of freshwater consumption in LCA. Environmental Science and Technology, 43(11), 4098-4104.
-
Eaternity Database (EDB). Water Scarcity Footprint Data. Internal documentation.